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 — назначается только каталогу, при этом создаваемые файлы в этом каталоге будут наследовать такие права.




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




Давайте для начала создадим трёх новых пользователей в системе. Так как это административное действие то в Ubuntu я использую sudo, а в Debian переключусь на пользователя root:




alex@ubu:~$ sudo useradd -m -s /bin/bash admin
alex@ubu:~$ sudo useradd -m -s /bin/bash user1
alex@ubu:~$ sudo useradd -m -s /bin/bash user2

alex@deb:~$ su -
Пароль:
root@deb:~# useradd -m -s /bin/bash admin
root@deb:~# useradd -m -s /bin/bash user1
root@deb:~# useradd -m -s /bin/bash user2




Про создание пользователей я писал в этой статье.




Установим пользователям пароли:




alex@ubu:~$ sudo passwd admin
New password:
Retype new password:
passwd: password updated successfully

alex@ubu:~$ sudo passwd user1
New password:
Retype new password:
passwd: password updated successfully

alex@ubu:~$ sudo passwd user2
New password:
Retype new password:
passwd: password updated successfully


root@deb:~# passwd admin
Новый пароль:
Повторите ввод нового пароля:
passwd: пароль успешно обновлён

root@deb:~# passwd user1
Новый пароль:
Повторите ввод нового пароля:
passwd: пароль успешно обновлён

root@deb:~# passwd user2
Новый пароль:
Повторите ввод нового пароля:
passwd: пароль успешно обновлён




Дальше все примеры для Ubuntu я показывать не буду, там всё аналогично. Единственное не забывайте при административных действиях использовать sudo перед командами.




Под пользователем user1 создадим каталог test и в нем файл file1.txt:




root@deb:~# su - user1

user1@deb:~$ mkdir test

user1@deb:~$ touch test/file1.txt

user1@deb:~$ exit
выход

root@deb:~#




На этом подготовка системы закончена, мы сделали трёх пользователей: admin, user1 и user2. И в домашнем каталоге пользователя user1 создали каталог test в котором создали файл file1.txt.




Работа с ACL в Linux




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




# apt install acl




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




root@deb:~# getfacl /home/user1/test/file1.txt
getfacl: Removing leading '/' from absolute path names
# file: home/user1/test/file1.txt
# owner: user1
# group: user1
user::rw-
group::r--
other::r--




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




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




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




Вот примерное использование setfacl:




# setfacl -m u:пользователь:права_доступа файл
# setfacl -m g:группа:права_доступа файл




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




root@deb:~# setfacl -m u:admin:rw-,u:user2:r-- /home/user1/test/file1.txt

root@deb:~# getfacl /home/user1/test/file1.txt
getfacl: Removing leading '/' from absolute path names
# file: home/user1/test/file1.txt
# owner: user1
# group: user1
user::rw-
user:admin:rw-
user:user2:r--
group::r--
mask::rw-
other::r--




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




root@deb:~# ls -l /home/user1/test/file1.txt
-rw-rw-r--+ 1 user1 user1 0 янв 20 14:38 /home/user1/test/file1.txt




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




setfacl -m g:groupname:rwx
setfacl -m o:rwx




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




root@deb:~# setfacl -x u:user2 /home/user1/test/file1.txt

root@deb:~# getfacl /home/user1/test/file1.txt
getfacl: Removing leading '/' from absolute path names
# file: home/user1/test/file1.txt
# owner: user1
# group: user1
user::rw-
user:admin:rw-
group::r--
mask::rw-
other::r--




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




setfacl -x g:groupname




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




root@deb:~# setfacl -b /home/user1/test/file1.txt

root@deb:~# getfacl /home/user1/test/file1.txt
getfacl: Removing leading '/' from absolute path names
# file: home/user1/test/file1.txt
# owner: user1
# group: user1
user::rw-
group::r--
other::r--




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




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




root@deb:~# setfacl -d -m u::rwx,g::rw-,o::r,u:admin:rw /home/user1/test/

root@deb:~# getfacl /home/user1/test/
getfacl: Removing leading '/' from absolute path names
# file: home/user1/test/
# 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, которые определяют права по умолчанию для всех новых файлов в этом каталоге.




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




root@deb:~# touch /home/user1/test/file2.txt

root@deb:~# getfacl /home/user1/test/file2.txt
getfacl: Removing leading '/' from absolute path names
# file: home/user1/test/file2.txt
# owner: root
# group: root
user::rw-
user:admin:rw-
group::rw-
mask::rw-
other::r--




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




Маска ACL




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




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




root@deb:~# touch /home/user1/test/file2.txt

root@deb:~# setfacl -m m:r /home/user1/test/file2.txt

root@deb:~# getfacl /home/user1/test/file2.txt
getfacl: Removing leading '/' from absolute path names
# file: home/user1/test/file2.txt
# owner: root
# group: root
user::rw-
user:admin:rw-                  #effective:r--
group::rw-                      #effective:r--
mask::r--
other::r--




По значению effective:r-- мы видим что права изменились.




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




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




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




setfacl -R -m u:пользователь:права_доступа каталог
setfacl -R -b каталог


















2022-01-21T10:26:29
Администрирование Linux