【问题标题】:Running commands though PHP/Perl scripts as a priviledged user on Linux在 Linux 上以特权用户身份通过​​ PHP/Perl 脚本运行命令
【发布时间】:2011-02-18 20:01:41
【问题描述】:

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

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

还有一些其他的......

我基本上是在寻找最安全的方法来做到这一点。我听说过 setuid 方法、sudo 方法,当然还有以特权用户身份运行 httpd。在执行任何命令之前,当然会对输入的数据进行完整性检查(即用户名中只有字母数字字符)

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

【问题讨论】:

    标签: php linux perl cgi apache


    【解决方案1】:

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

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

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

    【讨论】:

    • 唯一的问题是:1)我需要立即创建帐户,我等不及 cron... 这导致 2)我不想每分钟都运行 cron ,这不会给服务器带来很大压力吗?
    • 这就是为什么另一个选项是编写一个监视队列并立即执行操作的守护进程(后台进程)。只要您不使用共享主机(如果您正在添加用户,听起来好像不是),这可能是可行的。
    • 是的,有很多方法可以做到这一点。如果可以接受最多等待一分钟,那么每分钟一次的 cron 就可以了。它不会给服务器带来任何明显的负载——大多数时候,它只会看到队列为空并退出。我可能只是写一个小守护进程,每隔一秒左右检查一次队列。出于您的目的,一个单进程、非线程的守护进程就足够了。唯一的缺点是你现在需要确保你的守护进程一直在运行——但这很容易解决。
    • 编写守护进程的更有效方法是将队列设置为命名管道,并在管道的文件描述符上使用守护进程select。这样,它只会在有数据要从队列中读取时运行,并且几乎会在新数据出现时立即运行。
    【解决方案2】:

    创建一个接受命令行选项的脚本,对其进行验证,然后执行 useradd。使用 NOLOGIN 指令将您的 httpd 用户添加到 sudoers 文件中,仅针对该一个进程。

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

    【讨论】:

      【解决方案3】:

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

      最安全的方法是在网络服务器 UI 和效应器之间实现完全的权限分离 - 一种明显的方法是以 root 身份运行服务器,只接受 UI 发送的本地连接它的请求(一种简单的方法是通过inetd/xinetd - 这意味着您不必为建立守护进程的所有复杂性而烦恼)。

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

      最后,您需要一个定义明确的协议,用户界面和效果器通过该协议进行通信。

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

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

      HTH

      C.

      【讨论】:

        猜你喜欢
        • 2012-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        • 2013-07-31
        • 2013-09-17
        相关资源
        最近更新 更多