如何从root暂时删除权限?

jas*_*lip 7 c linux

我正在开发一个以root身份运行的守护进程,但需要与用户调用API,我检查了API代码,它用于getuid()获取用户.

如果root用户删除了特权setuid(),则无法将其恢复为root.如果调用seteuid(),API仍将以用户身份执行操作uid=0.

我认为在访问子进程中的API和setuid之前的fork应该可行,但即使COW,如果多次调用API也会花费很多.除了使用进程池之外,是否可以解决问题?

Iha*_*imi 8

是! 创建一个进程以使用适当的UID调用API,并通过管道,UNIX域套接字或(共享内存)1与程序的其余部分进行通信.

我的意思是,只分叉一次并让特权用户运行另一个进程.然后根据需要在需要时创建两者之间的通信.此外,您可能需要考虑使用dbus,因为它还与systemd和现代Linux 完美集成,您希望您的守护进程能够很好地与两者进行交互.

注意:我绝不是这方面的专家,但这是一个简单的想法,对我来说似乎很清楚.您无需为每次调用API创建进程.这是XY问题的一个很好的例子,你要解决的真正问题与避免fork()多次无关,因为这样做的想法是错误的解决方案.您只需要fork()一次,删除权限并在没有权限的情况下留在那里,如果需要,可以与父进程通信.


1 适用于您的任何IPC机制.

  • 这是一种有效的方法,除了*dbus*.如果可能,请使用[套接字对](http://man7.org/linux/man-pages/man2/socketpair.2.html),以便从第三方获得连接.(原始进程仍然具有root权限,我们不希望它被洪水或伪造的消息利用.)我个人使用了很多次,但更重要的是,其他人也是如此.最常用的例子可能是Apache [mod_cgid](https://httpd.apache.org/docs/2.4/mod/mod_cgid.html)和[mod_fcgid](https://httpd.apache.org/mod_fcgid/)模块. (2认同)