通过 UNIX 文件权限和 ACL 可保证文件安全。带 sticky 位的文件和可执行文件要求特殊的安全措施。
命令 |
说明 |
手册页 |
---|---|---|
列出目录中的文件及其有关信息。 | ||
更改文件的拥有权。 | ||
更改文件的组拥有权。 | ||
更改文件的权限。可以使用符号模式(使用字母和符号)或绝对模式(使用八进制数字)更改文件的权限。 |
传统 UNIX 文件权限可以为三类用户指定拥有权:
用户-文件或目录的属主,通常为创建该文件的用户。文件的属主可以决定谁拥有读取文件、写入文件(对文件进行更改)或执行文件(如果该文件为命令)的权限。
组-一组用户的成员。
其他用户-所有其他不是文件属主和组成员的用户。
文件属主通常可以指定或修改文件权限。此外,具有管理功能的用户或角色(如超级用户或主管理员角色)可以更改文件的拥有权。要覆盖系统策略,请参见示例 6–2。
下表列出并说明了可以为文件或目录的每类用户授予的权限。
表 6–2 文件和目录权限
符号 |
权限 |
对象 |
说明 |
---|---|---|---|
r |
读 |
文件 |
指定的用户可以打开和读取文件内容。 |
|
|
目录 |
指定的用户可以列出目录中的文件。 |
w |
写 |
文件 |
指定的用户可以修改文件的内容或删除该文件。 |
|
|
目录 |
指定的用户可以在目录中添加文件或链接。这些用户也可以删除目录中的文件或链接。 |
x |
执行 |
文件 |
指定的用户可以执行文件(如果该文件为程序或 shell 脚本)。这些用户也可以使用一个 exec(2) 系统调用来运行程序。 |
|
|
目录 |
指定的用户可以打开或执行目录中的文件。这些用户也可以使该目录以及该目录下的目录成为当前目录。 |
- |
拒绝 |
文件和目录 |
指定的用户无法读写或执行文件。 |
这些文件权限可应用于常规文件,也可应用于特殊文件(如设备、套接字和命名管道 (FIFO))。
通过对目录设置受限文件权限,可以保护该目录及其子目录中的文件。但是请注意,超级用户有权访问系统中的所有文件和目录。
可执行文件和公共目录可以使用三种特殊类型的权限:setuid、setgid 和 sticky 位。设置这些权限之后,运行可执行文件的任何用户都应采用该可执行文件属主(或组)的 ID。
设置特殊权限时必须非常小心,因为特殊权限会带来安全风险。例如,通过执行将用户 ID (user ID, UID) 设置为 0(root 的 UID)的程序,用户可以获取超级用户功能。此外,所有用户可以为其拥有的文件设置特殊权限,这会带来其他安全问题。
应对系统中未经授权使用 setuid 权限和 setgid 权限获取超级用户功能的情况进行监视。可疑权限为用户而不是 root 或 bin 授予管理程序的拥有权。要搜索并列出所有使用此特殊权限的文件,请参见如何使用特殊文件权限查找文件。
对可执行文件设置 setuid 权限时,将对运行该文件的进程授予基于文件属主的访问权限。该访问权限不是基于正在运行可执行文件的用户。使用此特殊权限,用户可以访问通常只有属主才可访问的文件和目录。
例如,passwd 命令的 setuid 权限使用户可以更改口令。拥有 setuid 权限的 passwd 命令与以下类似:
-r-sr-sr-x 3 root sys 28144 Jun 17 12:02 /usr/bin/passwd |
此特殊权限会带来安全风险。一些确定的用户甚至可以在 setuid 进程执行完毕后,找到保持由该进程授予他们的权限的方法。
在程序中使用具有保留 UID (0–100) 的 setuid 权限可能无法正确设置有效的 UID。请使用 shell 脚本或避免将保留的 UID 用于 setuid 权限。
setgid 权限与 setuid 权限类似。可将进程的有效组 ID (group ID, GID) 更改为拥有该文件的组,并基于授予该组的权限对用户授权访问权限。/usr/bin/mail 命令拥有 setgid 权限:
-r-x--s--x 1 root mail 67504 Jun 17 12:01 /usr/bin/mail |
将 setgid 权限应用于目录时,该目录中已创建的文件将属于该目录所属于的组。这些文件不属于创建进程所属于的组。在目录中拥有写和执行权限的任何用户都可以在其中创建文件。但是,文件将属于拥有该目录的组,而不是用户所属于的组。
应对系统中未经授权使用 setgid 权限获取超级用户功能的情况进行监视。可疑权限为非常规组而不是 root 或 bin 授予对此类程序的访问权限。要搜索并列出所有使用此权限的文件,请参见如何使用特殊文件权限查找文件。
sticky 位是保护目录中文件的权限位。如果对目录设置了 sticky 位,则只有文件属主、目录属主或特权用户才可以删除文件。root 用户和主管理员角色即是特权用户。sticky 位禁止用户从公共目录(如 /tmp)中删除其他用户的文件:
drwxrwxrwt 7 root sys 400 Sep 3 13:37 tmp |
在 TMPFS 文件系统中设置公共目录时,务必手动设置 sticky 位。有关说明,请参见示例 6–5。
创建文件或目录时,将使用一组缺省权限进行创建。系统缺省值为空。文本文件拥有 666 权限,该权限对所有用户授予读写权限。目录和可执行文件拥有 777 权限,该权限对所有用户授予读写和执行权限。通常,用户会覆盖其 /etc/profile 文件、.cshrc 文件或 .login 文件中的系统缺省值。
由 umask 命令指定的值将从缺省值中减去。此进程的作用是以 chmod 命令授予权限的相同方式拒绝这些权限。例如,chmod 022 对组和其他用户授予写权限。umask 022 命令拒绝组和其他用户的写权限。
下表给出了一些典型 umask 设置及其对可执行文件的影响。
表 6–3 不同安全级别的 umask 设置
安全级别 |
umask 设置 |
禁用的权限 |
---|---|---|
许可 (744) |
022 |
w(组和其他用户) |
中等 (740) |
027 |
w(组),rwx(其他用户) |
中等 (741) |
026 |
w(组),rw(其他用户) |
严重 (700) |
077 |
rwx(组和其他用户) |
有关设置 umask 值的更多信息,请参见 umask(1) 手册页。
使用 chmod 命令,可以更改文件的权限。要更改文件的权限,您必须是超级用户或是文件或目录的属主。
可以使用 chmod 命令按照以下两种模式之一设置权限:
下表列出了在绝对模式下设置文件权限的八进制值。可按顺序以三个一组的形式,使用这些数字来设置属主、组和其他用户的权限。例如,值 644 为属主设置读写权限,为组和其他用户设置只读权限。
表 6–4 在绝对模式下设置文件权限
八进制值 |
设置文件权限 |
权限说明 |
---|---|---|
0 |
--- |
无权限 |
1 |
--x |
仅执行权限 |
2 |
-w- |
只写权限 |
3 |
-wx |
写和执行权限 |
4 |
r-- |
只读权限 |
5 |
r-x |
读和执行权限 |
6 |
rw- |
读写权限 |
7 |
rwx |
读写和执行权限 |
下表列出了用于在符号模式下设置文件权限的符号。符号可以指定要设置或更改其权限的用户、要执行的操作,以及要指定或更改的权限。
表 6–5 在符号模式下设置文件权限
符号 |
功能 |
说明 |
---|---|---|
u |
who |
用户(属主) |
g |
who |
组 |
o |
who |
其他用户 |
a |
who |
所有 |
= |
operator |
赋值 |
+ |
operator |
添加 |
- |
operator |
删除 |
r |
permissions |
读 |
w |
permissions |
写 |
x |
permissions |
执行 |
l |
permissions |
强制锁定,setgid 位打开,组执行位关闭 |
s |
permissions |
setuid 或 setgid 位打开 |
t |
permissions |
Sticky 位打开,对于其他用户,执行位打开 |
功能列中的名称 who operator permissions 指定用于更改文件或目录的权限的符号。
指定要更改其权限的用户。
指定要执行的操作。
指定要更改的权限。
可以在绝对模式或符号模式下设置文件的特殊权限。但是,必须使用符号模式设置或删除目录的 setuid 权限。在绝对模式下,通过在权限三元字节的左侧添加新的八进制值,可设置特殊权限。下表列出了用于对文件设置特殊权限的八进制值。
表 6–6 在绝对模式下设置特殊文件权限
八进制值 |
特殊文件权限 |
---|---|
1 |
Sticky 位 |
2 |
setgid |
4 |
setuid |