免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2154 | 回复: 0
打印 上一主题 下一主题

第 7 章 使用ACL保护ZFS 文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-21 12:38 |只看该作者 |倒序浏览

第 7 章 使用 ACL 保护 ZFS 文件
本章介绍有关使用访问控制列表 (access control list, ACL) 通过提供比标准 UNIX 权限更详尽的权限来保护 ZFS 文件的信息。
本章包含以下各节:

新 Solaris ACL 模型
Solaris 的最近几种旧版本支持主要基于 POSIX 式 ACL 规范的 ACL 实现。基于 POSIX 样式的 ACL 用来保护 UFS 文件,并通过 NFSv4 之前的 NFS 版本进行转换。
引入 NFSv4 后,新 ACL 模型完全支持 NFSv4 在 UNIX 和非 UNIX 客户机之间提供的互操作性。如 NFSv4 规范中所定义,这一新的 ACL 实现提供了更丰富的基于 NT 样式 ACL 的语义。
与旧模型相比,新 ACL 模型的主要变化如下:


  • 基于 NFSv4 规范并与 NT 样式的 ACL 相似。

  • 提供了更详尽的访问权限集。有关更多信息,请参见
    表 7–2


  • 分别使用 chmod 和 ls 命令(而非 setfacl 和 getfacl 命令)进行设置和显示。

  • 提供了更丰富的继承语义,用于指定如何将访问权限从目录应用到子目录等。有关更多信息,请参见
    ACL 继承


两种 ACL 模型均可比标准文件权限提供更精细的访问控制。与 POSIX 式 ACL 非常相似,新 ACL 也由多个访问控制项 (Access Control Entry, ACE) 构成。
POSIX 样式的 ACL 使用单个项来定义允许和拒绝的权限。而新 ACL 模型包含两种类型的 ACE,用于进行访问检查:ALLOW 和 DENY。因此,不能根据任何定义一组权限的单个 ACE 来推断是否允许或拒绝该 ACE 中未定义的权限。
NFSv4 样式的 ACL 与 POSIX 式 ACL 之间的转换如下:


  • 如果使用任何可识别 ACL 的实用程序(如 cp、mv、tar、cpio 或 rcp 命令)将具有 ACL 的 UFS 文件传送到 ZFS 文件系统,则 POSIX 式 ACL 会转换为等效的 NFSv4 样式的 ACL。

  • 一些 NFSv4 样式的 ACL 会转换为 POSIX 式 ACL。如果 NFSv4 样式的 ACL 未转换为 POSIX 式 ACL,则会显示以下类似消息:
    # cp -p filea /var/tmp
    cp: failed to set acl entries on /var/tmp/filea

  • 如果在运行当前 Solaris 发行版的系统上使用保留的 ACL 选项(tar -p 或 cpio -P)创建 UFS tar 或 cpio 归档文件,则在运行以前的 Solaris 发行版的系统中提取该归档文件时将丢失 ACL。
    所有文件都以正确的文件模式提取,但会忽略 ACL 项。

  • 可以使用 ufsrestore 命令将数据恢复到 ZFS 文件系统中,但 ACL 将丢失。

  • 如果尝试对 UFS 文件设置 NFSv4 样式的 ACL,则会显示以下类似消息:
    chmod: ERROR: ACL type's are different

  • 如果尝试对 ZFS 文件设置 POSIX 样式的 ACL,则会显示以下类似信息:
    # getfacl filea
    File system doesn't support aclent_t style ACL's.
    See acl(5) for more information on Solaris ACL support.

有关对 ACL 和备份产品的其他限制信息,请参见
使用其他备份产品保存 ZFS 数据

ACL 设置语法的说明
提供以下两种基本的 ACL 格式:
用于设置普通 ACL 的语法
chmod [options] A[index]{+|=}owner@, group@, everyone@:access-permissions/...[:inheritance-flags]:deny | allow file
chmod [options] A-owner@, group@, everyone@:access-permissions/...[:inheritance-flags]:deny | allow file ...
chmod [options] A[index]- file
用于设置显式 ACL 的语法
chmod [options] A[index]{+|=}user|group:access-permissions/...[:inheritance-flags]:deny | allow file
chmod [options] A-user|group:access-permissions/...[:inheritance-flags]:deny | allow file ...
chmod [options] A[index]- file
owner@, group@, everyone@
标识用于普通 ACL 语法的 ACL 项类型。有关 ACL 项类型的说明,请参见
表 7–1

