使用 NFSv4 ACL

文件系统
NFSv4 (Network File

– 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] <file_name>
列出目录

ACL 项 ls –d[v | V] <dir_name>
列出文件

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_spec

ication filename
为用户添加 ACL 项 # chmod A+acl_spec

ication filename
按索引 ID 删除 ACL 项 # chmod Aindex_ID- filename
按用户删除 ACL 项 # chmod A-acl_spec

ication filename
删除文件

ACL # chmod A- filename
替换索引 ID 位置上

ACL 项 # chmod Aindex_ID=acl_spec

ication filename
替换文件

ACL # chmod A=acl_spec

ication 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

(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
(IDENTITY_who must be a special who)
IDENTITY_name => user/group name
IDENTITY_who => who
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 相关

命令

操作 命令
显示文件

ACL aclget <filename>
设置文件

ACL aclput [-i infile] [-t acl_type] [-v] <filename>
编辑文件

ACL acledit [-t acl_type] <filename>
把文件

ACL 从

种类型转换为另

种类型 aclconvert [ -R ] -t <acltype> <filename>
获取文件系统路径所支持

ACL 类型 aclgettypes <filename>
在 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 <input_acl_file> 存储它们

acledit 命令使用

个编辑器显示和修改 ACL

在使用 acledit 命令的前

需要设置环境变量 EDITOR

为了避免每次在目录中添加文件时都要把 ACL 由 AIXC 类型转换为 NFS4

可以在目录中设置适当

继承标志

还可以使用前面

命令在 AIX 上管理 NFSv4 ACL

有关 GPFS ACL
IBM General Parallel File

(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

它代表这 3者可以拥有

最大权限

注意

它不应用于所有者用户和其他项
在前面

举例中

mask 设置为 rw-c

因此

这是其他用户可以拥有

最大权限

例如尽管 samy

ACL 是 rwxc

但是有效

ALC 只是 rw-c

GPFS 中

NFS4 ACL 格式
在 GPFS ACL

NFS4 形式中

每个 ACL 项由 3行组成

语法
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 命令
操作 命令
显示文件

ACL mmgetacl <filename>
添加、替换和删除 ACL 项 mmputacl –i <input_acl_file> <filename>
编辑文件

ACL mmeditacl <filename>
删除 ACL 项 mmdelacl <filename>
在默认情况下

文件包含 POSIX ACL

通过在 mmgetacl 命令中使用 -k nfs4 选项

可以把 POSIX ACL 显示为 NFS4 形式

可以使用 mmchfs <device> –k nfs4 把 GPFS 文件系统

默认 ACL 设置为 NFS4

在已经设置了 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 <path or file_name> 命令启用 NFS4 ACL
GPFS mmgetacl、mmputacl、mmdelacl 和 mmeditacl 命令用于 ACL 操作

操作 ZFS 命令 JFS2ea2 命令 GPFS 命令
显示文件

ACL ls –v <file_name> aclget <file_name> mmgetacl –knfs4 <file_name>
添加 ACL 项 chmod Aindex_ID+acl_spec

ication <file_name> aclput –t NFS4 <file_name> mmputacl –i input_acl_file <file_name>
chmod A+acl_spec

ication <file_name> acledit <file_name> mmeditacl <file_name>
替换 ACL 项 chmod Aindex_ID=acl_spec

ication <file_name> acledit –t NFS4 <file_name> mmputacl –i input_acl_file <file_name>
chmod A=acl_spec

ication <file_name> mmeditacl <file_name>
删除 ACL 项 chmod Aindex_ID- filename acledit <file_name> mmeditacl <file_name>
chmod A-acl_spec

ication <file_name>
chmod A- <file_name>
chmod 命令

效果
对于 ZFS 文件

在使用 chmod 命令修改基本权限位时

并不删除扩展

或显式

NFS ACL

在修改权限位时

相应地设置 NFS ACL

反的亦然
对于 JFS2ea2 中

文件

只能使用 chmod 命令修改权限位

不能用它修改 ACL 中

位

chmod 命令只能修改

uid、

gid 或 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