Linux 文件权限中的 Set UID、Get UID 和 Sticky Bits 是什么?

作为 Linux 新手用户,您将了解与文件和目录相关的权限和所有权。 Linux/Unix-like 操作系统允许您设置九位权限的组合,以防止其他用户访问不必要的文件/目录。 与这些类似的是可执行文件的特殊权限,称为设置 UID、设置 GID 和粘滞位。

对于有抱负的 Linux 管理员来说,了解特殊权限可能有点不知所措。 在这里,您将了解有关常规文件权限的一些背景知识,并解释它们与特殊权限的区别。 我们还通过示例演示了 SetID、GetID 和粘滞位功能,以便全面了解。

常规 Linux 文件权限

Linux 使用 chmod 命令来分配/更改读取(r=4), 写 (w=2),并执行 (x=1) 对文件和文件夹的权限。 也就是说,上面提到的九位适用于三大类权限组。 前三个用于拥有文件的用户,第二个用于分配给文件/目录的组,后三个代表所有其他用户。

例如,一个普通文件将所有类别用户的所有类型权限都显示为 -rwxrwxrwx。 而 – 代替字母代表没有该许可。 现在 修改 命令使用数字和字母来更改权限,如下所示:

sudo chmod 755 file #for rwxr-xr-x 
sudo chmod 644 file #for rw-r--r-- 
sudo chmod a-w file #for r-xr-xr-x 
sudo chmod a+x file #for --x--x--x

特殊的 Linux 文件权限

设置用户名 位代表对可执行文件的权限,可以由其他用户在拥有者的授权下运行。 例如,当用户 最大限度 以用户身份运行 vi 命令 约翰,您将拥有以下的读/写权限 约翰.

要使用 setuid 识别文件,请使用 ls 命令并寻找 位代替可执行位 X, 如下。

设置 UID 位

设置用户名 位代表对可执行文件的权限,可以由其他用户在拥有者的授权下运行。 例如,当用户 最大限度 运行 vi 命令作为 根, 他将拥有读/写权限 . 要使用 setuid 识别文件,请使用 ls 命令并寻找 位代替执行位 X, 如下:

ls -la /etc/passwd 
-rwsr-xr-x 1 root root 88464 Dec 14 12:46 passwd

其他一些例子是:

ls -la /bin/gpasswd
-rwsr-xr-x 1 root root 88464 Jul 14 15:08 gpasswd
ls -la /bin/su
-rwsr-xr-x 1 root root 67816 Jul 21 2020 su
ls -la /newgrp
-rwsr-xr-x 1 root root 44784 Jul 14 15:08 newgrp
ls -la /bin/sudo
-rwsr-xr-x 1 root root 166056 Jan 19 2021 sudo

要为可执行文件设置 setuid 位,请使用 chmod 命令,如下所示:

chmod u+s /etc/passwd

要删除非 root 用户或所有者执行文件的权限:

chmod u-s /etc/passwd

设置 GID 位

如前所述,set uid 位控制对其他用户的文件访问,而 setgid (GID) 位创建协作目录。 这意味着该目录的组可以访问在该目录中创建的任何文件。 因此,它允许所有组成员在没有所有者权限的情况下运行可执行文件并保护它们免受其他用户的侵害。

按照以下步骤在您的 Linux 系统中创建一个协作目录:

使用创建一个组 群组添加 用于协作的组 ID 为 415 的命令:

groupadd -g 415 admins

使用 usermod 命令添加 约翰 到组以进行文件访问/执行。

usermod -aG admins john

使用 目录 创建目录的命令:

mkdir /tmp/collaborative_dir

使用 chgrp 命令将目录分配给 管理员 团体:

chgrp admins /tmp/collaborative_dir

使用 修改 命令将目录权限更改为 2775。2 位打开设置 gid,7 将完整的 rwx 分配给用户和组,而 5 (rw) 用于其他人。

chmod 2775 /tmp/collaborative_dir

最后,将您的用户帐户更改为 约翰 并在协作目录中创建一个文件来检查文件权限。

su - john
touch /tmp/collaborative_dir/file.txt

su 命令可能会给您一个身份验证错误。 在这种情况下,键入 sudo 他的 命令切换到根并重新运行 他的约翰 更改用户帐户

现在列出检查目录和新创建文件的 GID 位设置的权限。

ls -ld /tmp/collaborative_dir /tmp/collaborative_dir/file.txt 

在典型情况下,由 john 创建的文件将分配有一个组 john。 由于您在设置的 GID 位目录中创建文件,因此它会将权限分配给 管理员 组,这样属于该组的任何人,例如用户 克里斯, 将可以访问它。 相关:如何使用触摸在 Linux 上创建新文件

粘滞位

与 SID 和 GID 位不同,粘滞位在功能上有所不同,因为它保护文件和目录不被其他用户重命名和删除。 常规文件权限允许任何具有写入权限的用户删除或重命名文件。 而设置了粘滞位后,除非您是文件的 root 用户或所有者,否则这是不可能的。

使用粘滞位的理想情况是所有用户都可以访问用于创建文件的目录。 例如,使用 ls -ld 命令来检查 tmp 目录权限,如下:

你可以注意到粘性位 替换执行位 X. 按照给定的一组说明创建受限删除目录:

现在创建另一个目录 /tmp 文件夹:

mkdir /tmp/new_dir

将文件权限更改为 1777 设置粘滞位() 和完整目录访问:

chmod 1777 /tmp/new_dir

现在复制任何文件 /等等 文件夹到 /tmp/new_dir 并将其权限更改为 666

cp /etc/ /tmp/new_dir
chmod 666 /tmp/new_dir/services

列出目录及其所有内容以查看权限:

ls -ld /tmp/new_dir /tmp/new_dir/services

您可以注意到粘滞位而不是执行位,这意味着只有 root 或用户 john 可以删除该文件,因为该文件位于粘滞位目录中。

了解 Linux 中的特殊文件权限

本文演示了如何设置这些位以改进共享文件和目录的协作并保护它们免遭未经授权的访问、执行和删除。 即使您不使用这些位创建文件/目录,了解特殊文件权限在许多情况下也是有帮助的,尤其是在故障排除或作为系统 admin. 然而,不明智地使用这些位会导致各种安全漏洞。