跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 11.1 管理:ZFS 文件系统 Oracle Solaris 11.1 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
6. 使用 Oracle Solaris ZFS 快照和克隆
7. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
可以使用 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 A=acl-specification filename
% chmod Aindex-ID=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 206695 Jul 20 13:43 file.1 0:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 2:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
有关使用缩写 ACL 格式的信息,请参见以缩写格式设置和显示 ZFS 文件的 ACL。
示例 7-1 修改 ZFS 文件的普通 ACL
本节提供了有关设置和显示普通 ACL 的示例,普通 ACL 是指 ACL 中将只包含传统的 UNIX 条目、用户、组以及其他内容。
在以下示例中,普通 ACL 存在于 file.1 中:
# ls -v file.1 -rw-r--r-- 1 root root 206695 Jul 20 13:43 file.1 0:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 2:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
在以下示例中,为 group@ 授予了 write_data 权限。
# chmod A1=group@:read_data/write_data:allow file.1 # ls -v file.1 -rw-rw-r-- 1 root root 206695 Jul 20 13:43 file.1 0:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:read_data/write_data:allow 2: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 206695 Jul 20 13:43 file.1 0:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 2: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 Jul 20 14:23 test.dir 0:user:gozer:list_directory/read_data/execute:allow 1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 3: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 Jul 20 14:23 test.dir 0:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 2: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 2693 Jul 20 14:26 file.2 0:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 2:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
在以下示例中,从 everyone@ 中删除了 ACL allow 权限。
# chmod A2- file.2 # ls -v file.2 -rw-r----- 1 root root 2693 Jul 20 14:26 file.2 0:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow
在此输出中,文件的权限位从 644 重置为 640。删除 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 2440 Jul 20 14:28 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 2440 Jul 20 14:28 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 2440 Jul 20 14:28 file.3 0:owner@:execute:deny 1:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:read_data/read_xattr/execute/read_attributes/read_acl /synchronize:allow 3:everyone@:read_data/read_xattr/execute/read_attributes/read_acl /synchronize:allow
示例 7-4 恢复 ZFS 文件的普通 ACL
可以使用 chmod 命令来删除文件或目录的所有非普通 ACL。
在以下示例中,test5.dir 中存在两个非普通 ACE。
# ls -dv test5.dir drwxr-xr-x+ 2 root root 2 Jul 20 14:32 test5.dir 0:user:lp:read_data:file_inherit:deny 1:user:gozer:read_data:file_inherit:deny 2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 3:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 4: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 Jul 20 14:32 test5.dir 0:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 2:everyone@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow
示例 7-5 将 ACL 集合应用于 ZFS 文件
因为有 ACL 集合可用,因此您不必分别应用各个 ACL 权限。有关 ACL 集合的说明,请参见ZFS ACL 集合。
例如,您可以如下所示应用 read_set:
# chmod A+user:otto:read_set:allow file.1 # ls -v file.1 -r--r--r--+ 1 root root 206695 Jul 20 13:43 file.1 0:user:otto:read_data/read_xattr/read_attributes/read_acl:allow 1:owner@:read_data/read_xattr/write_xattr/read_attributes /write_attributes/read_acl/write_acl/write_owner/synchronize:allow 2:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 3:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
您可以如下所示应用 write_set 和 read_set:
# chmod A+user:otto:read_set/write_set:allow file.2 # ls -v file.2 -rw-r--r--+ 1 root root 2693 Jul 20 14:26 file.2 0:user:otto:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl:allow 1:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 3:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
可以确定如何在文件和目录中继承或不继承 ACL。缺省情况下,不会传播 ACL。如果在某个目录上设置了非普通 ACL,则任何后续目录都不会继承该 ACL。必须对文件或目录指定 ACL 的继承。
可以在文件系统中全局设置 aclinherit 属性。缺省情况下,aclinherit 设置为 restricted。
有关更多信息,请参见ACL 继承。
示例 7-6 授予缺省 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 Jul 20 14:53 test.dir 0:user:gozer:list_directory/read_data/add_file/write_data/execute:allow 1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 3: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 Jul 20 14:54 test.dir/sub.dir 0:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 2:everyone@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow
示例 7-7 对文件和目录授予 ACL 继承
以下一系列示例标识了设置 file_inherit 标志时应用的文件和目录的 ACE。
在以下示例中,为用户 gozer 添加了对 test2.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 Jul 20 14:55 test2.dir 0:user:gozer:read_data/write_data:file_inherit:allow 1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 3: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 Jul 20 14:56 test2.dir/file.2 0:user:gozer:read_data:inherited:allow 1:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 3:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
由于此文件系统的 aclinherit 属性设置为缺省模式 restricted,因此用户 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 Jul 20 14:57 test2.dir/subdir.2 0:user:gozer:list_directory/read_data/add_file/write_data:file_inherit /inherit_only/inherited:allow 1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 3: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 Jul 20 15:00 test3.dir 0:user:gozer:list_directory/read_data/add_file/write_data/execute :file_inherit/dir_inherit:allow 1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 3:everyone@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow
下面输出中的 inherited 文本是信息性消息,指示该 ACE 是继承的。
# touch test3.dir/file.3 # ls -v test3.dir/file.3 -rw-r--r--+ 1 root root 0 Jul 20 15:01 test3.dir/file.3 0:user:gozer:read_data:inherited:allow 1:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 3:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
在上面的示例中,由于 group@ 和 everyone@ 的父目录的权限位拒绝写入和执行权限,因此拒绝了用户 gozer 的写入和执行权限。缺省的 aclinherit 属性为 restricted,这意味着未继承 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--r--+ 2 root root 2 Mar 1 12:11 test4.dir 0:user:gozer:list_directory/read_data/add_file/write_data/execute :file_inherit/no_propagate:allow 1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:list_directory/read_data/read_xattr/read_attributes/read_acl /synchronize:allow 3:everyone@:list_directory/read_data/read_xattr/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 Jul 20 15:09 test4.dir/file.4 0:user:gozer:read_data:inherited:allow 1:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 3:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
示例 7-8 ACL 继承模式设置为 Passthrough 时的 ACL 继承
如果 tank/cindy 文件系统的 aclinherit 属性设置为 passthrough,则对于新创建的 file.5,用户 gozer 将继承 test4.dir 上应用的 ACL,如下所示:
# zfs set aclinherit=passthrough tank/cindy # touch test4.dir/file.5 # ls -v test4.dir/file.5 -rw-r--r--+ 1 root root 0 Jul 20 14:16 test4.dir/file.5 0:user:gozer:read_data/write_data/execute:inherited:allow 1:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 3:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow
示例 7-9 ACL 继承模式设置为 Discard 时的 ACL 继承
如果将文件系统的 aclinherit 属性设置为 discard,则目录的权限位更改时,可能会废弃 ACL。例如:
# zfs set aclinherit=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 Jul 20 14:18 test5.dir 0:user:gozer:list_directory/read_data/add_file/write_data/execute :dir_inherit:allow 1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 3: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 Jul 20 14:18 test5.dir 0:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 1:group@:list_directory/read_data/read_xattr/read_attributes/read_acl /synchronize:allow 2:everyone@:list_directory/read_data/read_xattr/read_attributes/read_acl /synchronize:allow
示例 7-10 ACL 继承模式设置为 Noallow 时的 ACL 继承
在以下示例中,设置了两个包含文件继承的非普通 ACL。一个 ACL 允许 read_data 权限,一个 ACL 拒绝 read_data 权限。此示例还说明了如何可在同一 chmod 命令中指定两个 ACE。
# zfs set aclinherit=noallow 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 Jul 20 14:22 test6.dir 0:user:gozer:read_data:file_inherit:deny 1:user:lp:read_data:file_inherit:allow 2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory /append_data/read_xattr/write_xattr/execute/delete_child /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 3:group@:list_directory/read_data/read_xattr/execute/read_attributes /read_acl/synchronize:allow 4: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 Jul 20 14:23 test6.dir/file.6 0:user:gozer:read_data:inherited:deny 1:owner@:read_data/write_data/append_data/read_xattr/write_xattr /read_attributes/write_attributes/read_acl/write_acl/write_owner /synchronize:allow 2:group@:read_data/read_xattr/read_attributes/read_acl/synchronize:allow 3:everyone@:read_data/read_xattr/read_attributes/read_acl/synchronize :allow