用户或组:ACL 项 ID=用户名或组名
标识用于显式 ACL 语法的 ACL 项类型。用户和组的 ACL 项类型还必须包含 ACL 项 ID用户名组名。有关 ACL 项类型的说明,请参见
表 7–1

access-permissions/.../
标识授予或拒绝的访问权限。有关 ACL 访问权限的说明,请参见
表 7–2

inheritance-flags
标识一组可选的 ACL 继承标志。有关 ACL 继承标志的说明,请参见
表 7–3

deny | allow
标识授予还是拒绝访问权限。
在以下示例中,ACL 项 ID 值无意义。
group@:write_data/append_data/execute:deny
由于 ACL 中包括特定用户(ACL 项类型),因此以下示例中包括 ACL 项 ID
0:user:gozer:list_directory/read_data/execute:allow
显示的 ACL 项与以下内容类似:
2:group@:write_data/append_data/execute:deny
本示例中指定的2索引 ID 用于标识较大 ACL 中的 ACL 项,较大的 ACL 中可能包含对应于属主、特定 UID、组和各用户的多个项。可以使用 chmod 命令指定索引 ID,以标识 ACL 要修改的部分。例如,可将索引 ID 3 标识为 chmod 命令中的 A3,与以下内容类似:
chmod A3=user:venkman:read_acl:allow filename
下表介绍了 ACL 项的类型,即属主、组和其他对象的 ACL 表示形式。
表 7–1 ACL 项类型

ACL 项类型
说明
owner@
指定授予对象属主的访问权限。
group@
指定授予对象所属组的访问权限。
everyone@
指定向不与其他任何 ACL 项匹配的任何用户或组授予的访问权限。
user
通过用户名指定向对象的其他用户授予的访问权限。必须包括 ACL 项 ID,其中包含用户名或用户 ID。如果该值不是有效的数字 UID 或用户名,则该 ACL 项的类型无效。
group
通过组名指定向对象的其他组授予的访问权限。必须包括 ACL 项 ID,其中包含组名或组 ID。如果该值不是有效的数字 UID 或组名,则该 ACL 项的类型无效。
下表介绍了 ACL 访问权限。
表 7–2 ACL 访问权限

访问权限
缩写访问权限
说明
add_file
w
向目录中添加新文件的权限。
add_subdirectory
p
在目录中创建子目录的权限。
append_data
p
对文件修改文件内容的权限。
delete
d
删除文件的权限。
delete_child
D
删除目录中的文件或目录的权限。
execute
x
执行文件或搜索目录内容的权限。
list_directory
r
列出目录内容的权限。
read_acl
c
读取 ACL 的权限 (ls)。
read_attributes
a
读取文件的基本属性(非 ACL)的权限。将基本属性视为状态级别属性。允许此访问掩码位意味着该实体可以执行 ls(1) 和 stat(2)。
read_data
r
读取文件内容的权限。
read_xattr
R
读取文件的扩展属性或在文件的扩展属性目录中执行查找的权限。
synchronize
s
占位符,此时不使用。
write_xattr
A
创建扩展属性或向扩展属性目录进行写入的权限。
向用户授予此权限意味着用户可为文件创建扩展属性目录。属性文件的权限可以控制用户对属性的访问。
write_data
w
修改或替换文件内容的权限。
write_attributes
W
将与文件或目录关联的时间更改为任意值的权限。
write_acl
C
编写 ACL 的权限或使用 chmod 命令修改 ACL 的能力。
write_owner
o
更改文件的属主或组的权限,或者对文件执行 chown 或 chgrp 命令的能力。
获取文件拥有权的权限或将文件的组拥有权更改为由用户所属组的权限。如果要将文件或组的拥有权更改为任意用户或组,则需要 PRIV_FILE_CHOWN 权限。
ACL 继承
使用 ACL 继承的目的是使新创建的文件或目录可以继承其本来要继承的 ACL,但不忽略父目录的现有权限位。
缺省情况下,不会传播 ACL。如果设置某个目录的显式 ACL,则该显式 ACL 不会继承到任何后续目录。必须对文件或目录指定 ACL 的继承。
下表介绍了可选的继承标志。
表 7–3 ACL 继承标志

