Linux 特权 SUID/SGID 的详解

linux,suid,sgid · 浏览次数 : 4

小编点评

本文将探讨Linux系统中权限匹配流程、五种身份变化、有效用户/组、特权对Shell脚本的影响、Sudo与SUID/SGID的优先级以及SUID、SGID、Sticky各自的功能。 **权限匹配流程** 当一个进程尝试访问某个文件时,操作系统会根据其有效用户身份(euid)、有效组身份(egid)和文件所有者身份(owner-id)来判断是否具有访问权限。具体流程如下: 1. 如果euid等于文件所有者id,则检查文件所有者权限位中是否包含读取(r)权限。 2. 如果euid不等于文件所有者id,则检查进程所属组权限位中是否包含读取权限。 3. 如果上述条件都不满足,则检查其他用户权限位中是否包含读取权限。 **五种身份变化** 当一个二进制文件被授予SUID/SGID特权时,进程会经历以下五种身份变化: 1. 无特殊权限:uid=继承shell的uid,gid=继承shell的gid,euid=uid,egid=gid,groups=uid所加入的群组。 2. 获得SUID特权:uid=继承shell的uid,gid=继承shell的gid,euid=suid的值,egid=gid,groups=uid所加入的群组。 3. 获得SGID特权:uid=继承shell的uid,gid=继承shell的gid,euid=uid,egid=sgid的值,groups=uid所加入的群组+sgid。 4. 同时获得SUID和SGID特权:uid=继承shell的uid,gid=继承shell的gid,euid=suid的值,egid=sgid的值,groups=uid所加入的组+sgid。 5. 仅获得SUID特权:uid=继承shell的uid,gid=继承shell的gid,euid=suid的值,egid=gid,groups=uid所加入的群组。 **有效用户/组** 无论进程的身份如何变化,当进程创建新文件时,文件的拥有者和所属组都将根据euid和egid的值进行设置。 **特权对Shell脚本的影响** SUID和SGID特权对Shell脚本没有影响,因为它们只对二进制文件有效。在Shell脚本中,这些特权不会改变当前shell的用户身份。 **Sudo与SUID/SGID的优先级** 当Sudo和SUID/SGID同时作用于一个二进制文件时,SUID/SGID的权限优先级更高。这意味着在root shell下执行特殊授权的命令时,命令进程的五种身份变化仍然遵循第二小节描述的过程。 **SUID、SGID、Sticky各自的功能** - SUID:仅作用于二进制文件,使命令以拥有者的身份运行,而非当前shell的用户身份。 - SGID:作用于二进制文件时,效果与SUID类似,但多了一个群组的辅助;作用于目录时,使得进入该目录的用户所属群组成为该目录的群组,新建文件的群组id与该目录的群组id相同。 - Sticky:仅作用于目录,使得在该目录下新建的文件只有用户和root有权删除。

正文

导航


0、前言

Linux最优秀的地方之一,就在于他的多人多工环境。而为了让各个使用者具有较保密的档案资料,因此档案的权限管理就变的很重要了。
Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有 read/write/execute 等权限。
image

故对于"静态"的档案来说,其中的权限属性即确定了“哪些身份的人拥有什么样的权限可以去做什么动作”,如上图所示。

而对于"动态"的进程来说,操作系统又为进程分配了它们的用户身份,即有效用户身份euid、有效群组身份egid、群组身份groups、还有继承uid、继承gid。【注:不管进程是否有SUID/SGID加持,进程都将拥有这5个身份,只不过无差异时 id 命令默认不显示euid/egid而已,默认euid=uid、egid=gid】

注:以下实验中涉及的 id、cat、touch 命令均是通过 cp $(which id) /tmp 从系统命令拷贝而来,通过对 id 命令赋予特权以观察同样被赋予特权的cat、touch 命令在此情景之下进程内部发生的变化,以及实际会产生什么样的效果。

1、权限匹配流程

于是,当一个进程想要操作某个档案文件时,操作系统便会根据进程拥有的身份档案拥有的权限标记去做判断。判断流程如下(示例以读权限 r 举例):

  1. 如果进程的 euid 等于档案的 owner-id,则继续开始判断档案拥有者对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限,此时不管 r 权限包含与否判断流程都将不再继续;如果进程的 euid 不等于档案的 owner-id,则开始步骤 2 的判断。
  2. 如果进程的 groups 包含档案的 group-id,则继续开始判断档案所属群组对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限,此时不管 r 权限包含与否判断流程都将不再继续;如果进程的 groups 不包含档案的 group-id,则开始步骤 3 的判断。
  3. 此时直接开始判断档案其它人对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限。至此,流程不再递归判断,直接结束。

image

image

image

2、五种身份变化

