本章介绍如何保护 Solaris 操作系统 (Solaris Operating System, Solaris OS) 中的文件,还将介绍如何防范其权限可能危及系统安全的文件。
以下是本章中信息的列表:
通过 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 |
传统 UNIX 文件保护可为以下三类用户提供读写和执行权限:文件属主、文件组和其他用户。访问控制列表 (Access Control List, ACL) 通过允许您执行以下操作来提供更好的文件安全性:
为文件属主、组、其他用户、特定用户和特定组定义文件权限
为上面的每一种类别定义缺省权限
例如,如果想要组中的每个用户都能够读取某文件,则只需要授予该组对该文件的读取权限即可。现在,假设您希望组中只有一个用户能够写入该文件。标准 UNIX 不提供该级别的文件安全性。但是,ACL 可提供此级别的文件安全性。
ACL 项定义文件的 ACL。这些项通过 setfacl 命令设置。 ACL 项由以下字段组成并使用冒号进行分隔:
entry-type:[uid|gid]:perms |
设置文件权限的 ACL 项的类型。例如,entry-type 可以是 user(文件属主)或 mask(ACL 掩码)。有关 ACL 项的列表,请参见表 6–7 和表 6–8。
用户名或用户 ID (user ID, UID)。
组名或组 ID (group ID, GID)。
表示 entry-type 中设置的权限。perms 可以由符号字符 rwx 或八进制数字表示。这些数字与用于 chmod 命令的数字相同。
在以下示例中,ACL 项为用户 stacey 设置读写权限。
user:stacey:rw- |
仅 UFS 文件系统支持 UFS 文件系统属性,例如 ACL。因此,如果将具有 ACL 项的文件恢复或复制到 /tmp 目录(通常挂载为 TMPFS 文件系统)中,则这些 ACL 项将丢失。使用 /var/tmp 目录临时存储 UFS 文件。
下表列出了对文件设置 ACL 时可以使用的有效 ACL 项。前三个 ACL 项提供基本的 UNIX 文件保护。
表 6–7 文件的 ACL 项
ACL 项 |
说明 |
---|---|
u[ser]::perms |
文件属主权限。 |
g[roup]::perms |
文件组权限。 |
o[ther]:perms |
文件属主或文件组成员之外的用户的权限。 |
m[ask]:perms |
ACL 掩码。掩码项表示允许用户(属主除外)和组拥有的最大权限。掩码是一种可快速更改所有用户和组的权限的方法。 例如,mask:r-- 掩码项表示,用户和组只能拥有读取权限,即使他们可能拥有写和执行权限。 |
u[ser]:uid:perms |
特定用户的权限。对于 uid,可以指定用户名或数字 UID。 |
g[roup]:gid:perms |
特定组的权限。对于 gid,可以指定组名或数字 GID。 |
除表 6–7 中说明的 ACL 项外,还可以对目录设置缺省 ACL 项。在具有缺省 ACL 项的目录中创建的文件或目录将具有与缺省 ACL 项相同的 ACL 项。表 6–8 列出了目录的缺省 ACL 项。
首次为特定用户和组设置目录的缺省 ACL 项时,还必须为文件属主、文件组、其他用户和 ACL 掩码设置缺省 ACL 项。这些项是必需的。这些项是下表中前四个缺省 ACL 项。
表 6–8 目录的缺省 ACL 项
缺省 ACL 项 |
说明 |
---|---|
d[efault]:u[ser]::perms |
缺省文件属主权限。 |
d[efault]:g[roup]::perms |
缺省文件组权限。 |
d[efault]:o[ther]:perms |
文件属主或文件组成员之外的用户的缺省权限。 |
d[efault]:m[ask]:perms |
缺省 ACL 掩码。 |
d[efault]:u[ser]:uid:perms |
特定用户的缺省权限。对于 uid,可以指定用户名或数字 UID。 |
d[efault]:g[roup]:gid:perms |
特定组的缺省权限。对于 gid,可以指定组名或数字 GID。 |
以下命令可管理文件或目录的 ACL。
设置、添加、修改和删除 ACL 项。有关更多信息,请参见 setfacl(1) 手册页。
显示 ACL 项。有关更多信息,请参见 getfacl(1) 手册页。
在将可执行栈的权限设置为读写和执行时,很多安全错误与缺省可执行栈有关。虽然允许栈拥有执行权限,但大多数程序可以在不使用可执行栈的情况下正常运行。
使用 noexec_user_stack 变量,可以指定栈映射是否可执行。从 Solaris 2.6 发行版开始,可以使用该变量。缺省情况下,该变量被设置为零(64 位应用程序中除外),这将提供兼容 ABI 的行为。如果将该变量设置为非零值,则系统会将系统中每个进程的栈标记为可读写,但不可执行。
设置此变量后,将向尝试执行其栈中代码的程序发送一个 SIGSEGV 信号。此信号通常将导致程序终止,同时进行核心转储。这样的程序还将生成一条警告消息,该消息中包括违例程序的名称、进程 ID 和运行该程序的用户的实际 UID。例如:
a.out[347] attempt to execute code on stack by uid 555 |
将 syslog kern 功能设置为 notice 级别时,该消息由 syslog 守护进程记录。缺省情况下,将在 syslog.conf 文件中设置此日志,这意味着,消息将发送到控制台和 /var/adm/messages 文件。有关更多信息,请参见 syslogd(1M) 和 syslog.conf(4) 手册页。
syslog 消息用于观察可能的安全问题。通过设置此变量,该消息还将确定依赖于可执行栈(已被禁止,无法正确执行操作)的有效程序。如果不想记录任何消息,则可以在 /etc/system 文件中将 noexec_user_stack_log 变量设置为零。即使未记录消息,SIGSEGV 信号仍可能会导致执行程序终止,同时进行核心转储。
如果希望程序显式将其栈标记为可执行,则可以使用 mprotect() 功能。有关更多信息,请参见 mprotect(2) 手册页。
由于硬件限制,在大多数基于 x86 的系统中不能使用捕获和报告可执行栈问题的功能。AMD64 产品系列中的系统可以捕获和报告可执行栈问题。
任务 |
说明 |
参考 |
---|---|---|
使用 UNIX 权限保护文件 |
查看文件的 UNIX 权限。使用 UNIX 权限保护文件。 | |
使用 ACL 保护文件 |
添加 ACL,以便在比 UNIX 权限更周密的级别上保护文件。 | |
防止系统受到来自文件的安全风险 |
查找具有可疑拥有权的可执行文件。禁用可能会破坏系统的文件。 |
以下任务列表说明列出文件权限、更改文件权限,以及使用特殊文件权限保护文件的过程。
任务 |
参考 |
---|---|
显示文件信息 | |
更改文件拥有权 | |
更改文件权限 |
使用 ls 命令显示有关目录中所有文件的信息。
在以下示例中,显示了 /sbin 目录中部分文件的列表。
% cd /sbin % ls -la total 13456 drwxr-xr-x 2 root sys 512 Sep 1 14:11 . drwxr-xr-x 29 root root 1024 Sep 1 15:40 .. -r-xr-xr-x 1 root bin 218188 Aug 18 15:17 autopush lrwxrwxrwx 1 root root 21 Sep 1 14:11 bpgetfile -> ... -r-xr-xr-x 1 root bin 505556 Aug 20 13:24 dhcpagent -r-xr-xr-x 1 root bin 456064 Aug 20 13:25 dhcpinfo -r-xr-xr-x 1 root bin 272360 Aug 18 15:19 fdisk -r-xr-xr-x 1 root bin 824728 Aug 20 13:29 hostconfig -r-xr-xr-x 1 root bin 603528 Aug 20 13:21 ifconfig -r-xr-xr-x 1 root sys 556008 Aug 20 13:21 init -r-xr-xr-x 2 root root 274020 Aug 18 15:28 jsh -r-xr-xr-x 1 root bin 238736 Aug 21 19:46 mount -r-xr-xr-x 1 root sys 7696 Aug 18 15:20 mountall . . . |
每一行按以下顺序显示了有关文件的信息:
文件的类型-例如,d。有关文件类型的列表,请参见文件和目录的拥有权。
权限-例如,r-xr-xr-x。有关说明,请参见文件和目录的拥有权。
硬链接数-例如,2。
文件的属主-例如,root。
文件的组-例如,bin。
文件的大小(以字节为单位)-例如,7696。
创建文件的日期或上次更改文件的日期-例如,Aug 18 15:20。
文件名-例如,mountall。
文件属主、主管理员角色或超级用户可以更改任何文件的拥有权。
显示文件的权限。
% ls -l example-file -rw-r--r-- 1 janedoe staff 112640 May 24 10:49 example-file |
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
更改文件的属主。
# chown stacey example-file |
检验文件的属主是否已更改。
# ls -l example-file -rw-r--r-- 1 stacey staff 112640 May 26 08:50 example-file |
安全注意事项-您应该有合理理由通过将 rstchown 变量设置为零来覆盖系统安全策略。访问系统的任何用户都可以更改系统中任何文件的拥有权。
在此示例中,在 /etc/system 文件中将 rstchown 变量的值设置为零。通过此设置,文件属主可以使用 chown 命令将文件的拥有权更改为另一用户。通过此设置,文件属主还可以使用 chgrp 命令将文件的组拥有权设置为非其所在的组。重新引导系统后,更改将生效。
set rstchown = 0 |
有关更多信息,请参见 chown(1) 和 chgrp(1) 手册页。
此外,请注意,已挂载 NFS 的文件系统对更改拥有权和组有更多限制。有关限制对已挂载 NFS 的系统的访问的更多信息,请参见《系统管理指南:网络服务》中的第 6 章 “访问网络文件系统(参考)”。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
$ chgrp scifi example-file |
有关设置组的信息,请参见《系统管理指南:基本管理》中的第 4 章 “管理用户帐户和组(概述)”。
检验文件的组拥有权是否已更改。
$ ls -l example-file -rw-r--r-- 1 stacey scifi 112640 June 20 08:55 example-file |
另请参见示例 6–2。
如果您不是文件或目录的属主,请成为超级用户或承担等效角色。
只有当前属主或超级用户可以使用 chmod 命令更改文件或目录的文件权限。
在符号模式下更改权限。
% chmod who operator permissions filename |
指定要更改其权限的用户。
指定要执行的操作。
指定要更改的权限。有关有效的符号列表,请参见表 6–5。
指定文件或目录。
检验文件的权限是否已更改。
% ls -l filename |
在以下示例中,将解除其他用户的读取权限。
% chmod o-r example-file1 |
在以下示例中,将为用户、组和其他用户添加读和执行权限。
$ chmod a+rx example-file2 |
在以下示例中,将为组指定读写和执行权限。
$ chmod g=rwx example-file3 |
如果您不是文件或目录的属主,请成为超级用户或承担等效角色。
只有当前属主或超级用户可以使用 chmod 命令更改文件或目录的文件权限。
在绝对模式下更改权限。
% chmod nnn filename |
按照该顺序指定将表示文件属主、文件组和其他用户的权限的八进制值。有关有效八进制值的列表,请参见表 6–4。
指定文件或目录。
使用 chmod 命令更改具有 ACL 项的文件的文件组权限时,文件组权限和 ACL 掩码都将更改为新权限。请注意,新 ACL 掩码权限可以更改在文件中具有 ACL 项的其他用户和组的权限。使用 getfacl 命令以确保为所有 ACL 项都设置了适当的权限。有关更多信息,请参见 getfacl(1) 手册页。
检验文件的权限是否已更改。
% ls -l filename |
在以下示例中,将公共目录的权限从 744(读、写、执行;只读;只读)更改为 755(读、写、执行;读和执行;读和执行)。
# ls -ld public_dir drwxr--r-- 1 ignatz staff 6023 Aug 5 12:06 public_dir # chmod 755 public_dir # ls -ld public_dir drwxr-xr-x 1 ignatz staff 6023 Aug 5 12:06 public_dir |
在以下示例中,将可执行 shell 脚本的权限从读写更改为读写和执行。
% ls -l my_script -rw------- 1 ignatz staff 6023 Aug 5 12:06 my_script % chmod 700 my_script % ls -l my_script -rwx------ 1 ignatz staff 6023 Aug 5 12:06 my_script |
如果您不是文件或目录的属主,请成为超级用户或承担等效角色。
只有当前属主或具有超级用户功能的用户可以使用 chmod 命令更改文件或目录的特殊权限。
% chmod nnnn filename |
指定用于更改文件或目录的权限的八进制值。最左侧的八进制值设置文件的特殊权限。有关特殊权限的有效八进制值的列表,请参见表 6–6。
指定文件或目录。
使用 chmod 命令更改具有 ACL 项的文件的文件组权限时,文件组权限和 ACL 掩码都将更改为新权限。请注意,新 ACL 掩码权限可以更改在文件中具有 ACL 项的其他用户和组的权限。使用 getfacl 命令以确保为所有 ACL 项都设置了适当的权限。有关更多信息,请参见 getfacl(1) 手册页。
检验文件的权限是否已更改。
% ls -l filename |
在以下示例中,将对 dbprog 文件设置 setuid 权限。
# chmod 4555 dbprog # ls -l dbprog -r-sr-xr-x 1 db staff 12095 May 6 09:29 dbprog |
在以下示例中,将对 dbprog2 文件设置 setgid 权限。
# chmod 2551 dbprog2 # ls -l dbprog2 -r-xr-s--x 1 db staff 24576 May 6 09:30 dbprog2 |
在以下示例中,将对 public_dir 目录设置 sticky 位权限。
# chmod 1777 public_dir # ls -ld public_dir drwxrwxrwt 2 ignatz staff 512 May 15 15:27 public_dir |
以下任务列表说明列出文件的 ACL、更改 ACL,以及将 ACL 复制到另一个文件的过程。
任务 |
参考 |
---|---|
确定文件是否具有 ACL | |
将 ACL 添加到文件 | |
复制 ACL | |
修改 ACL | |
删除文件的 ACL | |
显示文件的 ACL |
% ls -l filename |
其中,filename 指定文件或目录。
在输出中,模式字段右侧的加号 (+) 表示该文件具有 ACL。
除非已添加了用于扩展 UNIX 文件权限的 ACL 项,否则会将文件视为具有“琐碎” ACL,并且不会显示加号 (+)。
在以下示例中,ch1.sgm 文件具有 ACL。ACL 由模式字段右侧的加号 (+) 表示。
% ls -l ch1.sgm -rwxr-----+ 1 stacey techpubs 167 Nov 11 11:13 ch1.sgm |
% setfacl -s user::perms,group::perms,other:perms,mask:perms,acl-entry-list filename ... |
设置文件的 ACL。如果文件已具有 ACL,则会替换该 ACL。此选项要求至少有 user::、group:: 和 other:: 项。
指定文件属主权限。
指定组属主权限。
为文件属主或组成员之外的用户指定权限。
指定 ACL 掩码的权限。掩码表示允许用户(属主除外)和组拥有的最大权限。
指定文件或目录中要为特定用户和组设置的一个或多个 ACL 项的列表。也可以设置目录的缺省 ACL 项。表 6–7 和表 6–8 显示了有效的 ACL 项。
指定要对其设置 ACL 的一个或多个文件或目录。多个 filename 由空格分隔。
如果该文件已存在 ACL,则 -s 选项将使用新的 ACL 替换整个 ACL。
有关更多信息,请参见 setfacl(1) 手册页。
% getfacl filename |
有关更多信息,请参见如何检查文件是否具有 ACL。
在以下示例中,会在 ch1.sgm 文件中将文件属主权限设置为读写、将文件组权限设置为只读,并将其他用户权限设置为无。此外,还在文件中为用户 anusha 指定读写权限。将 ACL 掩码权限设置为读写,这意味着任何用户或组都没有执行权限。
% setfacl -s user::rw-,group::r--,other:---,mask:rw-,user:anusha:rw- ch1.sgm % ls -l total 124 -rw-r-----+ 1 stacey techpubs 34816 Nov 11 14:16 ch1.sgm -rw-r--r-- 1 stacey techpubs 20167 Nov 11 14:16 ch2.sgm -rw-r--r-- 1 stacey techpubs 8192 Nov 11 14:16 notes % getfacl ch1.sgm # file: ch1.sgm # owner: stacey # group: techpubs user::rw- user:anusha:rw- #effective:rw- group::r-- #effective:r-- mask:rw- other:--- |
在以下示例中,会将文件属主权限设置为读写和执行,将文件组权限设置为只读,并将其他用户权限设置为无。此外,还会在 ch2.sgm 文件中将 ACL 掩码权限设置为读。最后,将为用户 anusha 指定读写权限。但是,由于 ACL 掩码的原因,anusha 的权限为只读。
% setfacl -s u::7,g::4,o:0,m:4,u:anusha:7 ch2.sgm % getfacl ch2.sgm # file: ch2.sgm # owner: stacey # group: techpubs user::rwx user:anusha:rwx #effective:r-- group::r-- #effective:r-- mask:r-- other:--- |
通过重定向 getfacl 输出,将文件的 ACL 复制到另一个文件。
% getfacl filename1 | setfacl -f - filename2 |
指定将从其中复制 ACL 的文件。
指定要对其设置所复制的 ACL 的文件。
在以下示例中,会将 ch2.sgm 中的 ACL 复制到 ch3.sgm。
% getfacl ch2.sgm | setfacl -f - ch3.sgm |
在以下示例中,将用户 anusha 的权限修改为读写。
% setfacl -m user:anusha:6 ch3.sgm % getfacl ch3.sgm # file: ch3.sgm # owner: stacey # group: techpubs user::rw- user::anusha:rw- #effective:r-- group::r- #effective:r-- mask:r-- other:r- |
在以下示例中,将组 staff 的缺省权限修改为对 book 目录的读取权限。此外,还将缺省 ACL 掩码权限修改为读写。
% setfacl -m default:group:staff:4,default:mask:6 book |
删除文件的 ACL 项。
% setfacl -d acl-entry-list filename ... |
删除指定的 ACL 项。
指定文件或目录中要删除的 ACL 项(未指定权限)的列表。只能删除特定用户和组的 ACL 项和缺省 ACL 项。表 6–7 和表 6–8 显示了有效的 ACL 项。
指定一个或多个文件或目录,由空格分隔。
或者,可以使用 setfacl -s 命令删除文件的所有 ACL 项,并使用所指定的新 ACL 项替换它们。
检验是否已删除文件的 ACL 项。
% getfacl filename |
在以下示例中,将从 ch4.sgm 文件中删除用户 anusha。
% setfacl -d user:anusha ch4.sgm |
% getfacl [-a | -d] filename ... |
显示指定文件或目录的文件名、文件属主、文件组和 ACL 项。
显示指定目录的文件名、文件属主、文件组和缺省 ACL 项(如果存在)。
指定一个或多个文件或目录,由空格分隔。
如果在命令行中指定多个文件名,则会在每两个 ACL 项之间显示一个空白行。
在以下示例中,将显示文件 ch1.sgm 的所有 ACL 项。用户和组项旁边的 #effective: 注释表示由 ACL 掩码修改后的权限。
% getfacl ch1.sgm # file: ch1.sgm # owner: stacey # group: techpubs user::rw- user:anusha:r- #effective:r-- group::rw- #effective:rw- mask:rw- other:--- |
% getfacl -d book # file: book # owner: stacey # group: techpubs user::rwx user:anusha:r-x #effective:r-x group::rwx #effective:rwx mask:rwx other:--- default:user::rw- default:user:anusha:r-- default:group::rw- default:mask:rw- default:other:--- |
以下任务列表说明查找系统中的危险可执行程序,以及禁止程序利用可执行栈的过程。
任务 |
说明 |
参考 |
---|---|---|
使用特殊权限查找文件 |
查找设置了 setuid 位,但不归 root 用户拥有的文件。 | |
防止可执行栈溢出 |
防止程序利用可执行栈。 | |
防止记录可执行栈消息 |
关闭记录可执行栈消息 |
应对系统中未经授权在程序中使用 setuid 和 setgid 权限的情况进行监视。使用 setuid 和 setgid 权限,普通用户可以获取超级用户功能。可疑可执行文件为用户而不是 root 或 bin 授予拥有权。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
使用 find 命令查找拥有 setuid 权限的文件
# find directory -user root -perm -4000 -exec ls -ldb {} \; >/tmp/filename |
检查以指定的 directory(可以是 root (/)、sys、 bin 或 mail)开头的所有挂载路径。
仅显示由 root 拥有的文件。
仅显示权限被设置为 4000 的文件。
以 ls -ldb 格式显示 find 命令的输出。
包含 find 命令的结果的文件。
在 /tmp/filename 中显示结果。
# more /tmp/filename |
有关 setuid 权限的背景信息,请参见setuid 权限。
以下示例的输出显示,名为 rar 的用户创建了一份 /usr/bin/sh 的个人副本,并将权限设置为 root 的 setuid。因此,/usr/rar/bin/sh 程序将使用 root 权限运行。
通过将文件从 /tmp 目录中移出,可以保存此输出以供将来参考。
# find / -user root -perm -4000 -exec ls -ldb {} \; > /var/tmp/ckprm # cat /var/tmp/ckprm -r-sr-xr-x 1 root bin 38836 Aug 10 16:16 /usr/bin/at -r-sr-xr-x 1 root bin 19812 Aug 10 16:16 /usr/bin/crontab ---s--x--x 1 root sys 46040 Aug 10 15:18 /usr/bin/ct -r-sr-xr-x 1 root sys 12092 Aug 11 01:29 /usr/lib/mv_dir -r-sr-sr-x 1 root bin 33208 Aug 10 15:55 /usr/lib/lpadmin -r-sr-sr-x 1 root bin 38696 Aug 10 15:55 /usr/lib/lpsched ---s--x--- 1 root rar 45376 Aug 18 15:11 /usr/rar/bin/sh -r-sr-xr-x 1 root bin 12524 Aug 11 01:27 /usr/bin/df -rwsr-xr-x 1 root sys 21780 Aug 11 01:27 /usr/bin/newgrp -r-sr-sr-x 1 root sys 23000 Aug 11 01:27 /usr/bin/passwd -r-sr-xr-x 1 root sys 23824 Aug 11 01:27 /usr/bin/su # mv /var/tmp/ckprm /export/sysreports/ckprm |
有关可执行栈的安全风险的说明,请参见防止可执行文件危及安全。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
set noexec_user_stack=1 |
重新引导系统。
# init 6 |
在此示例中,将禁止记录可执行栈消息,然后重新引导系统。
# cat /etc/system set noexec_user_stack=1 set noexec_user_stack_log=0 # init 6 |