继承标志
缩写继承标志
说明
file_inherit
f
仅将 ACL 从父目录继承到该目录中的文件。
dir_inherit
d
仅将 ACL 从父目录继承到该目录的子目录。
inherit_only
i
从父目录继承 ACL,但仅适用于新创建的文件或子目录,而不适用于该目录自身。该标志要求使用 file_inherit 标志或 dir_inherit 标志,或同时使用两者来表示要继承的内容。
no_propagate
n
仅将 ACL 从父目录继承到该目录的第一级内容,而不是第二级或后续内容。该标志要求使用 file_inherit 标志或 dir_inherit 标志,或同时使用两者来表示要继承的内容。
此外,还可以使用 aclinherit 文件系统属性对文件系统设置更为严格或更为宽松的缺省 ACL 继承策略。有关更多信息,请参见下一节。
ACL 属性模式
ZFS 文件系统包括与 ACL 相关的两种属性模式:


  • aclinherit-此属性可确定 ACL 继承的行为。包括以下属性值:


    • discard-对于新对象,创建文件或目录时不会继承任何 ACL 项。文件或目录的 ACL 等效于该文件或目录的权限模式。

    • noallow-对于新对象,仅继承访问类型为 deny 的可继承 ACL 项。

    • secure-对于新对象,继承 ACL 项时将删除 write_owner 和 write_acl 权限。

    • passthrough-对于新对象,将继承可继承的 ACL 项,并且不会对其进行更改。实际上,此模式会禁用 secure 模式。

    aclinherit 的缺省模式为 secure。

  • aclmode-每次 chmod 命令修改文件或目录的模式或最初创建文件时,此属性都将修改 ACL 的行为。包括以下属性值:


    • discard-删除所有 ACL 项,但定义文件或目录的模式所需的项除外。

    • groupmask-除非用户项与文件或目录的属主具有相同的 UID,否则将减少用户或组的 ACL 权限,以使其不会大于组权限位。然后,减少 ACL 权限,以使其不会大于属主权限位。

    • passthrough-对于新对象,将继承可继承的 ACL 项,并且不会对其进行更改。

    aclmode 属性的缺省模式为 groupmask。

设置 ZFS 文件的 ACL
正如 ZFS 所实现的那样,ACL 由 ACL 项的数组构成。ZFS 提供了一个 ACL 模型,其中所有文件都包括 ACL。通常,ACL 很普通,因为它仅表示传统的 UNIX owner/group/other 项。
ZFS 文件仍然具有权限位和模式,但这些值大部分是 ACL 所表示内容的高速缓存。因此,如果更改文件的权限,该文件的 ACL 也会相应地更新。此外,如果删除授予用户对文件或目录的访问权限的显式 ACL,则由于该文件或目录的权限位会将访问权限授予组或各用户,因此该用户仍可访问这一文件或目录。所有访问控制决策都由文件或目录的 ACL 中表示的权限来管理。
对于 ZFS 文件,ACL 访问权限的主要规则如下:


  • ZFS 按照 ACL 项在 ACL 中的排列顺序从上至下对其进行处理。

  • 仅处理具有与访问权限的请求者匹配的“对象”的 ACL 项。

  • 一旦授予允许权限,同一 ACL 权限集当中的后续 ACL 拒绝项即不能拒绝此权限。

  • 无条件地授予文件属主 write_acl 权限,即使显式拒绝此权限时也是如此。否则,将拒绝仍未指定的所有权限。
    如果拒绝权限或缺少访问权限,权限子系统将确定为文件属主或超级用户授予的访问请求。此机制可以防止文件属主无法访问其文件,并允许超级用户修改文件以进行恢复。

如果设置某个目录的显式 ACL,则该目录的子目录不会自动继承该 ACL。如果设置了显式 ACL 并希望目录的子目录将其继承,则必须使用 ACL 继承标志。有关更多信息,请参见
表 7–3

以详细格式对 ZFS 文件设置 ACL 继承

创建新文件时,根据 umask 值将应用类似如下的缺省的普通 ACL:
$ ls -v file.1
-r--r--r--   1 root     root      206663 May  4 11:52 file.1
     0:owner@:write_data/append_data/execute:deny
     1:owner@:read_data/write_xattr/write_attributes/write_acl/write_owner
         :allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
