Sysadminium
В этой статье разберём расширенные права доступа к файлам в Linux, которые называются Access Control List / списки контроля доступа (ACL).
О системе прав ACL в Linux
В этой статье мы познакомились со стандартной системой прав в Linux. Но может возникнуть ситуация, что к файлу с правами: rw-r—r— user1 user1 , нужно дать доступ пользователю admin с правами rw- , и пользователю user2 c правами r— .
Стандартная система прав здесь не поможет. Для решения подобной задачи применяют ACL (Access Control List / списки контроля доступа).
- права доступа к файлу — определяет доступ к файлу или каталогу;
- 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, про установку дополнительных пакетов в систему поговорим позже, просто выполните:
Чтобы посмотреть 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 прав к этому файлу. Таким же образом можем удалить группу:
Для того чтобы удалить все 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 каталог
Access Control Lists (Русский)
Состояние перевода: На этой странице представлен перевод статьи Access Control Lists. Дата последней синхронизации: 10 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
Списки управления доступом (Access Control Lists, ACL) — расширенный, более гибкий механизм прав доступа для файловых систем, разработанный как дополнение к стандартным правам доступа UNIX. ACL позволяет задавать права доступа к объектам на диске для пользователей и групп.
Установка
Пакет acl уже установлен, так как является зависимостью systemd.
Включение ACL
Для использования ACL файловая система должна быть смонтирована с опцией acl . Файл fstab позволяет настроить постоянное монтирование с данной опцией.
В некоторых файловых системах параметр монтирования acl включён по умолчанию. К таким файловым системам относятся Btrfs и Ext2/3/4. Следующая команда позволяет проверить раздел с файловой системой ext* на наличие параметра acl :
# tune2fs -l /dev/sdXY | grep "Default mount options:"
Default mount options: user_xattr acl
Убедитесь, что используемая по умолчанию опция не была переопределена. Об этом будет свидетельствовать параметр noacl в соответствующей строке файла /proc/mounts .
Задать параметры монтирования файловой системы по умолчанию можно командой tune2fs -o параметр раздел , например:
# tune2fs -o acl /dev/sdXY
Это очень удобно при работе с внешними дисками, поскольку такой диск будет монтироваться с опцией acl и на других Linux-машинах. В противном случае придётся редактировать файл /etc/fstab на каждой системе.
- acl используется как опция монтирования по умолчанию при создании файловой системы ext2/3/4. Это настраивается в файле /etc/mke2fs.conf .
- Параметры монтирования по умолчанию в /proc/mounts не указаны.
Использование
Изменение ACL
Для изменения прав ACL используется команда setfacl.
- Флаг —test позволяет вывести изменения прав доступа к файлу/каталогу без их реального применения (т.н. dry-run).
- Флаг -R / —recursive позволяет применять действия рекурсивно.
Задать права пользователя (в качестве пользователь можно использовать имя пользователя или его ID):
# setfacl -m "u:пользователь:права"
Задать права группы (в качестве группа можно использовать имя группы или её ID):
# setfacl -m "g:группа:права"
Задать права для остальных:
# setfacl -m "other:права"
Настроить наследование новыми файлами и каталогами записей ACL родительского каталога (не относится к файлам/каталогам, которые копируются в каталог):
# setfacl -dm «запись_ACL»
Удалить определённую запись ACL:
# setfacl -x "запись_ACL"
Удалить записи по умолчанию:
The factual accuracy of this article or section is disputed.
Reason: Оригинальное замечание об опции —mask (взятое из setfacl(1) ) было признано неточным, но новый вариант также, судя по всему, неверен. Подробности см. по ссылке на обсуждение. (Discuss in Talk:Access Control Lists#ACL mask entry)
Примечание: По умолчанию setfacl вычисляет значение маски ACL, если она не была задана явно флагом —mask . С помощью маски задаются максимальные права, которые могут быть даны пользователю (не владельцу) или группе. Если маска не задаётся явно, то ей присваивается значение прав «группы по умолчанию». Например, предположим, что группа определённого каталога имеет права r-x . Если добавить ACL-пользователя или группу с правами rwx , то эффективными правами этого пользователя/группы применительно к данному каталогу будут r-x . Причина подобного поведения заключается в предотвращении «сюрпризов» при перемещении файлов из системы, не поддерживающей ACL, в систему с ACL.
Просмотр ACL
Вывести права доступа ACL:
Примеры
Установить все права доступа к файлу abc для пользователя johnny :
# file: abc # owner: someone # group: someone user::rw- user:johny:rwx group::r-- mask::rwx other::r--
Измененить права для пользователя johnny :
# file: abc # owner: someone # group: someone user::rw- user:johny:r-x group::r-- mask::r-x other::r--
# file: abc # owner: someone # group: someone user::rw- group::r-- other::r--
Вывод команды ls
Символ + (плюс) после прав доступа Unix в выводе команды ls -l указывает на использование ACL:
crw-rw----+ 1 root audio 14, 4 nov. 9 12:49 /dev/audio
getfacl: Removing leading '/' from absolute path names # file: dev/audio # owner: root # group: audio user::rw- user:solstice:rw- group::rw- mask::rw- other::---
Права на выполнение личных файлов
Ниже описано, как процесс вроде веб-сервера может получить доступ к файлам в домашнем каталоге пользователя без ущерба для безопасности.
Будем считать что веб-сервер работает от пользователя http и получает доступ к домашнему каталогу /home/geoffrey пользователя geoffrey .
Санчала предоставим права на выполнение для пользователя http :
# setfacl -m "u:http:--x" /home/geoffrey
Примечание: Права на исполнение для каталога позволяют процессу просматривать его содержимое.
Поскольку пользователь http теперь имеет доступ к файлам в /home/geoffrey то безопаснее будет удалить доступ для остальных пользователей:
Проверим изменения с помощью getfacl :
getfacl: Removing leading '/' from absolute path names # file: home/geoffrey # owner: geoffrey # group: geoffrey user::rwx user:http:--x group::r-x mask::r-x other::---
Как видно из вывода, other больше не имеют никаких прав, но пользователь http всё ещё может обращаться к файлам.
Если необходимо будет выдать пользователю http права доступа на запись в определённые файлы/каталоги, выполните:
# setfacl -dm "u:http:rwx" /home/geoffrey/project1/cache