9.10 SetUID(SUID)文件特殊权限用法
-
在讲解Linux权限如何设定(权限位)时提到除了 rwx 权限,还会用到 s 权限。如下面信息,原本表示文件所有者权限中的 x 权限位,却出现了 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。
-
设置和取消 SetUID
设置 SetUID:
chmod 4xxx < file-name > chmod u+s < file-name >
取消 SetUID:
chmod xxx < file-name > chmod u-s < file-name >
[root@CncLucZK test]# ll -d /usr/bin/passwd
-rwsr-xr-x. 1 root root 34928 May 11 2019 /usr/bin/passwd
-
SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。
-
如:我们都知道,Linux 系统中所有用户的密码数据都记录在 /etc/shadow 这个文件中,通过 ll /etc/shadow 命令可以看到,此文件的权限是 0(———),也就是说,普通用户对此文件没有任何操作权限。
[root@CncLucZK test]# ll -d /etc/shadow
---------- 1 root root 1396 Oct 16 11:25 /etc/shadow
- 这就会产生一个问题,为什么普通用户可以使用 passwd 命令修改自己的密码呢?本节开头已经显示了 passwd 命令的权限配置,可以看到,此命令拥有 SUID 特殊权限,而且其他人对此文件也有执行权限,这就意味着,任何一个用户都可以用文件所有者,也就是 root 的身份去执行 passwd 命令。
#属主取消SetUID权限
[root@CncLucZK test]# chmod u-s /usr/bin/passwd
[root@CncLucZK test]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 34928 May 11 2019 /usr/bin/passwd
[root@CncLucZK test]# su - zk
Last login: Sun Oct 16 10:18:57 CST 2022 on pts/0
[zk@CncLucZK ~]$ passwd
Changing password for user zk.
Current password:
New password:
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
passwd: Authentication token manipulation error #鉴定令牌操作错误
#最后密码没有生效
- 显然,虽然用户有执行 passwd 命令的权限,但无修改 /etc/shadow 文件的权限,因此最终密码修改失败。
注意,实验完成后,一定要再把 /usr/bin/passwd 文件的 SetUID 权限加上。
-
那么,普通用户可以使用 cat 命令查看 /etc/shadow 文件吗?答案的否定的,因为 cat 不具有 SUID 权限,因此普通用户在执行 cat /etc/shadow 命令时,无法以 root 的身份,只能以普通用户的身份,因此无法成功读取。
-
所以我们可以总结出,SUID 特殊权限具有如下特点:
- 只有可执行的二进制程序才能设定 SetUID 权限,对目录设定 SUID,是无效的。
- 所有者用户要对欲设置SetUID的文件该文件拥有 x(执行)权限。
- 用户在执行该文件时,会以文件所有者的身份执行。
- SetUID 权限只在文件执行过程中有效,一旦执行完毕,身份的切换也随之消失。
9.11 SetGID(SGID)文件特殊权限用法
- SetGID :当 s 权限位于所属组的 x 权限位时,就被称为 SetGID,简称 SGID 特殊权限。与 SUID 不同的是,SGID 既可以对文件进行配置,也可以对目录进行配置。如:
[root@CncLucZK test]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 48552 May 11 2019 /usr/bin/locate
-
SetGID(SGID)对文件的作用:同 SUID 类似,对于文件来说,SGID 具有如下几个特点:
- SGID 只针对可执行文件二进制文件有效,换句话说,只有可执行文件才可以被赋予 SGID 权限,普通文件赋予 SGID 没有意义。
- 用户对该文件具备 x 权限
- 用户在执行具有 SGID 权限的可执行文件时,用户的群组身份会变为文件所属群组;
- SGID 权限赋予用户改变组身份的效果,只在可执行文件运行过程中有效;
-
对于目录来说:
- 普通用户在此目录中的有效组会变成此目录的所属组
- 该目录的其他用户具备 r 和 x 权限,普通用户才可以进入到该目录
- 该目录的其他用户具备w权限,普通用户新建文件的所属组为该目录的所属组
-
设置和取消 SetGID
设置 SetGID
chmod 2xxx chmod g+s
取消 SetGID
chmod xxx chmod g-s
SGID 和 SUID 的不同之处就在于,SUID 赋予用户的是文件所有者的权限,而 SGID 赋予用户的是文件所属组的权限
- 以locate 命令为例,可以看到,/usr/bin/locate 文件被赋予了 SGID 的特殊权限,这就意味着,当普通用户使用 locate 命令时,该用户的所属组会直接变为 locate 命令的所属组,也就是 slocate。locate 命令是用于在系统中按照文件名查找符合条件的文件的,当执行搜索操作时,它会通过搜索 /var/lib/mlocate/mlocate.db 这个数据库中的数据找到答案,我们来看看此数据库的权限:
[root@CncLucZK /]# ll -d /usr/bin/locate
-rwx--s--x. 1 root slocate 48552 May 11 2019 /usr/bin/locate
[root@CncLucZK ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 1838850 1月20 04:29 /var/lib/mlocate/mlocate.db
- 可以看到,mlocate.db 文件的所属组为 slocate,虽然对文件只拥有 r 权限,但对于普通用户执行 locate 命令来说,已经足够了。一方面,普通用户对 locate命令拥有执行权限,其次,locate 命令拥有 SGID 权限,这使得普通用户在执行 locate 命令时,所属组身份会变为 slocate,而 slocate 对 mlocate.db 数据库文件拥有 r 权限,所以即便是普通用户,也可以成功执行 locate 命令。
无论是 SUID,还是 SGID,它们对用户身份的转换,只有在命令执行的过程中有效,一旦命令执行完毕,身份转换也随之失效。
- SetGID(SGID)对目录的作用:SGID 能作用于目录,且这种用法很常见。当一个目录被赋予 SGID 权限后,进入此目录的普通用户,其有效群组会变为该目录的所属组,会就使得用户在创建文件(或目录)时,该文件(或目录)的所属组将不再是用户的所属组,而使用的是目录的所属组。
- 也就是说,**只有当普通用户对具有 SGID 权限的目录有 rwx 权限时,SGID 的功能才能完全发挥。**比如说,如果用户对该目录仅有 rx 权限,则用户进入此目录后,虽然其有效群组变为此目录的所属组,但由于没有w权限,用户无法在目录中创建文件或目录,SGID 权限也就无法发挥它的作用。
#进入临时目录做此实验。因为只有临时目录才允许普通用户修改
[root@CncLucZK /]# ll -d tmp
drwxrwxrwx. 11 root root 4096 Oct 19 19:40 tmp
[root@CncLucZK /]# cd tmp
#建立测试目录
[root@CncLucZK tmp]# mkdir dtest
#给测试目录赋予SetGID权限
[root@CncLucZK tmp]# chmod g+s dtest
[root@CncLucZK tmp]# ll -d dtest
drwxr-sr-x 2 root root 4096 Oct 16 13:18 dtest
#SetGID权限已经生效
#给测试目录赋予777权限,让普通用户可以读写执行
[root@CncLucZK tmp]# chmod 777 dtest
[root@CncLucZK tmp]# ll -d dtest
drwxrwsrwx 3 root root 4096 Oct 16 13:22 dtest
[root@CncLucZK tmp]# grep zk /etc/passwd /etc/group
/etc/passwd:zk:x:1002:1002:commons user:/home/zk:/bin/bash
/etc/group:root:x:0:zk
/etc/group:zk:x:1002:
/etc/group:u-dev3:x:1005:zk,u-dev1
#切换成普通用户zk,此用户的所属群组为zk
[root@CncLucZK tmp]# su - zk
Last login: Sun Oct 16 12:52:50 CST 2022 on pts/0
#普通用户进入测试目录
[zk@CncLucZK ~]$ cd /tmp/dtest
[zk@CncLucZK dtest]$ touch file1
[zk@CncLucZK dtest]$ mkdir dict1
#在此目录中创建新的文件file1和子目录dict1
[zk@CncLucZK dtest]$ ll
total 4
drwxrwsr-x 2 zk root 4096 Oct 16 13:22 dict1
-rw-rw-r-- 1 zk root 0 Oct 16 13:21 file1
可以看到,虽然是zk用户创建的dict1文件和file1目录,但它们的所属组都不是 zk(zk用户的所属组),而是 root(dtest 目录的所属组)。
9.12 Stick BIT(SBIT)文件特殊权限用法详解
-
Sticky BIT,简称 SBIT 特殊权限,可意为粘着位、粘滞位、防删除位等。SBIT 权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root 才有权利修改或删除该文件。
-
作用:
- 只对目录有效
- 普通用户对该目录有 w 和 x 权限
- 若没有粘滞位,则普通用户可以对目录下的文件/子目录进行删除操作(因为普通用户对目录具有 w 权限),包括其它用户建立的目录/文件;但若赋了 SBIT,则普通用户只能删除自己创建的文件/目录,而不能删除不属于自己的文件/目录!
-
设置和取消SBIT
设置 SBIT
chmod 1xxx < dir-name > chmod o+t < dir-name >
取消 SBIT
chmod xxx < dir-name > chmod o-t < dir-name >
-
也就是说,当甲用户以目录所属组或其他人的身份进入 A 目录时,如果甲对该目录有 w 权限,则表示对于 A 目录中任何用户创建的文件或子目录,甲都可以进行修改甚至删除等操作。但是,如果 A 目录设定有 SBIT 权限,那就大不一样,甲用户只能操作自己创建的文件或目录,而无法修改甚至删除其他用户创建的文件或目录。举个例子,Linux 系统中,存储临时文件的 /tmp 目录就设定有 SBIT 权限:
[zk@CncLucZK /]$ ll -d tmp
drwxrwxrwt. 11 root root 4096 Oct 16 13:18 tmp
- 可以看到,在其他人身份的权限设定中,原来的 x 权限位被 t 权限占用了,这就表示此目录拥有 SBIT 权限。通过下面一系列的命令操作,我们来具体看看 SBIT 权限对 /tmp 目录的作用。
#以zk用户在tmp目录中建立ftest文件
[root@CncLucZK tmp]# su - zk
[zk@CncLucZK tmp]$ touch ftest
[zk@CncLucZK tmp]$ ll -d ftest
-rw-rw-r-- 1 zk zk 0 Oct 16 13:31 ftest
[zk@CncLucZK tmp]$ exit
logout
#切换到u-dev1进行删除ftest文件
[root@CncLucZK tmp]# su - u-dev1
Last login: Sat Oct 15 11:51:57 CST 2022 on pts/0
[u-dev1@CncLucZK ~]$ cd /tmp
[u-dev1@CncLucZK tmp]$ rm -rf ftest
rm: cannot remove 'ftest': Operation not permitted
[u-dev1@CncLucZK tmp]$
可以看到,虽然 /tmp 目录的权限设定是 777,但由于其具有 SBIT 权限,因此zk用户在此目录创建的文件 ftest,u-dev1用户删除失败。
参考文献:
Linux 文件基本属性
Linux SetGID(SGID)文件特殊权限用法详解
下一篇:Linux学习-34-chattr、lsattr文件系统的权限属性设置
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123758.html