请注意,本示例中的每个用户类别 (owner@, group@, everyone@) 都有两个 ACL 项。一项用于 deny 权限,另一项用于 allow 权限。
此文件 ACL 的说明如下:
0:owner@
拒绝属主对文件的执行权限 (execute:deny)。
1:owner@
属主可以读取和修改文件的内容 (read_data/write_data/append_data)。属主还可以修改文件的属性,如时间标记、扩展属性和 ACL (write_xattr/write_attributes/write_acl)。此外,属主还可以修改文件的拥有权 (write_owner:allow)。
2:group@
拒绝组对文件的修改和执行权限 (write_data/append_data/execute:deny)。
3:group@
授予组对文件的读取权限 (read_data:allow)。
4:everyone@
拒绝用户或组之外的所有用户执行或修改文件内容和修改文件的任何属性的权限 (write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:deny)。
5:everyone@
向用户或组之外的所有用户授予对文件和文件属性的读取权限 (read_data/read_xattr/read_attributes/read_acl/synchronize:allow)。synchronize 访问权限当前未实现。
创建新目录时,根据 umask 值,缺省目录 ACL 将类似如下:
$ ls -dv dir.1
drwxr-xr-x   2 root     root           2 Feb 23 10:37 dir.1
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
此目录 ACL 的说明如下:
0:owner@
目录的属主拒绝列表为空 (::deny)。
1:owner@
属主可以读取和修改目录内容 (list_directory/read_data/add_file/write_data/add_subdirectory/append_data),搜索内容 (execute) 并修改文件的属性,如时间标记、扩展属性和 ACL (write_xattr/write_attributes/write_acl)。此外,属主还可以修改目录的拥有权 (write_owner:allow)。
2:group@
组不能添加或修改目录内容 (add_file/write_data/add_subdirectory/append_data:deny)。
3:group@
组可以列出并读取目录内容。此外,组还具有搜索目录内容的执行权限 (list_directory/read_data/execute:allow)。
4:everyone@
对用户或组之外的所有用户拒绝添加或修改目录内容的权限 (add_file/write_data/add_subdirectory/append_data)。此外,还会拒绝修改目录的任何属性的权限 (write_xattr /write_attributes/write_acl/write_owner:deny)。
5:everyone@
向用户或组之外的所有用户授予对目录内容和目录属性的读取和执行权限 (list_directory/read_data/read_xattr/execute/read_attributes/read_acl/synchronize:allow)。synchronize 访问权限当前未实现。
以详细格式设置和显示 ZFS 文件的 ACL
可以使用 chmod 命令修改 ZFS 文件的 ACL。以下用于修改 ACL 的 chmod 语法使用 acl 规范来确定 ACL 的格式。有关 acl 规范的说明,请参见
ACL 设置语法的说明



  • 添加 ACL 项


    • 为用户添加 ACL 项
      % chmod A+acl-specification filename

    • 按 index-ID 添加 ACL 项
      % chmod Aindex-ID+acl-specification filename
      此语法可用于在指定的 index-ID 位置插入新的 ACL 项。


  • 替换 ACL 项
    % chmod Aindex-ID=acl-specification filename
    % chmod A=acl-specification filename

  • 删除 ACL 项


    • 按 index-ID 删除 ACL 项
      % chmod Aindex-ID- filename

    • 由用户删除 ACL 项
      % chmod A-acl-specification filename

    • 从文件中删除所有显式 ACE
      % chmod A- filename

详细 ACL 信息是通过使用 ls -v 命令来显示的。例如:
# ls -v file.1
-rw-r--r--   1 root     root      206663 Feb 16 11:00 file.1
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
有关使用缩写 ACL 格式的信息,请参见
以缩写格式设置和显示 ZFS 文件的 ACL

示例 7–1 修改 ZFS 文件的普通 ACL
本节提供了设置和显示普通 ACL 的示例。
在以下示例中,普通 ACL 存在于 file.1 中:
# ls -v file.1
-rw-r--r--   1 root     root      206663 Feb 16 11:00 file.1
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
在以下示例中,为 group@ 授予了 write_data 权限。
# chmod A2=group@:append_data/execute:deny file.1
# chmod A3=group@:read_data/write_data:allow file.1
# ls -v file.1
-rw-rw-r--   1 root     root           206663 May  3 16:36 file.1
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:append_data/execute:deny
     3:group@:read_data/write_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
在以下示例中,对 file.1 的权限重新设置为 644。
# chmod 644 file.1
# ls -v file.1
-rw-r--r--   1 root     root           206663 May  3 16:36 file.1
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
示例 7–2 设置 ZFS 文件的显式 ACL
本节提供了设置和显示普通 ACL 的示例。
在以下示例中,为用户 gozer 添加了对 test.dir 目录的 read_data/execute 权限。
# chmod A+user:gozer:read_data/execute:allow test.dir
# ls -dv test.dir
drwxr-xr-x+  2 root     root           2 Feb 16 11:12 test.dir
     0:user:gozer:list_directory/read_data/execute:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
