系统管理指南:安全性服务

第 6 章 控制对文件的访问(任务)

本章介绍如何保护 Solaris 操作系统 (Solaris Operating System, Solaris OS) 中的文件,还将介绍如何防范其权限可能危及系统安全的文件。

以下是本章中信息的列表:

使用 UNIX 权限保护文件

通过 UNIX 文件权限和 ACL 可保证文件安全。带 sticky 位的文件和可执行文件要求特殊的安全措施。

用于查看和保证文件安全的命令

下表给出了用于监视以及保证文件和目录安全的命令。

表 6–1 保证文件和目录安全的命令

命令 

说明 

手册页 

ls

列出目录中的文件及其有关信息。 

ls(1)

chown

更改文件的拥有权。 

chown(1)

chgrp

更改文件的组拥有权。 

chgrp(1)

chmod

更改文件的权限。可以使用符号模式(使用字母和符号)或绝对模式(使用八进制数字)更改文件的权限。 

chmod(1)

文件和目录的拥有权

传统 UNIX 文件权限可以为三类用户指定拥有权:

文件属主通常可以指定或修改文件权限。此外,具有管理功能的用户或角色(如超级用户或主管理员角色)可以更改文件的拥有权。要覆盖系统策略,请参见示例 6–2

文件可以是七种类型之一。每种类型由一个符号显示:

-(减号)

文本或程序

b

块特殊文件

c

字符特殊文件

d

目录

l

符号链接

s

套接字

D

P

命名管道 (FIFO)

UNIX 文件权限

下表列出并说明了可以为文件或目录的每类用户授予的权限。

表 6–2 文件和目录权限

符号 

权限 

对象 

说明 

r

读 

文件 

指定的用户可以打开和读取文件内容。 

 

 

目录 

指定的用户可以列出目录中的文件。 

w

写 

文件 

指定的用户可以修改文件的内容或删除该文件。 

 

 

目录 

指定的用户可以在目录中添加文件或链接。这些用户也可以删除目录中的文件或链接。 

x

执行 

文件 

指定的用户可以执行文件(如果该文件为程序或 shell 脚本)。这些用户也可以使用一个 exec(2) 系统调用来运行程序。

 

 

目录 

指定的用户可以打开或执行目录中的文件。这些用户也可以使该目录以及该目录下的目录成为当前目录。 

-

拒绝 

文件和目录 

指定的用户无法读写或执行文件。 

这些文件权限可应用于常规文件,也可应用于特殊文件(如设备、套接字和命名管道 (FIFO))。

对于符号链接,所应用的权限为链接指向的文件权限。

通过对目录设置受限文件权限,可以保护该目录及其子目录中的文件。但是请注意,超级用户有权访问系统中的所有文件和目录。

特殊文件权限(setuidsetgid 和 Sticky 位)

可执行文件和公共目录可以使用三种特殊类型的权限:setuidsetgid 和 sticky 位。设置这些权限之后,运行可执行文件的任何用户都应采用该可执行文件属主(或组)的 ID。

设置特殊权限时必须非常小心,因为特殊权限会带来安全风险。例如,通过执行将用户 ID (user ID, UID) 设置为 0root 的 UID)的程序,用户可以获取超级用户功能。此外,所有用户可以为其拥有的文件设置特殊权限,这会带来其他安全问题。

应对系统中未经授权使用 setuid 权限和 setgid 权限获取超级用户功能的情况进行监视。可疑权限为用户而不是 rootbin 授予管理程序的拥有权。要搜索并列出所有使用此特殊权限的文件,请参见如何使用特殊文件权限查找文件

setuid 权限

对可执行文件设置 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 权限

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 权限获取超级用户功能的情况进行监视。可疑权限为非常规组而不是 rootbin 授予对此类程序的访问权限。要搜索并列出所有使用此权限的文件,请参见如何使用特殊文件权限查找文件

Sticky 位

sticky 位是保护目录中文件的权限位。如果对目录设置了 sticky 位,则只有文件属主、目录属主或特权用户才可以删除文件。root 用户和主管理员角色即是特权用户。sticky 位禁止用户从公共目录(如 /tmp)中删除其他用户的文件:


drwxrwxrwt 7  root  sys   400 Sep  3 13:37 tmp

在 TMPFS 文件系统中设置公共目录时,务必手动设置 sticky 位。有关说明,请参见示例 6–5

缺省 umask

创建文件或目录时,将使用一组缺省权限进行创建。系统缺省值为空。文本文件拥有 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

setuidsetgid 位打开

t

permissions

Sticky 位打开,对于其他用户,执行位打开 

功能列中的名称 who operator permissions 指定用于更改文件或目录的权限的符号。

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
entry-type

设置文件权限的 ACL 项的类型。例如,entry-type 可以是 user(文件属主)或 mask(ACL 掩码)。有关 ACL 项的列表,请参见表 6–7表 6–8

