![为什么“man acl”中的访问检查算法与实际的权限区分不一致?](https://linux22.com/image/1570143/%E4%B8%BA%E4%BB%80%E4%B9%88%E2%80%9Cman%20acl%E2%80%9D%E4%B8%AD%E7%9A%84%E8%AE%BF%E9%97%AE%E6%A3%80%E6%9F%A5%E7%AE%97%E6%B3%95%E4%B8%8E%E5%AE%9E%E9%99%85%E7%9A%84%E6%9D%83%E9%99%90%E5%8C%BA%E5%88%86%E4%B8%8D%E4%B8%80%E8%87%B4%EF%BC%9F.png)
在man acl
说:
2. else if the effective user ID of the process matches the qualifier of any entry of type ACL_USER, then
if the matching ACL_USER entry and the ACL_MASK entry contain the requested permissions, access is granted,
else access is denied.
据我了解,如果存在用户的 ACL_USER 条目,则授予或拒绝与该条目对应的访问,并且算法结束。
创建文件并分配其访问权限::
echo "echo 123" > /file1
chmod 005 file1
setfacl -m u:test1:--- /file1
chown usertest:root /file1
并得到
userc@client:~$ getfacl /file1
getfacl: Removing leading '/' from absolute path names
# file: file1
# owner: usertest
# group: root
user::---
user:test1:---
group::---
mask::---
other::r-x
usertest
如果我正确理解了该算法,则除和之外的所有人都可以访问执行和读取test1
,但对test1
和 执行文件有权限:
test1@client:~$ sh /file1
123
即获取访问权限others
为什么用户‘test1’的 ACL_USER 条目没有拒绝访问test1
?
ps 使用‘acl’挂载的驱动器
答案1
在这种情况下,由于 ACL_MASK 不包含任何位(因此 ACL 无法授予任何权限),Linux 内核将完全跳过 ACL 检查。操作将直接转到仅检查“其他”权限位(允许访问)。
这可能是 2004 年“通用 ACL 支持”重写中引入的一个错误(提交42017c2e
在 tglx/history 中,dc4ceab7
在 unified 中)。你可以在acl_permission_check() 函数(fs/namei.c
请注意,“mask”变量不是请参阅 ACL_MASK,但请参阅所需的访问位):
静态 int acl_permission_check(struct inode *inode,int mask) { 无符号整数模式 = inode->i_mode; 如果(可能(uid_eq(current_fsuid(,inode->i_uid))) ... 别的 { 如果 (IS_POSIXACL(inode) && (模式 & S_IRWXG)) { int 错误 = check_acl(inode,mask); 如果(错误!= -EAGAIN) 返回错误; } ...
附注:当您使用时sh /file1
,仅有的+r 权限适用于 file1,因为您没有要求内核执行该文件 – 您仅执行sh
。