我有一个“简单”的问题:我如何在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)
非常感谢任何有关此事的建议!
答案 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完成工作(每分钟一次)