日期:2014-05-16  浏览次数:20771 次

掌握Linux之实际用户ID 有效的用户ID 保存的设置用户ID
Linux通过进程的 实际用户ID/实际组ID,有效用户ID/有效组ID/附加组ID,保存的设置用户ID/保存的设置组ID 
来控制进程对资源的访问。 

其中,实际用户ID/实际组ID标识进程究竟是谁(即是进程在系统的唯一标识) 
      有效用户ID/有效组ID/附加组ID决定了进程的访问权限 
      保存的设置用户ID/保存的设置组ID在执行一个程序时包含了有效用户ID和有效组ID的副本 

通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID 
但是可以在文件模式字(st_mode)中设置一个特殊标志(如S_ISUID,S_ISGID)来实现"当执行该程序文件时,将进 
程的有效用户ID设置为程序文件所有者的用户ID(s_uid)"(组也一样) 

在文件模式字s_mode中这两位S_ISUID,S_ISGID被称为设置用户ID位和设置组ID位 

当程序需要增加特权以访问当前不允许访问的资源时,我们需要更换程序的用户ID或组ID,使新ID具有合适的特权 
或者访问权限。 
Linux系统提供了setuid/setgid(unistd.h)来设置用户ID.这种设置必须遵循一下规则: 
1.若进程具有超级用户权限,则setuid(uid)将实际用户ID,有效用户ID,以及保存的设置用户ID设置为uid 
2.若进程没有超级用户特权,但是uid等于实际用户ID或保存的设置用户ID,则setuid(uid)将有效的用户ID设置为 
  uid 
3.如果以上两个条件都不满足,则将errno设置为EPERM,并返回-1 
关于内核所维护的三个用户ID,还需注意一下几点: 
1.只有超级用户进程可以改变实际用户ID。实际的用户ID通常在登陆时由login程序设置 
2.仅当对程序文件设置了设置用户ID位时,exec函数才会设置有效用户ID,如果设置用户ID位没有设置,则exec函 
  数不会改变有效用户ID,而将其维持为原先值。任何时候都可以调用setuid(uid)将有效用户ID设置为实际用户 
  ID或者保存的设置用户ID。但不能将有效的用户ID设置为任意值(前面的规则约束) 

3.保存的设置用户ID是由exec复制有效用户ID而得来的 


未完待续,分析一个实际例子