я попросил этот вопрос около шести месяцев назад, и я подумал, что могу получить здесь лучшие отзывы.
У меня есть веб-сайт, написанный почти исключительно на javascript (холст HTML), и база данных MySQL, управляемая через PHP. На стороне сервера скрипты, которые я выполняю, выполняются как пользователь www-data
. Теперь предположим, что я хочу создать новую учетную запись Linux, а также добавить имя / пароль пользователя в базу данных. Как мне это автоматизировать?
Фактическая функциональность, которую я хотел бы, распространяется также на создание групп для пользователя, создание скелетного каталога для домашней папки и получение доступа для чтения / записи к их домашней папке и подпапкам. По сути, мне нужно выполнять определенные команды как root, но я, очевидно, не могу вводить их с клавиатуры.
У меня была одна идея - создать /home/www-data/.ssh/
папка с входом по SSH без ключа в root, но меня беспокоит, что это дает слишком много возможностей.
Безумный Шляпник указал, что это потенциальный дубликат этот вопрос поэтому я уточняю свой первоначальный вопрос.
На моем веб-сайте каждому пользователю разрешено создавать свои собственные сценарии и выполнять их. Создана сложная библиотека, которая может динамически загружать сценарии javascript, выполнять их, почти всегда перерисовывая элемент HTML Canvas. В дополнение к этому они могут создавать сценарии PHP.
Поскольку пользователь может создавать свои собственные сценарии PHP, я не могу просто передать root-доступ для создания новых пользователей к www-данным (путем редактирования /etc/sudoers
файл). Я хочу способ выполнить приведенную ниже команду / скрипт PHP, когда пользователь регистрируется (поэтому подключается как пользователь www-data
)
shell_exec("sudo useradd J.C.Denton");
Но избегайте ситуации, когда впоследствии пользователь пишет сценарий PHP, чтобы использовать указанный выше файл PHP для создания своих собственных пользователей.
Мой идеальный сценарий состоял бы в том, чтобы иметь возможность войти в систему пользователя не только как сеанс PHP и предоставить ему доступ только к элементам базы данных SQL, на которую он / она имеет права, но и фактически зарегистрировать его на сервере Apache, как в этом кейс, J.C.Denton
Вы не можете «фактически зарегистрировать его на сервере Apache как, в данном случае, J.C.Denton», потому что, если вы не реализуете соответствующие конструкции в своем приложении, функциональность не будет существовать. Хотя вы можете использовать HTTP-аутентификацию, это не обеспечивает всех остальных частей, необходимых для модели безопасности.
Здесь вы пытаетесь иметь дело с 3 разными моделями безопасности
Да, рационализация этих потенциально конфликтующих моделей должна быть в вашем списке приоритетов проектирования, но действительно ли вы должны основывать это на модели разрешений Unix? Есть инструменты для расширения это в область приложения с помощью PHP - но это не единственное решение.
Оставим это пока в стороне, в системе Unix / Linux / POSIX создание пользователей из командной строки прост - но есть некоторые предостережения. Точно так же вы можете создавать пользователей mysql с помощью SQL. Но учтите, что модуль pam_mysql, о котором я знаю делает не использовать функции аутентификации MySQL и управления пользователями, но просто предоставляет репозиторий для данных аутентификации.
Объединить все это в единую оболочку или php-скрипт - тривиально. Единственное предостережение заключается в том, что если вы хотите вызвать это из чего-то другого, кроме оболочки, принадлежащей root, вы все равно должны сделать ее доступной для чтения / выполнения только для root, но настройте sudo, чтобы разрешить ее запуск, например с веб-сервера.
Итак, чтобы ваша модель работала, вам нужно более подробно спланировать, как вы собираетесь структурировать разрешения Unix и использовать suPHP.
Вы думали об использовании чего-то вроде pam_mysql
или pam_ldap
и поместить информацию об учетной записи пользователя в базу данных? Таким образом вы можете разделить свои системные учетные записи (локальные /etc/passwd
) из ваших учетных записей пользователей, повышая гибкость и безопасность. Управление вашими пользователями будет происходить через MySQL, root-доступ не требуется.
pam_mkhomedir
затем создаст домашний каталог (и необходимые файлы скелета) при первом входе в систему.
Благодаря PAM большинство сервисов, которые я могу себе представить (доступ к оболочке, электронная почта, [s] ftp, www ...), могут использовать pam_mysql
или pam_ldap
прозрачно, ваши конечные пользователи ни в коем случае не заметят этого.