ACL (Access Control List) - это расширенная система управления доступом к файлам и директориям в Linux, которая дополняет стандартные права доступа (rwx для владельца, группы и других).
Стандартные права доступа в Linux ограничены тремя категориями:
Но что, если нужно дать доступ конкретному пользователю или конкретной группе, не входящей в основную группу файла? Тут и пригодятся ACL.
Примеры:
alice доступ на чтение к файлу, владельцем которого является bob.developers писать в директорию, принадлежащую admin.noacl или acl в опциях экспорта).tar --acls, иначе ACL потеряются.getfacl.default ACL для общих директорий.getfacl.ACL работают только на файловых системах, которые их поддерживают, например:
Проверка поддержки ACL
mount | grep $(df . | tail -1 | awk '{print $1}')
Или:
tune2fs -l /dev/sda1 | grep "Default mount options"
Если в выводе есть acl, значит поддержка включена.
Если нет - нужно включить.
/etc/fstab добавить опцию acl для нужной файловой системы:/dev/sda1 /home ext4 defaults,acl 0 2
sudo mount -o remount,acl /home
sudo mount -o acl /dev/sda1 /mnt
На некоторых минимальных системах нет getfattr, setfattr, getfacl, setfacl.
Установка Ubuntu/Debian:
sudo apt update && sudo apt install acl attr -y
Установка CentOS/RHEL/Rocky:
sudo yum install acl attr -y # или sudo dnf install acl attr -y
acl - пакет с getfacl/setfaclattr - пакет с getfattr/setfattr| Команда | Назначение |
|---|---|
getfacl <файл> | Показать ACL |
setfacl <опции> <файл> | Установить/изменить ACL |
setfacl -b <файл> | Удалить все ACL |
getfacl file.txt
Вывод:
# file: file.txt
# owner: alice
# group: developers
user::rw-
group::r--
other::r--
Это стандартные права без расширенных ACL.
bob доступ на чтение и записьsetfacl -m u:bob:rw file.txt
-m - модифицировать ACLu:bob:rw - пользователь bob, права rwПроверим:
getfacl file.txt
Вывод:
# file: file.txt # owner: alice # group: developers user::rw- user:bob:rw- <= новый ACL group::r-- mask::rw- other::r--
Обрати внимание: появился
mask- он ограничивает максимальные права для всех, кроме владельца.
testers доступ на выполнение (например, скрипта)setfacl -m g:testers:rx script.sh
bobsetfacl -x u:bob file.txt
-x - удалить конкретный ACLsetfacl -b file.txt
setfacl -R -m u:bob:rw /home/project/
-R - рекурсивноБудь осторожен: это может повлиять на много файлов.
Иногда нужно, чтобы новые файлы в директории автоматически наследовали ACL.
setfacl -d -m u:bob:rw /home/shared/
-d - установить default ACL/home/shared/ будут иметь ACL для bobПример:
# Создаём default ACL setfacl -d -m u:alice:rwx /shared/ # Теперь при создании нового файла: touch /shared/newfile.txt # У него автоматически будет: getfacl /shared/newfile.txt # user:alice:rwx
Default ACL работает только в каталогах и только для новых файлов.
Mask - это максимальные права, которые могут быть у пользователей и групп (кроме владельца).
Пример:
setfacl -m u:bob:rwx,g:devs:rw file.txt
После этого mask автоматически установится в rwx, если не указан явно.
Если потом сделаешь:
setfacl -m g:devs:rwx file.txt
То mask станет rwx.
Но если потом сделаешь:
setfacl -m u:bob:--- file.txt
То mask не изменится, но если потом добавишь пользователя с rwx, mask может пересчитаться.
Mask ограничивает реальные права!Даже если у пользователя
bobстоитrwx, ноmask-r--, то реально он получит толькоr--.
setfacl -m m::rx file.txt
m::rx - установить mask в rxТеперь никто (кроме владельца) не сможет писать, даже если ACL разрешает w.
setfacl| Флаг | Описание |
|---|---|
-m | Modify - изменить ACL |
-x | Remove - удалить конкретный ACL |
-b | Remove all - удалить все расширенные ACL |
-R | Recursive - применить рекурсивно |
-d | Default - установить default ACL |
-k | Remove default ACL |
--test | Протестировать, не применяя |
Допустим, нужно настроить общую директорию /var/www/project для:
developers - полный доступmanager - только чтениеdeveloperssudo groupadd developers sudo usermod -aG developers alice sudo usermod -aG developers bob sudo usermod -aG developers devops
sudo mkdir -p /var/www/project sudo chown -R root:developers /var/www/project sudo chmod -R 775 /var/www/project
775: владелец и группа - полный доступ, другие - чтение + вход в директорию.
developers полный доступ через ACLsudo setfacl -R -m g:developers:rwx /var/www/project
manager только чтениеsudo setfacl -R -m u:manager:rx /var/www/project
sudo setfacl -d -m g:developers:rwx /var/www/project sudo setfacl -d -m u:manager:rx /var/www/project
Теперь все новые файлы будут автоматически иметь эти права.
getfacl /var/www/project
Ожидаемый вывод (пример):
# file: var/www/project # owner: root # group: developers user::rwx user:manager:r-x group::rwx group:developers:rwx mask::rwx other::r-x default:user::rwx default:user:manager:r-x default:group::rwx default:group:developers:rwx default:mask::rwx default:other::r-x
sudo -u alice touch /var/www/project/new_file.txt getfacl /var/www/project/new_file.txt
Убедись, что:
developers имеет rwxmanager имеет r-xfind /var/www/project -exec getfacl {} \; 2>/dev/null | grep -q "user:" && echo "ACL найдены" # Или просто: find /var/www/project -exec getfacl {} \; 2>/dev/null | grep -A2 -B2 "user:"
getfacl -R /var/www/project > /backup/acl_backup.txt
setfacl --restore=/backup/acl_backup.txt
При использовании tar - включи ACL:
tar --acls -cf project.tar /var/www/project
Без
--aclsправа ACL не сохранятся!
Удалить все ACL у файла/директории:
setfacl -b /var/www/project
Удалить только default ACL:
setfacl -k /var/www/project
# Посмотреть ACL getfacl file.txt # Дать пользователю права setfacl -m u:alice:rw file.txt # Дать группе права setfacl -m g:devs:rwx dir/ # Удалить ACL для пользователя setfacl -x u:alice file.txt # Удалить все ACL setfacl -b file.txt # Рекурсивно setfacl -R -m u:bob:rwx /dir/ # Default ACL (для новых файлов) setfacl -d -m g:devs:rw /shared/ # Удалить default ACL setfacl -k /shared/
| Задача | Команда |
|---|---|
| Посмотреть ACL | getfacl file |
| Добавить ACL | setfacl -m u:alice:rw file |
| Удалить ACL для пользователя | setfacl -x u:alice file |
| Удалить все ACL | setfacl -b file |
| Рекурсивно | setfacl -R ... |
| Default ACL | setfacl -d -m g:group:rx dir/ |
| Бэкап ACL | getfacl -R /dir > acl.txt |
| Восстановить | setfacl --restore=acl.txt |
С tar | tar --acls -cf backup.tar /dir |
ACL - мощный инструмент для тонкой настройки доступа в Linux. Он позволяет: