粘性位详解
在上个月的期刊中,我讨论了 Linux 权限(参见五月份“前沿”栏目中的文章“请求原谅更容易...”)。我本可以在同一篇文章中介绍 SUID、GUID 和粘性位,但这似乎在一篇文章中涵盖的内容太多了。因此,在本文中,我将介绍 Linux 系统上的特殊权限。标准权限相当直观,但特殊权限起初不太容易理解。不过,一旦您了解了它们的作用,就会发现它们其实并不太复杂。
但是没有更多权限空间了!
当您学习设置文件和文件夹的读取、写入和执行位时,您可能意识到您已经使用了所有可用的“位置”来表示权限。因此,在操作特殊权限时,您实际上是重复使用现有的权限位。它的功能与其他任何权限属性一样,但它们的表示方式有点奇怪。
权限字符串的每个部分(用户、组、其他)都有一个额外的“特殊”权限位,可以像 rwx
一样设置。这些位是否被设置的指示显示在字符串的执行部分。例如:
-
如果设置了 SUID(设置用户 ID)权限,则用户部分的执行位显示为 s 而不是 x。
-
如果设置了 GUID(设置组用户 ID)权限,则组部分的执行位显示为 s 而不是 x。
-
如果设置了粘性位,则其他部分的执行位显示为 t 而不是 x。
是不是有点困惑?这里有一些例子:
-
-rwsrw-rw-
— 此文件上设置了 SUID。 -
drw-rwsrw-
— 此文件夹上设置了 GUID。 -
drw-rw-r-t
— 此文件夹上设置了粘性位。 -
-rwSr--r--
— 此文件上设置了 SUID,但是 用户执行位未设置。
请注意,在最后一个示例中,S 是大写的。这是您可以判断底层执行位是否被设置的方式。如果 SUID 位是小写的,则表示执行位已设置。如果它是大写的,则表示 SUID 位已设置,但可执行位未设置。
它们是做什么用的?
与标准权限不同,特殊权限改变的是文件和文件夹的功能,而不是控制访问。它们的功能也因分配给文件还是文件夹而异。让我们逐个了解它们。
SUID: SUID 位应用于可执行程序。一旦设置,程序将以拥有该文件的用户的权限和能力执行。您可以想象,这可能是一个巨大的安全风险!如果文件由 root 拥有并且设置了 SUID 位,则任何执行该文件的人都具有与 root 用户相同的权限。尽管听起来很可怕,但在某些情况下,这样做是合理的。一个完美的例子是 ping
程序。为了访问 ping 主机所需的网络硬件,用户需要具有 root 访问权限。为了让所有用户都能够使用 ping
,它被设置为 SUID 位,并且每个人都可以使用与 root 相同的系统权限执行它。通过输入 ls -l /bin/ping
在您的系统上查看一下。您应该看到 SUID 位已设置!
在文件夹上设置 SUID 位无效。
GUID: 在可执行文件上设置的 GUID 与 SUID 的效果类似,不同之处在于,它不是使用拥有该文件的用户的权限,而是使用组成员身份的权限执行。这不太常用,但在某些多用户环境中,它可能是需要的。
GUID 主要用于文件夹。如果在文件夹上设置了 GUID 位,则在该文件夹内创建的文件将继承该文件夹本身的组成员身份。这在团队协作中特别有用。通常,当某人创建一个文件时,它具有该用户主组的组成员身份。在 GUID 文件夹中,用户仍然拥有该文件,但组成员身份会自动设置,以便组中的其他人可以访问这些文件。
粘性位: 首先,我不知道为什么粘性位用 t 而不是 s 表示。我到处搜索,也问了很多人。似乎没有人知道。也许有 Linux Journal 的读者知道答案并能启发我。(如果是这样,我会将其包含在“读者来信”栏目中。)无论如何,粘性位是另一种用于文件夹的特殊权限。事实上,如果它设置在文件上,则根本无效。
设置了粘性位的文件夹为其中创建的文件添加了一层保护。通常,在多人可访问的文件夹中,任何人都可以删除其他任何人的文件。(即使他们没有对这些文件的写入权限!)设置了粘性位后,只有拥有该文件的用户才能删除它。这似乎是一件很微妙的事情,但是当您考虑到多用户 Linux 系统上的 /tmp 文件夹之类的文件夹时,您就可以看到粘性位有多么重要!事实上,如果不是因为粘性位,您系统上的 /tmp 文件夹就会像狂野的西部一样,而邪恶的枪手可以随意删除其他人的文件。您可以通过输入 ls -l / | grep tmp
在您的系统上看到粘性位已设置。
分配特殊权限
将特殊权限应用于文件或文件夹与分配常规权限完全相同。您可以使用 chmod 工具 — 例如:
-
chmod u+s file.txt
— 将 SUID 权限添加到 file.txt。 -
chmod g-s file.txt
— 从 file.txt 中删除 GUID 权限。 -
chmod o+t folder
— 将粘性位添加到 “folder” 目录。
特殊权限也可以与常规权限一起分配,因此像这样的操作完全没问题:
chmod ug+rw,u+s,ugo-x file.txt
就像标准权限一样,也可以(而且通常更可取)使用八进制表示法分配特殊权限。为了做到这一点,您可以使用第四个字段。当像这样分配权限时:
chmod 755 file.txt
有一个第四个字段,如果省略,则假定为零。因此,这实际上与上面的示例相同:
chmod 0755 file.txt
前面的零是分配特殊权限的字段。如果您省略它,则假定为零,并且不分配任何特殊权限。但是,了解它的存在应该可以很容易地理解如何使用它。如果您阅读了上个月关于权限的文章,其中包含对八进制表示法的理解,只需将该概念应用于特殊权限即可。图 1 显示了它的分解方式。

图 1. 八进制表示法
因此,为了为用户和组分配文件夹的读/写访问权限以及 GUID 位,您需要键入:
chmod 2770 foldername
并且,生成的权限字符串(通过键入 ls -l
查看)将显示以下内容(请注意小写 s — 还记得这意味着什么吗?):
drwxrws--- foldername
就像标准权限一样,如果您想设置多个特殊权限,只需将值相加即可。为了设置 SUID 和粘性位,您需要将第四个八进制字段设置为 5。通常,任何特定文件或文件夹上只设置一个特殊权限,但是使用八进制表示法,您可以选择以您认为合适的任何方式设置它们。
希望这两篇文章能够消除您对 Linux 权限的任何误解。ACL 提供了更复杂的访问控制,但对于大多数用例,标准的权限字符串足以控制对系统上文件和文件夹的访问。