在以下示例中,为用户 gozer 删除了 read_data/execute 权限。
# chmod A0- test.dir
# ls -dv test.dir
drwxr-xr-x   2 root     root           2 Feb 16 11:12 test.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
示例 7–3 与 ZFS 文件权限的 ACL 交互
以下 ACL 示例说明了如何在设置显式 ACL 和随后更改文件或目录的权限位之间进行交互。
在以下示例中,普通 ACL 存在于 file.2 中:
# ls -v file.2
-rw-r--r--   1 root     root        2703 Feb 16 11:16 file.2
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     5:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
在以下示例中,将从 everyone@ 中删除 ACL 允许权限。
# chmod A5- file.2
# ls -v file.2
-rw-r-----   1 root     root        2703 Feb 16 11:16 file.2
     0:owner@:execute:deny
     1:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     2:group@:write_data/append_data/execute:deny
     3:group@:read_data:allow
     4:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
在此输出中,文件的权限位从 655 重置为 650。为 everyone@ 删除 ACL 允许权限时,已有效地从文件的权限位中删除了对 everyone@ 的读取权限。
在以下示例中,现有 ACL 将替换为对 everyone@ 的 read_data/write_data 权限。
# chmod A=everyone@:read_data/write_data:allow file.3
# ls -v file.3
-rw-rw-rw-+  1 root     root        1532 Feb 16 11:18 file.3
     0:everyone@:read_data/write_data:allow
在此输出中,chmod 语法有效地将现有 ACL 中的 read_data/write_data:allow 权限替换为对属主、组和 everyone@ 的读取/写入权限。在此模型中,everyone@ 用于指定对任何用户或组的访问权限。由于不存在用以覆盖属主和组的权限的 owner@ 或 group@ ACL 项,因此权限位会设置为 666。
在以下示例中,现有 ACL 将替换为对用户 gozer 的读取权限。
# chmod A=user:gozer:read_data:allow file.3
# ls -v file.3
----------+  1 root     root        1532 Feb 16 11:18 file.3
     0:user:gozer:read_data:allow
在此输出中,文件权限计算结果为 000,这是因为不存在对应 owner@、group@ 或 everyone@ 的 ACL 项,这些项用于表示文件的传统权限组成部分。文件属主可通过重置权限(和 ACL)来解决此问题,如下所示:
# chmod 655 file.3
# ls -v file.3
-rw-r-xr-x+  1 root     root           0 Mar  8 13:24 file.3
     0:user:gozer::deny
     1:user:gozer:read_data:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     4:group@:write_data/append_data:deny
     5:group@:read_data/execute:allow
     6:everyone@:write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/execute/read_attributes/read_acl
         /synchronize:allow
示例 7–4 恢复 ZFS 文件的普通 ACL
可以使用 chmod 命令来删除文件或目录的所有显式 ACL。
在以下示例中,test5.dir 中存在 2 个显式 ACE:
# ls -dv test5.dir
drwxr-xr-x+  2 root     root           2 Feb 16 11:23 test5.dir
     0:user:gozer:read_data:file_inherit:deny
     1:user:lp:read_data:file_inherit:deny
     2:owner@::deny
     3:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     4:group@:add_file/write_data/add_subdirectory/append_data:deny
     5:group@:list_directory/read_data/execute:allow
     6:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     7:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
在以下示例中,删除了用户 gozer 和 lp 的显式 ACL。剩余的 ACL 包含用于 owner@、group@ 和 everyone@ 的六个缺省值。
# chmod A- test5.dir
# ls -dv test5.dir
drwxr-xr-x   2 root     root           2 Feb 16 11:23 test5.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
以详细格式对 ZFS 文件设置 ACL 继承
可以确定如何在文件和目录中继承或不继承 ACL。缺省情况下,不会传播 ACL。如果设置某个目录的显式 ACL,则任何后续目录都不会继承该 ACL。必须对文件或目录指定 ACL 的继承。
此外,还提供了可在文件系统中进行全局设置的两个 ACL 属性:aclinherit 和 aclmode。缺省情况下,aclinherit 设置为 secure,aclmode 设置为 groupmask。
有关更多信息,请参见
ACL 继承

示例 7–5 缺省 ACL 继承
缺省情况下,ACL 不通过目录结构传播。
在以下示例中,为用户 gozer 应用了针对 test.dir 的显式 ACE read_data/write_data/execute。
# chmod A+user:gozer:read_data/write_data/execute:allow test.dir
# ls -dv test.dir
drwxr-xr-x+  2 root     root           2 Feb 17 14:45 test.dir
     0:user:gozer:list_directory/read_data/add_file/write_data/execute:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
