2012-07-24 6 views
6

私は "簡単な"質問があります:Apacheのroot権限を与えたり、他の狂ったセキュリティホールを導入したりすることなく、PHPスクリプトからユーザのパスワードを安全に変更するにはどうすればいいですか?PHPのスクリプトからLinuxユーザのパスワードを変更する

背景: CentOSの6は、Apache 2.2.13、PHP 5.3.3

私はPECL PAMライブラリの一部であるpam_chpasswd()コマンドの認識しています。ただし、ホストプロセス(httpd)が/ etc/shadowファイルへの読み取りアクセス権を持っていない限り、この関数は失敗します。 (BAD IDEA!このライブラリがそのような高い特権を必要とするなら、どうすればよいか分かりません...)

私が見る限り、理想的な状況は、PHPに 'sudo -u [usernameユーザーのパスワードを変更する] ' これは、ユーザーの "AS"スクリプトを実行するので、自分のパスワードを変更する権限を持っている必要があります。そして、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)を、関数がすぐに失敗し、$結果は= 1

私はsudoersファイル(visudoを)を変更した場合に追加ライン:
$デフォルト:apacheのrequiretty

スクリプトに失敗した、約10秒間フリーズはこれを行うための($結果= 1)

任意の提案は大歓迎です!セキュリティを考慮して上述の目的を達成するために

+0

これらの作品のどれ? http://stackoverflow.com/questions/127459/using-shell-execpasswd-to-change-a-users-password?rq=1 – Aknosis

答えて

0

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

+0

あなたの答えをありがとう。しかし、これには2つの問題があります。 1)ユーザーはパスワードが変更されたかどうかについてすぐにフィードバックを得ることはできません。 2)ユーザーの既存のパスワードが確認されていません。 これはあまり安全ではないかもしれません。私は、パスワードを変更するためにユーザーに既存のパスワードを要求する必要があります。これにより、1人のユーザーによるハイジャックが防止され、別のユーザーのパスワードを変更できなくなります。 –

2

、私はでしょうexpectを使用するか、または前記ファイルおよび前記ファイルのみへの書き込みアクセス権を有するグループにApcheユーザを追加することを提案する。

sudoパスワードを含める必要があります。パスワードはPassword:というOSからの応答をリッスンするため、自動的に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 
+0

#2はマルチユーザー環境で動作しますか?複数のユーザーが同時にパスワードを変更しようとしていますか?私は、各パスワード変更要求が、プロセス中にユーザーが互いに踏み合わないようにランダムに名前を付けたファイルを作成しなければならないと仮定します...? –

+0

私は "expect"オプションが私の最善の策だと思っています... –

+1

2番目のオプションを使うと、最初のユーザーが試したときにファイルをロックするために 'flock()'を実装できます。彼らが完了したら、 'flock()'を削除し、他のユーザは行けます。少なくとも、他のユーザーは、現時点では「できない」というエラーメッセージを表示します。 –

関連する問題