进程的用户身份
来源:互联网 发布: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。关于各个函数的作用,见下表。
任何时候,每一个进程都有一组 用户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 特征的系统中使用这两个函数。)
- 进程的用户身份
- 进程的用户和用户组身份
- 如何从 Visual Basic 的另一个用户身份启动进程
- LINUX用户身份的识别
- 多服务器的用户身份认证方案
- 多服务器的用户身份认证方案
- 27.2 基于数字证书的用户身份认证
- SYSOPER身份用户的权限限制
- 多服务器的用户身份认证方案
- linux的用户帐号和身份
- 用户身份的切换su | sudo小结
- 基于FormsAuthentication的用户、角色身份认证
- TODO:小程序的用户身份
- 基于FormsAuthentication的用户、角色身份认证
- 基于FormsAuthentication的用户、角色身份认证
- 基于FormsAuthentication的用户、角色身份认证
- ASP.NET工作进程的安全性身份
- paip.提升用户体验---确认用户身份的方法
- Unity3D研究院之与Android相互传递消息(十九)
- Cannot open precompiled header file: 预编译头文件
- asp.net页面加载执行顺序
- 终于会用sql server中的With了,超简单,超方便!(原创总结)
- 使用IO流的规律总结:
- 进程的用户身份
- Copy binary文件到开发板
- 重读<Understanding The Linux Virtual Memory Manager>笔记
- 黑马程序员_IO类_File类的学习
- [转]Android的Handler总结
- 编程好习惯
- 11g GRID root不成功重做的方法
- C++内存管理
- hibernate_part2_1