为什么许多服务器改变其uid和gid,有什么好处?

时间:2011-06-03 05:54:11

标签: c security unix

我在许多开源项目中看到了这样的逻辑:

if (setuid() == 0) {
   if (setgid(ccf->group) == -1) {
   ...
   if (initgroups(ccf->username, ccf->group) == -1) {

我有两个问题:

  1. 改变另一个gid和uid有什么好处?
  2. 什么是initgroups? IMO,要改变gid和uid,setuid()setgid()就够了。

3 个答案:

答案 0 :(得分:4)

大多数情况下,系统守护进程由init脚本生成,因此以root运行。调用setuid()setgid()允许他们删除超级用户权限并模拟系统上的其他用户(通常远不如root强)。这样,错误和安全漏洞对系统的致命性降低。

关于问题的第二部分,调用initgroups()重新初始化组访问列表,并将ccf->group添加到ccf->username所属的组列表中。这可能是因为调用setgid()不足以将与新组关联的访问权限传播到流程。

答案 1 :(得分:2)

通常,您需要管理权限才能侦听端口1023及以下。 (还有其他原因以管理员身份启动,但这是最重要的原因。)但事情就是这样:你可以以管理员身份启动,绑定套接字,然后下拉成为用户。

现在,您为什么想成为一名用户?好吧,如果您以尽可能少的权限运行,并且您的程序受到损害,那么损害将被包含。

答案 2 :(得分:0)

在某些操作系统setgid()上为补充组提供祝酒。在 initgroups()之前调用setgid() 因此无效。