Linux 特权 SUID/SGID 详解
人生一世间如白驹过隙。导航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的uidgid继承shell的gideuiduidegidgidgroupsuid所加入的群组。当授予 suid 特殊权限时uid继承shell的uidgid继承shell的gideuidsuid的值egidgidgroupsuid所加入的群组。当授予 sgid 特殊权限时uid继承shell的uidgid继承shell的gideuiduidegidsgid的值groupsuid所加入的群组sgid。当授予 suid 和 sgid 特殊权限时uid继承shell的uidgid继承shell的gideuidsuid的值egidsgid的值groupsuid所加入的组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 各自的功能。SUID只作用于二进制文件当命令被执行时命令会以命令拥有者的身份走完进程的整个生命周期而非以当前 shell 的用户身份运行。SGID当作用于二进制文件时效果与 SUID 类似只是在命令进程的整个生命周期中又多了一个群组的援助注意只是多了一个群组的援助并不是说进程就会以群组的身份去运行。当作用于目录时使用者进入此目录下时他的有效群组将会变成该目录的群组此时新建的任何文件目录他们的 群组 id 都将和该目录的 群组 id 一样。时使用者进入此目录下时他的有效群组将会变成该目录的群组此时新建的任何文件目录他们的 群组 id 都将和该目录的 群组 id 一样。Sticky只作用于目录使用者在该目录下新建的任何文件目录都将只有自己与 root 才有权力删除。如 /tmp 目录。我的博客园