使用 NFSv4 ACL 的文件系统

     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 –d[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 设置文件的 ACLaclput [-i infile] [-t acl_type] [-v] 编辑文件的 ACLacledit [-t acl_type] 把文件的 ACL 从一种类型转换为另一种类型aclconvert [ -R ] -t 获取文件系统路径所支持的 ACL 类型aclgettypes

  在 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 添加、替换和删除 ACL 项mmputacl –i 编辑文件的 ACLmmeditacl 删除 ACL 项mmdelacl

  在默认情况下,文件包含 POSIX ACL。通过在 mmgetacl 命令中使用 -k nfs4 选项,可以把 POSIX ACL 显示为 NFS4 形式。可以使用 mmchfs –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 命令启用 NFS4 ACL。

  GPFS mmgetacl、mmputacl、mmdelacl 和 mmeditacl 命令用于 ACL 操作。

操作ZFS 命令JFS2ea2 命令GPFS 命令显示文件的 ACLls –v aclget mmgetacl –knfs4 添加 ACL 项chmod Aindex_ID+acl_specification aclput –t NFS4 mmputacl –i input_acl_file  chmod A+acl_specification acledit mmeditacl 替换 ACL 项chmod Aindex_ID=acl_specification acledit –t NFS4 mmputacl –i input_acl_file  chmod A=acl_specification  mmeditacl 删除 ACL 项chmod Aindex_ID- filenameacledit mmeditacl  chmod A-acl_specification    chmod A-   

  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 

你可能感兴趣的:(存储,操作系统-solaris,操作系统-linux,permissions,inheritance,file,attributes,user,aix)