Изменить пароль пользователя Linux из PHP-скрипта

У меня "простой" вопрос :Как я могу безопасно изменить пароль пользователя из скрипта 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 )и добавлю строку:
$По умолчанию :apache !requiretty

Скрипт зависает примерно на 10 секунд, затем происходит сбой ($result = 1)

Любые предложения по этому поводу приветствуются!

6
задан Ryan Griggs 24 July 2012 в 16:19
поделиться