我正在编写一个应用程序,该应用程序创建在其他用户凭据下运行的工作进程。该程序在 root 下运行。但是,我想在权限较低的帐户下运行它。
有什么方法可以授予用户帐户为其创建的进程分配 UID、GID 的权限吗?
换句话说,是否有办法限制/授予用户对某些系统调用的权限?谢谢!
答案1
赋予进程更改其 UID 的权利相当于赋予其以 root 身份运行的权利,因为它只能将其 UID 更改为 root。所以即使你这么做了,也没有任何好处。
您可以通过降低程序被欺骗以 root 身份执行某些意外操作的风险来提高此设置的安全性。这不会减少完全妥协的影响(如果攻击者能够使您的程序运行任意代码),但它可以减少部分妥协的影响(攻击者只能说服您的程序执行某些操作)具体的事情,例如读取文件并显示它)。为了降低风险,请减少程序以 root 身份运行的时间窗口。让它以专用用户身份运行,但保持其真实UID设置为0。当程序需要root时,它会暂时将其有效UID切换为0,然后再切换回来。
请注意,这在多线程程序中并不实际,因为用户 ID 是针对整个进程的,而不是针对每个线程的。
为了获得更好的稳健性和安全性,请实施权限分离:将程序分为两个进程,一个以 root 身份运行,另一个以专用用户身份运行。以 root 身份运行的进程应该尽可能少地执行操作。它接受来自其他进程的请求,尽可能验证它们,然后执行它们。然后,即使其他进程有错误,它最多只能发出有效的请求。
对于简单的需求,您可以使用 sudo 规则直接允许主程序以第三用户身份运行命令,而不是编写以 root 身份运行的程序。您可以将验证嵌入 sudo 规则中,而不是依赖中间根程序来执行验证,例如
myapp_user ALL = (ALL:ALL) validate_and_run
这允许myapp_user
以任何用户身份运行命令,但命令必须是validate_and_run
(带有任何参数)。