Зачем ACL
Классические [[file-permissions|rwx]] позволяют задать права для одного владельца, одной группы и всех остальных. Когда нужно "Алисе read+write, Бобу read, всем остальным ничего" - три set'а не хватают.
Решения:
- Создать новую группу с Алисой и Бобом - но Бобу нужен только read; одной группой не выразить
- Дать setgid + общий группа - всё равно одинаковые права в группе
- POSIX ACL - точечно дать права отдельным user/group
ACL - расширение rwx, не замена. Базовые owner/group/other остаются, ACL добавляются сверху.
Где работает
Поддерживается ext4, xfs, btrfs, tmpfs (с RAM>=ядро 6),
zfs. Не работает на FAT/NTFS, на старом vfat. Mount с
acl (на ext часто default), на xfs default включено.
Проверить:
mount | grep ' / ' # ищи acl в опциях (или просто отсутствие noacl)
tune2fs -l /dev/sda1 | grep -i acl
getfacl - чтение
$ getfacl /home/shared/report.pdf
# file: home/shared/report.pdf
# owner: alice
# group: team
user::rw-
user:bob:r--
group::r--
group:auditors:r--
mask::r--
other::---
Расшифровка:
user::rw-- права owner'а (alice)user:bob:r--- именованный user; бит "r"group::r--- права группы (team)group:auditors:r--- именованная groupmask::r--- верхний предел для всех ACL-entry кроме owner и otherother::---- все остальные
Если ls -l показывает + после прав:
-rw-r--r--+ 1 alice team 12K May 2 14:00 report.pdf
это значит "файл имеет ACL".
setfacl - запись
Базовый синтаксис:
setfacl -m u:bob:r-- file
setfacl -m u:bob:rwx,g:auditors:rx file
setfacl -m u:bob:- file # явно "ничего"
setfacl -x u:bob file # удалить ACL для bob
setfacl -b file # сбросить все ACL (оставить базовые rwx)
setfacl --restore=acl-backup.txt # из бэкапа
Опции:
| Опция | Что |
|---|---|
-m | modify - добавить/изменить |
-x | remove конкретные entry |
-b | сбросить все |
-k | удалить default ACL |
-R | recursive |
-d | работать с default ACL (не effective) |
Целевая аудитория записи
| Префикс | Кому |
|---|---|
u:NAME | конкретному пользователю |
g:NAME | конкретной группе |
m:: | mask |
o:: | other |
u:: | owner (то же что chmod u) |
g:: | owning group |
Mask - верхний предел
mask ограничивает эффективные права для всех именованных user/group
и owning-group:
user::rw-
user:bob:rwx ← объявлено rwx
group::rwx
mask::r-- ← но mask только r
other::r--
Bob эффективно может только r--. ls показывает effective:r--
справа от entry. Это не баг, а фича: сделать chmod g-w и
гарантировать, что никакой ACL не даст write.
setfacl автоматически пересчитывает mask:
setfacl -m u:bob:rwx file # mask станет rwx
setfacl -n -m u:bob:rwx file # -n: НЕ пересчитывать mask
Default ACL - наследование
Только на директориях. Default ACL применяется к новым файлам и поддиректориям внутри:
setfacl -d -m u:bob:rx /home/shared
setfacl -d -m g:team:rwx /home/shared
Теперь любой новый файл в /home/shared создастся с этими ACL
плюс обычная uid/gid логика. Существующие файлы не затрагиваются.
Это главный сценарий ACL в проде: shared-папка для команды, чтобы не возиться с umask, setgid и chown'ом каждый раз.
Скопировать default в effective для всех существующих:
getfacl --default /home/shared > acl.tpl
setfacl --set-file=acl.tpl -R /home/shared
Полный пример: shared team-folder
# Создать
sudo mkdir /srv/team-share
sudo chgrp team /srv/team-share
sudo chmod g+s /srv/team-share # setgid - наследовать group
# Default ACL: команда rwx, аудиторы только r
sudo setfacl -d -m g:team:rwx /srv/team-share
sudo setfacl -d -m g:auditors:rx /srv/team-share
sudo setfacl -d -m o::- /srv/team-share
# Существующие файлы тоже привести
sudo setfacl -R -m g:team:rwx,g:auditors:rx,o::- /srv/team-share
Теперь любой член team может писать в любой файл, любой auditor
может читать, "other" не видят ничего.
ACL и cp / tar / rsync
Не все утилиты переносят ACL по дефолту:
cp- сохраняет при-p(preserve mode includes ACL)tar- нужен--acls(на старых GNU tar ---aclsподдерживается с 1.27)rsync- нужен-A(--acls); добавляет к стандартному-afind ... -exec cp- помни про-p
Backup'ы:
getfacl -R /srv/team-share > acl-backup.txt
# ...
setfacl --restore=acl-backup.txt
ACL vs SELinux/AppArmor
ACL - DAC (Discretionary Access Control): владелец решает. SELinux/AppArmor - MAC: политика системы поверх. Они не заменяют друг друга. Если SELinux запретил - ACL не помогут; если ACL запретили - SELinux не вернёт.
Подробнее в selinux-apparmor и capabilities.
Когда что-то пошло не так
setfacl: Operation not supported- mount безacl(старый ext-mount), либо ФС не поддерживает (vfat, NFSv3 без acl).- chmod "съел" ACL - старая семантика:
chmod g+wменял mask и ACL вместе с group-bit. На новых ядрахchmodчаще трогает только classical bits, но mask может пересчитаться. Smarter:setfacl -m m::rwx. - Default ACL не наследуется на NFS - старые NFS-клиенты не поддерживают ACL. NFSv4 ACL (другой стандарт!) тоже отдельная история.
tarпотерял ACL - не было--acls. Используйbsdtar(libarchive) или--acls --xattrs.- Видно
+но getfacl пуст - бывает при corrupted ACL-blob;setfacl -bи заново.
Альтернативы
- NFSv4 ACL - другой стандарт, более похож на Windows/Solaris
- Richacl - устарело, не вошёл в mainline
- xattr напрямую через [[extended-attributes|setfattr]] - ACL
хранятся именно как xattr
system.posix_acl_*