特殊权限及facl
(一)Linux系统上的特殊权限
- 特殊权限:SUID,SGID,STICKY
- 安全上下文:
- 进程以某用户的身份运行;进程是发起此进程的用户的代理,因此以此用户的身份和权限完成所有操作
- 权限匹配模型
- 判断进程的属主是否为被访问文件的属主,如果是,则应用属主的权限
- 否则,判断进程的属主是否属于被访问的文件的属组,如果是,则应用属组的权限
- 否则,则应用其他权限
- SUID
- 默认情况下,用户发起的进程,其属主是发起者。因此,进程以发起者的身份在运行
- SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么当程序运行为进程时,其属主不是发起者,而是程序文件自己的属主
- 管理文件的SUID权限
- 设置SUID:chmod u+s FileName
- 取消SUID:chmod u-s FileName
- 展示位置为属主的执行权限位
- 如果属主原本有执行权限,显示为小写s
- 如果属主原本没有执行权限,显示为大写s
- 例子:passwd文件
- SGID
- SGID功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中创建文件或者目录时,新文件的属组不是用户的基本组,而是此目录的属组。
- 可以用于组内成员共同开发
- 管理文件的SGID权限
- 设置SGID:chmod g+s FileName
- 取消SGID:chmod g-s FileName
- 展示位置为属组的执行权限位
- 如果属组原本有执行权限,显示为小写s
- 如果属组原本没有执行权限,显示为大写s
- SGID功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中创建文件或者目录时,新文件的属组不是用户的基本组,而是此目录的属组。
- Sticky
- Sticky功用:对于属组或全局可写的目录,对应的组内用户或者系统上的用户在此目录中都可以创建或者删除文件;如果为此类目录设置Sticky权限,则每个用户只能删除自己创建的文件
- 管理文件的Sticky权限
- 设置SGID:chmod o+t FileName
- 取消SGID:chmod o-t FileName
- 展示位置为其他用户的执行权限位
- 如果其他用户原本有执行权限,显示为小写s
- 如果其他用户原本没有执行权限,显示为大写s
- 例子:/tmp和/var/tmp
- 管理特殊权限的另一种方式
- 基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字(SUID,SGID,Sticky)
- umask最左侧的那一位就代表特殊权限位,但是它的值为0,作用并不是用7去减,否则结果就全都是7了,那一位可以忽略
(二)facl
- file access control list
- 背景:每个普通用户无法修改自己文件的属主和属组,只能修改文件的权限。如此,用户想把自己的文件给别人用,只能修改其他用户类权限,但是这样又很危险。
- facl是文件的额外赋权机制:在原有的u,g,o之外,另一层让普通用户能控制赋权给另外的用户或组的机制
- getfacl FileName:显示文件权限列表
- 结果格式:user:UserName:Mode;group:GroupName:Mode
- setfacl:
- setfacl -m u:UserName:Mode FileName:赋权给用户。例如:setfacl -m u:Fedora:rw test.txt。(---三个横线表示什么权限也没有)
- setfacl -x u:UserName FileName:撤销用户赋权
- setfacl -m g:GroupName:Mode FileName:赋权给组
- setfacl -x g:GroupName FileName:撤销组赋权
- 文件被添加权限列表之后,权限属性会变成:-rw-rw-r--+,那个+号就代表具有权限列表
- 权限匹配模型
- 判断进程的属主是否为被访问文件的属主,如果是,则应用属主的权限
- 否则,判断该文件有没有针对该进程属主的特殊权限,如果有,则应用该特殊权限(如果特殊权限为禁止该用户,那就禁止了)
- 否则,判断进程的属主是否属于被访问的文件的属组,如果是,则应用属组的权限
- 否则,判断该文件有没有针对该进程属组的特殊权限,如果有,则应用该特殊权限(如果特殊权限为禁止该用户,那就禁止了)
- 否则,则应用其他权限