一、概述
在日常运维中,细心的小伙伴可能已经注意到,在某些目录下的文件权限不仅仅有rwx,还有s和t。s权限我们在/bin目录下最为常见,在/tmp目录下,-rwxrwxrwxt这类文件也偶尔能够看到。这到底是怎么回事呢?让我们来深入探讨一下吧!
二、SUID
- SUID仅对二进制文件有效。
- 执行者对该程序需要具有x可执行权限。
- 权限仅在程序执行的过程中有效。
- 执行者将具有程序的所有者权限。
- 数字设置权限的值为4。
使用举例
[suid@GeekDevOps ~]$ ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /bin/passwd
[suid@GeekDevOps ~]$ exit
exit
[root@GeekDevOps ~]# chmod u-s /bin/passwd
[root@GeekDevOps ~]# ll /bin/passwd
-rwxr-xr-x. 1 root root 27832 6月 10 2014 /bin/passwd
[root@GeekDevOps ~]# su suid
[suid@GeekDevOps root]$ passwd
更改用户 suid 的密码 。
为 suid 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd: 鉴定令牌操作错误
[suid@GeekDevOps root]$ exit
exit
[root@GeekDevOps ~]# chmod u+s /bin/passwd
[root@GeekDevOps ~]# su suid
[suid@GeekDevOps root]$ passwd
更改用户 suid 的密码 。
为 suid 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
在我们去除suid用户的SUID权限时,命令执行错误。去除SUID权限之后我们还能执行passwd命令是因为文件passwd的权限是755。
[root@GeekDevOps ~]# chmod 4700 /bin/passwd
[root@GeekDevOps ~]# ll /bin/passwd
-rws------. 1 root root 27832 6月 10 2014 /bin/passwd
[root@GeekDevOps ~]# su suid
[suid@GeekDevOps root]$ passwd
bash: /usr/bin/passwd: 权限不够
[root@GeekDevOps ~]# chmod o+x /bin/passwd
[root@GeekDevOps ~]# ll /bin/passwd
-rws-----x. 1 root root 27832 6月 10 2014 /bin/passwd
[root@GeekDevOps ~]# su suid
[suid@GeekDevOps root]$ passwd
更改用户 suid 的密码 。
为 suid 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
上面的操作中,如果其他用户没有执行权限,即使文件具备SUID权限,这个文件也是不能被执行的,至少这个文件对其他用户要有x权限才行。
三、SGID
- SGID对二进制文件和目录有效。
- 执行者对该程序、目录需要具有x可执行权限。
- 执行者(包括组员,其他用户)具有程序的组权限。
- 用户在此目录下的有效组群将会变成目录的组群。
- 若用户在此目录下有w权限,则使用者所建立的新文件的组群与该目录的组群相同。
- 数字设置权限的值为2。
使用举例
[root@GeekDevOps ~]# groupadd sgid
[root@GeekDevOps ~]# useradd -g sgid sgid1
[root@GeekDevOps ~]# useradd -g sgid sgid2
[root@GeekDevOps ~]# useradd sgid3
[root@GeekDevOps ~]# mkdir /sgid
[root@GeekDevOps ~]# chgrp sgid /sgid
[root@GeekDevOps ~]# chmod 2775 /sgid/
[root@GeekDevOps ~]# ll / |grep sgid
drwxrwsr-x. 2 root sgid 6 3月 21 12:52 sgid
[root@GeekDevOps ~]# su - sgid1
[sgid1@GeekDevOps ~]$ cd /sgid/
[sgid1@GeekDevOps sgid]$ touch sgid1.txt
[sgid1@GeekDevOps sgid]$ ll
总用量 0
-rw-r--r--. 1 sgid1 sgid 0 3月 21 13:14 sgid1.txt
[sgid3@GeekDevOps sgid]$ exit
[root@GeekDevOps ~]# chmod o+w /sgid
[root@GeekDevOps ~]# su - sgid3
[sgid3@GeekDevOps ~]$ cd /sgid/
[sgid3@GeekDevOps sgid]$ touch GeekDevOps.txt
[sgid3@GeekDevOps sgid]$ ll
总用量 0
-rw-rw-r--. 1 sgid3 sgid 0 3月 21 14:13 GeekDevOps.txt
以上是针对目录sgid权限的举例,接下来我们看一下针对二进制文件的例子。
[root@GeekDevOps sgid]# ll /usr/bin/write
-rwxr-sr-x. 1 root tty 19536 12月 2 07:28 /usr/bin/write
[root@GeekDevOps ~]# write root pts/1
I am GeekDevOps!
在终端pts/1显示如下:
[root@GeekDevOps ~]#
Message from root@GeekDevOps on pts/0 at 19:50 ...
I am GeekDevOps!
EOF
去除SGID权限观察:
[root@GeekDevOps ~]# ll /usr/bin/write
-rwxr-sr-x. 1 root tty 19536 12月 2 07:28 /usr/bin/write
[root@GeekDevOps ~]# chmod g-s /usr/bin/write
[root@GeekDevOps ~]# ll /usr/bin/write
-rwxr-xr-x. 1 root tty 19536 12月 2 07:28 /usr/bin/write
[root@GeekDevOps ~]# write root pts/1
write: you have write permission turned off
[root@GeekDevOps ~]# chmod o-x /usr/bin/write
[root@GeekDevOps ~]# write root pts/1
hello
^C[root@GeekDevOps ~]# chmod g-x /usr/bin/write
[root@GeekDevOps ~]# ll /usr/bin/write
-rwxr-Sr--. 1 root tty 19536 12月 2 07:28 /usr/bin/write
[root@GeekDevOps ~]# chmod g+x /usr/bin/write
[root@GeekDevOps ~]# ll /usr/bin/write
-rwxr-sr--. 1 root tty 19536 12月 2 07:28 /usr/bin/write
二进制文件write所有者是root,属于tty组,这个命令主要用于
四、SBIT
- 只针对目录有效。
- 任何人都可以在此目录拥有写权限,但是不能删除、修改、移动别人拥有的文件。
- 除了root和目录所有者,其他任何用户均不能删除具有该权限的目录。
- 数字设置权限的值为1。
使用举例
[root@GeekDevOps ~]# ll / |grep tmp
drwxrwxrwt. 9 root root 4096 3月 22 18:51 tmp
[root@GeekDevOps tmp]# su sbit1
[sbit1@GeekDevOps tmp]$ touch sbit1
[sbit1@GeekDevOps tmp]$ exit
exit
[root@GeekDevOps tmp]# su sbit2
[sbit2@GeekDevOps tmp]$ ll
总用量 0
-rw-rw-r-- 1 sbit1 sbit1 0 3月 22 19:58 sbit1
[sbit2@GeekDevOps tmp]$ rm -rf sbit1
rm: 无法删除"sbit1": 不允许的操作
五、一个小问题
有时候我们也会在权限列看到“S”或“T”,这是因为无论是SUID、SGID还是SBIT,都需要对应的文件或目录必须在权限列对应位置要有执行权限,如果没有执行权限,则会出现这种情况,表示权限为空。请看下面例子:
[root@GeekDevOps ~]# chmod 7666 test.sh
[root@GeekDevOps ~]# ll test.sh
-rwSrwSrwT 1 root root 666 3月 22 19:24 test.sh