Назад | Перейти на главную страницу

Поведение Linux ACL: настройки маски изменяют вывод ls, но не фактические разрешения

Возможно, сейчас время ночи, но меня это озадачивает. Представьте себе следующее.

[root@node1 acltest]# getfacl foo/
# file: foo
# owner: root
# group: testuser
user::rwx
group::r-x
other::---

[root@node1 acltest]# ls -la .
total 24
drwxr-xr-x  3 root root     4096 Feb  9 21:53 .
drwxr-xr-x 25 root root     4096 Feb  9 21:54 ..
drwxr-x---  2 root testuser 4096 Feb  9 21:53 foo
[root@node1 acltest]# setfacl -m m::rwx foo
[root@node1 acltest]# getfacl foo/
# file: foo
# owner: root
# group: testuser
user::rwx
group::r-x
mask::rwx
other::---

[root@node1 acltest]# ls -la .
total 24
drwxr-xr-x   3 root root     4096 Feb  9 21:53 .
drwxr-xr-x  25 root root     4096 Feb  9 21:54 ..
drwxrwx---+  2 root testuser 4096 Feb  9 21:53 foo
[root@node1 acltest]# su - testuser
[testuser@node1 ~]$ cd /acltest/foo/
[testuser@node1 foo]$ ls -la .
total 16
drwxrwx---+ 2 root testuser 4096 Feb  9 21:53 .
drwxr-xr-x  3 root root     4096 Feb  9 21:53 ..
[testuser@node1 foo]$ touch bar
touch: cannot touch `bar': Permission denied

На словах: создаю каталог foo, с режимом 0750, root как владелец и testuser как группа. (testuser это частная группа testuser, но это не имеет значения.)

В getfacl команда правильно не показывает ACL в этом каталоге и еще нет маски. Маска будет установлена ​​в соответствии с разрешениями группы, если я сейчас добавлю именованную группу или пользователя.

Если я явно установил маску на rwx теперь разрешения группы, как показано ls тоже измениться. Я знаю, что бывает наоборот (маска меняется при изменении разрешений группы), но это кажется загадочным.

Тем более загадочно, потому что getfacl вывод делает не показать разрешения группы как rwx но - как сказано - ls делает.

Какой из них правильный? Судя по всему, на выходе getfacl правильно, потому что testuser не могу написать foo. Как и ожидалось, кстати, потому что я не предоставил testuser сгруппируйте любые разрешения для этого.

Это продолжается. Я не могу допустить testuser права записи группы на foo просто используя chmod. Я должен явно установить ACL, используя setfacl -m g:testuser:rwx foo позволять testuser наконец прикоснуться foo/bar.

Может ли кто-нибудь объяснить причину разницы в результатах getfacl и ls? Я знаю, что может быть сложно совместить обычные разрешения с ACL, но это кажется совершенно неправильным. (Хотя я ожидаю, что упущу что-то очевидное;))

Я уже видел Почему chmod (1) в группе влияет на маску ACL?

Со страницы man (5) acl

    ACL_MASK        The ACL_MASK entry denotes the maximum access
                       rights that can be granted by entries of type
                       ACL_USER, ACL_GROUP_OBJ, or ACL_GROUP.

и позже:

  1. иначе, если эффективный идентификатор группы или любой из дополнительных идентификаторов группы процесса соответствует группе файлов или квалификатору любой записи типа ACL_GROUP, тогда
          if the ACL contains an ACL_MASK entry, then

              if  the ACL_MASK entry and any of the matching ACL_GROUP_OBJ
              or ACL_GROUP  entries  contain  the  requested  permissions,
              access is granted,

              else access is denied.

Это означает, что rwx ЖЕСТЯНАЯ БАНКА должен быть предоставлен в каталоге, но биты chmod должны согласиться с этим.

Я хотел бы добавить, что когда ACL используются для объекта, разрешения, перечисленные с помощью ls -l, немного отличаются.

Согласно man ACL (5):

СООТВЕТСТВИЕ МЕЖДУ ВХОДАМИ ACL И БИТАМИ РАЗРЕШЕНИЯ ФАЙЛОВ

Полномочия, определенные списками ACL, являются надмножеством разрешений, определенных битами разрешений файла.

Существует соответствие между владельцем файла, группой и другими разрешениями и конкретными записями ACL: разрешения владельца соответствуют разрешениям записи ACL_USER_OBJ. Если ACL имеет запись ACL_MASK, разрешения группы соответствуют разрешениям записи ACL_MASK. В противном случае, если ACL не имеет записи ACL_MASK, разрешения группы соответствуют разрешениям записи ACL_GROUP_OBJ. Остальные разрешения соответствуют разрешениям записи ACL_OTHER_OBJ.

Поэтому при использовании ACL вы должны рассматривать раздел групповых разрешений в ls -l output как маску ACL.