楼主: ChallenWang
33 0

[作业] NFSv4 ACL 详解(基于 linux 原生实现) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-2-12
最后登录
2018-2-12

楼主
ChallenWang 发表于 2025-12-12 14:07:56 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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 参数表示递归应用于目录下的所有文件和子目录。

  1. 查看 ACL 中的 ACE 列表
    nfs4_getfacl <path>
  2. 在 ACL 的指定位置插入新的 ACE 条目
    nfs4_setfacl [-R] -a <ace> [ace_index]   # 在第 index 条 ACE 前添加新的 ACE 条目,默认为1
  3. 删除 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
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Linux ACL Lin localhost principle

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-19 23:53