Списки контроля доступом ACL

Последнее обновление: 16.03.2024

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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850