ACL или Access Control Lists (Списки контроля доступом) в Linux предоставляют еще одну возможность предоставлять разрешения нескольким пользователям и группам для одного и того же файла или каталога. ACL позволяют решить некоторые ограничения других общих инструментов управления разрешениями, в частности:
У файла/каталога может быть только один пользователь-владелец и одна группа-владелец
Не работает наследование разрешений, чтобы разрешения каталога передавались его файлам и подкаталогам
Списки ACL часто применяются к каталогам, чтобы гарантировать, что новые файлы, созданные в каталоге, автоматически получат необходимые разрешения. Для установки ACL применяется команда setfacl:
setfacl [options] operation entity:entityname:permissions file
Она принимает следующие компоненты:
options: с помощью необязательных опций позволяет управлять работой команды setfacl. Распространенные опции:
-d
: устанавливает ACL по умолчанию. Это параметр ACL также наследуется подкаталогами и файлами.
-k
: удаляет список ACL по умолчанию.
-R
: рекурсивно применяет настройки ACL.
ACL по умолчанию предназначен для новых файлов и не влияет на существующие файлы. Все новые файлы получат разрешения, установленные в ACL по умолчанию.
Без опции -d
команда setfacl работает только с существующими файлами. Чтобы убедиться, что все новые файлы получат желаемые настройки ACL,
следует дважды использовать команду setfacl. Сначала с опцией -d
, чтобы был установлен список ACL по умолчанию, а затем с опцией -R
и без опции -d
, чтобы позаботиться о
существующих в данный момент файлах.
operation: устанавливает, что надо сделать: добавить или удалить настройку ACL. Доступны следующие операции:
--set
: используется для установки ACL. Стоит учитывать, что она заменит любой существующий ACL.
-m
: дополняет текущие настройки ACL, без полной замены.
-x
: удаляет существующий ACL.
entity и entity name: тип объекта имя объекта, которые определяют, для кого надо установить ACL. Существует два типа объектов: u для пользователя и g для группы. После указания типа объекта надо указать имя объекта.
permissions: разрешения, которые надо установить с помощью списков управления доступом.
file: имя файла или каталога, к которому надо применить списки ACL.
Пример:
setfacl -m g:users:rwx /somedir
В данном случае для каталога "/somedir" у группы "users" (g:users
) устанавливаются разрешения "rwx", то есть разрешения на чтение, запись и выполнение. И операция -m
говорит, что эту настройку надо добавить к
уже существующим спискам ACL.
Также можно установить ACL сразу для нескольких пользователей/групп:
setfacl -d -m g:users:rwx,g:developers:rx /somedir
Эта команда устанавливает ACL по умолчанию для папки /somedir. Причем группа "users" получает разрешения "rwx", а группа "developers" - "rx"
Для получения информации о списках ACL применяется команда getfacl, которой передается имя файла/каталога:
getfacl file
Например, создадим в корневой папке файловой системы новый каталог "test":
eugene@Eugene:~$ sudo mkdir /test
Посмотрим на списки ACL для этого каталога:
eugene@Eugene:~$ getfacl /test getfacl: Removing leading '/' from absolute path names # file: test # owner: root # group: root user::rwx group::r-x other::r-x eugene@Eugene:~$
Здесь мы видим, что для пользователя-владельца установлены разрешения rwx
, а для группы-владельца и всех остальных - r-x
Перейдем в этот каталог и попробуем создать в нем новый файл "hello.txt":
eugene@Eugene:~$ cd /test eugene@Eugene:/test$ touch hello.txt touch: cannot touch 'hello.txt': Permission denied eugene@Eugene:/test$
Как мы видим, команда touch, которая должна создавать файл, не создает его без команды sudo
Теперь установим списки контроля доступом для этого каталога. Например, в моем случае среди дополнительных групп, к которым принадлежит текущий пользователь, есть группа "users":
eugene@Eugene:/test$ groups eugene adm cdrom sudo dip plugdev users lpadmin eugene@Eugene:/test$
Установим для группы "users" для папки "/test" разрешения "rwx":
eugene@Eugene:/test$ sudo setfacl -m g:users:rwx /test [sudo] password for eugene: eugene@Eugene:/test$
После этого заново проверим списки контроля доступа к папке с помощью команды getfacl:
eugene@Eugene:/test$ getfacl /test getfacl: Removing leading '/' from absolute path names # file: test # owner: root # group: root user::rwx group::r-x group:users:rwx mask::rwx other::r-x eugene@Eugene:/test$
Итак, мы видим, что в выводе команды появился новый пункт - group:users:rwx
, который указывает на разрешения для группы users.
И после этого пользователи из группы "users" смогут изменять содержимое каталога, например, создать текстовый файл, без команды sudo:
eugene@Eugene:/test$ touch hello1.txt eugene@Eugene:/test$
Попробуем получить ACL для созданного файла:
eugene@Eugene:/test$ getfacl hello1.txt # file: hello1.txt # owner: eugene # group: eugene user::rw- group::rw- other::r--
Мы видим, что для файла hello1.txt действуют списки доступа, установленные для папки /test. Теперь изменим их:
eugene@Eugene:/test$ sudo setfacl -d -m g:users:rwx /test
Параметр -d
устанавливает список доступа ACL по умолчанию для всех новых файлов и каталогов на основе ACL, установленного для каталога /test. Например, создадим новый файл -
"hello2.txt" и проверим его ACL:
eugene@Eugene:/test$ touch hello2.txt eugene@Eugene:/test$ getfacl hello2.txt # file: hello2.txt # owner: eugene # group: eugene user::rw- group::r-x group:users:rwx mask::rw- other::r-- eugene@Eugene:/test$
И здесь мы видим, что для файла "hello2.txt" уже применяются ACL, установленные для каталога. Проблема только в том, что к первому текстовому файлу - hello1.txt ACL каталога все еще не применяется. И чтобы решить эту проблему, нам надо применить ACL рекурсивно:
sudo setfacl -R -m g:users:rwx /test