SUID(Set UID)
用在文件上
当s这个标志出现在文件拥有者的x权限上时,例如/usr/bin/passwd这个文件的权限状态为【-rwsr-xr-x】,此时就称为Set UID,简称为SUID的特殊权限。
在 Linux 中,所有账号的密码记录在 /etc/shadow 这个文件中,并且只有 root 可以读写入这个文件:
[root@study ~]# ls -l /etc/shadow
----------. 1 root root 1277 7月 16 15:56 /etc/shadow
如果另一个普通账号 tester 需要修改自己的密码,就要访问 /etc/shadow 这个文件。但是明明只有 root 才能访问 /etc/shadow 这个文件,这究竟是如何做到的呢?事实上,tester 用户是可以修改 /etc/shadow 这个文件内的密码的,就是通过 SUID 的功能。
SUID的特点如下:
- SUID权限仅对二进制程序有效
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序的过程中有效
- 执行者将具有该程序拥有者(owner)的权限
下面我们来看 tester 用户是如何利用 SUID 权限完成密码修改的:
- tester 用户对于 /usr/bin/passwd 这个程序具有执行权限,因此可以执行 passwd 程序
- passwd 程序的所有者为 root
- tester 用户执行 passwd 程序的过程中会暂时获得 root 权限,因此 tester 用户在执行 passwd 程序的过程中可以修改 /etc/shadow 文件
但是如果由 tester 用户执行 cat 命令去读取 /etc/shadow 文件确是不行的:
[jony@study ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
原因很简单,tester 用户没有读 /etc/shadow 文件的权限,同时 cat 程序也没有被设置 SUID。我们可以通过下图来理解这两种情况:
如果想让任意用户通过 cat 命令读取 /etc/shadow 文件的内容也是非常容易的,给它设置 SUID 权限就可以了:
[root@study ~]$ chmod 4755 /bin/cat #开头的4代表SUID
[root@study ~]# su - jony #切换为普通用户
[jony@study ~]$ cat /etc/shadow #执行cat命令读取shadow
[root@study ~]# chmod 755 /bin/cat #取消cat的SUID权限
SGID(Set GID)
用在文件或目录
当s标志在用户组的x时称为SGID
对文件来说,SGID的功能有:
- SGID对二进制程序有用
- 程序执行者对于该程序来说,需要具备x权限
- 执行者在执行的过程中将会获得该程序用户组的支持
对目录来说,SGID的功能有:
- 用户若对于此目录具有r或x的权限时,该用户能够进入此目录
- 用户在此目录下的有效用户组将会变成该目录的用户组
- 用途:若用户在此目录下具有w的权限(可以新建文件),则用户所建立的新文件,该新文件的用户组与此目录的用户组相同
我们通过 /usr/bin/mlocate 程序来演示其用法。mlocate 程序通过查询数据库文件 /var/lib/mlocate/mlocate.db 实现快速的文件查找。 mlocate 程序的权限如下图所示:
[root@study ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
-rw-r-----. 1 root slocate 3642301 7月 19 09:08 /var/lib/mlocate/mlocate.db
普通用户 tester 执行 mlocate 命令时,tester 就会获得用户组 mlocate 的执行权限,又由于用户组 mlocate 对 mlocate.db 具有读权限,所以 tester 就可以读取 mlocate.db 了。程序的执行过程如下图所示:
SBIT(Sticky Bit)
只对目录有效
SBIT对文件的作用是:
- 当用户对于此目录具有w、x权限,即具有写入的权限
- 当用户在该目录下建立文件或目录时,仅有自己和root才可以删除该文件
换句话说:当甲这个用户对于A目录具有用户组或其他人身份,并且拥有该目录w的权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行删除、更名、移动等操作。不过,如果将A目录加上SBIT权限后,则甲只能够针对自己建立的文件或目录进行删除、更名、移动等操作,而无法删除他人的文件。
举例来说,我们的/tmp本身的权限是【drwxrwxrwt】,在这样的权限内容下,任何人都可以在/tmp内新增、修改文件,但仅有该文件/目录建立者与root能够删除自己的目录或文件。
[root@study ~]# cd /tmp
[root@study tmp]# touch test #创建test文件
[root@study tmp]# chmod 777 test #更改权限为777
[root@study tmp]# su - jony #以一般用户登录
[jony@study ~]$ rm -f /tmp/test #尝试删除文件test
rm: 无法删除"/tmp/test": 不允许的操作
SUID、SGID、SBIT权限设置
权限 | 数字形式 |
---|---|
SUID | 4 |
SGID | 2 |
SBIT | 1 |
Comments NOTHING