我想构建一个非常简单的基于 PHP 的基于 Web 的控制面板,以便在我的 linode vps(Ubuntu 8.04 LTS)上添加和删除用户以及在 nginx 配置文件中添加和删除部分。
根据基于 Web 的控制面板的输入,以 root 身份执行命令的最安全方法是什么?
出于显而易见的原因,我不愿意以 root 身份运行 PHP(即使在 IP 表防火墙后面)。
欢迎提出建议。这肯定是可行的,因为有几种商业控制面板(而且对于我的需求来说过于臃肿)提供了类似的功能。
谢谢
答案1
为 Web 服务器运行的用户创建 sudo 规则,以便它只能运行特定命令。例如,要编辑文件,您可以让 Web 服务器在 Web 服务器拥有且只能写入的目录中进行复制(这样恶意的本地用户就无法在过程中踩到您的更改),并设置 sudo 规则将编辑后的文件复制到位。您可以锁定 sudo 规则,以便只能处理具有特定参数的命令。
此外,请确保您正在验证用户,并确保您清理来自用户的任何输入,以阻止任何 shell 元字符或类似字符潜入。例如,在添加用户时,您可能会验证输入是否符合最大长度并且仅包含字母和数字。使用 sudo 可以防止大多数类似情况,但多层保护是好的。对用户输入不能过于偏执。;)
或者只需安装 Webmin。:)
答案2
无论您做什么,总会存在一个潜在的安全漏洞。
一些建议:
- 编写一个简单的 shell 脚本来执行其输入,并让其 chown 和 setuid root;PHP 将调用它并将提供的命令传递给它。
- 对于您将要执行的各种任务使用更具体的脚本,并让它们 setuid root;同样,PHP 将调用它们。
- 编写一个守护进程,它通过 TCP 套接字接受命令并执行这些命令,并让其以 root 身份运行;PHP 将连接到它。
- 基于“系统上还有其他东西可以以 root 身份执行您想要的操作并让 PHP 调用它”这一概念的任何其他内容。
以上这些似乎都比以 root 身份运行“控制面板”更安全(也绝对不简单)。而且大多数“控制面板”软件包(例如网页管理工具)完全绕过这个问题并以 root 身份运行。
答案3
用 python 编写一个 cgi 脚本,我认为这可能更容易。尽管正如 Massimo 所说,运行 webmin 更安全...
答案4
cPannel 和 WebMin 可以做到这一点,但它们也非常不安全。黑客入侵的后果也很严重,您会丢失整个系统,并且一旦被黑客入侵,您将不得不从头开始重新安装。
就像您不想使用 telnet 一样,您也不想使用 http。请确保您使用 HTTPS,并购买真正的证书,毕竟将您的 root 密码泄露到网上是一个严重的错误,您需要确保它发送到正确的服务器。
编辑: 您可以在 chroot 中运行 cPannel,因此即使它被破解了,您也可以创建一个新的 chroot。它也是一个加垫监狱,可以让您准确定义 root 可以访问的内容。