В этой статье разберём расширенные права доступа к файлам в 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.