Solaris OS 的旧版本支持主要基于 POSIX 草案 ACL 规范的 ACL 实现。基于 POSIX 草案 ACL 用来保护 UFS 文件,并通过 NFSv4 之前的 NFS 版本进行转换。
引入 NFSv4 后,新 ACL 模型完全支持 NFSv4 在 UNIX 和非 UNIX 客户机之间提供的互操作性。如 NFSv4 规范中所定义,这一新的 ACL 实现提供了更丰富的基于 NT 样式 ACL 的语义。
新 ACL 模型的主要差别如下所列:
此新 ACL 模型基于 NFSv4 规范,并与 NT 样式的 ACL 类似。
新模型提供更为详尽的访问权限集。有关更多信息,请参见表 8–2。
ACL 分别使用 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 文件系统中。如果原始数据包括 POSIX 草案 ACL,则这些 ACL 会被转换为 NFSv4 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 很普通,因为它仅表示传统的 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
标识用于普通 ACL 语法的 ACL-entry-type。有关 ACL 项类型的说明,请参见表 8–1。
标识用于显式 ACL 语法的 ACL-entry-type。用户和组的 ACL-entry-type 还必须包含 ACL-entry-ID、username 或 groupname。有关 ACL 项类型的说明,请参见表 8–1。
标识授予或拒绝的访问权限。有关 ACL 访问权限的说明,请参见表 8–2。
标识一组可选的 ACL 继承标志。有关 ACL 继承标志的说明,请参见表 8–3。
标识授予还是拒绝访问权限。
在以下示例中,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,其中包含 username 或 userID。如果该值不是有效的数字 UID 或 username,则该 ACL 项的类型无效。 |
group |
通过组名指定向对象的其他组授予的访问权限。此项必须包括 ACL-entry-ID,其中包含 groupname 或 groupID。如果该值不是有效的数字 UID 或 groupname,则该 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 |
更改文件的属主或组的权限,或者对文件执行 chown 或 chgrp 命令的能力。 获取文件拥有权的权限或将文件的组拥有权更改为由用户所属组的权限。如果要将文件或组的拥有权更改为任意用户或组,则需要 PRIV_FILE_CHOWN 权限。 |
使用 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 继承策略。有关更多信息,请参见下一节。
aclinherit-此属性可确定 ACL 继承的行为。包括以下属性值:
discard-对于新对象,创建文件或目录时不会继承任何 ACL 项。新文件或目录的 ACL 等效于该文件或目录的权限。
noallow-对于新对象,仅继承访问类型为 deny 的可继承 ACL 项。
restricted-对于新对象,继承 ACL 项时将删除 write_owner 和 write_acl 权限。
passthrough-当属性值设置为 passthrough 时,会使用由可继承 ACE 确定的权限来创建文件。如果不存在影响权限的可继承 ACE,则会根据应用程序要求的权限设置权限。
passthrough-x-此属性与 passthrough 语义相同,只不过如果启用 passthrough-x,将使用执行 (x) 权限创建文件,但前提是必须在文件创建模式和影响该模式的可继承 ACE 中设置执行权限。
aclinherit 属性的缺省值为 restricted。
aclmode-最初创建文件时或每次用 chmod 命令修改文件或目录的权限时,该属性都会修改 ACL 行为。包括以下属性值:
discard-删除所有 ACL 项,但定义文件或目录的模式所需的项除外。
groupmask-除非用户项与文件或目录的属主具有相同的 UID,否则将减少用户或组的 ACL 权限,以使其不会大于组权限。然后,减少 ACL 权限,以使其不会大于属主权限。
passthrough-在 chmod 操作期间,除 owner@、group@ 或 everyone@ 以外的 ACE 不会以任何方式进行修改。owner@、group@ 或 everyone@ ACE 会被禁用以按 chmod 操作的要求设置文件模式。
aclmode 属性的缺省值为 groupmask。