Сообщить об ошибке.

ACL (Access Control List) в Linux

Система управления доступом к файлам и директориям в Linux

Содержание:

ACL (Access Control List) - это расширенная система управления доступом к файлам и директориям в Linux, которая дополняет стандартные права доступа (rwx для владельца, группы и других).

Зачем нужен ACL?

Стандартные права доступа в Linux ограничены тремя категориями:

  • Владелец (owner)
  • Группа (group)
  • Остальные (others)

Но что, если нужно дать доступ конкретному пользователю или конкретной группе, не входящей в основную группу файла? Тут и пригодятся ACL.

Когда использовать ACL?

Примеры:

  • Дать пользователю alice доступ на чтение к файлу, владельцем которого является bob.
  • Разрешить группе developers писать в директорию, принадлежащую admin.
  • Ограничить доступ узко определённым пользователям, не меняя основного владельца.

Ограничения и нюансы

  1. ACL не работают на NFS без настройки (нужно noacl или acl в опциях экспорта).
  2. Резервное копирование: используй tar --acls, иначе ACL потеряются.
  3. Mask может "обрезать" права - всегда проверяй getfacl.
  4. Default ACL не наследуются при копировании, только при создании.

Подсказки и лучшие практики

  • Используй ACL, когда стандартных прав недостаточно.
  • Не злоупотребляй - сложные ACL трудно поддерживать.
  • Используй default ACL для общих директорий.
  • Всегда проверяй результат через getfacl.
  • Документируй ACL, если они критичны.

Поддержка ACL в файловой системе

ACL работают только на файловых системах, которые их поддерживают, например:

  • ext2, ext3, ext4
  • XFS
  • Btrfs
  • reiserfs
  • и некоторые другие

Проверка поддержки ACL

mount | grep $(df . | tail -1 | awk '{print $1}')

Или:

tune2fs -l /dev/sda1 | grep "Default mount options"

Если в выводе есть acl, значит поддержка включена.

Если нет - нужно включить.

Как включить ACL?

  1. В /etc/fstab добавить опцию acl для нужной файловой системы:
/dev/sda1  /home  ext4  defaults,acl  0  2
  1. Перемонтировать:
sudo mount -o remount,acl /home
  1. Или смонтировать с опцией:
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/setfacl
  • attr - пакет с getfattr/setfattr

Примеры использования

КомандаНазначение
getfacl <файл>Показать ACL
setfacl <опции> <файл>Установить/изменить ACL
setfacl -b <файл>Удалить все ACL

Просмотр текущих 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 - модифицировать ACL
  • u: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

Удалить ACL для пользователя bob

setfacl -x u:bob file.txt
  • -x - удалить конкретный ACL

Удалить все расширенные ACL

setfacl -b file.txt

Рекурсивное применение ACL к директории и всем файлам

setfacl -R -m u:bob:rw /home/project/
  • -R - рекурсивно

Будь осторожен: это может повлиять на много файлов.

Установить ACL по умолчанию (для новых файлов в директории)

Иногда нужно, чтобы новые файлы в директории автоматически наследовали 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?

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--.

Как явно задать mask?

setfacl -m m::rx file.txt
  • m::rx - установить mask в rx

Теперь никто (кроме владельца) не сможет писать, даже если ACL разрешает w.

Полезные флаги setfacl

ФлагОписание
-mModify - изменить ACL
-xRemove - удалить конкретный ACL
-bRemove all - удалить все расширенные ACL
-RRecursive - применить рекурсивно
-dDefault - установить default ACL
-kRemove default ACL
--testПротестировать, не применяя

Настройка общей директории с ACL

Допустим, нужно настроить общую директорию /var/www/project для:

  • Группы developers - полный доступ
  • Пользователя manager - только чтение
  • Новые файлы должны автоматически давать доступ developers

Создай группу и добавь пользователей

sudo 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: владелец и группа - полный доступ, другие - чтение + вход в директорию.

Настройка ACL

Дай группе developers полный доступ через ACL

sudo setfacl -R -m g:developers:rwx /var/www/project

Дай пользователю manager только чтение

sudo setfacl -R -m u:manager:rx /var/www/project

Установи default ACL для новых файлов

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 имеет rwx
  • Пользователь manager имеет r-x
  • Default ACL применился

Регулярная проверка и аудит

Найди все файлы с ACL

find /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:"

Экспорт ACL для бэкапа

getfacl -R /var/www/project > /backup/acl_backup.txt

Восстановление ACL из бэкапа

setfacl --restore=/backup/acl_backup.txt

Интеграция с резервным копированием

При использовании tar - включи ACL:

tar --acls -cf project.tar /var/www/project

Без --acls права ACL не сохранятся!

Очистка 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/

Полезные команды

ЗадачаКоманда
Посмотреть ACLgetfacl file
Добавить ACLsetfacl -m u:alice:rw file
Удалить ACL для пользователяsetfacl -x u:alice file
Удалить все ACLsetfacl -b file
Рекурсивноsetfacl -R ...
Default ACLsetfacl -d -m g:group:rx dir/
Бэкап ACLgetfacl -R /dir > acl.txt
Восстановитьsetfacl --restore=acl.txt
С tartar --acls -cf backup.tar /dir

Вывод

ACL - мощный инструмент для тонкой настройки доступа в Linux. Он позволяет:

  • Давать доступ отдельным пользователям/группам
  • Автоматизировать права через default ACL
  • Гибко управлять доступом в командных проектах