2.10 进程的安全上下文
一个对象操作另一个对象时通常要做安全性检查,例如进程操作一个文件,要检查进程是否有权限操作该文件。一个对象访问另一个对象,前者称为主体,后者称为客体。
证书是访问对象所需权限的抽象,主体提供自己权限的证书,客体提供访问自己所需权限的证书,根据主客体提供的证书和操作做安全性检查。
证书用数据结构cred表示,进程描述符有两个成员和证书有关:
include/linux/sched.h struct task_struct { … /* 主体和真实客体进程证书*/ const struct cred __rcu *real_cred; /* 有效客体进程证书*/ const struct cred __rcu *cred; … };
成员real_cred指向主体和真实客体证书,cred指向有效客体证书。通常情况下,cred和real_cred指向相同的证书,但是cred可能被临时修改为指向另一个证书。
证书包含的用户标识符和组标识符如表2.12所示。
表2.12 证书包含的用户标识符和组标识符
真实用户标识符和真实组标识符:标识了进程属于哪一个用户和哪一个组,即登录时使用的用户标识符和用户所属的第一个组标识符。
有效用户标识符和有效组标识符:用来确定进程是否有权限访问共享资源,和大多数UNIX系统不同的是,访问文件时Linux使用文件系统标识符和文件系统组标识符。
通常情况下,有效用户标识符和真实用户标识符相同,有效组标识符和真实组标识符相同。但是,如果为可执行文件设置了set-user-ID模式位,那么在创建进程的时候,进程的有效用户标识符等于可执行文件的用户标识符;如果为可执行文件设置了set-group-ID模式位,那么在创建进程的时候,进程的有效组标识符等于可执行文件的组标识符。
保存用户标识符和保存组标识符:用来保存可执行文件的用户标识符和组标识符。如果为可执行文件设置了set-user-ID模式位,进程的有效用户标识符可以在真实用户标识符和保存用户标识符之间切换;如果为可执行文件设置了set-group-ID模式位,进程的有效组标识符可以在真实用户标识符和保存组标识符之间切换。
文件系统用户标识符和文件系统组标识符:它们是Linux私有的,和附加组标识符一起用来确定进程是否有权限访问文件。通常情况下,文件系统用户标识符和有效用户标识符相同,文件系统组标识符和有效组标识符相同。进程可以调用setfsuid以设置和有效用户标识符不同的文件系统用户标识符,调用setfsgid以设置和有效组标识符不同的文件系统组标识符。
附加组标识符(supplementary group IDs):访问文件和其他共享资源时用来检查权限的附加组标识符的集合。进程可以调用getgroups以读取附加组标识符的集合,可以调用setgroups以修改附加组标识符的集合。