文件的特殊权限:SUID SGID sTicky 及文件扩展权限 ACL
7.2 文件的特殊权限:SUID SGID sTicky 及文件扩展权限 ACL
其实文件不目录设置不止这些,还有所谓的特殊权限。由于特殊权限会拥有一些“特权”,以上描述了 umask 掩码的 3 位,实际上是 4 位,umask 掩码的第 1 位表示 SUID、SGID、sTicky 特殊权限。
7.2.1 文件的特殊权限:SUID、SGID、sTicky
SUID(set uid 设置用户 ID):限定:只能设置在二进制可执行程序上面。对目录设置无效。
功能:程序运行时的权限从执行者变更成程序所有者的权限。
SGID:限定:既可以给二进制可执行程序设置,也可以对目录设置。
功能:在设置了 SGID 权限的目录下建立文件时,新创建的文件的所属组会继承上级目录的所属组。
sTicky:粘滞位权限是针对目录的,对文件无效,也叫防删除位。
这 3 个特殊权限对应的数值为,如表 7-5 所示。
SUID |
SGID |
Stickybit |
u+s或u=4 |
g+s或g=2 |
o+t或o=1 |
表 7-5 特殊权限数值对照表
1) SUID :
SUID 属性一般用在可执行文件上,当用户执行该文件时,会临时拥有该执行文件的所有者权限。使用”ls -l” 或者”ll”命令浏览文件时,如果可执行文件所有者权限的第三位是一个小写的”s”,就表明该执行文件拥有 SUID 属性,比如/usr/bin/passwd 文件,如图 7-3 所示。
图 7-3 拥有 SUID 属性
注:赋予 SUID 权限后,该权限需占用所属主的 x 权限位,如果文件本身的所属主权限具有 x 权限时,那举将会显示为 s ,如果没有 x 权限,则显示为 S 。
互动: 普通用户 mk,没有对 shadow 文件写入的权限, 但是 mk 用户使用 passwd 修改自己密码时,可以修改 shadow 文件中的内容,这是什么原因?
[root@xuegod63 ~]# ll /etc/shadow #以长格式查看/etc/shadow,权限为 000。
----------. 1 root root 1179 9 月 19 2017 /etc/shadow
[root@xuegod63 ~]# su - mk #切换 mk 普通用户登彔。
上一次登彔:二 5 月 8 21:07:24 CST 2018pts/0 上
[mk@xuegod63 ~]$ passwd #修改密码。
更改用户 mk 的密码 。
为 mk 更改 STRESS 密码。
(当前)UNIX 密码:123456 #输入当前用户密码。
新的 密码:xuegod*666 #输入新密码。
重新输入新的 密码:xuegod*666 #再次输入新密码。
passwd:所有的身份验证令牌已经成功更新。
[root@xuegod63 ~]# vim /etc/shadow #查看 shadow 文件已经被 mk 用户修改成功。
因为 mk 用户执行 passwd 命令时,权限会提升成 root 用户,所以可以修改成功。
例 7.11:赋值 SUID 权限
[root@xuegod63 ~]# useradd mk #创建 mk 普通用户,如有该用户则不需创建。
[root@xuegod63 ~]# su - mk #切换 mk 普通用户登彔。
[root@xuegod63 ~]$ less /etc/shadow #看不到内容。
[root@xuegod63 ~]$ su - root #切换到 root 用户。
[root@xuegod63 ~]# chmod u+s /usr/bin/less #给一个 suid 权限。
[root@xuegod63 ~]# su - mk #切换 mk 普通用户登彔。
[mk@xuegod63 ~]$ less /etc/shadow #使用 less 命令查看/etc/shadow 文件可以看到了。
查看 u+s 后的效果:
[root@xuegod63 ~]# ll /usr/bin/less #以长格式查看/usr/bin/less 文件,权限为 rwsr-xr-x
-rwsr-xr-x 1 root root 154536 Sep 26 2011 /usr/bin/less
[root@xuegod63 ~]# ps -axu | grep less
root 43407 0.0 0.0 110260 980 pts/0 S+ 22:30 0:00 less /etc/shadow
另外:
[root@xuegod63 ~]# chmod 4755 /usr/bin/less #等同于 chmod u+s /usr/bin/less
2) SGID:
限定:既可以给二进制可执行程序设置,也可以给目录设置。
功能:在设置了 SGID 权限的目录下建立文件时,新创建的文件的所属组会继承上级目录的权限。
注:赋予 SGID 权限后,该权限需占用所属组的 x 权限位,如果文件本身的所属组权限具有 x 权限时,那举将会显示为 s ,如果没有 x 权限,则显示为 S 。
[root@xuegod63 ~]# mkdir test #创建 test 目录。
[root@xuegod63 ~]# ll -d test #以长格式查看目录,权限为 rwxr-xr-x。
drwxr-xr-x 2 root root 4096 Jan 24 20:14 test
[root@xuegod63 ~]# chmod g+s test #赋予 SGID 权限。
[root@xuegod63 ~]# ll -d test #以长格式查看目录,权限为 rwxr-sr-x 。
drwxr-sr-x 2 root root 4096 Jan 24 20:14 test
测试:sgid 效果。
[root@xuegod63 ~]# chown :bin test/ #修改 test 目录属组为 bin 用户组。
[root@xuegod63 ~]# touch test/a.txt #在 test 目录创建 a.txt 文件。
[root@xuegod63 ~]# ll !$ #以长格式查看文件,属组为 bin 用户组。
ll test/a.txt
-rw-r--r-- 1 root bin 0 Jan 24 20:15 test/a.txt
3) Stickybit
限定:只作用于目录。
功能:在一个公共目录,每个用户都可创建文件,但只能删除自己的文件,不能删除其他用户的文件。
注:赋予 sTicky 权限后,该权限需占用其他用户的 x 权限位,如果目录本身的其他用户权限具有 x 权限时,那举将会显示为 t ,如果没有 x 权限,则显示为 T。
例 7.12: 系统中的 tmp 目录本身就具有 sTicky 权限。
[root@xuegod63 ~]# ll -d /tmp/ #以长格式查看/tmp 目录,默认权限为 rwxrwxrwt
drwxrwxrwt. 11 root root 4096 Jan 24 19:41 /tmp/
赋予 Stickybit 权限用法:
[root@xuegod63 ~]# chmod o+t /tmp/test/ #赋予 Stickybit 权限。
7.2.2 文件扩展权限 ACL
扩展 ACL:access control list。
设置 FACL 相关命令:
setfacl 命令 用于设置 FACL 权限。
getfacl 命令 用于查看 FACL 权限。
命令使用格式:setfacl -m u:用户名称:权限 文件名称 #指定用户的权限。
setfacl -m g:用户名称:权限 文件名称 #指定组的权限。
setfacl -x u:用户名称 文件名称 #取消用户的权限。
setfacl -x g:用户名称 文件名称 #取消组的权限。
注意:setfacl 设定了权限时,是没有相关修改权限的参数,也就是说明权限设定后不支持修改或调整权限,但可以通过重新指定权限进行调整权限,例:指定了 rwx 权限时,想要去掉 x 权限,那就需要重新赋予 rw 即可。
setfacl 命令选项:
-m 设定权限(通常需要带上 u/g 标识指定权限)。
u:USERNAME:PERM # u 表示标识用户设定权限:指定用户名称:设定的权限,三者之间用:冒号分隔。
g:GROUPNAME:PERM # g 表示标识组设定权限:指定组的名称:设定的权限,三者之间用:冒号分隔。
-x 取消设定。
d: 该参数不需要使用 - 指定,使用时加在 u: 或 d: 前面,针对目录时使用。
getfacl 命令用于查看 facl 权限。
命令使用格式:getfacl 文件名称
例 7.13:设置用户 mk 对文件 a.txt 拥有的 rwx 权限 ,mk 不属于 a.txt 的所属主和组,mk 是 other。怎么做?
[root@xuegod63 ~]# touch /tmp/a.txt #创建 a.txt 文件。
[root@xuegod63 ~]# getfacl /tmp/a.txt #查看 a.txt 的 ACL 权限。
getfacl: Removing leading '/' from absolute path names
# file: tmp/a.txt #文件名称。
# owner: root #所属主。
# group: root #所属组。
user::rw- #属主的权限。
group::r-- #属组的权限。
other::r-- #其他用户的权限。
[root@xuegod63 ~]# setfacl -m u:mk:rwx /tmp/a.txt #u:设置某个用户拥有的权限。
[root@xuegod63 ~]# getfacl /tmp/a.txt #查看 a.txt 的 ACL 权限。
getfacl: Removing leading '/' from absolute path names
...
user::rw-
user:mk:rwx #此时属主的权限中有 mk 用户了。
[root@xuegod63 ~]# su - mk #切换 mk 用户登彔。
[mk@xuegod63 ~]$ vim /tmp/a.txt #尝试编辑 a.txt。
[mk@xuegod63 ~]$ ll /tmp/a.txt #以长格式查看,权限为 rw-rwxr--+。
-rw-rwxr--+ 1 root root 8 5 月 8 22:42 /tmp/a.txt
例 7.14:给目录加扩展权限。
[root@xuegod63 ~]# mkdir /tmp/test
[root@xuegod63 ~]# setfacl -m d:u:mk:rwx /tmp/test # -d default 设置默认 acl,对目录有效,此目录下新建的目录或文件都继承此 acl 权限。
例 7.15:测试一下 -d 参数:
[root@xuegod63 ~]# mkdir /tmp/test
[root@xuegod63 ~]# setfacl -m d:u:mk:rwx /tmp/test #使用 d 参数。
[root@xuegod63 ~]# getfacl /tmp/test/ #查看/tmp/test 目录 ACL。
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:mk:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@xuegod63 ~]# touch /tmp/test/a.txt #在 test 目录下创建 a.txt。
[root@xuegod63 ~]# mkdir /tmp/test/data #在 test 目录下创建 data 目录。
[root@xuegod63 ~]# getfacl /tmp/test/a.txt #因为-d 参数,所以 test 下所有创建的文。件和目录都继承了默认的 acl 权限。
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/a.txt
# owner: root
# group: root
user::rw-
user:mk:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
[root@xuegod63 ~]# getfacl /tmp/test/data #查看 data 目录 ACL 权限。
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/data
# owner: root
# group: root
user::rwx
user:mk:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:mk:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
例 7.16:给目录下所有文件都加扩展权限。
[root@xuegod63 ~]# setfacl -R -m u:lee:rw- testdirectory/ #-R 一定要在-m 前面,表示目录下所有文件。
[root@xuegod63 ~]# setfacl -x u:mk /tmp/a.txt # 去掉单个权限。
[root@xuegod63 ~]# setfacl -b /tmp/a.txt # 去掉所有 acl 权限。