uid

用户名或用户 ID (user ID, UID)。

gid

组名或组 ID (group ID, GID)。

perms

表示 entry-type 中设置的权限。perms 可以由符号字符 rwx 或八进制数字表示。这些数字与用于 chmod 命令的数字相同。

在以下示例中,ACL 项为用户 stacey 设置读写权限。


user:stacey:rw-

注意 – 注意 –

仅 UFS 文件系统支持 UFS 文件系统属性,例如 ACL。因此,如果将具有 ACL 项的文件恢复或复制到 /tmp 目录(通常挂载为 TMPFS 文件系统)中,则这些 ACL 项将丢失。使用 /var/tmp 目录临时存储 UFS 文件。


文件的 ACL 项

下表列出了对文件设置 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。

目录的 ACL 项

表 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 命令

设置、添加、修改和删除 ACL 项。有关更多信息,请参见 setfacl(1) 手册页。

getfacl 命令

显示 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 权限保护文件。 

使用 UNIX 权限保护文件(任务列表)

使用 ACL 保护文件 

添加 ACL,以便在比 UNIX 权限更周密的级别上保护文件。 

使用 ACL 保护文件(任务列表)

防止系统受到来自文件的安全风险 

查找具有可疑拥有权的可执行文件。禁用可能会破坏系统的文件。 

防止程序受到安全风险(任务列表)

使用 UNIX 权限保护文件(任务列表)

以下任务列表说明列出文件权限、更改文件权限,以及使用特殊文件权限保护文件的过程。

任务 

参考 

显示文件信息 

如何显示文件信息

更改文件拥有权 

如何更改文件的属主

如何更改文件的组拥有权

更改文件权限 

如何在符号模式下更改文件权限

如何在绝对模式下更改文件权限

如何在绝对模式下更改特殊文件权限

Procedure如何显示文件信息

使用 ls 命令显示有关目录中所有文件的信息。

    键入以下命令以显示当前目录中所有文件的长列表。


    % ls -la
    
    -l

    显示包括用户拥有权、组拥有权和文件权限的长格式。

    -a

    显示所有文件,包括以点 (.) 开头的隐藏文件。


示例 6–1 显示文件信息

在以下示例中,显示了 /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

   .

   .

   .

每一行按以下顺序显示了有关文件的信息:


Procedure如何更改文件的属主

文件属主、主管理员角色或超级用户可以更改任何文件的拥有权。

  1. 显示文件的权限。


    % ls -l example-file
    
    -rw-r--r--   1 janedoe   staff   112640 May 24 10:49 example-file
  2. 承担主管理员角色,或成为超级用户。

    主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

  3. 更改文件的属主。


    # chown stacey example-file
    
  4. 检验文件的属主是否已更改。


    # ls -l example-file
    
    -rw-r--r--   1 stacey   staff   112640 May 26 08:50 example-file 

示例 6–2 允许用户更改其他用户拥有的文件的拥有权

安全注意事项-您应该有合理理由通过将 rstchown 变量设置为零来覆盖系统安全策略。访问系统的任何用户都可以更改系统中任何文件的拥有权。

在此示例中,在 /etc/system 文件中将 rstchown 变量的值设置为零。通过此设置,文件属主可以使用 chown 命令将文件的拥有权更改为另一用户。通过此设置,文件属主还可以使用 chgrp 命令将文件的组拥有权设置为非其所在的组。重新引导系统后,更改将生效。


set rstchown = 0

有关更多信息,请参见 chown(1)chgrp(1) 手册页。

此外,请注意,已挂载 NFS 的文件系统对更改拥有权和组有更多限制。有关限制对已挂载 NFS 的系统的访问的更多信息,请参见《系统管理指南:网络服务》中的第 6  章 “访问网络文件系统(参考)”


Procedure如何更改文件的组拥有权

  1. 承担主管理员角色,或成为超级用户。

    主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

  2. 更改文件的组拥有权。


    $ chgrp scifi example-file
    

    有关设置组的信息,请参见《系统管理指南:基本管理》中的第 4  章 “管理用户帐户和组(概述)”

  3. 检验文件的组拥有权是否已更改。


    $ ls -l example-file
    
     -rw-r--r--   1 stacey   scifi   112640 June 20 08:55  example-file

    另请参见示例 6–2

Procedure如何在符号模式下更改文件权限

  1. 如果您不是文件或目录的属主,请成为超级用户或承担等效角色。

    只有当前属主或超级用户可以使用 chmod 命令更改文件或目录的文件权限。

  2. 在符号模式下更改权限。


    % chmod who operator permissions filename
    
    who

    指定要更改其权限的用户。

    operator

    指定要执行的操作。

    permissions

    指定要更改的权限。有关有效的符号列表,请参见表 6–5

    filename

    指定文件或目录。

  3. 检验文件的权限是否已更改。


    % ls -l filename
    

