在 FreeBSD 中,每个文件和目录都有一组关联的权限,并有多个实用工具可用于查看和修改这些权限。理解权限如何工作是必要的,可确保用户能够访问他们需要的文件,并且不能非法访问操作系统使用的文件和其他用户拥有的文件。
本节讨论了在 FreeBSD 中使用的传统 UNIX® 权限。要了解更细粒度的文件系统访问控制,请参考访问控制列表。
在 UNIX® 中,基本权限使用三种类型的访问分配:读取、写入和执行。这些访问类型用于确定文件对文件所有者、组和其他用户(其他所有人)的访问。读取、写入和执行权限可以表示为字母 r,w 和 x。它们也可以表示为二进制数,因为每个权限都是开启或关闭的( 0 )。当表示为数字时,顺序总是读取为 rwx,其中 r 的开启值为 4,w 的开启值为 2,而 x 的开启值为 1。
表 4.1 总结了可能的数值和字母可能性。当阅读"目录列表"列时,使用 - 表示设置为关闭的权限。
表 2. UNIX® 权限
值 | 权限 | 目录列表 |
---|---|---|
使用 -l 参数与 ls(1) 一起,可以列出一个包含有关文件所有者、组和其他人权限的信息列的长目录列表。例如,在任意目录中:
输出应该类似于以下内容:
请注意 myfile 这一行,第一个 (leftmost) 字符表示此文件是常规文件、目录、特殊字符设备、套接字或任何其他特殊伪文件设备。在此示例中,- 表示常规文件。接下来的三个字符,比如 rw-,给出了文件所有者的权限。接下来的三个字符,如 r--,给出了文件所属组的权限。最后三个字符,如 r--,给出了其他用户的权限。短划线表示权限已关闭。在此示例中,权限被设置为这样,文件所有者可以读取并写入文件,组可以读取文件,其他用户只能读取文件。根据上表,此文件的权限将为 644,其中每个数字代表文件权限的三个部分。
系统如何控制设备的权限?FreeBSD 将大多数硬件设备视为程序可以打开、读取和写入数据的文件。这些特殊设备文件存储在 /dev/。
目录也被视为文件。它们具有读取、写入和执行权限。目录的可执行位与文件的含义有所不同。当目录被标记为可执行时,这意味着可以使用 cd(1) 更改进入该目录。这也意味着可以访问该目录中的文件,但受限于文件本身的权限。
为了执行目录列表,必须在目录上设置读取权限。为了删除一个已知名称的文件,需要对包含该文件的目录具有写入和执行权限。
还有更多的权限位,但它们主要用于特殊情况,如 setuid 二进制文件和目录粘滞位。有关文件权限及如何设置它们的更多信息,请参考 chmod(1)。
符号权限使用字符而不是八进制值来为文件或目录分配权限。符号权限使用(谁) (动作) (权限)的语法,可用以下值:
这些值与 chmod(1)一起使用,但使用字母而不是数字。例如,以下命令将阻止与 FILE 关联的组的所有成员和所有其他用户访问 FILE:
当必须对文件进行一组以上的更改时,可以提供逗号分隔的列表。例如,以下命令删除 FILE 上的组和“world”写权限,并为所有人添加执行权限:
除了文件权限外,FreeBSD 还支持使用"文件标志"。这些标志为文件提供了额外的安全性和控制,但不包括目录。通过文件标志,甚至也可以阻止 root 删除和修改文件。
使用 chflags(1)来修改文件标志。例如,要在文件 file1 上启用系统不可删除标志,执行以下命令:
禁用系统不可删除标志,将 sunlink 前加上 "no" :
要查看文件的标志,请使用 -lo 与 ls(1):
有些文件标志只能由 root 用户增加和删除。在其他情况下,文件所有者可以设置其文件标志。有关更多信息,请参阅 chflags(1) 和 chflags(2)。
除了讨论过的权限之外,还有另外三个所有管理员都应该了解的特定设置。它们分别是 setuid,setgid 和 sticky 权限。
这些设置对于某些 UNIX® 操作非常重要,因为它们提供了通常不授予普通用户的功能。要理解它们,必须注意实际用户 ID 和有效用户 ID 之间的区别。
实际用户 ID 是拥有或启动进程的 UID。有效 UID 是进程以其身份运行的用户 ID。例如,当用户修改密码时,passwd(1)会使用实际用户 ID 运行。但是,为了更新密码数据库,该命令将以 root 用户的有效 ID 运行。这样用户可以更改密码而不会产生 Permission Denied 错误。
可以通过为用户添加 s 权限来以符号方式添加 setuid 权限,如下例所示:
也可以通过在权限集前加上数字四(4)来设置 setuid 权限,如下例所示:
现在 suidexample.sh 上的权限看起来像下面这样:
请注意,现在文件所有者权限集中包含了一个 s,取代了可执行位。这允许需要提升权限的实用程序,例如 passwd(1)。
要实时查看此内容,请在两个终端中打开。在一个终端中,以普通用户身份键入 passwd。在它等待新密码时,检查进程列表,并查看 passwd(1) 的用户信息:
在终端 A:
在终端 B:
尽管 passwd(1) 以普通用户身份运行,但它使用的是 root 的有效 UID。
setgid 权限执行与 setuid 权限相同的功能;唯一的区别是它会更改组设置。当应用程序或实用程序以此设置执行时,将基于拥有文件的组而不是启动该进程的用户被授予权限。
要在文件上符号性设置 setgid 权限,请使用 chmod(1) 为该组添加 s 权限:
或者,向 chmod(1) 提供一个前置的两 (2):
在下面的列表中,请注意 s 现在位于用于组权限设置的字段中:
使用 setuid 和 setgid 权限位可能降低系统安全性,因为它允许提升权限。第三个特殊权限,sticky bit,可以加强系统的安全性。
当在目录上设置粘滞位时,只允许文件所有者删除文件。这对防止用户删除公共目录中的文件(如 /tmp )很有用。要使用这个权限,请将 t 模式添加到文件中:
或者,将权限集的前缀设置为一个(1):
sticky bit 权限将显示为权限集的最后一个 t :
选项 | 字母 | 代表 |
---|---|---|
0
无读取、无写入、无执行
---
1
无读取、无写入、执行
--x
2
无读取、写入、无执行
-w-
3
无读取、写入、执行
-wx
4
读取、无写入、无执行
r--
5
读取、无写入、执行
r-x
6
读取、写入、无执行
rw-
7
读取、写入、执行
rwx
(谁)
你
用户
(谁)
g
组所有者
(谁)
o
其他
(谁)
一个
所有(“世界”)
(动作)
+
添加权限
(操作)
-
删除权限
(操作)
=
明确设置权限
(权限)
r
读
(权限)
w
写
(权限)
xt: x
执行
(权限)
text: t
粘滞位
(权限)
s
设置 UID 或 GID