没有标记就谈不上WWW区分,没有区分就无从实施控制。本章介绍进程的标记,下一章介绍文件等客体的标记。
UNIX是诞生于20世纪70年代的分时多任务多用户操作系统。当时的场景是许多用户同时登录到一台主机,运行多个各自的进程。因此,很自然的,UNIX系统中进程的标记是基于用户的。在人类的世界中,人的标记是名字。相比字符串而言,计算机更擅长处理数字,UNIX使用一个整数来标记运行进程的用户,这个整数被称作user id,简写为uid。人通常被分组,比如这几个人做研发工作,被分到研发组,那几个人做销售工作,被分到销售组。UNIX用另一个整数来标记用户组,这个整数被称作group id,简写为gid。uid和gid是包括Linux在内的所有类UNIX操作系统的自主访问控制的基础。
下面看一下uid和gid是如何记录在内核的进程控制结构之中的:
Credential的中文意思为凭证或通行证,本书用凭证这个词。进程的凭证中存储有和访问控制相关的成员。从上面代码可见,进程的控制结构中有两个凭证,一个叫real_cred,另一个叫cred。在内核代码注释中将real_cred称为客体(objective)凭证,将cred称为主体(subjective)凭证。进程是主体,在某些场景下又是客体。典型的场景是进程间发信号,进程A向进程B发送信号,进程A是主体,进程B就是客体。在大多数情况下,主体凭证和客体凭证的值是相同的,但在某些情况下内核代码会修改当前进程的主体凭证,以获得某种访问权限,待执行完任务后再将主体凭证改回原值。
下面看一下凭证的数据结构:
源统计和资源分配中使用,比如限制某用户拥有的进程数量。
(2)euid
euid(effective uid)即有效uid。在内核做特权判断时使用它。它的引入和提升权限有关 [1] 。此外,内核在做ipc(进程间通信)和key(密钥)的访问控制时也使用euid。 (www.xing528.com)
(3)suid
suid是“saved set user id”。euid和特权有关,当euid为0时,进程就具有了超级用户的权限 [2] ,拥有了全部特权,在系统中没有做不了的事情。这有些危险。我们需要锋利的刀,但不用的时候希望把刀放入刀鞘。为了让进程不要总是具有全部特权,总能为所欲为,系统的设计者引入了suid,用于暂存euid的值。euid为0时做需要特权的操作,执行完操作,将0赋予suid,euid恢复为非0值,做普通的不需要特权的操作,需要特权时再将suid的值传给euid。
(4)fsuid
fsuid是“file system user id”。这个uid是Linux系统独有的。它用于在文件系统相关的访问控制中判断操作许可。
gid和uid类似,也有(r)gid、egid、sgid、fsgid。此外,多出了一个补充组id,Supplementary Group IDs。补充组id是一个数组,存有一组group id,因为一个用户可以属于多个组。补充组id也用于访问控制权限检查。这点与egid相同。可以这样理解:在涉及权限的检查中,要判断egid和补充组id中的每一个gid,涉及文件系统的操作还要加上fsgid,只要有一个判断的结果是允许访问就允许访问。
gid和uid的另一个区别是group id与特权无关。euid为0的进程具备全部特权 [3] 。egid或别的gid为0,进程不会因此而具备特权。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。