关于SUID、SGID、SBIT,我们必须了解的几个关键点

一、概述

在日常运维中,细心的小伙伴可能已经注意到,在某些目录下的文件权限不仅仅有rwx,还有s和t。s权限我们在/bin目录下最为常见,在/tmp目录下,-rwxrwxrwxt这类文件也偶尔能够看到。这到底是怎么回事呢?让我们来深入探讨一下吧!

关于SUID、SGID、SBIT,我们必须了解的几个关键点

Linux

二、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