关于*nix系统POSIX文件权限校验机制的技术问询
*nix系统POSIX文件权限校验机制解答
权限校验的完整逻辑
你梳理的基础校验流程框架是对的,补充完整的第三步逻辑:
- 当进程euid不是0且不等于文件uid时,会先检查进程的egid(有效组ID)是否等于文件的gid,如果匹配则使用group类权限位;
- 若egid不匹配,再检查文件的gid是否存在于进程的补充组列表中,只要有任一匹配就使用group类权限位;
- 以上都不匹配时,才会使用other类权限位。
关于(r|e|s)gid的存在意义
这三类gid各自承担不同的身份管理职责,并非和权限校验完全无关:
- 真实gid(rgid):是进程创建时从父进程继承的“原生”组身份,主要用于审计、身份溯源(比如记录进程实际属于哪个组发起),以及在调用
setgroups()、initgroups()等修改组列表的系统调用时做权限校验(只有root或rgid对应的用户才能修改自身补充组)。 - 有效gid(egid):直接参与权限校验(就是上面第一步组匹配的检查项之一),同时决定进程创建新文件时默认的组归属(除非文件系统开启了
grpid位)。当执行带有setgid位的程序时,进程的egid会被设置为该程序文件的gid,从而获得对应组的权限。 - 保存的gid(sgid):用于保存进程原本的egid,当进程通过
setregid()等调用临时切换egid后,还能通过sgid恢复到原来的有效组身份。比如setgid程序在完成需要特权的操作后,可以通过sgid降权回原来的组权限,保证安全性。
内容的提问来源于stack exchange,提问作者androkettle
相关产品推荐
相关产品推荐

