从PHP安全地执行系统命令sudo

可能吗?

我已经用PHP编写了一个命令行工具来为我们公司创build新的环境。 它创build系统用户,目录,数据库,VHosts和重新启动Apache等等。 这些命令需要sudo权限。 我认为为它提供一个networking接口可能是一个不错的主意,使其他非开发人员可以更容易地使用它。 Web应用程序将在身份validation后面。

当从命令行运行时,我只是运行sudo tool.php ,显然我不能从一个web应用程序做到这一点。

我怎么能安全地做到这一点? 给apache用户sudo访问似乎很愚蠢,因为这意味着所有托pipe在站点上的站点(例如我们所有的环境)都会有sudo访问。 是否有可能让这个工具在不同的用户下运行? 这个用户可以只有我需要的命令的sudo权限?

像plesk和cPanel这样的东西如何做到这一点?

有什么想法吗?

虽然这种方法有助于产生不好的感觉,但是如果这是一个必要的罪恶,我首先要确定服务器是从networking中分割出来的 – 只能由局域网中的less数主机访问,已通过VPN(或SSH隧道)进行身份validation。 总之,尽量不要让这个主持人低贱的成果。

有可能有一个有限的sudo访问用户,我会build议这样做。

首先,创build一个只能运行tool.phpsudoers用户,可以通过您的www-data用户(或任何您的networking用户恰好被命名)切换。 这将限制可以在服务器上执行sudo操作的范围(但是,如果您的tool.php是可利用的,这不会有帮助)。

你可以通过编辑sudoers来包含如下行:

online_tool_user ALL=(www-data) NOPASSWD: /var/danger/tool.php

这将允许“online_tool_user”在不input密码的情况下运行/var/danger/tool.php命令。 如果这个用户试图运行其他命令(iptables,adduser等),它将被拒绝。

为了利用这个用户对攻击者不那么有趣,使用受限制的shell或者“jail”进行研究。

最后,如果您只是通过PHP调用exec ,请将用户引入调用,例如: exec("sudo -u online_tool_user -c 'php /var/danger/tool.php'")

一种方法是将Web界面与执行层分开,即使用Web界面作为UI并安排操作。 然后以root权限运行第二个作业,轮询队列,validation并执行计划任务,并返回退出状态。

稍微修改一下,不要让轮询器独立运行,你的web应用程序可以使用sudo按需运行轮询器。

另一个不太安全的方法是为安全的应用程序运行第二个apache实例,它以root身份而不是apache运行。 上次我检查(很久以前),这是networking控制面板使用的方法。

如何使用setuid,以便进程可以作为根运行?

  chmod 4555 tool.php chown root tool.php 

我认为应该做到这一点。