Права ACL в Linux

В этой статье разберём расширенные права доступа к файлам в Linux, которые называются Access Control List / списки контроля доступа (ACL).

О системе прав ACL в Linux

В простых случаях хватает простых прав, про это я писал в статье [Стандартные права доступа в Linux]. Но может возникнуть ситуация, что к файлу с правами: rw-r--r-- user1 user1, нужно дать доступ пользователю admin с правами rw-, и пользователю user2 c правами r--. Стандартная система прав здесь не поможет. Для решения подобной задачи применяют ACL (Access Control List / списки контроля доступа).

ACL бывает 2-х типов:

  • права доступа к файлу — определяет доступ к файлу или каталогу;
  • ACL default — назначается только каталогу, при этом создаваемые файлы в этом каталоге будут наследовать права каталога.

Подготовка системы к практике

Я заранее создал 3 пользователей admin, user1, user2. Если не помните как создавать пользователей, то об этом я писал в статье [Пользователи в Linux].

В корне создадим каталог test-dir и в нем файл file1.txt:

$ sudo mkdir /test-dir/
$ sudo chown user1:user1 /test-dir/
$ sudo -u user1 touch /test-dir/test.txt

$ ls -ld /test-dir/
drwxr-xr-x 2 user1 user1 4096 апр 16 17:43 /test-dir/

$ ls -l /test-dir/
итого 0
-rw-r--r-- 1 user1 user1 0 апр 16 17:43 test.txt

Установка acl

Для начала установим систему acl, например так:

$ sudo apt install acl

Просмотр прав acl

Чтобы посмотреть acl права на файл или каталог используют команду getfacl (её может выполнить любой пользователь, главное чтобы были права на чтение каталога в котором лежит файл).

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
group::r--
other::r--

Для данного файла acl пока не настроен. Поэтому мы видим стандартные права, где владелец имеет права на чтение и запись, а группа и все остальные только на чтение.

Установка прав acl для отдельных пользователей

Для установки acl прав используем команду setfacl (для выполнения этой команды уже нужны root права). Рассмотрим синтаксис команды для установки прав:

setfacl -m u:username:rwx filename
setfacl -m g:groupname:rwx filename
  • опция -m используется когда нужно модифицировать права;
  • дальше, если мы устанавливаем права для пользователя, то ставим символ u, для группы будем использовать символ g;
  • затем, после двоеточия, имя пользователя;
  • дальше, права доступа для этого пользователя;
  • и наконец указываем имя файла.

Вот как решается описанная в самом начале задача, используя acl:

$ sudo setfacl -m u:admin:rw-,u:user2:r-- /test-dir/test.txt

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
user:admin:rw-
user:user2:r--
group::r--
mask::rw-
other::r--

При этом если мы посмотрим на права командой ls -l, то заметим знак +, который и указывает что файл имеет дополнительные acl права:

$ ls -l /test-dir/test.txt
-rw-rw-r--+ 1 user1 user1 0 апр 16 17:43 /test-dir/test.txt

Установка прав acl для группы и всех остальных

Для группы владельцев и всех остальных также можно устанавливать acl права таким образом:

$ sudo setfacl -m g:users:rw /test-dir/test.txt

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
user:admin:rw-
user:user2:r--
group::r--
group:users:rw-
mask::rw-
other::r--

$ sudo setfacl -m o:--- /test-dir/test.txt

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
user:admin:rw-
user:user2:r--
group::r--
group:users:rw-
mask::rw-
other::---

Удаление пользователей или групп из прав acl

Для того чтобы удалить пользователя или группу из acl нужно использовать команду setfacl с опцией -x, например вот так:

$ sudo setfacl -x u:user2 /test-dir/test.txt

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
user:admin:rw-
group::r--
group:users:rw-
mask::rw-
other::---

Как видим у пользователя user2 не осталось acl прав к этому файлу.

Таким же образом можем удалить группу:

$ sudo setfacl -x g:users /test-dir/test.txt

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
user:admin:rw-
group::r--
mask::rw-
other::---

Для того чтобы удалить все acl права с файла используем команду setfacl с опцией -b:

$ sudo setfacl -b /test-dir/test.txt

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
group::r--
other::---

Наследование ACL

Теперь разберемся с acl default. Устанавливаются такие права только на каталог. Для установки таких прав используется команда setfacl с опцией -d:

$ sudo setfacl -d -m u::rwx,g::rw-,o::r,u:admin:rw /test-dir/

$ getfacl /test-dir/
getfacl: Removing leading '/' from absolute path names
# file: test-dir/
# owner: user1
# group: user1
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:admin:rw-
default:group::rw-
default:mask::rw-
default:other::r--

Добавились новые поля default, которые определяют права по умолчанию для всех новых файлов в этом каталоге.

  • default:user::rwx — владелец файла должен получить права rwx (но система сама может их обрезать по маске);
  • default:user:admin:rw- — ко всем создаваемым файлам будет иметь доступ пользователь admin с правами rw, и не важно кто будет создавать файлы;
  • default:group::rw- — группа владельцев получит права rw.
  • default:other::r-- — все остальные получать права r.
  • default:mask::rw- — максимальные права это rw, всё что выше будет урезано.

Теперь, для проверки, создадим новый файл и посмотрим на его права:

$ sudo touch /test-dir/test2.txt

$ getfacl /test-dir/test2.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test2.txt
# owner: root
# group: root
user::rw-
user:admin:rw-
group::rw-
mask::rw-
other::r--

$ ls -l /test-dir/test2.txt
-rw-rw-r--+ 1 root root 0 апр 16 18:04 /test-dir/test2.txt

В этом примере я создал файл из под пользователя root, но пользователь admin получил к нему доступ, так как он указан в правах default этого каталога.

Маска ACL

Кроме прав доступа и прав по умолчанию в acl присутствуем маска. Она говорит о максимально возможных назначенных правах для пользователей. Она вычисляется автоматически при добавлении пользователя в acl. Т.е. мы можем одному пользователю дать права rw-, второму r--, маска при этом станет rw-.

Маску можно изменить командой setfacl -m m:права_доступа файл например:

$ sudo setfacl -m m:r /test-dir/test2.txt

$ getfacl /test-dir/test2.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test2.txt
# owner: root
# group: root
user::rw-
user:admin:rw-                  #effective:r--
group::rw-                      #effective:r--
mask::r--
other::r--

По значению effective:r-- мы видим что права изменились. Использовать это можно, если мы дали различные права на файл разным пользователям, а затем всех решили ограничить.

Рекурсивное назначение прав

Для рекурсивного назначения прав используется опция -R, её же можно использовать при удалении прав:

$ sudo setfacl -R -m u:admin:rw /test-dir/

$ getfacl /test-dir/
getfacl: Removing leading '/' from absolute path names
# file: test-dir/
# owner: user1
# group: user1
user::rwx
user:admin:rw-
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:admin:rw-
default:group::rw-
default:mask::rw-
default:other::r--

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
user:admin:rw-
group::r--
mask::rw-
other::---

А вот пример удаления прав рекурсивно:

$ sudo setfacl -R -b /test-dir/

$ getfacl /test-dir/
getfacl: Removing leading '/' from absolute path names
# file: test-dir
# owner: user1
# group: user1
user::rwx
group::r-x
other::r-x

$ getfacl /test-dir/test.txt
getfacl: Removing leading '/' from absolute path names
# file: test-dir/test.txt
# owner: user1
# group: user1
user::rw-
group::r--
other::---

Если понравилась статья, подпишись на мой канал в VK или Telegram.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности