如何通过Web控制面板以root身份安全地执行命令?

我想build立一个非常简单的基于PHP的基于Web的控制面板来添加和删除用户,并添加和删除/从我的linode vps(Ubuntu 8.04 LTS)的nginxconfiguration文件的部分。

据基于Web的控制面板的input,以root身份执行命令最安全的方法是什么?

我不喜欢以root身份运行PHP(即使在IP桌面防火墙后),原因很明显。

build议欢迎。 它必须是可能的,因为几个商业(和我的需要臃肿)控制面板提供类似的function。

谢谢

无论你做什么,它总会是一个可能的安全漏洞。

一些build议:

  • 编写一个简单的shell脚本来执行它的input,并使其具有chown和setuid root; PHP会调用它,并将它传递给提供的命令。
  • 使用更具体的脚本来执行各种任务,并使用setuid root; 再次,PHP会打电话给他们。
  • 写一个恶魔,它接受TCP套接字上的命令并执行它们,并以root身份运行; PHP将连接到它。
  • 其他任何基于这个概念的“在系统上有其他的东西,可以做你想做的事情,并且让PHP来做它”。

上述内容似乎没有比以“root”方式运行“控制面板”更安全(绝对不是简单的)。 而大多数“控制面板”软件包(如webmin )完全绕过这一切,并以root身份运行。

为Web服务器运行的用户创build一个sudo规则,因此它只能运行特定的命令。 例如,要编辑一个文件,您可以让Web服务器在一个目录中复制一个目录,并且只能由Web服务器写入(这样恶意的本地用户就不能在中间进程中进行更改),并且有一个sudo规则将编辑的文件复制到位。 您可以lockingsudo规则,以便只能处理具有特定参数的那些命令。

此外,请确保您正在对用户进行身份validation,并确保您清理了用户的任何input,以阻止任何shell元字符或类似内容。例如,在添加用户时,您可能会validationinput是否在最大长度内只包含字母和数字。 使用sudo可以防止大部分事情,但多层保护是好的。 用户input不可能太偏执。 ;)

或者只安装Webmin。 🙂

在Python中写一个CGI脚本,我想这可能更容易。 尽pipe如Massimo所言,安全性要高得多。

我认为你可以把这些项目结合起来,达到很好的安全性:

  • 以特定用户身份通过​​fast-cgi,cgi-bin或phpsuexec运行PHP
  • 考虑使用Hardened PHP项目http://www.hardened-php.net/
  • 如上所示,使用sudo来获得您所需的根级别访问权限
  • 如果可能的话,在这里使用SELinux可以给你非常好的安全性,但是部署起来可能很繁琐

另外,虽然我更喜欢上面的方法,但我有一个客户端,简单地将操作转储到文件,然后用脚本处理这些操作。 脚本每5分钟通过cron运行。

这需要公共访问吗? 如果没有,使用IPtables和Apache自己的Authconfig来防止滥用。

有cPannel和WebMin这样做,他们也是臭名昭着的不安全。 黑客攻击造成的后果也非常严重,你会丢失整个系统,当你被黑客入侵时你将不得不重新安装。

就像你不想使用telnet一样,你不想使用http。 确保你使用HTTPS,并购买一个真正的证书,毕竟把你的root密码通过networking是一个严重的错误,你想确保它去正确的服务器。

编辑:你可以在chroot中运行cPannel,所以即使它被破坏,你也可以做一个新的chroot。 它也是一个填充监狱,可以让你确切地定义根访问。

你可以将这些文件符号链接到一个web-root文件夹,半安全的htaccess(在你的php auth之上),编写一个脚本来改变它。然后你只需要在文件改变的时候重新启动nginx进程。

http://www.cyberciti.biz/faq/freebsd-configure-nginx-php-fastcgi-server/

你可以使用类似下面的内容来监视变化,当他们改变(发生变化)时向你发送电子邮件,并通过脚本重新启动nginx进程。

http://inotify-tools.sourceforge.net/

当你可以通过cron每分钟检测到它时,可能会过度杀伤..

想法1:使用木偶将更改引导到您的configuration文件。

如果您需要编辑这些文件,请尝试:创build一个编辑它自己的本地副本的PHP脚本。 然后这被检入到一个本地的SVN仓库。 然后使用svn-externals,你必须做的唯一的事情就是在nginxconfiguration文件(当然你已经签入了SVN)和你的设置中进行svn update

更新脚本可以在cron作业上运行。