进程的用户身份

来源:互联网 发布:windows 无法访问指定 编辑:程序博客网 时间:2024/04/30 09:40
进程的用户身份
任何时候,每一个进程都有一组 用户ID 和一组 组ID 与之相连。


实际用户ID 和 实际组ID


通常 实际用户ID 和 实际组ID 由 login 程序在用户注册时设置并且不会发生改变。(login 开始运行时,它的用户ID 是 root 。随后 login 程序会将 实际用户ID 和 有效用户ID 设置为当前注册用户。)


有效用户ID 和 有效组ID


当 exec 系统调用所执行的文件设置了 调整用户ID 位时,exec 会改变进程的 有效用户ID 为文件拥有者的 用户ID 。我们可以在任何时候调用 setuid 设置 有效用户ID 为 实际用户ID 或者 保存的调整用户ID ,但不能设置 有效用户ID 为任意值(超级用户除外)。


有效用户ID 和 有效组ID 影响文件的创建和访问。文件创建期间,内核设置文件的拥有者为创建进程的 有效用户ID 和 有效组ID 。文件访问期间,内核使用进程的 有效用户ID 和 有效组ID 来判断它是否能够访问该文件。




保存的调整用户ID 和 保存的调整组ID


exec 执行文件时,会将 有效用户ID 和 有效组ID 复制到 保存的调整用户ID 和 保存的调整组ID 。另外,只有在支持 _POSIX_SAVED_IDS 特征的系统中才有 保存的调整用户ID 和 保存的调整组ID 。




附加组ID


由于一个用户可以属于多个组,因此,除了 有效组ID 外,进程还有 0 到 NGROUPS_MAX 个决定文件访问权限的 附加组ID 。


进程的 用户ID 和 组ID 在创建时从父进程继承而来。它们的值来自于口令文件 /etc/passwd 和 组文件 /etc/group ,或者另外的机制。也即来自于用户的用户ID和组ID,并且在 session 一开始就被设置。此后,它们被遗传给 session 内的每一个进程,默认值设置为 session leader 的用户ID和组ID,这即为 实际用户ID 和 实际组ID。由默认值,有效用户ID 和 有效组ID 在执行时被设置为 实际用户ID 和 实际组ID 。




获取进程用户身份


#include <unistd.h>


uid_t getuid(void);
uid_t geteuid(void);
gid_t getgid(void);
gid_t getegid(void);
gid_t getgroups(int count, gid_t groups[]);




getuid 返回实际用户ID,geteuid 返回有效用户ID 。
getgid 返回进程的实际组ID,getegid 返回进程的有效组ID。
getgroups 获取进程的当前附加组ID。


这几个函数只能得到实际ID和有效ID的当前值,得不到保存的调整ID值,保存的调整ID由系统掌管。




调整进程用户身份


进程并不能随意调整自己的身份,只有超级用户可以随意调整实际用户ID和有效用户ID。当进程的有效用户ID 被设置为所执行文件的用户ID 后,进程总是可以调整它的有效用户ID回到其实际ID 。




#include <unistd.h>


int setuid(uid_t uid);
int setgid(gid_t gid);
int setreuid(uid_t ruid, uid_t euid);
int setregid(uid_t rgid, uid_t egid);
int seteuid(uid_t uid);
int setegid(gid_t gid);


以上调用,成功返回0, 失败返回-1。关于各个函数的作用,见下表。

(※ setreuid 和 setregid 这两个函数用来交换 实际用户ID 和 有效用户ID。通常只在不支持 _POSIX_SAVED_IDS 特征的系统中使用这两个函数。)



原创粉丝点击