如果创建了 test.dir 子目录,则不会传播用户 gozer 的 ACE。如果对 sub.dir 的权限授予用户 gozer 作为文件属主、组成员或 everyone@ 进行访问的权限,则该用户只能访问 sub.dir。
# mkdir test.dir/sub.dir
# ls -dv test.dir/sub.dir
drwxr-xr-x   2 root     root           2 Feb 17 14:46 test.dir/sub.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
示例 7–6 对文件和目录授予 ACL 继承
以下一系列示例标识了设置 file_inherit 标志时应用的文件和目录的 ACE。
在以下示例中,为用户 gozer 添加了对 test.dir 目录中的文件的 read_data/write_data 权限,以便该用户对于任何新创建的文件都具有读取访问权限。
# chmod A+user:gozer:read_data/write_data:file_inherit:allow test2.dir
# ls -dv test2.dir
drwxr-xr-x+  2 root     root           2 Feb 17 14:47 test2.dir
     0:user:gozer:read_data/write_data:file_inherit:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
在以下示例中,用户 gozer 的权限应用于新创建的 test2.dir/file.2 文件。向 ACL 继承授予 read_data:file_inherit:allow 意味着用户 gozer 可以读取任何新创建的文件的内容。
# touch test2.dir/file.2
# ls -v test2.dir/file.2
-rw-r--r--+  1 root     root           0 Feb 17 14:49 test2.dir/file.2
     0:user:gozer:write_data:deny
     1:user:gozer:read_data/write_data:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes+
         /write_acl/write_owner:allow
     4:group@:write_data/append_data/execute:deny
     5:group@:read_data:allow
     6:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
由于此文件的 aclmode 设置为缺省模式 groupmask,因此用户 gozer 对 file.2 不具有 write_data 权限,这是因为该文件的组权限不允许使用此权限。
请注意,设置 file_inherit 或 dir_inherit 标志时所应用的 inherit_only 权限用来通过目录结构传播 ACL。因此,除非用户 gozer 是文件的属主或文件所属组的成员,否则仅授予或拒绝该用户 everyone@ 权限中的权限。例如:
# mkdir test2.dir/subdir.2
# ls -dv test2.dir/subdir.2
drwxr-xr-x+  2 root     root           2 Feb 17 14:50 test2.dir/subdir.2
     0:user:gozer:list_directory/read_data/add_file/write_data:file_inherit
         /inherit_only:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
以下一系列示例标识了同时设置 file_inherit 和 dir_inherit 标志时所应用的文件和目录的 ACL。
在以下示例中,向用户 gozer 授予了继承用于新创建的文件和目录的读取、写入和执行权限。
# chmod A+user:gozer:read_data/write_data/execute:file_inherit/dir_inherit:allow test3.dir
# ls -dv test3.dir
drwxr-xr-x+  2 root     root           2 Feb 17 14:51 test3.dir
     0:user:gozer:list_directory/read_data/add_file/write_data/execute
         :file_inherit/dir_inherit:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
# touch test3.dir/file.3
# ls -v test3.dir/file.3
-rw-r--r--+  1 root     root           0 Feb 17 14:53 test3.dir/file.3
     0:user:gozer:write_data/execute:deny
     1:user:gozer:read_data/write_data/execute:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     4:group@:write_data/append_data/execute:deny
     5:group@:read_data:allow
     6:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
# mkdir test3.dir/subdir.1
# ls -dv test3.dir/subdir.1
drwxr-xr-x+  2 root     root           2 May  4 15:00 test3.dir/subdir.1
     0:user:gozer:list_directory/read_data/add_file/write_data/execute
         :file_inherit/dir_inherit/inherit_only:allow
     1:user:gozer:add_file/write_data:deny
     2:user:gozer:list_directory/read_data/add_file/write_data/execute:allow
     3:owner@::deny
     4:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     5:group@:add_file/write_data/add_subdirectory/append_data:deny
     6:group@:list_directory/read_data/execute:allow
     7:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     8:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
在以下示例中,由于 group@ 和 everyone@ 的父目录的权限位拒绝写入和执行权限,因此拒绝了用户 gozer 的写入和执行权限。缺省的 aclmode 属性为 secure,这意味着未继承 write_data 和 execute 权限。
在以下示例中,向用户 gozer 授予了继承用于新创建的文件的读取、写入和执行权限,但未将这些权限传播给该目录的后续内容。
# chmod A+user:gozer:read_data/write_data/execute:file_inherit/no_propagate:allow test4.dir
# ls -dv test4.dir
drwxr-xr-x+  2 root     root           2 Feb 17 14:54 test4.dir
     0:user:gozer:list_directory/read_data/add_file/write_data/execute
         :file_inherit/no_propagate:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
