php - 从 PHP 脚本更改 Linux 用户密码

标签 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 脚本 这会将脚本“作为”用户运行,因此他应该有权更改自己的密码。并且 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/

相关文章:

php - UTF-8贯穿始终

在后台使用 & 的 PHP exec 不工作

HTML:Chrome 保存密码

centos - sudoers 列表中的错误

linux - 停止在使用 sudo 运行的脚本中间成为 root

php - 在 Web 应用程序中处理具有 "has many"关系的数据更新

php - 我应该为这个项目使用 Perl 或 PHP 或其他东西吗?

python - 安全存储 Redis 密码

linux - 现代 Unix/Linux 系统上的密码是否仍限制为 8 个字符?

python ImportError Openvino 通过脚本和 shell