从PHP脚本更改Linux用户密码

时间:2012-07-24 16:19:12

标签: php passwords sudo pam

我有一个“简单”的问题:我如何在PHP脚本中安全地更改用户密码,而不授予Apache root权限或引入其他疯狂的安全漏洞?

背景: CentOS 6,Apache 2.2.13,PHP 5.3.3

我知道pam_chpasswd()命令,它是PECL PAM库的一部分。但是,除非主机进程(httpd)具有对/ etc / shadow文件的读访问权限,否则此函数将失败。 (不好的想法!如果它需要如此高的权限,不确定这个库如何帮助......)

据我所知,理想的情况是PHP使用'sudo -u [用户更改密码的用户名]来调用shell脚本 这将使脚本“AS”运行用户,因此他应该有权更改自己的密码。并且sudo将要求用户发送其现有密码以进行身份​​验证,从而阻止一个用户更改其他用户的密码。

但是由于某些原因这不起作用......当用popen打开进程时,进程永远不会执行。我设置了shell脚本,将一些文本转储到/ 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)

非常感谢任何有关此事的建议!

2 个答案:

答案 0 :(得分:2)

为了实现上述安全性,我建议使用expect或将Apche用户添加到对该文件具有写访问权限且只有该文件的组中。

预计,您需要包含sudo密码,因为它会监听来自Password:操作系统的回复,一旦看到,它会自动回复sudo密码。这样,您就可以将shell_exec()和家人与expect合作,以实现您的成果。

我会选择第二个安全路由,它会使用组权限写入一个只对该文件具有写访问权限的组的文件。

示例:

groupadd secure_apache
usermod -G secure_apache apache_user
chown owner:secure_apache /tmp/file_to_change
chmod 740 /tmp/file_to_change

答案 1 :(得分:0)

更安全的方法是将用户名和密码存储在特殊目录中的文件中,让cron完成工作(每分钟一次)