当一个二进制命令被授予 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。

image

image

image

image

3、有效用户/组

不管实验2中进程的5种身份如何变化,当进程产生新档案时,档案的拥有者和所属群组都是以euid和egid的值去赋予的。

image

4、特权对 Shell 脚本无效

特殊权限 SUID/SGID 对于 shell 脚本不起作用,授予和不授予的状态一样。

image

5、Sudo 与 SUID/SGID 的优先级

当 Sudo 和 SUID/SGID 同时作用二进制命令时,优先以SUID/SGID的权限为主,这其实就相当于在root shell下执行特殊授权的命令一样,命令进程的5种身份依旧按照小节(2)描述的过程一样,root也不例外。

image

6、SUID、SGID、Sticky 各自的功能。

  • SUID:只作用于二进制文件,当命令被执行时,命令会以命令拥有者的身份走完进程的整个生命周期,而非以当前 shell 的用户身份运行。
  • SGID:当作用于二进制文件时,效果与 SUID 类似,只是在命令进程的整个整个生命周期中又多了一个群组的援助;当作用于目录时,使用者进入此目录下时他的有效群组将会变成该目录的群组,此时新建的任何文件目录,他们的 群组id 都将和该目录的 群组id 一样。
  • Sticky:只作用于目录,使用者在该目录下新建的任何文件目录,都将只有自己与 root 才有权力删除。如 /tmp 目录。

与Linux 特权 SUID/SGID 的详解相似的内容:

Linux 特权 SUID/SGID 的详解

导航 0 前言 1 权限匹配流程 2 五种身份变化 3 有效用户/组 4 特权对 Shell 脚本无效 5 Sudo 与 SUID/SGID 的优先级 6 SUID、SGID、Sticky 各自的功能 0、前言 Linux最优秀的地方之一,就在于他的多人多工环境。而为了让各个使用者具有较保密的档案资

Linux 中 uid、gid、euid、egid、groups 之间的关系

导航 1 权限匹配流程 2 五种身份变化 3 有效用户/组 4 特权对 Shell 脚本无效 5 Sudo 与 SUID/SGID 的优先级 6 SUID、SGID、Sticky 各自的功能 Linux最优秀的地方之一,就在于他的多人多工环境。而为了让各个使用者具有较保密的档案资料,因此档案的权限管

[转帖]linux网络常见概念

Linux用户态和内核态 为了减少有限资源的访问和使用冲突,Unix/Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念。简单说就是有多大能力做多大的事,与系统相关的一些特别关键的操作必须由最高特权的程序来完成。Intel的X86架构的CPU提供了0到3四个特权级,数字

[转帖]linux网络常见概念

Linux用户态和内核态 为了减少有限资源的访问和使用冲突,Unix/Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念。简单说就是有多大能力做多大的事,与系统相关的一些特别关键的操作必须由最高特权的程序来完成。Intel的X86架构的CPU提供了0到3四个特权级,数字

[转帖]精华总结:10个问题理解 Linux epoll

epoll 是 linux 特有的一个 I/O 事件通知机制。很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣。近期学习、研究了 epoll 源码,在这个过程中关于 epoll 数据结构和作者的实现思路产生出不少疑惑,在此总结为了 10 个问题并逐个加以解答和分析。 本文基于的

[转帖]嵌入式Linux的基础知识介绍

https://zhuanlan.zhihu.com/p/598268657 嵌入式Linux是Linux内核的改编版,用于嵌入式系统。嵌入式Linux最流行的例子是Android 操作系统。 但是,需要大量硬件资源来支持嵌入式 Linux,特别是如果它将部署在实时机器对机器 (M2M) 通信、机器

[转帖]sqlserver on linux vs windows

简单对比下sqlserver on windows与linux的特点,发现新的继续添加 对比项sqlserver on windowssqlserver on Linux备注费用需要windows license开源,可使用免费的OS 功能齐全,企业版包含所有功能较少,企业版功能也不齐全 安装包大小

[转帖]Linux 防火墙开放特定端口 (iptables)

查看状态: iptables -L -n 下面添加对特定端口开放的方法: 使用iptables开放如下端口 /sbin/iptables -I INPUT -p tcp --dport 8000 -j ACCEPT 保存 /etc/rc.d/init.d/iptables save 重启服务 ser

[转帖]Linux 防火墙开放特定端口 (iptables)

查看状态: iptables -L -n 下面添加对特定端口开放的方法: 使用iptables开放如下端口 /sbin/iptables -I INPUT -p tcp --dport 8000 -j ACCEPT 保存 /etc/rc.d/init.d/iptables save 重启服务 ser

[转帖]docker 容器基础技术:linux cgroup 简介

https://cizixs.com/2017/08/25/linux-cgroup/ Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、