2011-06-03 25 views
6

我看到许多开源项目这样的逻辑:为什么很多服务器改变它的uid和gid,有什么好处?

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

我对此有2个问题:

  1. 什么的benifit切换到其它GID和UID?
  2. 什么是initgroups?海事组织,改变gid和uid,setuid()setgid()就足够了。

回答

4

大多数情况下,系统守护进程都是由init脚本产生的,因此运行时为root。调用setuid()setgid()可以让他们放弃其超级用户权限并冒充系统上的其他用户(通常远低于root)。这样,错误和安全漏洞对系统的致命性就会降低。

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

+0

@FrédéricHamidi,initgroups呢,为什么这里需要? – cpuer 2011-06-03 06:02:48

+0

@cpuer,如果还不是这样的话,可能会将该用户设置为该组的成员。看到我更新的答案。 – 2011-06-03 06:07:33

+0

但是当'setgid()'成功时,nginx调用'initgroups' .. – cpuer 2011-06-03 06:08:58

2

通常,您需要具有管理权限才能在端口1023和以下进行侦听。 (还有其他一些原因是以管理员身份开始的,但这是最重要的原因。)但事情是这样的:您可以以管理员身份启动,绑定套接字,然后下载成为用户。

现在,你为什么要成为一个用户?那么,如果你使用尽可能少的权限运行,并且你的程序受到了损害,那么这个损害将被包含在内。

+0

任何关于什么时候应该使用'initgroups'的说法? – cpuer 2011-06-03 06:11:49

+0

没有。对不起,我不是要问的人。 – 2011-06-03 06:13:13

0

对某些OS setgid()敬酒补充组。因此在setgid()之前调用initgroups()是无效的。

相关问题