Linux 中 uid、gid、euid、egid、groups 之间的关系
导航
Linux最优秀的地方之一,就在于他的多人多工环境。而为了让各个使用者具有较保密的档案资料,因此档案的权限管理就变的很重要了。
Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有 read/write/execute 等权限。
故对于"静态"的档案来说,其中的权限属性即确定了“哪些身份的人拥有什么样的权限可以去操作档案”,如上图所示。
而对于"动态"的进程来说,操作系统又为进程分配了它们的用户身份,即有效用户身份euid、有效群组身份egid、群组身份groups、还有继承uid、继承gid。【注:不管进程是否有SUID/SGID加持,进程都将拥有这5个身份,只不过无差异时 id 命令默认不显示euid/egid而已,默认euid=uid、egid=gid】
于是,当一个进程想要操作某个档案文件时,操作系统便会根据进程拥有的身份和档案拥有的权限标记去做判断。判断流程如下(以下以读权限 r 举例):
- 如果进程的 euid 等于档案的 owner-id,则继续开始判断档案拥有者对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限,此时不管 r 权限包含与否判断流程都将不再继续;如果进程的 euid 不等于档案的 owner-id,则开始步骤 2 的判断。
- 如果进程的 groups 包含档案的 group-id,则继续开始判断档案所属群组对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限,此时不管 r 权限包含与否判断流程都将不再继续;如果进程的 groups 不包含档案的 group-id,则开始步骤 3 的判断。
- 此时直接开始判断档案其它人对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限。至此,流程不再递归判断,直接结束。
当一个二进制命令被授予 SUID/SGID 特权时,命令进程中 5 种身份的变化。
- 当无特殊权限时,uid=继承shell的uid,gid=继承shell的gid,euid=uid,egid=gid,groups=uid所加入的群组。
- 当授予suid特殊权限时,uid=继承shell的uid,gid=继承shell的gid,euid=suid的值,egid=gid,groups=uid所加入的群组。
- 当授予sgid特殊权限时,uid=继承shell的uid,gid=继承shell的gid,euid=uid,egid=sgid的值,groups=uid所加入的群组+sgid。
- 当授予suid和sgid特殊权限时,uid=继承shell的uid,gid=继承shell的gid,euid=suid的值,egid=sgid的值,groups=uid所加入的组+sgid。
不管实验2中进程的5种身份如何变化,当进程产生新档案时,档案的拥有者和所属群组都是以euid和egid的值去赋予的。
特殊权限 SUID/SGID 对于 shell 脚本不起作用,授予和不授予的状态一样。
当 Sudo 和 SUID/SGID 同时作用二进制命令时,优先以SUID/SGID的权限为主,这其实就相当于在root shell下执行特殊授权的命令一样,命令进程的5种身份依旧按照小节(2)描述的过程一样,root也不例外。
- SUID:只作用于二进制文件,当命令被执行时,命令会以命令拥有者的身份走完进程的整个生命周期,而非以当前 shell 的用户身份运行。
- SGID:当作用于二进制文件时,效果与 SUID 类似,只是在命令进程的整个整个生命周期中又多了一个群组的援助;当作用于目录时,使用者进入此目录下时他的有效群组将会变成该目录的群组,此时新建的任何文件目录,他们的 群组id 都将和该目录的 群组id 一样。
- Sticky:只作用于目录,使用者在该目录下新建的任何文件目录,都将只有自己与 root 才有权力删除。如 /tmp 目录。
Linux 中 uid、gid、euid、egid、groups 之间的关系的更多相关文章
- linux UID,GID,EUID,EGID,SUID,SGID
SUID, SGID, sticky位可以参考: http://onlyzq.blog.51cto.com/1228/527247/ SUID属性只能运用在可执行文件上,当用户执行该执行文件时,会临时 ...
- 微擎框架中 uid、acid、uniacid 之间的关系
首先,在创建应用的时候,会在表 uni_account 中插入一条应用数据,其中 default_acid = 0 ,返回值为该表的主键,作为 $uniacid . 然后,会在表 account 中插 ...
- Android进阶笔记08:Android 中Activity、Window和View之间的关系
1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutI ...
- Linux中service命令和/etc/init.d/的关系
Linux中service命令和/etc/init.d/的关系 service xxx启动 /etc/init.d/ 目录下的xxx脚本 如一个脚本名为 mysvc保存在/etc/init.d/下 ...
- C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现
C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现 来源 http://blog.csdn.net/Virtual_Func/article/details/4975 ...
- storm中worker、executor、task之间的关系
这里做一些补充: worker是一个进程,由supervisor启动,并只负责处理一个topology,所以不会同时处理多个topology. executor是一个线程,由worker启动,是运行t ...
- FFMPEG中最要害的结构体之间的关系
FFMPEG中最关键的结构体之间的关系 http://www.myexception.cn/program/1404591.html FFMPEG中结构体很多.最关键的结构体可以分成以下几类: a) ...
- Android中的APK,TASK,PROCESS,USERID之间的关系
开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...
- python中,ascii,unicode,utf8,gbk之间的关系梳理
在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...
- js中prototype,__proto__,constructor之间的关系
首先,我们需要了解三点: 1. 只要创建一个任意新函数,就会根据一个prototype属性,该属性指向函数的原型对象: 2. 每一个原型对象都会自动获得一个constructor属性,该属性只想pro ...
随机推荐
- 2021年5.21NCU第四届校赛
比赛地址:http://222.204.50.106/contest/39 A 树上祖先 链接:http://222.204.50.106/contest/39/problem/A B 莎士比亚 链接 ...
- 【zabbix】snmp监控linux主机
1.安装net-snmp # yum install -y net-snmp 2.配置文件 /etc/snmp/snmpd.conf 添加如下内容 view systemview included . ...
- shell 去掉逗号_shell替换和去掉换行符
用shell处理文件的时候我们常常需要去掉或者加上换行符,name问题就来了怎么才能快速的替换呢? 我们有这样一个文件[root@hxy working]# cat 1 GD200A16C013493 ...
- CINN 中子图编译缓存机制
采用 「问-答」形式记录研读 CINN 开源框架的笔记 Q:CINN中子图编译的入口是在哪里? for (const auto& node_vec : clusters) { // <- ...
- 基于AIRIOT平台构建低成本、更聪明的智能环卫系统,让管理更加高效智能
环卫工程作为城市基础设施保障,是城市建设管理中不可或缺的重要组成部分.随着城市进程的加快及技术的进步,环卫工程管理也在逐渐向精细化.智能化.绿色化等趋势发展. 智能环卫依托物联网.AI.大数据等技术, ...
- echarts(数据可视化图表)
echarts饼图详细 echarts下载 https://echarts.apache.org/zh/index.html echarts官网 http://www.isqqw.com/#/hom ...
- linux常用关机/重启命令:shutdown,init 0,init 6
目录 一.使用shutdown关机,重启,定时关机 二.使用init关机/重启 一.使用shutdown关机,重启,定时关机 1.设置计算机10分钟之后关机 [root@node5 ~]# shutd ...
- 008. gitlab代码克隆与推送
推送配置 gitlab需要推送的客户端sshkey添加到gitlab服务器中 node1 推送配置 centos node1: [root@node1 ~]# cat ~/.ssh/id_rsa.pu ...
- wordpress博客系统报错
第一种,只显示nginx的默认网页 说明wordpress的网页配置文件没有被系统读取 我们就需要去查看nginx的配置文件/etc/nginx/conf.d/default.conf 首先,查看是不 ...
- Linux扩展篇-shell编程(三)-shell运算符
基本语法: 格式一 expr +. -. \*./. %(加.减.乘.除.求余) 格式二 "$((运算式))"或者"$[运算式]" 基本运算符 Shell 和其 ...