我有一个程序叫做 foo,它在执行时需要 root 权限。foo 需要能够由任何用户运行,并且可以位于任何路径。这个程序可以位于任何路径的原因是,我们公司正在开发程序 foo,并且每个用户在开发该程序时可能在某个个人目录中拥有该程序的个人版本。
我的问题是,处理此问题最安全的方法是什么?我一直在研究 sudoers 文件,基本上有两个想法。
1.) 在 sudoers 文件中列出程序可能存在的所有路径。这很成问题,因为它需要频繁编辑 sudoers 列表,并且仍然会带来安全风险,因为非 root 用户将拥有他们自己的 foo 副本,并可能将某些系统程序复制到 foo 上,然后以 root 身份使用它。
2.) 编写一个名为 start_foo 的脚本,该脚本对传递的程序执行一些输入验证,例如大小和名称,然后启动传递的 foo。start_foo 可以位于 /usr/bin 中,由 root 拥有,但任何人都可以运行。此选项仍然包含安全漏洞,即能够用另一个需要 root 的程序覆盖用户的 foo 程序,但希望大小检查能够发现一些恶意情况。
有没有我尚未找到或想到的“典型”方法来解决此问题?如果没有,上述哪种方法或其他解决方案是处理此问题的最佳方法?
谢谢!
答案1
处理这个问题最安全的方法可能是给每个开发人员一个自己的小型开发/测试环境,也许是一个虚拟机。这样,他们就只能破坏自己的开发实例。
答案2
一个显而易见且最安全的解决方案是创建一个新的特权守护程序应用程序,food
它处理您的foo
应用程序应以 root 身份执行的操作,然后foo
应用程序使用套接字(Unix、TCP)等进行通信food
。如果您的foo
应用程序受到攻击,攻击者只能与food
具有有限命令集的进行通信。
如果您信任您的同事,您可以将他们每个人都添加到 unix-group foodevel
,使用解决方案 2),然后仅允许执行foo
属于该组的程序。属于特定组的人可以chgrp
对文件发出命令,而其他人则不能。
此外,您可以检查 sUID 字节解决方案,而不是依赖 sudo。这可能不是每种编程语言都支持得很好,您需要了解一些有效权限(检查man seteuid
)。
答案3
也许使用chroot 监狱某种类型。可能根据应用程序运行所需的各种文件动态创建它们。
答案4
这会带来很大的问题,因为用户可以随时编辑脚本。即使文件是只读的,他们也拥有该文件所在目录的写入权限。
因此,你需要将 root-priv 脚本放在你控制的某个地方
你能做点类似的事情吗
/home/central/[scriptname] <---- 仅限 root 可写目录,其他人可读。您可以授予此目录 sudo 访问权限
然后 /home/[anyuser]/scriptname <--- 没有 sudo 访问
scriptname 是 /home/central/[scriptname] 的包装器
这会更好、更可行
/home/[anyuser]/scriptname 将会是这样的
#!/bin/bash
/home/central/[scriptname] $@ # pass all arguments