У меня есть «простой» вопрос: как я могу безопасно изменить пароль пользователя из скрипта PHP, не предоставляя привилегии суперпользователя Apache или вводя другие сумасшедшие дыры в безопасности?
Фон: CentOS 6, Apache 2.2.13, PHP 5.3.3
Я знаю о команде pam_chpasswd(), которая является частью библиотеки PECL PAM. Однако эта функция не работает, если хост-процесс (httpd) не имеет доступа для чтения к файлу /etc/shadow. (ПЛОХАЯ ИДЕЯ! Не уверен, как эта библиотека поможет, если она требует таких высоких привилегий...)
Идеальная ситуация, насколько я вижу, состоит в том, чтобы PHP вызывал сценарий оболочки с помощью «sudo -u [имя пользователя, меняющего свой пароль]». Это запустит сценарий «КАК» пользователь, поэтому он должен иметь разрешение на изменить собственный пароль. И sudo потребует, чтобы пользователь отправил свой существующий пароль для аутентификации, что не позволит одному пользователю изменить пароль другого пользователя.
Но по какой-то причине это не работает... при открытии процесса с помощью popen процесс никогда не выполняется. У меня есть сценарий оболочки, настроенный на вывод некоторого текста в общедоступный файл для записи в /tmp. Но до этого никогда не доходит.
$cmd = "/usr/bin/sudo -S -u$username /file_to_execute.sh";
$handle = popen ($cmd, "w"); // Open the process for writing
fwrite ($handle, "$current_password\n"); // Send the user's current password to sudo (-S option)
fwrite .... (write the username, current password, and new password, so the script can change it)
$result = pclose($handle);
Если я получу доступ к этому php-скрипту (http://server/script.php), функция немедленно завершится ошибкой, и $result = 1
Если я изменю файл sudoers (visudo) и добавлю строку:$
Defaults:apache !requiretty
Скрипт зависает примерно на 10 секунд, затем завершается сбоем ($result = 1)
Любые предложения по этому поводу приветствуются!