Oracle Solaris ZFS 管理指南

新 Solaris ACL 模型

Solaris OS 的旧版本支持主要基于 POSIX 草案 ACL 规范的 ACL 实现。基于 POSIX 草案 ACL 用来保护 UFS 文件,并通过 NFSv4 之前的 NFS 版本进行转换。

引入 NFSv4 后,新 ACL 模型完全支持 NFSv4 在 UNIX 和非 UNIX 客户机之间提供的互操作性。如 NFSv4 规范中所定义,这一新的 ACL 实现提供了更丰富的基于 NT 样式 ACL 的语义。

新 ACL 模型的主要差别如下所列:

两种 ACL 模型均可比标准文件权限提供更精细的访问控制。与 POSIX 草案 ACL 非常相似,新 ACL 也由多个访问控制项 (Access Control Entry, ACE) 构成。

基于 POSIX 草案 ACL 使用单个项来定义允许和拒绝的权限。而新 ACL 模型包含两种类型的 ACE,用于进行访问检查: ALLOWDENY。因此,不能根据任何定义一组权限的单个 ACE 来推断是否允许或拒绝该 ACE 中未定义的权限。

NFSv4 ACL 与 POSIX 草案 ACL 之间的转换如下:

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

ACL 设置语法的说明

基本的 ACL 格式有如下两种:

用于设置普通 ACL 的语法

ACL 很普通,因为它仅表示传统的 UNIX owner/group/other 项。

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:name:access-permissions /...[:inheritance-flags]:deny | allow file

chmod [options] A-user|group:name:access-permissions /...[:inheritance-flags]:deny | allow file ...

chmod [options] A[index]- file

owner@, group@, everyone@

标识用于普通 ACL 语法的 ACL-entry-type。有关 ACL 项类型的说明,请参见表 8–1

user|group: ACL-entry-ID(username 或 groupname)

标识用于显式 ACL 语法的 ACL-entry-type用户和组的 ACL-entry-type 还必须包含 ACL-entry-IDusernamegroupname。有关 ACL 项类型的说明,请参见表 8–1

access-permissions/.../

标识授予或拒绝的访问权限。有关 ACL 访问权限的说明,请参见表 8–2

inheritance-flags

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

deny | allow

标识授予还是拒绝访问权限。

在以下示例中,ACL-entry-ID 值无意义。


group@:write_data/append_data/execute:deny

由于 ACL 中包括特定用户 (ACL-entry-type),因此以下示例中包括 ACL-entry-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 表示形式。

表 8–1 ACL 项类型

ACL 项类型 

说明 

owner@

指定授予对象属主的访问权限。 

group@

指定授予对象所属组的访问权限。 

everyone@

指定向不与其他任何 ACL 项匹配的任何用户或组授予的访问权限。 

user

通过用户名指定向对象的其他用户授予的访问权限。此项必须包括 ACL-entry-ID,其中包含 usernameuserID。如果该值不是有效的数字 UID 或 username,则该 ACL 项的类型无效。

group

通过组名指定向对象的其他组授予的访问权限。此项必须包括 ACL-entry-ID,其中包含 groupnamegroupID。如果该值不是有效的数字 UID 或 groupname,则该 ACL 项的类型无效。

下表介绍了 ACL 访问权限。

表 8–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

W

创建扩展属性或向扩展属性目录进行写入的权限。 

向用户授予此权限意味着用户可为文件创建扩展属性目录。属性文件的权限可以控制用户对属性的访问。 

write_data

w

修改或替换文件内容的权限。 

write_attributes

A

将与文件或目录关联的时间戳更改为任意值的权限。 

write_acl

C

编写 ACL 或使用 chmod 命令修改 ACL 的权限。

write_owner

o

更改文件的属主或组的权限,或者对文件执行 chownchgrp 命令的能力。

获取文件拥有权的权限或将文件的组拥有权更改为由用户所属组的权限。如果要将文件或组的拥有权更改为任意用户或组,则需要 PRIV_FILE_CHOWN 权限。

ACL 继承

使用 ACL 继承的目的是使新创建的文件或目录可以继承其本来要继承的 ACL,但不忽略父目录的现有权限。

缺省情况下,不会传播 ACL。如果设置某个目录的非普通 ACL,则任何后续目录不会继承该非普通 ACL。必须对文件或目录指定 ACL 的继承。

下表介绍了可选的继承标志。

表 8–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 标志,或同时使用两者来表示要继承的内容。

-

N/A 

未授予权限。 

此外,还可以使用 aclinherit 文件系统属性对文件系统设置更为严格或更为宽松的缺省 ACL 继承策略。有关更多信息,请参见下一节。

ACL 属性

ZFS 文件系统有两个与 ACL 相关的属性。