Почему алгоритм проверки доступа от «man acl» не соответствует фактическому разграничению прав?

228
magrif

В 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»

2

1 ответ на вопрос

2
grawity

В этом случае, поскольку 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;  если (вероятно (uid_eq (current_fsuid (), inode-> i_uid))) ... еще { if (IS_POSIXACL (inode) && (mode & S_IRWXG)) { int error = check_acl (inode, mask); если (ошибка! = -EAGAIN) ошибка возврата; } ... 

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

Существует ли интерфейс C для проверки фактических прав доступа к ресурсу FS для пользователя (включая ACL)? magrif 5 лет назад 0
@magrif: есть системный вызов [access ()] (http://man7.org/linux/man-pages/man2/access.2.html), чтобы проверить, есть ли у вас конкретные действующие права - он учитывает разрешения, ACL, root привилегия и CAP_DAC_OVERRIDE. (Я не знаю, включает ли он LSM, такой как SELinux, но это так и должно быть.) grawity 5 лет назад 1
exist some like access(user, resurce), i.e. not for calling process? (sudo -u [ -x /path/to/res ] don't want use). magrif 5 лет назад 0
Если вы делаете это в C и имеете root, то вы можете использовать `setfsuid ()` и `initgroups ()` перед проверкой разрешений, а затем вернуться обратно. Но помните, что доступ к файлу _can_ зависит от различных факторов среды. Даже `[-x путь]` на самом деле вызывает access () за кулисами. grawity 5 лет назад 1

Похожие вопросы