Ayd*_*san 1 security php sudo apache-2.2
是否可以?
我用 PHP 编写了一个命令行工具,用于为我们公司创建新环境。它创建系统用户、目录、数据库、VHosts 并重新启动 apache 等。这些命令需要sudo特权。我认为为它提供一个 Web 界面可能是个好主意,以便其他非开发人员更容易使用。Web 应用程序将落后于身份验证。
从命令行运行时sudo tool.php,我只是运行,显然我无法从网络应用程序执行此操作。
我怎么能安全地做到这一点?授予 apache 用户 sudo 访问权限似乎很愚蠢,因为这意味着主机上托管的所有站点(例如我们所有的环境)都将具有 sudo 访问权限。是否可以让这个工具在不同的用户下运行?这个用户可以只对我需要的命令有 sudo 权限吗?
plesk 和 cPanel 之类的东西是如何做到这一点的?
有什么想法吗?
虽然这种方法本身会产生不好的感觉,但如果这是必要的邪恶,我首先要确保服务器与网络分开——要么只能由局域网中的几台主机访问,要么只监听那些已针对 VPN(或 SSH 隧道)进行身份验证。总之,尽量不要让这个宿主成为唾手可得的果实。
用户可能具有有限的 sudo 访问权限,我建议您这样做。
首先,创建一个sudoers只能运行tool.php并且可以通过您的www-data用户(或您的网络服务用户碰巧被命名的任何用户)切换到的用户。这将限制可以在服务器上执行的 sudo 操作的范围(但是,如果您的 tool.php 可被利用,这无济于事)。
您可以通过编辑 sudoers 来包含如下一行:
online_tool_user ALL=(www-data) NOPASSWD: /var/danger/tool.php
这将允许“online_tool_user”在/var/danger/tool.php不输入密码的情况下运行命令。如果此用户尝试运行任何其他命令(iptables、adduser 等),它将被拒绝。
为了减少攻击者利用该用户的乐趣,请考虑使用受限制的 shell 或“监狱”。
最后,如果您只是exec通过 PHP调用,请将用户放入调用中,例如:exec("sudo -u online_tool_user -c 'php /var/danger/tool.php'")。