我有一个“简单”的问题:如何在 PHP 脚本中安全地更改用户的密码,而不授予 Apache root 权限或引入其他疯狂的安全漏洞?
背景: CentOS 6、Apache 2.2.13、PHP 5.3.3
我知道 pam_chpasswd() 命令,它是 PECL PAM 库的一部分。但是,除非主机进程 (httpd) 具有对/etc/shadow 文件的读取权限,否则此功能会失败。 (坏主意!如果它需要如此高的权限,我不确定这个库有什么帮助......)
据我所知,理想情况是让 PHP 使用“sudo -u [更改密码的用户名]”调用 shell 脚本 这会将脚本“作为”用户运行,因此他应该有权更改自己的密码。并且 sudo 会要求用户发送他现有的密码以进行身份验证,从而防止一个用户更改另一个用户的密码。
但是由于某种原因这不起作用......当用popen打开进程时,进程永远不会执行。我将 shell 脚本设置为将一些文本转储到/tmp 中的公共(public)可写文件中。但它永远不会达到这一点。
$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)
如有任何建议,我们将不胜感激!
最佳答案
考虑到安全性,为了实现上述目标,我建议使用 expect
或将 Apche 用户添加到对所述文件具有写入权限且仅具有对所述文件的写入权限的组。
使用 expect 时,你需要包含你的 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
关于php - 从 PHP 脚本更改 Linux 用户密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11635124/