Linux学习记录:SUID 和 SGID 等特殊权限

1. 引言

在上一篇文章 Linux学习记录:chmod 修改权限 中,我们已经介绍了 Linux 中是如何控制文件以及目录的权限的。

这篇文章中我们再来介绍几种特殊的权限,即 SUIDSGIDSBIT

2. 相关背景

从前面的介绍我们已经知道,使用 ll 命令来查看文件或者目录权限时,第一列一共有 10 个字符长度,我们从右往左编号,即 9876543210,其中:

  • 9 共 1 位表示标识位:标识当前的文件类型。如 d 表示目录,- 表示普通文件;
  • 876 共 3 位表示 属主 的权限;
  • 543 共 3 位表示 组用户 的权限;
  • 210 共 3 位表示 其他用户 的权限。

如果一个文件 test.txt 的权限为 -rwxrwxrwx,用二进制表示为 111-111-111,用八进制表示则为 777,所以我们经常会看到这种:

1
chmod 777 test.txt

意思就是 属主组用户其他用户 都能 read/write/execute 该文件。

其实 Linux 还有 3 个比特位来表示 SUIDSGIDSBIT 等特殊权限。

3. 具体介绍

Linux 表示文件或者目录的权限,总共用了 12 个比特位。其中最低的 9 位,即前面相关背景部分介绍的,用来表示 3 类不同用户的 read/write/execute 权限的。最高的 3 位,从高往低数,分别表示 SUID 权限、SGID 权限和 SBIT 权限。

举个例子:

1
2
11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 1 1 1 1 0 0 1 0 0

第一行表示二进制串的位置编号,从 0 开始。第二行表示是否具有对应位的权限,0 代表不具有,1 代表具有。

上述例子的意思是:该文件 属主 能够 read/write/execute,组用户其他用户 只能够 read。同时该文件还具有 SUID 权限。

下面就来具体解释下什么是 SUIDSGIDSBIT 权限。

3.1 SUID 权限

SUID 表示 Set User IDentification 。只能用来控制:是否让某种文件具有 SUID 权限,不能用来控制目录。

当一个文件 example 被设置了 SUID 权限时,那么除了 属主 之外的所有用户,在执行 example 时,都将获得 属主 的权限。

举个例子。example 一开始的权限是:

1
-rwxr-xr-x

我们给 example 设置 SUID 权限后,变成:

1
-rwsr-xr-x

注意 属主 权限的 execute 位现在是 s 而不是 x,这是因为设置了 SUID 的原因。

此时,组用户其他用户 在执行 example 程序时,就会获得 write 权限。而在设置 SUID 之前,这两类用户是不具备 write 权限的。

那么我们该怎么来设置这个 SUID 权限呢?还记得我们前面介绍的 12 位二进制位吗?我们只需要将最高位设置为 1,用八进制表示即 4755

原来我们是这么设置 example 的权限的:

1
chmod 755 example

现在我们这么设置:

1
chmod 4755 example

3.2 SGID 权限

SGID 的道理和 SUID 相似,只不过 SGID 不仅可以用来控制文件权限,还能控制目录的权限。

还是使用之前的例子。我们的 example 文件一开始的权限是:

1
-rwxr-xr-x

当我们给 example 设置 SGID 权限后,变成:

1
-rwxr-sr-x

注意 组用户 权限的 execute 位现在是 s 而不是 x,这是因为设置了 SGID 的原因。

此时,组用户(不包括 其他用户) 在执行 example 程序时,就会获得 write 权限。而在设置 SGID 之前,组用户 是不具备 write 权限的。

设置 SGID 权限也很简单,只需要将次高位的二进制设置为 1 即可。所以此时 example 文件的权限值用八进制表示为 2755

所以可以这么设置:

1
chmod 2755 example

那如果我们想要同时设置 SUIDSGID 权限该怎么办呢?想必你也很清楚了,只需要这么做:

1
chmod 6755 example

3.2 SBIT 权限

SBIT 只能用来控制目录的权限,不能用来控制文件。

如果一个目录被设置了 SBIT 权限,表示任何一个在此目录下可以新建文件的用户,该文件只有该用户自身、或者是 root用户 可以删除,除此之外的用户都无权删除。

举个例子,我们看 /tmp 目录的权限:

1
ls -ld /tmp

结果:

1
2
tan@DESKTOP-OPQIR8V:/mnt/c/Users/tanjuntao$ ll -ld /tmp
drwxrwxrwt 1 root root 512 Mar 8 13:52 /tmp/

注意 其它用户 权限的 execute 位现在是 t 而不是 x,这是因为设置了 SBIT 的原因。

即所有用户都能在 /tmp 目录下新建文件或目录,但只有该用户自身或者 root用户 能够删除这些文件。

4. References

Donate comment here