示例 6–3 在符号模式下更改权限

在以下示例中,将解除其他用户的读取权限。


% chmod o-r example-file1

在以下示例中,将为用户、组和其他用户添加读和执行权限。


$ chmod a+rx example-file2

在以下示例中,将为组指定读写和执行权限。


$ chmod g=rwx example-file3

Procedure如何在绝对模式下更改文件权限

  1. 如果您不是文件或目录的属主,请成为超级用户或承担等效角色。

    只有当前属主或超级用户可以使用 chmod 命令更改文件或目录的文件权限。

  2. 在绝对模式下更改权限。


    % chmod nnn filename
    
    nnn

    按照该顺序指定将表示文件属主、文件组和其他用户的权限的八进制值。有关有效八进制值的列表,请参见表 6–4

    filename

    指定文件或目录。


    注 –

    使用 chmod 命令更改具有 ACL 项的文件的文件组权限时,文件组权限和 ACL 掩码都将更改为新权限。请注意,新 ACL 掩码权限可以更改在文件中具有 ACL 项的其他用户和组的权限。使用 getfacl 命令以确保为所有 ACL 项都设置了适当的权限。有关更多信息,请参见 getfacl(1) 手册页。


  3. 检验文件的权限是否已更改。


    % ls -l filename
    

示例 6–4 在绝对模式下更改权限

在以下示例中,将公共目录的权限从 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

Procedure如何在绝对模式下更改特殊文件权限

  1. 如果您不是文件或目录的属主,请成为超级用户或承担等效角色。

    只有当前属主或具有超级用户功能的用户可以使用 chmod 命令更改文件或目录的特殊权限。

  2. 在绝对模式下更改特殊权限。


    % chmod nnnn filename
    
    nnnn

    指定用于更改文件或目录的权限的八进制值。最左侧的八进制值设置文件的特殊权限。有关特殊权限的有效八进制值的列表,请参见表 6–6

    filename

    指定文件或目录。


    注 –

    使用 chmod 命令更改具有 ACL 项的文件的文件组权限时,文件组权限和 ACL 掩码都将更改为新权限。请注意,新 ACL 掩码权限可以更改在文件中具有 ACL 项的其他用户和组的权限。使用 getfacl 命令以确保为所有 ACL 项都设置了适当的权限。有关更多信息,请参见 getfacl(1) 手册页。


  3. 检验文件的权限是否已更改。


    % ls -l filename
    

示例 6–5 在绝对模式下设置特殊文件权限

在以下示例中,将对 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 

如何复制 ACL

修改 ACL 

如何更改文件的 ACL 项

删除文件的 ACL 

如何删除文件的 ACL 项

显示文件的 ACL 

如何显示文件的 ACL 项

Procedure如何检查文件是否具有 ACL

    检查文件是否具有 ACL。


    % ls -l filename
    

    其中,filename 指定文件或目录。

    在输出中,模式字段右侧的加号 (+) 表示该文件具有 ACL。


    注 –

    除非已添加了用于扩展 UNIX 文件权限的 ACL 项,否则会将文件视为具有“琐碎” ACL,并且不会显示加号 (+)。



示例 6–6 检查文件是否具有 ACL

在以下示例中,ch1.sgm 文件具有 ACL。ACL 由模式字段右侧的加号 (+) 表示。


% ls -l ch1.sgm

-rwxr-----+  1 stacey   techpubs      167 Nov 11 11:13 ch1.sgm

Procedure如何将 ACL 项添加到文件

  1. 使用 setfacl 命令设置文件的 ACL。


    % setfacl -s user::perms,group::perms,other:perms,mask:perms,acl-entry-list filename ...
    
    -s

    设置文件的 ACL。如果文件已具有 ACL,则会替换该 ACL。此选项要求至少有 user::group::other:: 项。

    user::perms

    指定文件属主权限。

    group::perms

    指定组属主权限。

    other:perms

    为文件属主或组成员之外的用户指定权限。

    mask:perms

    指定 ACL 掩码的权限。掩码表示允许用户(属主除外)和组拥有的最大权限。

    acl-entry-list

    指定文件或目录中要为特定用户和组设置的一个或多个 ACL 项的列表。也可以设置目录的缺省 ACL 项。表 6–7表 6–8 显示了有效的 ACL 项。

    filename ...

    指定要对其设置 ACL 的一个或多个文件或目录。多个 filename 由空格分隔。


    注意 – 注意 –

    如果该文件已存在 ACL,则 -s 选项将使用新的 ACL 替换整个 ACL。


    有关更多信息,请参见 setfacl(1) 手册页。

  2. 检验是否已对文件设置了 ACL 项。


    % getfacl filename
    

    有关更多信息,请参见如何检查文件是否具有 ACL


