文件系统:在文件系统中使用 NFSv4 ACL

  使用 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 命令设置或修改 ACLchmod 命令使用 ACL 声明其中包含前面给出 ACL 格式(语法 A 或 B)

操作 命令
按索引 ID 添加 ACL 项 # chmod Aindex_ID+acl_specication filename
为用户添加 ACL 项 # chmod A+acl_specication filename
按索引 ID 删除 ACL 项 # chmod Aindex_ID- filename
按用户删除 ACL 项 # chmod A-acl_specication filename
删除文件 ACL # chmod A- filename
替换索引 ID 位置上 ACL 项 # chmod Aindex_ID=acl_specication filename
替换文件 ACL # chmod A=acl_specication 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 ACLNFS4 ACL 就会覆盖原来 ACL

  ZFS、JFS2 和 GPFS ACL 操作比较

  ZFS 支持使用 ls 和 chmod 命令列出和修改 ACL

  在 JFSv2 with Extended Attributes v2 (JFS2 with EAv2) 中可以使用 acl* 命令集列出和修改 ACL在默认情况下对于新创建文件只启用 AIX Classic ACLNFS4 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_specication <file_name> aclput –t NFS4 <file_name> mmputacl –i input_acl_file <file_name>
  chmod A+acl_specication <file_name> acledit <file_name> mmeditacl <file_name>
替换 ACL 项 chmod Aindex_ID=acl_specication <file_name> acledit –t NFS4 <file_name> mmputacl –i input_acl_file <file_name>
  chmod A=acl_specication <file_name>   mmeditacl <file_name>
删除 ACL 项 chmod Aindex_ID- filename acledit <file_name> mmeditacl <file_name>
  chmod A-acl_specication <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 


Tags:  ntfs文件系统 linux文件系统 文件系统raw 文件系统

延伸阅读

最新评论

发表评论