如以下示例所示,创建新子目录时,用户 gozer 对文件的 read_data/write_data/execute 权限不会传播给新的 sub4.dir 目录。
# mkdir test4.dir/sub4.dir
# ls -dv test4.dir/sub4.dir
drwxr-xr-x   2 root     root           2 Feb 17 14:57 test4.dir/sub4.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
如以下示例所示,gozer 对文件的 read_data/write_data/execute 权限不会传播给新创建的文件。
# touch test4.dir/file.4
# ls -v test4.dir/file.4
-rw-r--r--+  1 root     root           0 May  4 15:02 test4.dir/file.4
     0:user:gozer:write_data/execute:deny
     1:user:gozer:read_data/write_data/execute:allow
     2:owner@:execute:deny
     3:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     4:group@:write_data/append_data/execute:deny
     5:group@:read_data:allow
     6:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     7:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
示例 7–7 ACL 模式设置为 Passthrough 时的 ACL 继承
如果 tank/cindy 文件系统的 aclmode 属性设置为 passthrough,则用户 gozer 将继承为新创建的 file.4 应用于 test4.dir 的 ACL,如下所示:
# zfs set aclmode=passthrough tank/cindy
# touch test4.dir/file.4
# ls -v test4.dir/file.4
-rw-r--r--+  1 root     root           0 Feb 17 15:15 test4.dir/file.4
     0:user:gozer:read_data/write_data/execute:allow
     1:owner@:execute:deny
     2:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     3:group@:write_data/append_data/execute:deny
     4:group@:read_data:allow
     5:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     6:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
此输出说明对父目录 test4.dir 设置的 read_data/write_data/execute:allow:file_inherit/dir_inherit ACL 会传递给用户 gozer。
示例 7–8 ACL 模式设置为 Discard 时的 ACL 继承
如果将文件系统的 aclmode 属性设置为 discard,则目录的权限位更改时,可能会废弃 ACL。例如:
# zfs set aclmode=discard tank/cindy
# chmod A+user:gozer:read_data/write_data/execute:dir_inherit:allow test5.dir
# ls -dv test5.dir
drwxr-xr-x+  2 root     root           2 Feb 16 11:23 test5.dir
     0:user:gozer:list_directory/read_data/add_file/write_data/execute
         :dir_inherit:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
如果以后决定要加强目录的权限位,则会废弃显式 ACL。例如:
# chmod 744 test5.dir
# ls -dv test5.dir
drwxr--r--   2 root     root           2 Feb 16 11:23 test5.dir
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data/execute:deny
     3:group@:list_directory/read_data:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /execute/write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/read_attributes/read_acl
         /synchronize:allow
示例 7–9 ACL 继承模式设置为 Noallow 时的 ACL 继承
在以下示例中,设置了两个包含文件继承的显式 ACL。一个 ACL 允许 read_data 权限,一个 ACL 拒绝 read_data 权限。此示例还说明了如何可在同一 chmod 命令中指定两个 ACE。
# zfs set aclinherit=nonallow tank/cindy
# chmod A+user:gozer:read_data:file_inherit:deny,user:lp:read_data:file_inherit:allow test6.dir
# ls -dv test6.dir
drwxr-xr-x+  2 root     root           2 May  4 14:23 test6.dir
     0:user:gozer:read_data:file_inherit:deny
     1:user:lp:read_data:file_inherit:allow
     2:owner@::deny
     3:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     4:group@:add_file/write_data/add_subdirectory/append_data:deny
     5:group@:list_directory/read_data/execute:allow
     6:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     7:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
如以下示例所示,创建新文件时,将废弃允许 read_data 权限的 ACL。
# touch test6.dir/file.6
# ls -v test6.dir/file.6
-rw-r--r--+  1 root     root           0 May  4 13:44 test6.dir/file.6
     0:user:gozer:read_data:deny
     1:owner@:execute:deny
     2:owner@:read_data/write_data/append_data/write_xattr/write_attributes
         /write_acl/write_owner:allow
     3:group@:write_data/append_data/execute:deny
     4:group@:read_data:allow
     5:everyone@:write_data/append_data/write_xattr/execute/write_attributes
         /write_acl/write_owner:deny
     6:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize
         :allow
