Возможно, сейчас время ночи, но меня это озадачивает. Представьте себе следующее.
[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.
и позже:
- иначе, если эффективный идентификатор группы или любой из дополнительных идентификаторов группы процесса соответствует группе файлов или квалификатору любой записи типа 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.