「簡単な」質問があります。Apache の root 権限を付与したり、その他のクレイジーなセキュリティ ホールを導入したりせずに、PHP スクリプト内からユーザーのパスワードを安全に変更するにはどうすればよいですか?
背景: CentOS 6、Apache 2.2.13、PHP 5.3.3
PECL PAM ライブラリの一部である pam_chpasswd() コマンドを認識しています。ただし、ホスト プロセス (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)
これを行うための提案は大歓迎です!