2

В 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

Почему запись ACL_USER для пользователя 'test1' не запрещает доступ для test1?

PS диск установлен с «ACL»

1 ответ1

2

В этом случае, поскольку ACL_MASK вообще не содержит битов (и, следовательно, ACL не может предоставить никаких разрешений), ядро Linux полностью пропускает проверку ACL. Операция сводится к проверке "других" битов разрешения (которые разрешают доступ).

Это может быть ошибка, которая была введена в 2004 году при переписывании "универсальной поддержки ACL" (commit 42017c2e в tglx/history, dc4ceab7 в унифицированном). Вы можете увидеть это в функции acl_permission_check () в fs/namei.c (обратите внимание, что переменная 'mask' относится не к ACL_MASK, а к нужным битам доступа):

static int acl_permission_check(struct inode *inode, int mask)
{
    unsigned int mode = inode->i_mode;

    if (likely(uid_eq(current_fsuid(), inode->i_uid)))
        ...
    else {
        if (IS_POSIXACL(inode) && (mode & S_IRWXG)) {
            int error = check_acl(inode, mask);
            if (error != -EAGAIN)
                return error;
        }
        ...

Примечание: когда вы используете sh /file1 , только разрешение +r применяется к file1, потому что вы не просите ядро выполнить файл - вы выполняете только sh .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .