3.4. 权限

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

本节讨论传统的UNIX®在 FreeBSD 中使用的权限。有关更精细的文件系统访问控制,请参阅第 13.9 节 “文件系统访问控制表”

UNIX®,基础权限透过三种类型的存取来分配:读取、写入与执行。这些存取类型用来决定档案拥有者、群组以及其他人(其他任何人)的档案存取权。读取、写入及执行权限可使用rw,and x字母来表示。这些权限也可以使用二进位数字来表示每种权限的开或关(0)。当以二进位数字来表示时,阅读的顺序为rwx,其中r开启的值为4w开启的值为2以及x开启的值为1

表格4.1摘要了可用的数字及可用的字母。当阅读目录清单标示字段时,-用来代表该权限设为关闭。

表 3.2. UNIX® 权限
权限目录列表
0不可读,不可写,不可执行---
1不可读,不可写,可执行--x
2不可读,可写,不可执行-w-
3不可读,可写,可执行-wx
4可读,不可写,不可执行r--
5可读,不可写,可执行r-x
6可读,可写,不可执行rw-
7可读,可写,可执行rwx

使用ls(1)-l参数可以查看一个长目录列表,其中包含有关文件所有者、组和其他所有人的权限的信息列。例如,任意目录中的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

第一个(最左边)的字元用来表示这个档案的类型为何,除标准档案以外,尚有目录、特殊字元装置、Socket及其他特殊虚拟档案装置,在此例当中,-表示该档案为一个标准的档案。示例中接下来的三个字元中,rw-代表所有者对档案拥有的权限。再接下来的三个字元,r--则代表群组对档案拥有的权限,最后三个字元,r--则代表其他人对档案拥有的权限。破折号(-)表示没有权限,示例中的这个档案的权限,只允许所有者读取、写入档案,群组以及其他人仅能读取档案。根据以上的表格,此种权限的档案可以使用644来表示,每组数字分别代表档案的三种权限。

那系统如何控制装置的权限?实际上FreeBSD对大多的硬盘装置就如同档案,程序可以开启、读取以及写入数据如一般档案。这些特殊装置档案都储存于/dev/目录中。

目录也同如档案,拥有读取、写入及执行的权限,但在执行权限上与档案有明显的差异。当目录被标示为可执行时,代表可以使用cd(1)指令切换进入该目录。也代表能够存取在此目录之中的已知文件名的档案,但仍会受限于档案本身所设定的权限。

要能够列出目录内容,必须拥有目录的读取权限。要删除已知文件名的档案,必须拥有档案所在目录的写入以及执行的权限。

还有一些权限位,但这些权限主要在特殊情况使用,如setuid执行档及sticky目录。如果您还想知道更多档案权限的信息及使用方法,请务必参阅chmod(1)

3.4.1. 符号权限

Contributed by Tom Rhodes.

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

选项字母含义
(who)u用户
(who)g组所有者
(who)o其他
(who)aAll (world)
(action)+添加权限
(action)-删除权限
(action)=显式设置权限
(permissions)r
(permissions)w
(permissions)x执行
(permissions)t粘性位
(permissions)s设置 UID 或 GID

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

% chmod go= FILE

当必须对文件进行多组更改时,可以提供逗号分隔列表。例如,下面的命令删除组和world写入 FILE的权限,并添加每个人的执行权限:

% chmod go-w,a+x FILE

3.4.2. FreeBSD 文件标志

Contributed by Tom Rhodes.

除了文件权限外,FreeBSD 还支持file flags。这些标志添加了对文件(而非目录)的附加安全级别和控制。使用文件标志,即使是root也可以阻止删除或更改文件。

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

# chflags sunlink file1

要禁用系统不可删除标志,请在sunlink前放置no

# chflags nosunlink file1

要查看文件的标志,请使用-lo with 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. setuidsetgidsticky权限

Contributed by Tom Rhodes.

除了已经探讨过的权限外,这里尚有另外三种特别的设定所有管理者都应该知道,这些设定为setuidsetgid以及sticky权限。

这些设定对某些一般不会授权给一般使用者的UNIX®操作非常重要,它让这些功能可运作。要了解这些权限,就必须说明真实使用者ID(Real user ID)与有效使用者ID(Effective user ID)的差异。

真实使用者ID即是拥有者或启动程序者的UID,而有效UID是执行程序所使用的使用者ID。例如,passwd(1)在使用者更改自己的密码时会以真实使用者ID执行,然而,为了要更新密码数据库,该指令必须以root使用者做为有效ID来执行,这让使用者可以更改自己的密码而不会遇到权限不足(Permission Denied)的错误。

Setuid 权限可以透过在权限集前加上数字(4)来设定,如下示例所示:

# chmod 4755 suidexample.sh

现在suidexample.sh的权限会如下所示:

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

注意,s现在取代了原来的执行位成为指定档案拥有者权限集的一部份,这会允许须要提升权限的工具,如passwd(1)可正常使用。

注意:

mount(8)nosuid选项会造成这类Binary执行失败,但不会警告使用者。由于nosuid Wrapper可能可绕过该选项,因此该选项并非完全可靠。

实际来看这个示例,先开启两个终端机,其中一个用一般使用者输入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)的参数前加上(2):

# chmod 2755 sgidexample.sh

在以下列表中,请注意s现在位于为组权限设置指定的字段中:

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

注意:

在以上这些示例中,虽然在例子中的Shell script是可执行的档案,但并不会以其他的EUID或有效使用者ID执行,这是因为Shell script并不会存取setuid(2)系统呼叫(System call)。

setuidsetgid权限位可能会因允许提升权限而降低系统的安全性,因此有了第三个特殊的权限:sticky bit,可以加强系统的安全性。

当在目录上设定sticky bit,将只允许由档案拥有者删除档案。这对避免公开目录,如/tmp中的档案被不拥有该档案的人删除非常有用。要使用这个权限,可在权限集前加上(1):

# chmod 1777 /tmp

sticky bit权限会以t显示于权限集的最后:

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

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.