为什么“man acl”中的访问检查算法与实际的权限区分不一致?

为什么“man acl”中的访问检查算法与实际的权限区分不一致?

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

相关内容