我有一个“简单”的问题:如何在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中的公共可写文件中。但是它从未达到那个点。
如果我访问这个php脚本(http://server/script.php),函数会立即失败,$result = 1。
如果我修改sudoers文件(visudo)并添加一行:
脚本会冻结大约10秒钟,然后失败($result = 1)。
非常感谢您提供任何建议!
背景: 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中的公共可写文件中。但是它从未达到那个点。
$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)。
非常感谢您提供任何建议!