Linux文件特殊权限:SUID、SGID、SBIT

发布于 2020-07-19  857 次阅读


内容纲要

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 权限完成密码修改的:

  1. tester 用户对于 /usr/bin/passwd 这个程序具有执行权限,因此可以执行 passwd 程序
  2. passwd 程序的所有者为 root
  3. tester 用户执行 passwd 程序的过程中会暂时获得 root 权限,因此 tester 用户在执行 passwd 程序的过程中可以修改 /etc/shadow 文件

但是如果由 tester 用户执行 cat 命令去读取 /etc/shadow 文件确是不行的:

[jony@study ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够

原因很简单,tester 用户没有读 /etc/shadow 文件的权限,同时 cat 程序也没有被设置 SUID。我们可以通过下图来理解这两种情况:
file
如果想让任意用户通过 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 了。程序的执行过程如下图所示:
file

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
  • alipay_img
  • wechat_img
届ける言葉を今は育ててる
最后更新于 2020-07-19