IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  AIX and UNIX  >

在文件系统中使用 NFSv4 ACL

管理 NFSv4 ACL

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

英文原文

英文原文


级别: 中级

Samyak Jain, 高级软件工程师, IBM

2009 年 7 月 15 日

在不同的文件系统上使用不同的命令管理 NFSv4 ACL 可能很困难。本文讨论并对比的命令可能你在对不同的文件系统操作时会用到。

使用 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] <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 格式(语法 AB)。

操作命令
按索引 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 <filename>
设置文件的 ACLaclput [-i infile] [-t acl_type] [-v] <filename>
编辑文件的 ACLacledit [-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 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 <filename>
添加、替换和删除 ACL 项mmputacl –i <input_acl_file> <filename>
编辑文件的 ACLmmeditacl <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 命令
显示文件的 ACLls –v <file_name>aclget <file_name>mmgetacl –knfs4 <file_name>
添加 ACL 项chmod Aindex_ID+acl_specification <file_name>aclput –t NFS4 <file_name>mmputacl –i input_acl_file <file_name>
chmod A+acl_specification <file_name>acledit <file_name>mmeditacl <file_name>
替换 ACL 项chmod Aindex_ID=acl_specification <file_name>acledit –t NFS4 <file_name>mmputacl –i input_acl_file <file_name>
chmod A=acl_specification <file_name>mmeditacl <file_name>
删除 ACL 项chmod Aindex_ID- filenameacledit <file_name>mmeditacl <file_name>
chmod A-acl_specification <file_name>
chmod A- <file_name>




回页首


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



参考资料

学习
  • Managing GPFS access control lists and NFS export” —— 关于 GPFS ACL 各方面的信息。

  • ZFS Administration Guide

  • 技术书店 浏览关于这些主题和其他技术主题的图书。

  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。

  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。

  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。

  • developerWorks 技术活动网络广播:随时关注 developerWorks 技术活动和网络广播。

  • Podcasts:收听 Podcast 并了解 IBM 技术专家的最新想法。


讨论


关于作者

http://www.ibm.com/developerworks/i/p-sjain.jpg

Samyak Jain 是 IBM India Software Labs 的高级软件工程师。他已经在 IBM 工作了三年,从事企业文件系统 AFS。他当前是三级支持团队成员。他拥有印度 Bhopal 的 Rajeev Gandhi University 的计算机科学工程学士学位。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款