3.4.权限

在 FreeBSD 中,每个文件和目录都有一组关联的权限,并有多个实用工具可用于查看和修改这些权限。理解权限如何工作是必要的,可确保用户能够访问他们需要的文件,并且不能非法访问操作系统使用的文件和其他用户拥有的文件。

本节讨论了在 FreeBSD 中使用的传统 UNIX® 权限。要了解更细粒度的文件系统访问控制,请参考访问控制列表。

在 UNIX® 中,基本权限使用三种类型的访问分配:读取、写入和执行。这些访问类型用于确定文件对文件所有者、组和其他用户(其他所有人)的访问。读取、写入和执行权限可以表示为字母 r,w 和 x。它们也可以表示为二进制数,因为每个权限都是开启或关闭的( 0 )。当表示为数字时,顺序总是读取为 rwx,其中 r 的开启值为 4,w 的开启值为 2,而 x 的开启值为 1。

表 4.1 总结了可能的数值和字母可能性。当阅读"目录列表"列时,使用 - 表示设置为关闭的权限。

表 2. UNIX® 权限

权限目录列表

0

无读取、无写入、无执行

---

1

无读取、无写入、执行

--x

2

无读取、写入、无执行

-w-

3

无读取、写入、执行

-wx

4

读取、无写入、无执行

r--

5

读取、无写入、执行

r-x

6

读取、写入、无执行

rw-

7

读取、写入、执行

rwx

使用 -l 参数与 ls(1) 一起,可以列出一个包含有关文件所有者、组和其他人权限的信息列的长目录列表。例如,在任意目录中:

% ls -l

输出应该类似于以下内容:

total 530
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
-rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt

请注意 myfile 这一行,第一个 (leftmost) 字符表示此文件是常规文件、目录、特殊字符设备、套接字或任何其他特殊伪文件设备。在此示例中,- 表示常规文件。接下来的三个字符,比如 rw-,给出了文件所有者的权限。接下来的三个字符,如 r--,给出了文件所属组的权限。最后三个字符,如 r--,给出了其他用户的权限。短划线表示权限已关闭。在此示例中,权限被设置为这样,文件所有者可以读取并写入文件,组可以读取文件,其他用户只能读取文件。根据上表,此文件的权限将为 644,其中每个数字代表文件权限的三个部分。

系统如何控制设备的权限?FreeBSD 将大多数硬件设备视为程序可以打开、读取和写入数据的文件。这些特殊设备文件存储在 /dev/。

目录也被视为文件。它们具有读取、写入和执行权限。目录的可执行位与文件的含义有所不同。当目录被标记为可执行时,这意味着可以使用 cd(1) 更改进入该目录。这也意味着可以访问该目录中的文件,但受限于文件本身的权限。

为了执行目录列表,必须在目录上设置读取权限。为了删除一个已知名称的文件,需要对包含该文件的目录具有写入和执行权限。

还有更多的权限位,但它们主要用于特殊情况,如 setuid 二进制文件和目录粘滞位。有关文件权限及如何设置它们的更多信息,请参考 chmod(1)。

3.4.1. 符号权限

符号权限使用字符而不是八进制值来为文件或目录分配权限。符号权限使用(谁) (动作) (权限)的语法,可用以下值:

选项字母代表

(谁)

用户

(谁)

g

组所有者

(谁)

o

其他

(谁)

一个

所有(“世界”)

(动作)

+

添加权限

(操作)

-

删除权限

(操作)

=

明确设置权限

(权限)

r

(权限)

w

(权限)

xt: x

执行

(权限)

text: t

粘滞位

(权限)

s

设置 UID 或 GID

这些值与 chmod(1)一起使用,但使用字母而不是数字。例如,以下命令将阻止与 FILE 关联的组的所有成员和所有其他用户访问 FILE:

% chmod go= FILE

当必须对文件进行一组以上的更改时,可以提供逗号分隔的列表。例如,以下命令删除 FILE 上的组和“world”写权限,并为所有人添加执行权限:

% chmod go-w,a+x FILE

3.4.2. FreeBSD 文件标志

除了文件权限外,FreeBSD 还支持使用"文件标志"。这些标志为文件提供了额外的安全性和控制,但不包括目录。通过文件标志,甚至也可以阻止 root 删除和修改文件。

使用 chflags(1)来修改文件标志。例如,要在文件 file1 上启用系统不可删除标志,执行以下命令:

# chflags sunlink file1

禁用系统不可删除标志,将 sunlink 前加上 "no" :

# chflags nosunlink file1

要查看文件的标志,请使用 -lo 与 ls(1):

# ls -lo file1
-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

有些文件标志只能由 root 用户增加和删除。在其他情况下,文件所有者可以设置其文件标志。有关更多信息,请参阅 chflags(1) 和 chflags(2)。

3.4.3. 设置用户 ID、设置组 ID 和粘滞位权限

除了讨论过的权限之外,还有另外三个所有管理员都应该了解的特定设置。它们分别是 setuid,setgid 和 sticky 权限。

这些设置对于某些 UNIX® 操作非常重要,因为它们提供了通常不授予普通用户的功能。要理解它们,必须注意实际用户 ID 和有效用户 ID 之间的区别。

实际用户 ID 是拥有或启动进程的 UID。有效 UID 是进程以其身份运行的用户 ID。例如,当用户修改密码时,passwd(1)会使用实际用户 ID 运行。但是,为了更新密码数据库,该命令将以 root 用户的有效 ID 运行。这样用户可以更改密码而不会产生 Permission Denied 错误。

可以通过为用户添加 s 权限来以符号方式添加 setuid 权限,如下例所示:

# chmod u+s suidexample.sh

也可以通过在权限集前加上数字四(4)来设置 setuid 权限,如下例所示:

# chmod 4755 suidexample.sh

现在 suidexample.sh 上的权限看起来像下面这样:

-rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

请注意,现在文件所有者权限集中包含了一个 s,取代了可执行位。这允许需要提升权限的实用程序,例如 passwd(1)。

要实时查看此内容,请在两个终端中打开。在一个终端中,以普通用户身份键入 passwd。在它等待新密码时,检查进程列表,并查看 passwd(1) 的用户信息:

在终端 A:

Changing local password for trhodes
Old Password:

在终端 B:

# ps aux | grep passwd
trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

尽管 passwd(1) 以普通用户身份运行,但它使用的是 root 的有效 UID。

setgid 权限执行与 setuid 权限相同的功能;唯一的区别是它会更改组设置。当应用程序或实用程序以此设置执行时,将基于拥有文件的组而不是启动该进程的用户被授予权限。

要在文件上符号性设置 setgid 权限,请使用 chmod(1) 为该组添加 s 权限:

# chmod g+s sgidexample.sh

或者,向 chmod(1) 提供一个前置的两 (2):

# chmod 2755 sgidexample.sh

在下面的列表中,请注意 s 现在位于用于组权限设置的字段中:

-rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

使用 setuid 和 setgid 权限位可能降低系统安全性,因为它允许提升权限。第三个特殊权限,sticky bit,可以加强系统的安全性。

当在目录上设置粘滞位时,只允许文件所有者删除文件。这对防止用户删除公共目录中的文件(如 /tmp )很有用。要使用这个权限,请将 t 模式添加到文件中:

# chmod +t /tmp

或者,将权限集的前缀设置为一个(1):

# chmod 1777 /tmp

sticky bit 权限将显示为权限集的最后一个 t :

# ls -al / | grep tmp
drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

最后更新于

FreeBSD 中文社区