概述
简单的文件rwx权限不能满足我们对安全和便捷的需求,所以便有了SUID与SGID的特殊权限机制
案例1
/etc/passwd文件存储着用户的相关设置,/etc/shadow存储着用户加密后的密码。/etc/passwd的拥有者是root,所属组是root,根据权限的知识普通用户应该是不能修改/etc/passwd的内容的,但是普通用户可以通过passwd
命令修改自己的密码。这是因为passwd
设置了suid位,让用户临时拥有了文件拥有者的权限。
➜ test ll /etc/passwd
-rw-r--r--. 1 root root 2609 8月 4 18:18 /etc/passwd
➜ test ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
SUID(set uid)
让执行者临时拥有拥有者的权限(仅对拥有执行权限的二进制程序有效)
- 添加suid
chmod u+s <文件名...>
- 去除suid
chmod u-s <文件名...>
SGID(set gid)
SGID有两个功能,一个是让执行者临时拥有文件所属组的权限,另外一个是让文件下创建的文件的所属组是目录的所属组
- 添加suid
chmod g+s <文件名...>
- 去除suid
chmod g-s <文件名...>
案例2
一般老师希望学生可以将作业上传到某个特定目录。但为了避免某些小破坏份子有意或无意删掉别人的文件,那就要设置SBIT位了(也叫粘滞位)来限制用户删除其他人文件。
SBIT(Sticky)
只可管理自己的数据而不能删除他人文件(仅对目录有效)。对于所属组可写或全部可写的目录,当为此类目录设置sticky权限,则每个用户只能删除拥有者为自己的文件
- 添加sticky
chmod o+t <文件名...>
- 去除sticky
chmod o-t <文件名...>
文件的隐藏属性
文件权限除了读写执行与SUID、SGID、SBIT外还有一种隐藏权限,例如明明有权限删除某个文件却报错了,或者仅能为某个文件追加内容而不能减少内容,遇到这种很“奇怪”的文件,就要怀疑文件可能被设置隐藏权限了
查看隐藏属性(lsattr)
格式如下
lsattr [选项] <文件名...>
选项如下
选项 | 说明 |
---|---|
-a | 显示所有文件和目录 |
-d | 若目标文件为目录,显示本身,而不是子目录和文件 |
-R | 递归处理,将指定目录下的所有文件及子目录一并处理 |
lsattr -> list attribute
修改隐藏属性(chattr)
格式如下
chattr <+/-模式> <文件名...>
模式如下
模式 | 说明 |
---|---|
i | 将无法对文件进行修改,若对目录设置后则仅能修改子文件而不能新建或删除 |
a | 仅允许追加内容,无法覆盖/删除 |
S | 文件内容变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 当使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除此文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
X | 可以直接访问压缩文件的内容 |
chattr -> change attribute
案例3
rwx权限、特殊权限、隐藏权限都是对某一类用户设置的,而有时候需要对某个指定的用户进行单独的权限设置,那么就需要用文件的访问控制列表来实现啦
查看文件访问控制列表(getfacl)
格式如下
getfacl [选项] <文件名...>
选项如下
选项 | 说明 |
---|---|
-d, --default | 显示默认的文件访问控制权限 |
-R, --recursive | 递归处理,将指定目录下的所有文件及子目录一并处理 |
getfacl -> get file access control list
设置文件访问控制列表(setfacl)
格式如下
setfacl [选项] <文件名...>
选项如下
选项 | 说明 |
---|---|
-R, --recursive | 递归处理,将指定目录下的所有文件及子目录一并处理 |
-m FORMAT | 设置文件的acl规则 |
-b | 删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留 |
格式如下(详细参考这里)
[d[efault]:] [u[ser]:]uid [:perms] 指定用户的权限,文件所有者的权限 [d[efault]:] g[roup]:gid [:perms] 指定群组的权限,文件所有群组的权限 [d[efault]:] o[ther] [:perms] 其他的权限 [d[efault]:] m[ask][:] [:perms] 有效权限掩码
setfacl -> set file access control list