背景 :我正在为一家公司编写一个脚本,允许用户通过Web界面创buildFTP帐户。 在后台,脚本必须运行一堆命令:
和其他一些事情…
我基本上正在寻找这样做的最安全的方式。 我听说过setuid方法,sudo方法,当然,运行httpd作为priviledged用户。 在执行任何命令之前,将对input的数据进行健全性检查(即,只有用户名中的字母数字字符)
那里stream行的脚本(例如webmin)使用什么方法,因为它必须相当安全?
我将设置一个Web绑定脚本可以写入的队列。
然后,我会从该队列中读取一些特权进程并采取适当的措施。 你可以通过cron作业来驱动一个命令行脚本,或者在PHP中写一个守护进程来检查队列,并且比cron允许的更频繁地执行工作。
这样,唯一可以运行特权的代码是你的小工作者脚本,并且你不需要为web绑定脚本提供任何路径来获得必要但危险的特权。
创建一个接受命令行选项的脚本,验证它,并执行useradd。 使用NOLOGIN指令将你的httpd的用户添加到sudoers文件,只要这一个进程。
这样,您不必担心编写一个始终以root权限运行的守护程序,并且您的脚本也会立即返回。 如果您只是使用setuid根脚本,则同一系统上的其他用户可以执行您的脚本(除非您检查了他们的真实用户标识)。
我会开始说,以root身份运行httpd是一个非常糟糕的主意。
最安全的方法是在Web服务器UI和效果器之间完全分离权限 – 一种明显的方法是以root用户身份运行服务器,只接受UI发送请求的本地连接(这是一个简单的方法是通过inetd / xinetd – 这意味着你不必担心建立一个守护进程的所有复杂性)。
你还需要UI和效果器之间的某种信任机制 – 共享的秘密就足够了 – 这样系统上的其他程序就不能调用效果器。 使用依赖基于挑战的授权或非对称加密的信任系统意味着您不再需要担心本地连接限制。
最后,你需要一个明确的协议,用户界面和效应器通信。
这比使用sudo复杂得多,但是更安全(例如,sudo只允许用户执行特定的文件作为不同的uid – 你希望文件包含正确的程序)。
Setuid有许多与sudo相同的缺点,如果它启动另外一个程序,会增加复杂性(在大多数情况下),然后它会像原来的uid那样执行。
HTH
C。