NFSv4 ACL 与 POSIX ACL 的差异分析
POSIX ACL 在传统的 owner、group owner 和 other 权限模型基础上,扩展了对特定 user 和 group 的访问控制能力。权限检查遵循严格的顺序规则,一旦某一条目匹配成功即终止后续判断。其中,mask 表示 user、group 及 group owner 所能拥有的最大权限集合。
POSIX ACL 权限检查流程
- 属于 owner:若 owner 的权限满足请求的权限,则通过检查。
- 属于指定 user:若该 user 的权限与 mask 的交集满足所需权限,则通过。
- 属于 group owner 或任意 group:只要任一 group 与 mask 的交集,或 group owner 与 mask 的交集满足权限要求,即可通过。
- 属于 other:若 other 权限满足请求权限,则允许访问。
NFSv4 ACL 不采用 mask 机制,因此无法像 POSIX ACL 那样为 user、group 和 group owner 设置权限上限。但它引入了三个通用主体(principle):OWNER@、GROUP@ 和 EVERYONE@,其与 POSIX 模型中的对应关系如下表所示:
| POSIX 主体 | owner | user | group owner | group | other |
|---|---|---|---|---|---|
| OWNER@ | √ | ||||
| GROUP@ | √ | ||||
| EVERYONE@ | √ | √ | √ | √ | √ |
Mode 与 ACL 的相互影响
在 Linux 原生权限体系中,系统优先检查 POSIX ACL,若通过后再依据 mode 位进行最终判定。修改文件 mode(如使用 chmod)不会改变已设置的 POSIX ACL;但当通过 nfs4_setfacl 或 setfacl 修改 NFSv4/POSIX ACL 时,可能会更新 mode 位,具体影响如下:
| NFSv4 ACL Principal | POSIX ACL Principal | 对应的 Mode 权限 |
|---|---|---|
| OWNER@ | owner | S_IRWXU (700) |
| GROUP@ | group owner | S_IRWXG (070) |
| EVERYONE@ | owner、group owner、other | S_IRWXU|S_IRWXG|S_IRWXO (777) |
| user | user | 无影响 |
| group | group | 无影响 |
NFSv4 ACL 使用方式
NFSv4 ACL 由多个 ACE(Access Control Entry)条目按顺序叠加构成。在 Linux 原生 NFS 服务端实现中,这些 ACL 实际上会被转换为 POSIX ACL 并存储于 inode 中以生效,因此仅支持 NFSv4 ACL 的一个子集功能。
注意:ACL 列表中首个 ACE 条目的索引为 1。以下命令中的 -R 参数表示递归应用于目录下的所有文件和子目录。
- 查看 ACL 中的 ACE 列表
nfs4_getfacl <path> - 在 ACL 的指定位置插入新的 ACE 条目
nfs4_setfacl [-R] -a <ace> [ace_index] # 在第 index 条 ACE 前添加新的 ACE 条目,默认为1 - 删除 ACL 中某一位置的 ACE 条目
nfs4_setfacl [-R] -x <ace_index> # 删除第 index 条ACE nfs4_setfacl [-R] -x <ace> # 要求 ACE 的内容与某一条 ACE 完全匹配
在 Linux 内核实现中,NFSv4 ACL 存储时会先转化为 POSIX ACL 再写入 inode,读取时再逆向还原为 NFSv4 格式。此过程可能导致显示顺序与原始添加顺序不一致,但语义保持不变。例如:若第一条 ACE 为 deny 某权限,第二条为 allow 相同权限,则最终只会保留 deny 条目,因为只有实际生效的规则会被呈现。
ACE 条目格式说明
type:flag:user_or_group:mask
ACE 类型及其含义
| ACE Type | 含义 | 是否支持配置 | 行为描述 |
|---|---|---|---|
| A | 添加 allow 类型的 ACE 条目 | 是 | 如果此前没有 deny 该权限,则此权限将被允许。 |
| D | 添加 deny 类型的 ACE 条目 | 是(不推荐直接使用) |
建议做法是先删除原有条目,再新增 allow 规则来替代。
1. 若此前未 allow 该权限,则该权限将被拒绝; 2. 成功 deny 后可能“误伤”其他 user 或 group 的权限。这是出于兼容 POSIX 模型的安全保守策略。由于 POSIX 权限检查按 owner → user → group owner/group → other 的顺序执行,即使后面 deny 了某个权限,仍可能因前面的条目已匹配而导致权限被授予。例如,一个用户既是普通 group 成员,也可能是文件 owner 或匹配了 user 条目。在 NFSv4 ACL 转换为 POSIX ACL 的过程中,无法预知最终规则形态,故采取更谨慎的方式处理 deny 操作。 |
| U | 为访问行为启用审计日志记录 | 否 | 当前实现中无实际作用 |
| L | 在发生允许或拒绝访问时触发告警 | 否 | 当前实现中无实际作用 |
Deny 操作的潜在误伤矩阵
下表展示了当对某一 NFS Principle 设置 deny 权限时,可能连带影响到的其他 NFS 或 POSIX Principle 的权限范围。
| nfs principal | 误伤 principle |
|---|---|
| OWNER@ / owner | user |
| GROUP@ / group owner | group |
| EVERYONE@ | other |
| OWNER@ | √ | |||||
| user | √ | √ | ||||
| GROUP@ | √ | √ | √ | √ | √ | |
| group | √ | √ | √ | √ | √ | |
| EVERYONE@ | √ | √ | √ | √ | √ | √ |
ACE Flag
| ACE Flags | 含义 | 是否支持 | 行为 |
|---|---|---|---|
| g | 为此目录或文件增加的是 group 的 ace 而非 user 的 ace | 是 | 增加的是 group 的 ace 而非 user 的 ace |
| d/f | 在此目录下新创建的目录/文件继承权限 | 是 |
1、在目录下创建文件与目录的权限归一:无论指定了 d、f、df 中的哪种 flag,增加或删除权限的行为会同时应用于目录下新创建的目录和文件(相当于同时指定了 df) 2、只对目录生成,对文件应用 d/f 的 flag 的 ace 条目无效 |
| i | 是否影响原目录 | 是 |
1、指定 i 时,不影响当前目录的 acl 权限,只影响目录下新创建的文件或目录的 acl 权限。 2、只在指定 d/f flag 时有效 |
ACE Mask
| 权限 | 含义 | 是否支持配置 | 说明 |
|---|---|---|---|
| r | 读文件或目录权限 | 是 |
1、读文件内容 2、列出目录下文件 |
| w/a | 修改文件或目录 | 是 |
1、追加写(a)或覆盖写(w)文件 2、在目录下创建文件或目录 3、无论指定了 w、a、wa 中的哪种,都相当于指定了 wa,即“修改”的权限 4、部分旧版本要求 ace 条目中对目录同时指定 waD 才有效 5、部分旧版本要求 ace 条目中对文件同时指定 wa 才有效 |
| x | 执行文件或进入目录 | 是 |
1、执行文件 2、进入目录 |
| d | 删除此文件或目录 | 否 | 无影响 |
| D | 删除此目录下的文件或目录 | 否 | 对目录有写属性时自动附带 D 权限 |
| t | 读文件或目录的 attr | 否 | EVERYONE@ 自动附带权限,即任何用户可读文件/目录的属性 |
| T | 写文件或目录的 attr | 否 | OWNER@ 自动附带权限,即只有 owner 可修改文件/目录的属性 |
| n | 读文件或目录的 named attr | 否 | 无影响 |
| N | 写文件或目录的 named attr | 否 | 无影响 |
| c | 读文件或目录的 acl | 否 | EVERYONE@ 自动附带权限,即任何用户可读文件/目录的 acl |
| C | 写文件或目录的 acl | 否 | OWNER@ 自动附带权限,即只有 owner 可修改文件/目录的 acl |
| o | 改变文件或目录的 owner | 否 | 无影响 |
| y | 允许 nfs client 在提交写时确保文件内容落盘(sync IO) | 否 | EVERYONE@ 自动附带权限,即 nfs 服务端对于任意用户的写后 commit 请求,一定会等数据落盘才回复 nfs 客户端。 |
示例说明
示例一:为文件添加用户权限
为 file 文件的 1002 用户添加读、写、执行权限,并将该条目插入 ACL 列表的第 4 位:
nfs4_setfacl -a A::1002:warx 4 file
操作流程如下:
[root@localhost test]# touch file [root@localhost test]# nfs4_getfacl file # file: file A::OWNER@:rwatTcCy A::GROUP@:rtcy A::EVERYONE@:rtcy [root@localhost test]# nfs4_setfacl -a A::1002:warx file [root@localhost test]# nfs4_getfacl file # file: file D::OWNER@:x A::OWNER@:rwatTcCy A::1002:rwaxtcy A::GROUP@:rtcy A::EVERYONE@:rtcy [root@localhost test]# nfs4_setfacl -a D::1002:warx 4 file [root@localhost test]# nfs4_getfacl file # file: file D::OWNER@:x A::OWNER@:rwatTcCy A::1002:rwaxtcy A::GROUP@:rtcy A::EVERYONE@:rtcy
从结果可以看出,在第4条位置尝试添加 deny 类型的 ACE 实际未生效,原因在于第3条 already 允许了写权限,deny 条目无法覆盖已有的 allow 权限。
示例二:设置目录继承权限
为 dir 目录配置继承性 ACL,使得在其下新建的文件或子目录对用户 1003 具备读、写、执行权限:
nfs4_setfacl -a A:fdi:1003:wrx dir
执行过程如下:
[root@localhost test]# mkdir dir [root@localhost test]# nfs4_getfacl dir # file: dir A::OWNER@:rwaDxtTcCy A::GROUP@:rxtcy A::EVERYONE@:rxtcy
通过设置 fdi 标志,实现了新创建内容自动继承指定权限的效果。其中 d/f 控制继承目标类型,i 确保当前目录本身不受影响,仅作用于后续创建的对象。
[root@localhost test]# mkdir dir [root@localhost test]# nfs4_getfacl dir # file: dir A::OWNER@:rwaDxtTcCy A::GROUP@:rxtcy A::EVERYONE@:rxtcy
对目录 dir 设置 ACL 权限,移除 group owner 的写权限,并希望该设置在后续创建的文件或目录中继承:
[root@localhost test]# nfs4_setfacl -a D:f:GROUP@:w dir
查看当前目录的 ACL 配置:
[root@localhost test]# nfs4_getfacl dir # file: dir A::OWNER@:rxtTcCy A::GROUP@:rxtcy A::EVERYONE@:rxtcy A:fdi:OWNER@:tTcCy A:fdi:GROUP@:tcy A:fdi:EVERYONE@:tcy
从结果可以看出,由于未使用 flag i,虽然仅指定了 f 标志,但实际上 f 和 d、i 同时生效。因此不仅影响了新创建的文件和子目录的继承规则,还直接影响了当前目录的权限。
此外,原 OWNER@ 的完整权限(包含写权限)被错误地限制,导致其写权限也被 deny。同样,EVERYONE@ 的写权限也受到了影响。这表明该操作产生了非预期的副作用,即“误伤”了其他主体的权限设置。
nfs4_getfacl <path>
再来看另一个示例:向 dir 目录添加针对用户 1003 的读、写、执行权限 ACE,并指定 flag i,使其仅作用于继承机制:
[root@localhost test]# nfs4_setfacl -a A:fdi:1003:wrx dir [root@localhost test]# nfs4_getfacl dir # file: dir A::OWNER@:rwaDxtTcCy A::GROUP@:rxtcy A::EVERYONE@:rxtcy D:fdi:OWNER@:rx A:fdi:OWNER@:tTcCy A:fdi:1003:rxtcy A:fdi:GROUP@:tcy A:fdi:EVERYONE@:tcy
接着在该目录下创建一个新文件:
[root@localhost test]# touch dir/file [root@localhost test]# nfs4_getfacl dir/file # file: dir/file D::OWNER@:r A::OWNER@:tTcCy A::1003:rtcy A::GROUP@:tcy A::EVERYONE@:tcy
可以观察到,由于设置了 flag i,dir 目录本身并未赋予用户 1003 读、写、执行的实际权限,但新建的文件 dir/file 却正确继承了这些权限。说明该 ACE 仅通过继承机制生效,符合预期行为。
nfs4_setfacl [-R] -a <ace> [ace_index] # 在第 index 条 ACE 前添加新的 ACE 条目,默认为1

雷达卡


京公网安备 11010802022788号







