Linux 特权 SUID/SGID 的详解
扛枪的书生 2024-07-02 11:15:00 阅读 65
导航
- 0 前言
- 1 权限匹配流程
- 2 五种身份变化
- 3 有效用户/组
- 4 特权对 Shell 脚本无效
- 5 Sudo 与 SUID/SGID 的优先级
- 6 SUID、SGID、Sticky 各自的功能
0、前言
Linux最优秀的地方之一,就在于他的多人多工环境。而为了让各个使用者具有较保密的档案资料,因此档案的权限管理就变的很重要了。
Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有 read/write/execute 等权限。
故对于"静态"的档案来说,其中的权限属性即确定了“哪些身份的人拥有什么样的权限可以去做什么动作”,如上图所示。
而对于"动态"的进程来说,操作系统又为进程分配了它们的用户身份,即有效用户身份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 举例):
- 如果进程的 euid 等于档案的 owner-id,则继续开始判断档案拥有者对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限,此时不管 r 权限包含与否判断流程都将不再继续;如果进程的 euid 不等于档案的 owner-id,则开始步骤 2 的判断。
- 如果进程的 groups 包含档案的 group-id,则继续开始判断档案所属群组对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限,此时不管 r 权限包含与否判断流程都将不再继续;如果进程的 groups 不包含档案的 group-id,则开始步骤 3 的判断。
- 此时直接开始判断档案其它人对应的权限位中是否包含 r 权限,若包含则文件被进程顺利读取,若不包含则提示进程无权限。至此,流程不再递归判断,直接结束。
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。
3、有效用户/组
不管实验2中进程的5种身份如何变化,当进程产生新档案时,档案的拥有者和所属群组都是以euid和egid的值去赋予的。
4、特权对 Shell 脚本无效
特殊权限 SUID/SGID 对于 shell 脚本不起作用,授予和不授予的状态一样。
5、Sudo 与 SUID/SGID 的优先级
当 Sudo 和 SUID/SGID 同时作用二进制命令时,优先以SUID/SGID的权限为主,这其实就相当于在root shell下执行特殊授权的命令一样,命令进程的5种身份依旧按照小节(2)描述的过程一样,root也不例外。
6、SUID、SGID、Sticky 各自的功能。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。