通过PHP / Perl脚本作为Linux上的特权用户运行命令

时间:2010-05-12 20:30:58

标签: php linux perl cgi apache

背景:我正在为一家允许用户通过网络界面创建FTP帐户的公司编写脚本。在后台,脚本必须运行一堆命令:

  • 将用户添加到系统(useradd)
  • 打开并编辑各种文件
  • 通过sendmail邮寄用户

以及其他一些事情......

我基本上都在寻找最安全的方法。我听说过setuid方法,sudo方法,当然还有httpd作为特权用户运行。在执行任何命令之前,对当前输入的数据进行完整性检查(即用户名中只有字母数字字符)

流行脚本使用的方法是什么(例如webmin),因为它必须相当安全?

3 个答案:

答案 0 :(得分:5)

我会建立一个Web绑定脚本可以写入的队列。

然后我会从该队列中读取一些特权进程并采取适当的操作。您可以通过cron作业驱动命令行脚本,或者在PHP中编写一个小守护程序来检查队列,并且比cron允许的更频繁地完成工作。

这样,唯一可以运行特权的代码就是您的小工作脚本,并且您不需要为Web绑定脚本提供任何路径来获得必要但危险的权限。

答案 1 :(得分:2)

创建一个接受命令行选项,验证它并执行useradd的脚本。使用NOLOGIN指令将httpd的用户添加到sudoers文件中,JUST用于该过程。

这样,您不必担心编写一个始终以root权限运行的守护程序,并且您的脚本也会立即返回。如果您刚刚使用了setuid root脚本,则同一系统上的其他用户可以执行您的脚本(除非您检查了他们的真实用户ID)。

答案 2 :(得分:0)

我首先要说以root身份运行httpd是一个非常糟糕的主意。

执行此操作的最安全方法是在Web服务器UI和效应器之间实现完全权限分离 - 一种显而易见的方法是以root身份运行服务器,仅接受UI发送的本地连接它的请求(这样做的一个简单方法是通过inetd / xinetd - 这意味着你不必担心建立一个守护进程的所有复杂性。)

您还需要在UI和效应器之间使用某种信任机制 - 共享密钥就足够了 - 这样系统上的其他程序就无法调用效应器。使用依赖基于挑战的身份验证或非对称加密的信任系统意味着您不再需要担心本地连接约束。

最后,您需要一个定义良好的协议,UI和效应器通过该协议进行通信。

这比使用sudo要复杂得多,但更安全(例如sudo只允许用户将特定文件作为不同的uid执行 - 您希望该文件包含正确的程序)。

Setuid与sudo有许多相同的缺点,如果它启动了另一个程序(在大多数情况下)会增加复杂性 - 那么它将作为原始的uid。

HTH

下进行。