6

「簡単な」質問があります。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)

これを行うための提案は大歓迎です!

4

2 に答える 2

2

セキュリティを念頭に置いて上記を実現するには、上記のexpectファイルとそのファイルのみへの書き込みアクセス権を持つグループを使用するか、Apche ユーザーをグループに追加することをお勧めします。

sudoExpect では、OS からの応答をリッスンするため、パスワードを含める必要があります。Password:応答が見られると、sudoパスワードで自動的に応答します。これにより、チームを組んshell_exec()で家族とexpect協力して結果を達成することができます。

私は、セキュリティのために 2 番目のルートに進みます。これは、そのファイルへの書き込みアクセスのみを持つグループのファイルへの書き込みにグループ アクセス許可を使用します。

例:

groupadd secure_apache
usermod -G secure_apache apache_user
chown owner:secure_apache /tmp/file_to_change
chmod 740 /tmp/file_to_change
于 2012-07-24T16:34:33.637 に答える
0

これを行うためのより安全な方法は、ユーザー名とパスワードを特別なディレクトリのファイルに保存し、cron にジョブを実行させることです (1 分に 1 回)。

于 2012-07-24T16:26:57.623 に答える