これがstackoverflowの質問なのかserverfaultなのかはわかりませんが、次のようになります。
Ubuntu 10.04ファイルサーバー(Samba/FTP/HTTP)があり、ユーザーがWebブラウザーを使用してサーバーのパスワードを変更できるようにしたいと考えています。
PHPとexecの混乱を使用する前に、同様のスクリプトを記述しましたが、サーバー上のプロセスのリストを見ている人がリッスンできるため、安全ではありません。
これを簡単に実行できるプラグイン(PHPまたはPythonまたはその他)の種類はありますか?
私はwebmin/userminのようなものを使いすぎないようにしています。これはやり過ぎです。
何時間もオンラインで調査した後、非常に優れたオプションを見つけることができなかったので、このハックを実装しました。 PHPを使用してパスワードを変更するために この記事 を使用します。
PECL:PAMパッケージ を使用して、少し検証を追加しています。
このページは安全なHTTPSフォルダーにあります(.htaccessによる自動リダイレクト)
<?php
$messages = array();
function change_password ($user, $currpwd, $newpwd) {
// Open a handle to expect in write mode
$p = popen('/usr/bin/expect','w');
// Log conversation for verification
$log = '/tmp/passwd_' . md5($user . time());
$cmd .= "log_file -a \"$log\"; ";
// Spawn a Shell as $user
$cmd .= "spawn /bin/su $user; ";
$cmd .= "expect \"Password:\"; ";
$cmd .= "send \"$currpwd\\r\"; ";
$cmd .= "expect \"$user@\"; ";
// Change the unix password
$cmd .= "send \"/usr/bin/passwd\\r\"; ";
$cmd .= "expect \"(current) UNIX password:\"; ";
$cmd .= "send \"$currpwd\\r\"; ";
$cmd .= "expect \"Enter new UNIX password:\"; ";
$cmd .= "send \"$newpwd\\r\"; ";
$cmd .= "expect \"Retype new UNIX password:\"; ";
$cmd .= "send \"$newpwd\\r\"; ";
$cmd .= "expect \"passwd: password updated successfully\"; ";
// Commit the command to expect & close
fwrite($p, $cmd); pclose ($p);
// Read & delete the log
$fp = fopen($log,r);
$output = fread($fp, 2048);
fclose($fp); unlink($log);
$output = explode("\n",$output);
return (trim($output[count($output)-2]) == 'passwd: password updated successfully') ? true : false;
}
function process_post() {
if ((!isset($_SERVER['HTTP_REFERER']))
|| (strpos($_SERVER['HTTP_REFERER'], $_SERVER['SCRIPT_NAME']) === FALSE)) {
echo "GO AWAY!";
exit();
return FALSE;
}
global $messages;
$username = trim($_POST['username']);
$password_current = trim($_POST['password_current']);
$password_new = trim($_POST['password_new']);
$password_confirm = trim($_POST['password_confirm']);
// Check for blanks
if ($username == '' || $password_current == '' || $password_new == '' || $password_confirm == '') {
array_Push(&$messages, "ERROR: You cannot leave any field empty.");
return FALSE;
}
// Check username
if (!ctype_alnum($username)) {
array_Push(&$messages, "ERROR: You've entered an invalid username.");
return FALSE;
}
// Check to see if new password is correctly typed
if ($password_new != $password_confirm) {
array_Push(&$messages, "ERROR: New Password and Confirmation do not match.");
return FALSE;
}
// Check if current password is valid (not really neccessary)
if (!pam_auth($username, $password_current, &$error, FALSE)) {
if (trim($error) == "Permission denied (in pam_authenticate)")
array_Push(&$messages, "ERROR: You've username/password was not accepted.");
else
array_Push(&$messages, "ERROR: " . $error);
return FALSE;
}
if (change_password ($username, $password_current, $password_new))
array_Push(&$messages, "Password Successfully Changed");
else
array_Push(&$messages, "ERROR: Password change failed.");
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') process_post();
?><html>
<head>
<title>Passwords</title>
<style type="text/css">
body {
font-family: Verdana, Arial, sans-serif;
font-size: 12px;
}
label {
width: 150px;
display: block;
float: left;
}
input {
float: left;
}
br {
clear: both;
}
.message {
font-size: 11px;
font-weight: bold;
}
.error {
color:#C00;
}
</style>
</head>
<body>
<h2>Change Passwords</h2>
<form action="<?= $_SERVER['SCRIPT_NAME'] ?>" method="post">
<fieldset>
<? if (count($messages) != 0) {
foreach ($messages as $message) { ?>
<p class="message<?= ((strpos($message, 'ERROR:') === FALSE) ? '' : ' error') ?>"><?= $message ?></p>
<? } } ?>
<label>Username: </label>
<input type="text" name="username" /><br />
<label>Current Password:</label>
<input type="password" name="password_current" /><br />
<label>New Password:</label>
<input type="password" name="password_new" /><br />
<label>Confirm Password:</label>
<input type="password" name="password_confirm" /><br />
<input type="reset" value="Reset" /> <input type="submit" value="Submit" />
</fieldset>
</form>
</body>
</html>
https://stackoverflow.com/questions/3032785/php-pam-to-change-user-password/3067974#3067974 にもこの質問/回答が投稿されています
web-chpass PAMを介してパスワードを変更できます。
2つの別々のプロセスを使用することを好みます。 1つのプロセスは、特別なファイルを特別なフォルダーにドロップして要求を行います。次に、cronジョブがフォルダーをループし、パスワード変更要求を実行します。
呼び出しスクリプトが行う必要があるのは、ファイルをフォルダーにドロップすることだけです(そのためのアクセス許可がある場合)。
詳細とスクリプトを取得するには、このリンクを参照してください: http://sylnsr.blogspot.com/2012/09/keep-unix-password-in-sync-with.html
PDCとしてSambaを実行している場合、これを使用して、ユーザーがctrl + alt + deleteを使用してパスワードを変更できるようにすることができます。このanwserがあなたに適さない場合は申し訳ありませんが、投稿できませんまだcommetsか...
unix password sync = Yes
passwd program = /usr/bin/php -f /my_folder/my_own_script.php %u
passwd chat = "password:" %n\n "changed"
passwd chat debug = yes
またはシステムプログラム:
passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*
「パスワードの同期」を検索します。これはドキュメントの中央にあり、その仕組みをよりよく説明しています: http://www.samba.org/samba/docs/using_samba/ch09.html#samba2-CHP-9 -SECT-4.
おそらく、最良の解決策は、ある種のLDAPインターフェース(例えば、プログラミングフレームワークから)を使用するか、Webminのようにすぐに使えるフロントエンドです。