zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux 中的 Sticky Bit、SUID 和 SGID 示例

Linux 示例 bit sticky
2023-09-14 09:09:25 时间

在本文中,我们解释了适用于名为 Sticky bit、SUID 和 SGID 的文件和目录的特殊权限。

粘性位仅适用于目录。如果用户想在某个目录中创建或删除文件/目录,他需要对该目录的写权限。对目录的写权限赋予用户创建文件的权限以及删除文件的权限。

/tmp 目录是临时文件/目录的目录。该目录具有所有三个级别的所有权限,因为所有用户都需要创建/删除他们的临时文件。但是由于用户对该目录有写权限,他们可以删除该目录中的任何文件。该文件的权限对删除没有任何影响。

但是在目录上设置了粘性位,任何人都可以在其中创建文件/目录,但只能删除自己的文件。不能删除其他用户拥有的文件。

粘性位 - 如何查看和设置

您可能会注意到t添加到 /tmp 目录的标记,这意味着为该目录设置了位。

$ ls -ld /tmp/

drwxrwxrwt 4 root root 4096 Aug 19 02:29 /tmp/

在 Linux 中,可以使用 chmod 命令设置粘性位。您可以使用 +t 标签添加和-t标签删除粘滞位。

$ chmod o-t dir1

$ ls -l

total 8

drwxr-xr-x 2 root root 4096 Aug 19 03:08 dir1

$ chmod o+t dir1

$ ls -l

total 8

drwxr-xr-t 2 root root 4096 Aug 19 03:08 dir1

或者,

$ chmod 1777 dir1/

$ ls -l

total 8

drwxrwxrwt 2 root root 4096 Aug 19 03:08 dir1

注意:在 Unix 风格的操作系统中,sticky bit 有不同的用途,但我们在这里不讨论它。

什么是 SUID 位以及如何设置它

当一个可执行文件运行时,它在执行它的用户的所有权下运行。这意味着当学生用户运行ls 命令时,相应的进程将在学生的所有权下运行。SUID 位(也称为设置用户 ID 位)会覆盖此行为。如果在某个程序上设置了 SUID 位,那么该程序将作为该文件的所有者运行,而不管是谁在执行它。

Linux 中的 passwd 命令设置了 SUID 位。

$ ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 23420 Aug 3 2010 /usr/bin/passwd

这可以在权限的第三个字段中看到。代替“x”的“s”表示设置了 SUID 位。设置 SUID 位后,当普通用户(例如学生)运行 passwd 命令时,该命令以“root”的所有权运行,而不是以学生身份运行,因为 root 是该文件的所有者。此行为是必需的,因为密码存储在 /etc/shadow 文件中,该文件没有组或其他级别的权限。

$ ls -l /etc/shadow

-r-------- 1 root root 1027 Jul 13 21:56 /etc/shadow

您需要了解,出于安全原因,不能授予所有用户对该文件的读取或写入权限;否则,他们将读取/更改其他用户的密码。所以这会导致一个问题,如果用户没有对该文件的权限,那么他们将如何更改自己的密码?所以SUID位解决了这个问题。passwd 命令设置了SUID 位,所以普通用户执行该命令时,以root 的所有权运行,即passwd 命令的所有者。

如何设置和取消设置 SUID 位

请注意,SUID 位仅适用于文件。要在文件上设置 SUID 位,请使用chmod 命令,如下所示

$ ls -l

total 8

-rwxr--r-- 1 root root 104 Aug 19 01:26 hello.sh

$ chmod u+s hello.sh

$ ls -l

total 8

-rwsr--r-- 1 root root 104 Aug 19 01:26 hello.sh

也可以使用数值方法更改权限。假设如果一个文件的正常权限是 744,那么设置了 SUID 位,这些将变为 4744。SUID 位的值为 4。

$ ls -l

total 8

-rwxr--r-- 1 root root 104 Aug 19 01:26 hello.sh

$ chmod 4744 hello.sh

$ ls -l

total 8

-rwsr--r-- 1 root root 104 Aug 19 01:26 hello.sh

SGID Bit 如何处理文件和目录

与 SUID 位不同,SGID 位对文件和目录都有效,但在两种情况下它的含义不同。

关于文件:

对于文件,它与SUID 位具有相似的含义,即当任何用户执行设置了SGID 位的文件时,它将始终以该文件的组所有权执行,而不管是谁在运行它。例如,文件 /sbin/netreport 设置了 SGID 位,可以在组权限中的“s”而不是“x”中看到。

$ ls -l /sbin/netreport

-rwxr-sr-x 1 root root 6020 Oct 13 2010 /sbin/netreport

此文件具有根组的组所有权。所以当一个用户(比如学生)执行它时,那么相应的进程将不会拥有学生的组所有权,而是拥有根组的所有权。

在目录上:

现在让我们谈谈目录上的SGID。目录上的 SGID 用于创建协作目录。要了解目录上的 SGID 位,请考虑以下场景:

假设三个用户 jack、jones 和 jenny 正在一起从事某个项目。它们都属于一个名为 javaproject 的组。对于项目的过程,他们需要共享与项目相关的所有文件。他们都必须能够看到彼此的文件。这可以简单地通过在组级别提供读取权限来完成。此外,假设项目使用的目录是“/javaproject”。

这里出现了一个问题,当一个文件被创建时,它属于创建该文件的用户的主组。因此,当不同的用户在此目录中创建他们的文件时,这些文件将不具有 javaproject 组的组所有权。

我们针对我们的问题所做的就是将/javaproject 目录的组设置为javaproject 组,并在其上设置SGID 位。当在目录上设置 SGID 位时,在其中创建的所有文件和目录都具有与该目录关联的组的组所有权。这意味着在 /javaproject 目录上设置 SGID 位后,在该目录中创建的所有文件和目录都将具有“javaproject”组的组所有权。此外,这种行为是递归的,即在该目录中创建的目录也将设置 SGID 位。新目录的权限也将与 /javaproject 目录的权限相同。

可以使用 chmod 命令设置 SGID 位,如下所示:

$ ls -ld /javaproject

drwxrwxr-x 2 root javaproject 4096 Aug 19 02:33 /javaproject

$ chmod g+s /javaproject

$ ls -ld /javaproject

drwxrwsr-x 2 root javaproject 4096 Aug 19 02:33 /javaproject

现在当 jones 用户在这个目录中创建一个文件时,它是在 javaproject 组的组所有权下创建的。

$ touch /javaproject/jones1.txt

$ mkdir /javaproject/jones1dir

$ ls -l /javaproject/

total 12

drwxrwsr-x 2 jones javaproject 4096 Aug 19 02:38 jones1dir

-rw-rw-r-- 1 jones javaproject 0 Aug 19 02:37 jones1.txt

SGID 位对应的数值为 2。因此,要将 SGID 位数值相加,请使用以下命令:

$ ls -ld /shared/

drwxrwxr-x 2 root adm 4096 Aug 19 02:47 /shared/

$ chmod 2775 /shared/

$ ls -ld /shared/

drwxrwsr-x 2 root adm 4096 Aug 19 02:47 /shared/

感谢您阅读本文并参考sticky bit wiki 页面