Access Control Lists (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи 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:пользователь:права" <file/dir>

Задать права группы (в качестве группа можно использовать имя группы или её ID):

# setfacl -m "g:группа:права" <file/dir>

Задать права для остальных:

# setfacl -m "other:права" <file/dir>

Настроить наследование новыми файлами и каталогами записей ACL родительского каталога (не относится к файлам/каталогам, которые копируются в каталог):

# setfacl -dm "запись_ACL" <dir>

Удалить определённую запись ACL:

# setfacl -x "запись_ACL" <file/dir>

Удалить записи по умолчанию:

# setfacl -k <file/dir>

Удалить все записи ACL:

# setfacl -b <file/dir>

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:

# getfacl <file/dir>

Примеры

Установить все права доступа к файлу abc для пользователя johnny:

# setfacl -m "u:johny:rwx" abc

Проверка:

# getfacl abc
# file: abc
# owner: someone
# group: someone
user::rw-
user:johny:rwx
group::r--
mask::rwx
other::r--

Измененить права для пользователя johnny:

# setfacl -m "u:johny:r-x" abc

Проверка:

# getfacl abc
# file: abc
# owner: someone
# group: someone
user::rw-
user:johny:r-x
group::r--
mask::r-x
other::r--

Удалить все записи ACL:

# setfacl -b abc

Проверка:

# getfacl abc
# file: abc
# owner: someone
# group: someone
user::rw-
group::r--
other::r--

Вывод команды ls

Символ + (плюс) после прав доступа Unix в выводе команды ls -l указывает на использование ACL:

$ ls -l /dev/audio
crw-rw----+ 1 root audio 14, 4 nov.   9 12:49 /dev/audio
$ getfacl /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 то безопаснее будет удалить доступ для остальных пользователей:

# chmod o-rx /home/geoffrey

Проверим изменения с помощью getfacl:

$ getfacl /home/geoffrey
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

Смотрите также