以缩写格式设置和显示 ZFS 文件的 ACL
可通过使用 14 个唯一字母表示权限的缩写格式来设置和显示 ZFS 文件的权限。
表 7–2

表 7–3
中列出了表示缩写权限的字母。
可以使用 ls -V 命令显示用于文件和目录的缩写 ACL 列表。例如:
# ls -V file.1
-rw-r--r--   1 root     root      206663 Feb 16 11:00 file.1
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-wxp----------:------:deny
            group@:r-------------:------:allow
         everyone@:-wxp---A-W-Co-:------:deny
         everyone@:r-----a-R-c--s:------:allow
以下介绍了缩写的 ACL 输出:
owner@
拒绝属主对文件的执行权限 (x=execute)。
owner@
属主可以读取和修改文件的内容(rw=read_data/write_data、p=append_data)。属主还可以修改文件的属性,如时间标记、扩展属性和 ACL(A=write_xattr、W=write_attributes、C=write_acl)。此外,属主还可以修改文件的拥有权 (O=write_owner)。
group@
拒绝组对文件的修改和执行权限(rw=read_data/write_data、p=append_data 和 x=execute)。
group@
授予组对文件的读取权限 (r=read_data)。
everyone@
对用户或组之外的所有用户拒绝执行或修改文件内容以及修改文件的任何属性的权限(w=write_data、x=execute、p=append_data、A=write_xattr、W=write_attributes、C=write_acl 和 o=write_owner)。
everyone@
向用户或组之外的所有用户授予对文件和文件属性的读取权限(r=read_data、a=append_data、R=read_xattr、c=read_acl 和 s=synchronize)。synchronize 访问权限当前未实现。
与详细 ACL 格式相比,缩写 ACL 格式具有以下优点:


  • 可将权限指定为 chmod 命令的位置参数。

  • 可以删除用于标识无权限的连字符 (-) 字符,并且只需指定必需的字母。

  • 可以同一方式设置权限和继承标志。

有关使用详细 ACL 格式的信息,请参见
以详细格式设置和显示 ZFS 文件的 ACL

示例 7–10 以缩写格式设置和显示 ACL
在以下示例中,普通 ACL 存在于 file.1 中:
# ls -V file.1
-rw-r-xr-x   1 root     root      206663 Feb 16 11:00 file.1
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow
在本示例中,为用户 gozer 添加了对 file.1 的 read_data/execute 权限。
# chmod A+user:gozer:rx:allow file.1
# ls -V file.1
-rw-r-xr-x+  1 root     root      206663 Feb 16 11:00 file.1
        user:gozer:r-x-----------:------:allow
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow
为用户 gozer 添加相同权限的另一种方法是在特定位置(例如 4)插入新 ACL。这样,位于位置 4-6 的现有 ACL 将被下推。例如:
# chmod A4+user:gozer:rx:allow file.1
# ls -V file.1
-rw-r-xr-x+  1 root     root      206663 Feb 16 11:00 file.1
            owner@:--x-----------:------:deny
            owner@:rw-p---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
        user:gozer:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow
在以下示例中,通过使用缩写 ACL 格式向用户 gozer 授予了继承用于新创建的文件和目录的读取、写入和执行权限。
# chmod A+user:gozer:rwx:f:allow dir.1
# ls -dV dir.1
drwxr-xr-x+  2 root     root           2 Feb 23 10:37 dir.1
        user:gozer:rwx-----------:f-----:allow
            owner@:--------------:------:deny
            owner@:rwxp---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow
另外,还可以剪切 ls -V 输出中的权限和继承标志并将其粘贴到缩写的 chmod 格式中。例如,要将用户 gozer 对 dir.1 的权限和继承标志复制给用户 cindys,可将权限和继承标志 (rwx-----------:f-----:allow) 复制并粘贴到 chmod 命令中。例如:
# chmod A+user:cindys:rwx-----------:f-----:allow dir.1
# ls -dV dir.1
drwxr-xr-x+  2 root     root           2 Feb 23 10:37 dir.1
       user:cindys:rwx-----------:f-----:allow
        user:gozer:rwx-----------:f-----:allow
            owner@:--------------:------:deny
            owner@:rwxp---A-W-Co-:------:allow
            group@:-w-p----------:------:deny
            group@:r-x-----------:------:allow
         everyone@:-w-p---A-W-Co-:------:deny
         everyone@:r-x---a-R-c--s:------:allow

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26090/showart_325726.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP