对《unix高级环境编程》书里面提到的关于用户ID的内容进行了一下总结,同时在文章后面画了一个图,便于自己记忆。
1、与每个进程相关联的用户ID和组ID
实际用户ID 实际组ID | 我们实际上是谁 |
有效用户ID 有效组ID 附加组ID | 用于文件访问权限检查 |
保存的设置用户ID 保存的设置组ID | 由exec函数保存 |
(1)实际用户ID和实际组ID标识我们究竟是谁。这两个字段在登录时取自口令文件中的登录项。
(2)有效用户ID,有效组ID以及附加组ID决定了我们的文件访问权限。
(3)保存的设置用户ID和保存的设置组ID在执行一个程序时包含了有效用户ID和有效组ID的副本。
2、 口令文件/etc/passwd的pw_uid和pw_gid字段,这两个值是系统管理员在确定一个用户的登录名的同时确定的,用户不能更改其用户ID,通过每个用户有一个唯一的用户ID。组ID的设立允许同一个组内的成员之间共享资源。
root用户的实际用户ID和实际组ID是0,非系统用户的ID从500开始
3、附加组ID:附加组ID是指一个用户属于的另外的组
4、文件访问权限:进程每次打开、创建或删除一个文件时,内核就进行文件访问权限测试,而这种测试可能涉及文件的所有者(st_uid和st_gid)、进程的有效ID(有效用户ID和有效组ID)以及进程的附加组ID(若支持的话)。两个所有者ID是文件的性质,而两个有效ID和附加组ID则是进程的性质。内核进行测试的步骤如下:依次查看
进程的有效用户ID是0(超级用户)->进程的有效用户ID等于文件的所有者ID(进程拥有此文件)->进程的有效组ID或进程的附加组ID之一等于文件的组ID->其他用户适当的访问权限位被设置
新文件的用户ID设置为进程的有效用户ID。组ID分两种:
(1) 新文件的组ID可以是进程的有效组ID
(2) 新文件的组ID可以是它所在的目录的组ID
5、获取口令文件信息的函数:
struct passwd *getpwuid(uid)和函数structpasswd *getpwnam(const char*name)分别通过uid和用户登录名获取口令文件的信息。其中,在键入登录名时,getpwnam函数由login程序使用。
6、 更改用户ID和组ID
当执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID通常是实际组ID。但是可以在文件模式字(st_mode)中设置一个特殊标志,其含义是“当执行此文件时,将进程的的有效用户ID设置为文件所有者的用户ID(st_uid)”。(passwd命令)可以调用函数setuid(uid)进行修改用户ID
注意:如果一个进程正以特殊的权限(设置用户ID或设置组ID)运行,它又想生出另一个进程执行另一个程序,则它应该直接使用fork和exec,而且在fork之后,exec之前要改回到普通权限。设置用户ID或者设置组ID程序决不应调用system函数。