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

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

是否可以?

我用 PHP 编写了一个命令行工具,用于为我们的公司创建新的环境。它可以创建系统用户、目录、数据库、VHost 并重新启动 apache 等。这些命令需要sudo权限。我认为为它提供一个 Web 界面可能是一个好主意,以便其他非开发人员更容易使用。Web 应用程序将采用身份验证。

当从命令行运行时我只是运行sudo tool.php,显然我无法从 Web 应用程序执行此操作。

我该如何安全地做到这一点? 授予 apache 用户 sudo 访问权限似乎很愚蠢,因为这意味着托管在机器上的所有站点(例如我们所有的环境)都将具有 sudo 访问权限。 是否可以让此工具在不同的用户下运行? 这个用户可以只对我需要的命令拥有 sudo 权限?

plesk 和 cPanel 之类的程序是如何做到这一点的?

有什么想法吗?

答案1

虽然这种方法很容易让人产生不好的感觉,但如果这是必要之恶,我首先会确保服务器与网络隔离——要么只能由 LAN 中的少数主机访问,要么只监听通过 VPN(或 SSH 隧道)验证的主机。简而言之,尽量不要让这台主机成为唾手可得的果实。

有可能某个用户的 sudo 访问权限受到限制,我建议这样做。

首先,创建一个sudoers只能运行tool.php并且可以通过您的用户(或您的 Web 服务用户的任何名称)切换到的用户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 或“jails”。

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

答案2

一种方法是将 Web 界面与执行层分离,即使用 Web 界面作为 UI 并安排操作。然后运行第二个具有root特权的作业,该作业轮询队列、验证和执行计划任务并报告退出状态。

对此进行轻微的修改是,您的 Web 应用程序可以使用 sudo 按需运行该轮询器,而不是让轮询器独立运行。

另一种不太安全的方法是运行第二个 Apache 实例,以便为您的安全应用程序运行,而不是rootapache上次我检查时(很久以前),这就是 Web 控制面板使用的方法。

答案3

那么使用 setuid 使得该进程可以以 root 身份运行怎么样?

 chmod 4555 tool.php
 chown root tool.php

我认为这样做应该正确。

相关内容