示例 6–7 设置文件的 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:---

Procedure如何复制 ACL

    通过重定向 getfacl 输出,将文件的 ACL 复制到另一个文件。


    % getfacl filename1 | setfacl -f - filename2 
    
    filename1

    指定将从其中复制 ACL 的文件。

    filename2

    指定要对其设置所复制的 ACL 的文件。


示例 6–8 复制 ACL

在以下示例中,会将 ch2.sgm 中的 ACL 复制到 ch3.sgm


% getfacl ch2.sgm | setfacl -f - ch3.sgm

Procedure如何更改文件的 ACL 项

  1. 使用 setfacl 命令修改文件的 ACL 项。


    % setfacl -m acl-entry-list filename ... 
    
    -m

    修改现有的 ACL 项。

    acl-entry-list

    指定文件或目录中要修改的一个或多个 ACL 项的列表。也可以修改目录的缺省 ACL 项。表 6–7表 6–8 显示了有效的 ACL 项。

    filename ...

    指定一个或多个文件或目录,由空格分隔。

  2. 检验是否已修改文件的 ACL 项。


    % getfacl filename
    

示例 6–9 修改文件的 ACL 项

在以下示例中,将用户 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

Procedure如何删除文件的 ACL 项

  1. 删除文件的 ACL 项。


    % setfacl -d acl-entry-list  filename ... 
    
    -d

    删除指定的 ACL 项。

    acl-entry-list

    指定文件或目录中要删除的 ACL 项(未指定权限)的列表。只能删除特定用户和组的 ACL 项和缺省 ACL 项。表 6–7表 6–8 显示了有效的 ACL 项。

    filename ...

    指定一个或多个文件或目录,由空格分隔。

    或者,可以使用 setfacl -s 命令删除文件的所有 ACL 项,并使用所指定的新 ACL 项替换它们。

  2. 检验是否已删除文件的 ACL 项。


    % getfacl filename
    

示例 6–10 删除文件的 ACL 项

在以下示例中,将从 ch4.sgm 文件中删除用户 anusha


% setfacl -d user:anusha ch4.sgm

Procedure如何显示文件的 ACL 项

    使用 getfacl 命令显示文件的 ACL 项。


    % getfacl [-a | -d] filename ...
    
    -a

    显示指定文件或目录的文件名、文件属主、文件组和 ACL 项。

    -d

    显示指定目录的文件名、文件属主、文件组和缺省 ACL 项(如果存在)。

    filename ...

    指定一个或多个文件或目录,由空格分隔。

    如果在命令行中指定多个文件名,则会在每两个 ACL 项之间显示一个空白行。


示例 6–11 显示文件的 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:---

在以下示例中,将显示目录 book 的缺省 ACL 项。


% 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 用户拥有的文件。

如何使用特殊文件权限查找文件

防止可执行栈溢出 

防止程序利用可执行栈。 

如何禁止程序使用可执行栈

防止记录可执行栈消息 

关闭记录可执行栈消息 

示例 6–13

Procedure如何使用特殊文件权限查找文件

应对系统中未经授权在程序中使用 setuidsetgid 权限的情况进行监视。使用 setuidsetgid 权限,普通用户可以获取超级用户功能。可疑可执行文件为用户而不是 rootbin 授予拥有权。

  1. 承担主管理员角色,或成为超级用户。

    主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

  2. 使用 find 命令查找拥有 setuid 权限的文件


    # find directory -user root -perm -4000 -exec ls -ldb {} \; >/tmp/filename
    
    find directory

    检查以指定的 directory(可以是 root (/)、sys binmail)开头的所有挂载路径。

    -user root

    仅显示由 root 拥有的文件。

    -perm -4000

    仅显示权限被设置为 4000 的文件。

    -exec ls -ldb

    ls -ldb 格式显示 find 命令的输出。

    >/tmp/filename

    包含 find 命令的结果的文件。

  3. /tmp/filename 中显示结果。


    # more /tmp/filename
    

    有关 setuid 权限的背景信息,请参见setuid 权限


示例 6–12 使用 setuid 权限查找文件

以下示例的输出显示,名为 rar 的用户创建了一份 /usr/bin/sh 的个人副本,并将权限设置为 rootsetuid。因此,/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

Procedure如何禁止程序使用可执行栈

有关可执行栈的安全风险的说明,请参见防止可执行文件危及安全

  1. 承担主管理员角色,或成为超级用户。

    主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

  2. 编辑 /etc/system 文件并添加以下行:


    set noexec_user_stack=1
  3. 重新引导系统。


    # init 6
    

示例 6–13 禁止记录可执行栈消息

在此示例中,将禁止记录可执行栈消息,然后重新引导系统。


# cat /etc/system

set noexec_user_stack=1

set noexec_user_stack_log=0

# init 6