在 Apache 服务器上通过 cgi 启动根级进程的最安全方法是什么?

Mar*_*ver 3 python root setuid cgi apache-2.2

问题:我有一个脚本,它以 root 身份通过 cron 作业定期运行,但我想给人们一种通过网页异步启动它的方法。(将编写脚本以确保它不会运行重叠实例等。)

我不需要用户登录或拥有帐户,他们只需单击一个按钮,如果脚本准备好运行,它就会运行。用户可以为脚本选择参数(作为输入进行了大量过滤),但为简单起见,我们会说他们只有选择按下的按钮。

作为一个简单的测试,我在 cgi-bin 中创建了一个 Python 脚本。chown-ing 到 root:root 然后对它应用 "chmod ug+" 没有得到预期的结果:它仍然认为它具有网络服务器帐户的有效组......据我所知,这不是允许。

我读到用编译的 cgi 程序包装它可以完成这项工作,所以我创建了一个 C 包装器来调用我的脚本(它的权限恢复到正常)并给可执行文件根权限和 setuid 位。行得通……脚本运行起来就像 root 运行它一样。

我的主要问题是,这是否正常(需要二进制包装器来完成工作),这是安全的方法吗?它不是面向世界的,但我仍然想学习最佳实践。

更广泛地说,我经常想知道为什么编译后的二进制文件在实践中比脚本更“可信”?我认为你会信任一个人类可读的文件,而不是一个神秘的二进制文件。如果攻击者可以编辑文件,那么您就已经有麻烦了,如果是您无法轻松检查的文件,则更是如此。简而言之,我希望它在此基础上反过来。你的意见?

Sve*_*ven 6

另一个答案,因为这是一种完全不同(而且更通用)的方法。有人可能会争辩说这是做这些事情的规范方式:)

将您的 apache 用户(无论它如何命名,我假设www-data)放入sudoers 文件(带有visudo),其中包含一个非常特定的行,该行允许他仅从yourscript.py本地机器(hostname)运行,而无需密码。像这样的东西:

www-data hostname=(root)NOPASSWD:/path/to/yourscript.py
Run Code Online (Sandbox Code Playgroud)

然后,您的 CGI 脚本可以通过调用sudo /path/to/yourscript.py.

当然,您必须额外确保您可能用于此脚本的参数完全限于允许的值 - 最好是来自 cgi 包装器脚本和yourscript.py.