NFSv4 (Network File System – Version 4) 协议引入了一种新的 ACL(访问控制列表)格式,这种格式扩展了现有的其他 ACL 格式。NFSv4 ACL 很容易使用,还引入了更详细的文件安全属性,因此 NFSv4 ACL 更安全。IBM® AIX®、Sun Solaris 和 Linux® 等操作系统已经在文件系统中实现了 NFSv4 ACL。
当前,IBM AIX 5L version 5.3 和更高版本中支持 NFSv4 ACL 的文件系统是 NFSv4、JFS2 with EAv2 (Extended Journaled Filesystem with Extended Attributes format version 2) 和 General Parallel Filesystem (GPFS)。在 Sun Solaris 中,ZFS 支持这种 ACL 模型。在 RedHat Linux 中,NFSv4 支持 NFSv4 ACL。
什么是 ACL?
访问控制列表 (ACL) 用来指定文件系统对象(比如文件和目录)的访问权限。它是由许多访问控制项 (ACE) 组成的列表,每个访问控制项定义一个用户或组及其权限。
关于 ZFS ACL
Sun 通过 Solaris 10 操作系统补丁包引入了 ZFS 文件系统。
ZFS 支持 NFSv4 ACL 模型,并通过现有的 ls 和 chmod 命令的新选项实现了相关命令。可以使用 chmod 和 ls 命令设置和显示 ACL;没有引入新的命令。因此,在 ZFS 中使用 ACL 非常容易。
ZFS ACL 格式
ZFS ACL 采用一种定义良好的格式。这种格式和其中涉及的实体如下:
语法 A
ACL_entry_type:Access_permissions/…/[:Inheritance_flags]:deny or allow
ACL_entry_type 包括 “owner@”、“group@” 或 “everyone@”。
例如:
group@:write_data/append_data/execute:deny
语法 B
ACL_entry_type: ACL_entry_ID:Access_permissions/…/[:Inheritance_flags]:deny or allow
ACL_entry_type 包括 “user” 或 “group”。
ACL_entry_ID 包括 “user_name” 或 “group_name”。
例如:
user:samy:list_Directory/read_data/execute:allow
继承标志
f : FILE_INHERIT
d : DIRECTORY_INHERIT
i : INHERIT_ONLY
n : NO_PROPAGATE_INHERIT
S : SUCCESSFUL_ACCESS_ACE_FLAG
F : FAILED_ACCESS_ACE_FLAG
列出 ZFS 文件和目录的 ACL
可以使用带 -v 和 -V 选项的 ls 命令列出 ACL。使用 -d 选项列出目录的 ACL。
操作命令列出文件的 ACL 项ls –[v | V]
列出文件的 ACL 的示例
ls -v file.1
-rw-r--r-- 1 root root 2703 Nov 4 12:37 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 的示例
# ls -dv dir.1
drwxr-xr-x 2 root root 2 Nov 1 14:51 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 的示例
# ls -Vd dir.1
drwxr-xr-x 2 root root 2 Sep 1 05:46 d
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-xp--a-R-c--s:------:allow
在上面的示例中,以紧凑格式显示 ACL,也就是使用掩码显示访问权限和继承标志。每行显示一个 ACL 项,所以很容易理解。
修改 ZFS 文件和目录的 ACL
可以使用 chmod 命令设置或修改 ACL。chmod 命令使用 ACL 声明,其中包含前面给出的 ACL 格式(语法 A 或 B)。
操作命令按索引 ID 添加 ACL 项# chmod Aindex_ID+acl_specification filename为用户添加 ACL 项# chmod A+acl_specification filename按索引 ID 删除 ACL 项# chmod Aindex_ID- filename按用户删除 ACL 项# chmod A-acl_specification filename删除文件的 ACL# chmod A- filename替换索引 ID 位置上的 ACL 项# chmod Aindex_ID=acl_specification filename替换文件的 ACL# chmod A=acl_specification filename
修改 ZFS ACL 的示例
列出 ACL 项
# ls –v a
-rw-r--r-- 1 root root 0 Sep 1 04:25 a
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 项
# chmod A+user:samy:read_data:allow a
# ls -v a
-rw-r--r--+ 1 root root 0 Sep 1 02:01 a
0:user:samy:read_data: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
# chmod A1+user:samy:execute:deny a
# ls -v a
-rw-r--r--+ 1 root root 0 Sep 1 02:01 a
0:user:samy:read_data:allow
1:user:samy:execute:deny
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
替换 ACL 项
# chmod A0=user:samy:read_data/write_data:allow a
# ls -v
total 2
-rw-r--r--+ 1 root root 0 Sep 1 02:01 a
0:user:samy:read_data/write_data:allow
1:user:samy:execute:deny
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
# chmod A=user:samy:read_data/write_data/append_data:allow a
# ls -v a
----------+ 1 root root 0 Sep 1 02:01 a
0:user:samy:read_data/write_data/append_data:allow
还可以使用掩码(而不是指定完整名称)修改 ACL。
使用掩码修改 ACL 项
# ls -V a
-rw-r--r--+ 1 root root 0 Sep 5 01:50 a
user:samy:--------------:------:deny
user:samy:rwx-----------:------:allow
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
# chmod A1=user:samy:rwxp:allow a
# ls -V a
-rw-r--r--+ 1 root root 0 Sep 5 01:50 a
user:samy:--------------:------:deny
user:samy:rwxp----------:------:allow
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 项
# ls -v a
-rw-r-----+ 1 root root 0 Sep 5 01:50 a
0:user:samy: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@:read_data/write_data/append_data/write_xattr/execute/
write_attributes/write_acl/write_owner:deny
6:everyone@:read_xattr/read_attributes/read_acl/synchronize:allow
# chmod A- a
# ls -v a
-rw-r----- 1 root root 0 Sep 5 01:50 a
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@:read_data/write_data/append_data/write_xattr/execute/
write_attributes/write_acl/write_owner:deny
5:everyone@:read_xattr/read_attributes/read_acl/synchronize:allow
# chmod A5- a
# ls -v a
-rw-r----- 1 root root 0 Sep 5 01:50 a
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@:read_data/write_data/append_data/write_xattr/execute/
write_attributes/write_acl/write_owner:deny
关于 JFS2 ACL
Enhanced Journaled File System (JFS2) 是基本 AIX 操作系统中内置的文件系统。要想在 JFS2 文件系统中支持 NFSv4 ACL,需要在创建文件系统时启用 “Extended Attribute Format - Version 2”。在创建文件系统之后,无法启用或禁用这个特性。
本文假设已经启用了 “Extended Attribute Format - Version 2”。
JFS2 ACL 格式
这种格式和其中涉及的实体如下:
语法
IDENTITY ACE_TYPE ACE_MASK INHERITANCE_AND_AUDIT_ATTRS
Where:
IDENTITY has format: 'IDENTITY_type:IDENTITY_name(IDENTITY_who):'
Where:
IDENTITY_type is one of the following:
u : user
g : group
s : special who string (IDENTITY_who must be a special who)
IDENTITY_name => user/group name
IDENTITY_who => who string
ACE_TYPE is one of the following ACE Type:
a : allow
d : deny
l : alarm
u : audit
继承标志
INHERITANCE_AND_AUDIT_ATTRS (Optional) is one or more of the following:
fi : FILE_INHERIT
di : DIRECTORY_INHERIT
oi : INHERIT_ONLY
ni : NO_PROPAGATE_INHERIT
sf : SUCCESSFUL_ACCESS_ACE_FLAG
ff : FAILED_ACCESS_ACE_FLAG
列出 JFS2 文件和目录的 ACL
JFS 提供下面这些与 ACL 相关的命令。
操作命令显示文件的 ACLaclget
在 JFS2 分区中,在默认情况下启用 AIX Classic (AIXC) ACL 而不是 NFSv4 ACL。需要把 AIXC ACL 转换为 NFS4。
下面的命令列出 JFS2 分区中一个新文件的 ACL:
显示 ACL
# aclget file1
*
* ACL_type AIXC
*
attributes:
base permissions
owner(root): rw-
group(system): r--
others: r--
extended permissions
disabled
在这个示例中,AIXC 表明这些是 AIX Classic ACL。
要想转换为任何其他类型,需要了解这个文件系统支持的 ACL 类型。
显示支持的 ACL 类型:
# aclgettypes file1
Supported ACL types are:
AIXC
NFS4
现在,可以把 AIXC ACL 转换为 NFS4:
把 ACL 由 AIX Classic 形式转换为 NFSv4 形式
# aclconvert -t NFS4 file1
# aclget a
*
* ACL_type NFS4
*
*
* Owner: root
* Group: system
*
s:(OWNER@): a rwpRWaAdcCs
s:(OWNER@): d xo
s:(GROUP@): a rRadcs
s:(GROUP@): d wpWxACo
s:(EVERYONE@): a rRadcs
s:(EVERYONE@): d wpWxACo
修改 JFS2 文件和目录的 ACL
可以使用 aclput 或 acledit 命令修改 ACL。设置 ACL 的最好方法是,首先使用 aclget 命令获取文件的 ACL,把它保存在文件中。然后,修改文件中的 ACL,使用 aclput –i
acledit 命令使用一个编辑器显示和修改 ACL。在使用 acledit 命令之前,需要设置环境变量 EDITOR。
为了避免每次在目录中添加文件时都要把 ACL 由 AIXC 类型转换为 NFS4,可以在目录中设置适当的继承标志。
还可以使用前面的命令在 AIX 上管理 NFSv4 ACL。
关于 GPFS ACL
IBM General Parallel File System (GPFS) 是一种强大的集群文件系统。它提供集群环境所需的几个高级特性并在 AIX 和 Linux 上支持 NFSv4 ACL。
GPFS ACL 格式
GPFS 支持 NFS4 和 POSIX ACL 格式。
POSIX GPFS ACL 通常像下面这样:
GPFS POSIX ACL
#owner:guest
#group:usr
user::rwxc
group::rwx- #effective:rw—
other::--x-
mask::rw-c
user:samy:rwxc #effective:rw-c
group:audit:rwx- #effective:rw--
group:system:-w--
在这个示例中,除了一般的模式位 rwx 之外,还有新的 c 位,这是 GPFS 特有的,代表 ACL Control。如果为任何用户设置了这一位,用户就可以修改文件或目录的 ACL。
另外,注意 mask ACL 项。它不是任何用户或组的 ACL 项,而是一个筛选器,可以应用于所有组、所有用户和文件或目录的所有者组的 ACL。它代表这三者可以拥有的最大权限。注意,它不应用于所有者用户和其他项。
在前面的示例中,mask 设置为 rw-c。因此,这是其他用户可以拥有的最大权限,例如尽管 samy 的 ACL 是 rwxc,但是有效的 ALC 只是 rw-c。
GPFS 中的 NFS4 ACL 格式
在 GPFS ACL 的 NFS4 形式中,每个 ACL 项由三行组成。
语法
Format for first line:
IDENTITY_TYPE:IDENTITY_NAME:PERMISSIONS_BITS:TYPE[:INHERITANCE_FLAGS]
Where:
IDENTITY_TYPE is one of the following:
user : A normal user.
group : A normal Group.
special : File owning owner, group, or everyone.
IDENTITY_NAME is one of the following:
If IDENTITY_TYPE is user or group, then IDENTITY_NAME is name of user or group.
If IDENTITY_TYPE is special, then IDENTITY_NAME is either “owner@”, “group@”
or “everyone@”.
PERMISSIONS is one or more of the following:
r : Read.
w : Write.
x : Execute.
c : ACL Control.
TYPE is one of the following:
allow
deny
Next 2 lines represent the list of access permissions.
继承标志
INHERITANCE_FLAGS is one or more of the following:
FileInherit
DirInherit
InheritOnly
示例
group:staff:r-x-:allow
(X)READ/LIST (-)WRITE/CREATE (-)MKDIR (-)SYNCHRONIZE (-)READ_ACL
(X)READ_ATTR (-)READ_NAMED
(-)DELETE (-)DELETE_CHILD (-)CHOWN (X)EXEC/SEARCH (-)WRITE_ACL
(-)WRITE_ATTR (-)WRITE_NAMED
GPFS 中的 ACL 命令
操作命令显示文件的 ACLmmgetacl
在默认情况下,文件包含 POSIX ACL。通过在 mmgetacl 命令中使用 -k nfs4 选项,可以把 POSIX ACL 显示为 NFS4 形式。可以使用 mmchfs
在已经设置了 POSIX ACL 的文件上设置 NFS4 ACL,NFS4 ACL 就会覆盖原来的 ACL。
ZFS、JFS2 和 GPFS ACL 操作比较
ZFS 支持使用 ls 和 chmod 命令列出和修改 ACL。
在 JFSv2 with Extended Attributes v2 (JFS2 with EAv2) 中,可以使用 acl* 命令集列出和修改 ACL。在默认情况下,对于新创建的文件,只启用 AIX Classic ACL,NFS4 ACL 是禁用的。在这种情况下,在父目录上没有设置 ACL 继承标志。可以使用 aclconvert –t NFS4
GPFS mmgetacl、mmputacl、mmdelacl 和 mmeditacl 命令用于 ACL 操作。
操作ZFS 命令JFS2ea2 命令GPFS 命令显示文件的 ACLls –v
chmod 命令的效果
对于 ZFS 文件,在使用 chmod 命令修改基本权限位时,并不删除扩展的或显式的 NFS ACL。在修改权限位时,相应地设置 NFS ACL,反之亦然。
对于 JFS2ea2 中的文件,只能使用 chmod 命令修改权限位,不能用它修改 ACL 中的位。chmod 命令只能修改 setuid、setgid 或 sticky 位,而不会影响 NFS ACL。如果试图修改任何 Unix® 权限位,那么所有 NFS ACL 都会丢失并设置相应的 AIXC ACL。
对于 GPFS,使用 chmod 的结果是相似的。如果在 GPFS 文件系统上设置了 -k nfs4 选项,那么除 owner@、group@ 和 everyone@ 之外的所有 ACL 项都被删除。如果在 GPFS 文件系统上没有设置 -k nfs4,那么运行 chmod 会删除所有 NFS4 ACL,保留 owner@、group@ 和 everyone@ 的 POSIX ACL 项。
在 JFS2 上运行 chmod 命令的效果
# aclget a
*
* ACL_type NFS4
*
*
* Owner: root
* Group: system
*
s:(OWNER@): a rwpRWxaAdcCs
s:(OWNER@): d o
s:(GROUP@): a rRadcs
s:(GROUP@): d wpWxACo
s:(EVERYONE@): a rRadcs
s:(EVERYONE@): d wpWxACo
# chmod 744 a
# aclget a
*
* ACL_type AIXC
*
attributes:
base permissions
owner(root): rwx
group(system): r--
others: r--
extended permissions
disabled