6

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

背景:CentOS 6、Apache 2.2.13、PHP 5.3.3

我知道 pam_chpasswd() 命令,它是 PECL PAM 库的一部分。但是,除非主机进程 (httpd) 具有对 /etc/shadow 文件的读取权限,否则此功能会失败。(坏主意!如果它需要如此高的权限,不知道这个库有什么帮助......)

就我所见,理想的情况是让 PHP 使用 'sudo -u[username of user changed his password]' 调用 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) 并添加一行:
$Defaults:apache !requiretty

脚本冻结大约 10 秒,然后失败 ($result = 1)

任何这样做的建议都非常感谢!

4

2 回答 2

2

为了在考虑到安全性的情况下实现上述目标,我建议使用expectApche 用户或将其添加到对所述文件具有写入权限且仅对所述文件具有写入权限的组中。

使用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
于 2012-07-24T16:34:33.637 回答
0

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

于 2012-07-24T16:26:57.623 回答