linux系统进程凭证:user ID和group ID概念详解
1 实际用户ID(real user ID)和实际组ID(real group ID)
- 实际用户ID和实际组ID确定了进程所属的用户或者组,登录shell从/etcpasswd下读取相应用户密码记录的第三或者第四字段,置为实际用户ID和实际组ID,子进程会从父进程那里继承这些ID
2 有效用户ID(effective user ID)和有效组ID(effetive ID)
- 进程在尝试各种操作时候,将结合有效用户ID、有效组ID、连同辅助ID一起来确定授予进程的权限,例如当进程访问某个文件,此类ID会决定系统授予进程的权限,而这些资源的属主的权限则与另外的与之相关的用户ID或者组ID来决定
- 有效用户ID为0的进程拥有超级用户的权限,这样的进程称为特权级进程
3 Set-User-ID 和Set-Group-ID 程序
-
x对应的位置(执行位)还可能是其它字符。比如,user或group的执行位若为s,表示该文件的set-user-id或者set-group-id(这两种id下文会着重介绍)和执行权限x被同时置位;若为S,则表示set-user-id或set-group-id被置位,而执行权限x不被置位
-
一个用户,有两个id:user-id和group-id。user-id对于一个用户唯一的,但一个用户可以隶属于多个不同的group,但默认的组只有一个,这里的默认是指这个用户创建的文件默认隶属的组。这里说的group-id即为默认组id
-
相对于下面要介绍的effective-user-id和effective-group-id,上面的user-id和group-id确切地说是real-user-id和real-group-id。这两个id被保存在/etc/passwd文件中,创建用户时被写入,每当用户登录时由登录程序来读取该文件,并设定相应用户的id,OS以用户的用户id和组id来判断你是否具有相应的权限来执行特定的操作
-
effective-user-id和effective-group-id,是针对可执行文件来说的,通常一个被执行的程序(进程)的effective-user-id和effective-group-id与real-user-id和real-group-id是相同的,都等于执行该程序的用户的user-id和group-id,不管该程序文件本身属于哪个用户。但当该程序文件的set-user-id或者set-group-id被置位时,该程序进程的effective-user-id或effective-group-id就是该程序文件属主的real-user-id或real-group-id,而不是执行该进程的用户的real-user-id或real-group-id
-
那么,effective-user-id和effective-group-id有什么作用呢?
在一个进程试图去访问一种资源时,比如读、写某个文件,OS(内核)会判断此进程对该文件是否具有相应的权限,判断的依据就是上面介绍的文件的权限访问位。那么,OS是拿进程的real*id,即执行该程序的用户的id来判断呢,还是拿进程的可执行文件的属主的id来判断呢?答案是,拿进程的effective-user-id和effective-group-id来判断,而effective-user-id和effective-group-id与set-user-id和set-group-id有关 -
举例来说,/etc/passwd文件保存了系统中用户的基本信息(早期的Unix中,甚至直接将用户密码保存在该文件中),它的属主是root用户,普通用户对该文件只有读权限。但系统又需要允许用户修改自己的信息,这样就提供了相应的命令,例如passwd命令。这个命令的可执行文件的属主为root用户,为了普通用户也能够通过passwd命令修改密码,这个命令的set-user-id就被置位了,当普通用户执行该命令的时候,passwd的有效ID就变成passwd这个可执行文件属主的UID和GID了,也就拥有了root特权了
-
-rwsr-xr-x 1 root root 37K 2010-01-27 01:09 /usr/bin/passwd
-
注意,由于现在用户密码已经不再直接保存在/etc/passwd中了,因此passwd命令可能不再修改该文件,而该文件肯定也是不允许root之外的用户(准确说是不具有超级权限的用户)修改的。事实上,真正保存密码的文是/etc/shadow,而这个文件的权限位为0640
-
因此该权限只能设置在所属者或者所属组位置上
-
非特权用户可以对其拥有的文件进行设置,特权用户可以对任何文件设置
-
举例:
-
chmod 7777 a.out
-
-
最前面的那一个:
- 4 Set-User-ID 2 Set-Group-ID 1
- 所以当最前是7的时候,会设置所有者、所属组的相应位子,以及其他人的黏贴位
4 Save Set-User-ID 和Save Set-Group-ID
-
Save Set-User-ID 和Save Set-Group-ID的值由对应进程的有效SUID和SGID复制而来,无论正在执行的文件是否设置了SUID和SGID的相应位
-
举例:
-
某个程序的实际用户ID、有效用户ID和保存SUID为1000,当其执行了root的SUID程序,进程的用户ID变化:
real = 1000 effective = 0 save = 0
-
-
因此许多系统调用允许讲进程的有效用户ID在实际用户ID和save SUID之间切换,提高程序的灵活性
5 Sticky位
- other的执行为如果为t,表示该文件的粘滞位(sticky bit)和x均被置位;若为T,则表示只有粘滞位被置位
- 粘滞位如果被置位,而且该文件为可执行文件,则当文件被执行时,其文本段(.text段,即代码段)会被加载到swap中,程序结束时仍然保留在swap,当下次执行该文件时,将直接从swap中加载,由于swap在磁盘中为连续的block,因此加载速度会提高
- 粘滞位如果被置位,而且该文件为目录文件,表明非特权用户具有该目录的写权限,并且为该目录下某一个文件的属主的时候,才能对文件进行删除、重命名操作,具有CAP_FOWNER(特权用户,一般是root)的能力的进程可以免去对属主的检查,这样多个用户可以共享某个文件,但是只有属于自己的文件才删除,其它文件则不能