9.Linux/Unix 系统编程手册(上) -- 进程凭证
原本默认 1.进程凭证每个进程都有一套数字表示的用户ID(uid)和组ID(gid)。有时,也将这些ID称之为进程凭证。具体如下:1.实际用户ID(read user ID)和实际组ID(real group ID)实际用户ID 和 实际用户组ID 确定了进程所属的用户和组。作为登录过程的步骤之一,登录 shell 从 /etc/passwd 文件中读取相应用户密码记录的第三个和第四个字段,置为其实际用户ID 和 实际组 ID.当创建新进程时,将从其父进程继承这一属性。2.有效用户ID(effective user ID)和有效组ID(effective group ID)当进程尝试各种操作(系统调用)时,将结合有效用户ID, 有效组ID,连同辅助ID 一起来确定授予进程的权限。例如,当进程访问诸如文件,System V 进程间通信(IPC) 对象之类的系统资源时,此类 ID 会决定系统授予进程的权限,而这些资源的属主则令由与之相关联的用户 ID 和 组ID 来决定。内核会使用有效用户ID 来决定一个进程是否能向另外一个进程发送信号。有效用户ID为0(root 用户ID)的进程拥有超级用户的所有权限。这样的进程又称之为特权级进程(privileged process)。而某些系统调用只能由特权级进程执行。通常,有效用户ID及组ID 与其相应的实际ID 相等,但有2种方法能够致使二者不相等,其一就是9.7讨论的系统调用,其二就是执行 set-user-ID 和 set-group-ID 程序.3.保存的 set-user-ID(saved set-user-ID)和保存的 set-group-ID(saved set-group-ID)set-user-ID 程序会将进程的有效用户ID置为可执行文件的用户ID(属主), 从而获得常规情况下不具有的权限。与其他文件一样,可执行文件的用户ID和组ID决定了该文件的所有权。另外,可执行文件还拥有两个特别的权限位set-user-ID 和 set-group-ID。可使用 chmod 命令来设置。chmod u+s 文件名chmod g+s 文件名当运行set-user-ID 程序时,内核会将进程的有效用户ID设置为可执行文件的用户ID。通过这种方法修改进程的有效用户ID或者组ID,能够使进程获得常规情况下所不具备的权限。也可以利用程序的 set-user-ID 和 set-group-ID 机制,将进程的有效ID改为 root 之外的其他用户。例如,为提供对一个受保护文件的访问,采用如下方案就绰绰有余:创建一个具有对该文件访问权限的专用用户ID,然后再创建一个 set-user-ID 程序,将进程有效用户ID变更为这个专用ID。这样,就无需拥有超级用户的所有权限,程序就能访问该文件了。若可执行文件的 set-user-ID 权限位已开启,则将进程的有效用户ID置为可执行文件的属主。若未设置set-user-ID 权限位,则进程的有效用户ID保持不变。保存set-user-ID 和保存 set-group-ID 的值由对应的有效ID 复制而来。无论正在执行的文件是否设置了 set-user-ID 或者set-group-ID权限位,这一复制都将进行。只要 set-user-ID 和 set-group-ID 程序没有执行与特权级ID相关的任何操作,就应将其置于非特权ID 的身份之下。4.文件系统用户ID(file-system user ID)和文件系统ID(file-system group ID)(Linux专用)在Linux 系统中,要进行诸如打开文件,改变文件属主,修改文件权限之类的文件系统操作时,决定其操作权限的是文件系统用户ID和组ID。通常,文件系统用户ID和组ID 等同于相应的有效用户ID和组ID。此外,只要有效用户或组ID发生了变化,无论是通过系统调用,还是 set-user-ID 程序,则相应的文件系统ID也将随之改变为同一值。只有用 setfsuid(),setfsgid() ,才可以刻意制造出文件系统ID与相应有效ID的不同。5.辅助组ID辅助组ID用于标识进程所属的若干附加的组。新进程从其父进程处继承这些ID,登录shell从系统组文件中获取其辅助的组ID。这些ID与有效ID以及文件系统ID相结合,就能决定对文件,System V IPC 对象和其他系统资源的访问权限。2.获取和设置进程凭证1.修改有效ID,也可能修改实际用户ID和保存用户ID进程使用 setuid()和 setgid() 系统调用能够对其凭证做哪些修改呢?其规则取决于进程是否拥有特权(即有效用户ID 为0)。适用于setuid()系统调用的规则如下:1.当非特权进程调用 setuid() 时,仅能修改进程的有效用户ID.而且,仅能将有效用户ID修改成相应的实际用户ID或保存 set-user-ID。这意味着,对非特权用户而言,仅当执行 set-user-ID 程序时,setuid() 系统调用才起作用,因为当执行普通程序时,进程的实际用户ID,有效用户ID,和保存 set-user-ID三者之间均相等。2.当特权进程以一个非0参数调用 setuid() 时,其实际用户ID,有效用户ID和保存 set-user-ID 均被置为 uid 参数所指定的值。这一操作是单向的,一旦特权进程以此方式修改了其ID,那么所有特权都将丢失,且之后也不能再使用 setuid() 调用将有效用户ID重置为0.如果不希望发生这种情况,请使用稍后的 seteuid()或者 setreuid()替换setuid()。使用 setgid() 系统调用修改组 ID 的规则与之类似,仅需要把 setuid() 替换为 setgid(),把用户替换为组。因之,规则1与之前完全一致。但在规则2中,由于对组ID的修改不会引起进程特权的丢失(拥有特权与否由有效用户ID 决定),特权级程序可以使用 setgid()对组ID进行任意修改。2.修改有效用户ID seteuid():1.非特权级进程仅能将其有效ID修改为相应的实际 ID或者保存设置ID.2.特权级进程能将其有效ID修改为任意值。若特权进程使用 seteuid()将其有效用户ID修改为非0,那么此进程将不再具有特权(但可以根据规则1恢复)。3.修改实际ID和有效IDsetreuid();setregid();1.非特权进程只能将其实际用户ID设置为当前实际用户ID值(即保持不变)或有效用户ID值,且只能将有效用户ID设置为当前实际用户ID,有效用户ID或保持set-user-ID2.特权级进程能够设置实际用户ID和有效ID为任意值。3.不管进程拥有特权与否,只要如下条件成立,就能将保存set-user-ID 设置为新的有效用户ID。a) ruid 不为 -1b) 对有效用户ID所设置的值不同于系统调用之前的实际用户ID4.获取实际,有效和保存设置IDgetresuid();getresgid();5.修改实际,有效和保存IDsetresuid();setresgid();1.非特权进程能够将实际ID,有效ID和保存set-user-ID 中的任意ID 设置为实际用户ID,有效用户ID,或保存ser-user-ID中的任意当前值.2.特权级进程能够对实际用户ID,有效用户ID,和保存set-user-ID 做任意设置3.不管系统调用是否对其他ID做了修改,总是将文件系统用户ID设置为与有效用户ID相同。setresuid 和 setresgid() 调用具有0/1效应,要么全部成功,要么全部失败.6.获取和修改文件系统IDsetfsuid();setfsgid();7.获取和修改辅助组 IDgetgroups();setgroups();initgroups();getuid();
getgid();
geteuid();
getegid();
setuid();
setgid();
seteuid();
setegid();
setreuid();
setregid();
getresuid();
getresgid();
setresuid();
setresgid();
setfsuid();
setfsgid();
getgroups();
setgroups();
initgroups();https://blog.csdn.net/enlyhua/article/details/81008604
Uid: 有效,实际,保存,文件系统ID
9.Linux/Unix 系统编程手册(上) -- 进程凭证相关推荐
- linux/unix系统编程手册11-15
title: linux/unix编程手册-11_15 date: 2018-05-27 11:53:07 categories: programming tags: tips linux/unix编 ...
- Linux/Unix系统编程手册 第三章:系统编程概念
本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...
- Linux/Unix系统编程 五:进程
进程是一个可执行程序的实例. 一.linux系统进程管理 1.进程管理的作用 判断机器健康状态 查看系统中所有进程 杀手进程 2.查看系统进程 1.ps -aux BSD操作系统格式: TTY说明: ...
- Linux/UNIX系统编程手册gg
Linux系统: "所见皆文件" 一个比较好的博客 一.Linux基础操作 Linux系统目录: bin:存放二进制可执行文件 boot:存放开机启动程序 dev:存放设备文件: ...
- UNIX系统编程小结(三)----进程相关
进程即一个程序的动态执行.引用apue上的一句话:"A thorough understanding of the UNIX System's process control is esse ...
- 【Linux系统编程】特殊进程之守护进程
00. 目录 文章目录 00. 目录 01. 守护进程概述 02. 守护进程查看方法 03. 编写守护进程的步骤 04. 守护进程代码 05. 附录 01. 守护进程概述 守护进程(Daemon Pr ...
- 【Linux系统编程】特殊进程之僵尸进程
00. 目录 文章目录 00. 目录 01. 僵尸进程概述 02. 僵尸进程案例 03. 避免僵尸进程 04. 附录 01. 僵尸进程概述 进程已运行结束,但进程的占用的资源未被回收,这样的进程称为僵 ...
- Linux系统编程手册-源码的使用
Linux系统编程手册-源码的使用 转自:http://www.cnblogs.com/pluse/p/6296992.html 第三章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下: ...
- 【Linux系统编程】特殊进程之孤儿进程
00. 目录 文章目录 00. 目录 01. 孤儿进程概述 02. 孤儿进程代码 03. 附录 01. 孤儿进程概述 父进程运行结束,但子进程还在运行的子进程就称为孤儿进程(Orphan Proces ...
- Linux系统编程 74 孤儿进程和僵尸进程
Linux系统编程 74 孤儿进程和僵尸进程 学习笔记 孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为 init进程,称为init进程领养了孤儿进程. init进程会去接替 ...
最新文章
- Python编写爬虫编写到Excel中
- Android应用如何开机自启动、自启动失败原因
- 后台获得客户端IP地址
- 单点登陆的ASP.NET应用程序设计[zt]
- oracle socket读取超时,设置套接字操作超时
- c语言程序做成可执行文件,windows环境下C程序生成可执行文件
- 动态规划之字符串最短编辑距离
- 反编译代码遇到的问题
- 把RDD简单的转换成DataFrames
- AcWing基础算法课Level-2 第三讲 搜索与图论
- c语言跑酷小游戏代码,跑酷游戏代码
- 苹果手机收不到推送信息_苹果手机微信收不到信息怎么回事(超详细解决方案分享)...
- 使用驱动器中的光盘之前需要将其格式化怎么弄
- 落枫推荐:firefox插件firebug的8个最优秀扩展
- matlab的颜色映射colormap
- Good Luck in CET-4 Everybody! HDU - 1847
- MacOS 开启latex人生(mactex+texmaker安装)
- ubuntu 16.04 和 18.04 替换apt源为阿里源
- 通过CMD启动MATLAB的同时运行M脚本
- python画名侦探柯南_机器学习机器学习三剑客之Matplotlab