3.4.权限
在 FreeBSD 中,每个文件和目录都有一组相关的权限,有几个工具可以用来查看和修改这些权限。为了确保用户能够访问他们需要的文件,并且不能非法访问操作系统使用的或其他用户拥有的文件,了解权限的工作方式是必要的。
在 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 |
% 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) 切换到该目录。这也意味着可以访问该目录中的文件,但要取决于文件本身的权限。
为了列出目录内容,必须在目录上设置读取权限。为了删除一个知道名字的文件,必须对包含该文件的目录有写和执行的权限。
符号权限使用字符而非八进制值来给文件或目录分配权限。符号权限使用的语法是(用户)(动作)(权限),其中有 下列参数:
选项 | 参数 | 意义 |
---|---|---|
(用户) | u | 用户 |
(用户) | g | 组 |
(用户) | o | 其他 |
(用户) | a | All (“全部”) |
(动作) | + | 增加权限 |
(动作) | - | 移除权限 |
(动作) | = | 指定权限 |
(权限) | r | 读 |
(权限) | w | 写 |
(权限) | x | 执行 |
(权限) | t | 粘滞位 |
(权限) | s | 设置 UID 或 GID |
% chmod go= FILE
当必须对一个文件进行多组修改时,可以提供一个逗号分隔的列表。例如,下面的命令移除了组和所有人对 FILE 的写入权限,并为每个人增加了执行权限:
% chmod go-w,a+x FILE
除了文件权限之外,FreeBSD 还支持使用“文件标志”。这些标志为文件(不含目录),增加了额外的安全和控制能力。通过文件标志,甚至可以阻止
root
删除或更改文件。# chflags sunlink file1
要移除系统禁止删除标志,请在
sunlink
前面加一个“no”:# chflags nosunlink file1
# ls -lo file1
-rw-r-r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1
除了已经讨论过的权限之外,所有管理员都应该知道还有三个特定的设置:它们是
setuid
、setgid
和 sticky
权限。这些设置对某些 UNIX® 操作很重要,因为它们提供了通常不授予普通用户的功能。为了理解它们,必须注意真实用户 ID 和有效用户 ID 之间的区别。
真实用户 ID 是拥有或启动该进程的 UID。有效 UID 是进程运行的用户 ID。举个例子,当用户修改密码时,passwd(1) 以真实用户 ID 运行。然而,为了更新密码数据库,该命令以
root
用户的有效 ID 运行。这使得用户在修改密码时不会看到 Permission Denied
的错误。setuid 权限可以通过为用户添加符号
s
权限来添加,如下所示:# chmod u+s suidexample.sh
setuid 权限可以通过在权限集前加上数字四(4)来设置,如下例所示:
# chmod 4755 suidexample.sh
suidexample.sh
的权限现在显示如下:-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh
注意
在终端 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
setgid
权限 的功能与 setuid
权限的功能相同;只是它改变了组的设置。当一个应用程序或实用程序以这种设置执行时,它将被授予基于拥有文件的组的权限,而不是启动该进程的用户。# chmod g+s sgidexample.sh
# chmod 2755 sgidexample.sh
注意在下面的列表中,
s
现在位于指定组权限设置的字段:-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidexample.sh
注意
setuid
和 setgid
权限位可能会因为允许提升权限而降低系统的安全性。第三个特殊权限,粘滞位,可以加强系统的安全性。当一个目录上的粘滞位被设置时,它只允许文件所有者删除文件。这对于防止不拥有文件的用户在公共目录(如
/tmp
)中删除文件很有用。要利用这个权限,在文件中添加t
权限:# chmod +t /tmp
或者,在权限集前加一个一(1):
# chmod 1777 /tmp
粘滞位权限将在权限集的最末端显示为
t
:# ls -al / | grep tmp
drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp