2010-05-12 77 views
7

背景:我正在为允许用户通过Web界面创建FTP帐户的公司编写脚本。在此背景下,脚本必须运行一串命令:通过PHP/Perl脚本在Linux上作为特权用户运行命令

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

和其他一些东西...

我基本上是寻找最安全的这样做的方式。我听说过setuid方法,sudo方法,当然还有,运行httpd作为priviledged用户。在执行任何命令之前,将对输入的数据进行健全性检查(即,仅用户名中的字母数字字符)

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

回答

5

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

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

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

+0

与此唯一的问题是:1)我需要立即创建帐户,我不能等待cron的......这将导致2)我不想每分钟运行一次cron,不会给服务器带来很大的压力吗? – jtd 2010-05-12 20:45:05

+0

这就是为什么另一种选择是编写监视队列并立即执行操作的守护进程(后台进程)的原因。只要你没有使用共享主机(这听起来像你不是,如果你添加用户),这可能是可行的。 – 2010-05-12 21:01:39

+0

对,有很多方法可以去做。如果可以等待一分钟,每分钟cron都可以。它不会对服务器造成任何可观的负载 - 大部分时间,它只会看到队列是空的并退出。我可能会写一个守护进程,每隔一秒钟检查队列。出于您的目的,单进程,非线程守护进程就足够了。唯一的缺点是你现在需要确保守护进程总是运行 - 但这很容易解决。 – timdev 2010-05-12 21:06:01

2

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

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

0

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

最安全的方式来做到这一点是有Web服务器UI与效应之间的完全权限分离 - 这样做的一个显而易见的方法是运行一个服务器作为根接受本地连接仅在UI发送其请求(一个简单的方法是通过inetd/xinetd - 这意味着您不必担心建立守护进程的所有复杂问题)。

您还需要UI和效果器之间的某种信任机制 - 共享秘密就足够了 - 这样系统上的其他程序就不能调用效果器。使用依赖基于挑战的授权或非对称加密的信任系统意味着您不再需要担心本地连接限制。

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

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

设置uid有很多相同的缺点与增加的并发症,(在大多数情况下),如果它开始另一个程序使用sudo的 - 那么它也会这样做原来的UID。

HTH

C.