3.4.权限

3.4. 权限

在 FreeBSD 中,每个文件和目录都有一组关联的权限,并提供了几个实用程序用于查看和修改这些权限。了解权限的工作原理是确保用户能够访问他们需要的文件,并且不能不当地访问操作系统使用的文件或其他用户拥有的文件的必要条件。

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

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

表 4.1 总结了可能的数字和字母组合。在阅读“目录列表”列时,使用-表示关闭的权限。

表 3. UNIX® 权限

权限目录列表

0

不可读,不可写,不可执行

---

1

不可读,不可写,执行

--x

2

不可读,写入,不可执行

-w-

3

不可读,写入,执行

-wx

4

读取,不可写,不可执行

r--

5

读取,不可写,执行

r-x

6

读取,写入,不可执行

rw-

7

读取,写入,执行

rwx

使用-l参数与ls(1)一起,查看包括有关文件所有者、组和其他所有人的文件权限的信息列的长目录列表。例如,在任意目录中运行ls -l可能显示:

% 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行,第一个(最左边的)字符指示此文件是常规文件、目录、特殊字符设备、套接字还是任何其他特殊伪文件设备。在这个例子中,-表示一个常规文件。接下来的三个字符,在这个例子中是rw-,给出了文件所有者的权限。接下来的三个字符,r--,给出了文件所属组的权限。最后的三个字符,r--,给出了其他地方的权限。破折号表示权限已关闭。在这个例子中,权限被设置为所有者可以读写文件,组可以读取文件,而其他世界只能读取文件。根据上面的表格,该文件的权限将为644,其中每个数字代表文件权限的三个部分。

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

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

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

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

3.4.1. 符号权限

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

选项字母表示

(谁)

u

用户

(谁)

g

组所有者

(谁)

o

其他

(谁)

a

所有(“world”)

(动作)

+

添加权限

(动作)

-

删除权限

(动作)

=

明确设置权限

(权限)

r

读取

(权限)

w

写入

(权限)

x

执行

(权限)

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删除或更改文件。

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

# chflags sunlink file1

要禁用系统不可删除标志,在sunlink前面加上“no”:

# chflags nosunlink file1

要查看文件的标志,使用-lols(1)

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

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

3.4.3. setuid、setgid 和 sticky 权限

除了已经讨论的权限之外,还有三种其他特定设置,所有管理员都应该了解。它们是setuidsetgidsticky权限。

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

实际用户 ID 是拥有或启动进程的 UID。有效 UID 是进程运行的用户 ID。例如,passwd(1)在用户更改密码时以实际用户 ID 运行。然而,为了更新密码数据库,该命令以root用户的有效 ID 运行。这允许用户更改密码而不会看到“Permission Denied”错误。

可以通过以下示例中的两种方式之一通过符号添加setuid权限:

# chmod u+s suidexample.sh

或者,通过在权限集前面加上数字四(4),如下例所示:

# chmod 4755 suidexample.sh

现在,suidexample.sh的权限如下:

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

请注意,s现在是分配给文件所有者权限的一部分,取代了可执行位。这允许需要提升权限的实用程序(例如passwd(1))运行。

注意

nosuid mount(8)选项将导致此类二进制文件无声地失败,而不会通知用户。该选项并不完全可靠,因为nosuid包装程序可能能够规遍它。

要实时查看此示例,请打开两个终端。在其中一个中,作为普通用户键入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

注意

在这些示例中,尽管涉及的 shell 脚本是一个可执行文件,但它将不会以不同的 EUID 或有效用户 ID 运行。这是因为 shell 脚本可能无法访问setuid(2)系统调用。

setuidsetgid权限位可能会降低系统安全性,因为它们允许提升的权限。第三个特殊权限,粘性位,可以增强系统的安全性。

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

# chmod +t /tmp

或者,使用前缀数字一(1):

# chmod 1777 /tmp

粘性位权限将显示为权限设置的最后一个t

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

最后更新于

FreeBSD 中文社区