我需要以root身份运行一个Perl cgi。 我已经理解了这样做的大部分安全问题,但请先解释一下。
Perl cgi可以作为Web服务器运行,但需要sudo访问才能运行一些命令。 这是我先做的,但这不仅允许cgi运行这些命令,而且整个用户都运行Web服务器。 此外,我宁愿使用比运行外部命令更快的本机库,而不是使用sudo运行命令。但是,这些本机库需要对某些操作进行root访问。
所以我想到的是以root身份运行这一个单独的cgi(还没有真正找到它,这是我现在的主要问题)。 我在Perl cgi中要做的第一件事就是更改有效的uid $> / gid $)给非特权用户,当我需要调用一个需要root访问权限的本机库时,只将其更改回root,然后将其更改回非特权用户。
到目前为止,你对这个想法有什么意见吗?
回到主要问题:如何让cgi以root身份运行? 我看了一下suexec,但它似乎不允许root 无法在Perl脚本上使用setuid 在这里寻找一些帮助/想法
致以最诚挚的问候,
Yannick Bergeron
答案 0 :(得分:2)
我可能会尝试调查两个选项中的一个,两者都非常相似。
第一个是工作引擎。您的CGI除了将请求发布到引擎队列之外什么都不做。客户会回来调查结果。如果已经设置了这样的异步队列,则运行良好。引擎本身将以root身份运行以便能够运行请求。当然,请求不包括要运行的实际命令 - 安全性仍然是一个重要的要求。
第二个选项是守护进程。它会侦听内部端口(可能只在localhost适配器上),并接收请求。然后它将返回连接上的结果。如果您的CGI和守护进程都在perl中,您甚至可以通过Storable进行序列化,尽管我通常更喜欢JSON - 它并不总是比Storable大,而且它通常不会更大比可存储的。但它快速,安全,并且无需修改即可进行合理的跟踪,也可以根据您的需要不经修改而发送回客户端。
同样,安全性 - 您不会发送命令来运行或SQL短语,您发送请求和参数。但这和你的CGI代码一样。
这两个选项都需要额外的流程(或更多)。但是它们也避免了很多开销 - 每次都不需要重新初始化C运行时库,每次都不需要重新编译perl代码等等,并且它们会处理外部特权你的CGI代码。