acl — Списки управления доступом
ОПИСАНИЕ
Эта страница руководства описывает списки управления доступом POSIX, которые используются для определения более детальных дискреционных прав доступа к файлам и каталогам.
ТИПЫ ACL
Каждый объект можно рассматривать как имеющий связанный с ним ACL, который определяет дискреционный доступ к этому объекту; этот ACL называется ACL доступа. Кроме того, каталог может иметь связанный с ним ACL, который определяет начальный ACL доступа для объектов, создаваемых в этом каталоге; этот ACL называется ACL по умолчанию.
ЗАПИСИ ACL
ACL состоит из набора записей ACL. Запись ACL определяет права доступа к связанному объекту для отдельного пользователя или группы пользователей в виде комбинации разрешений на чтение, запись и поиск/выполнение.
Запись ACL содержит тип тега записи, необязательный квалификатор тега записи и набор разрешений. Мы используем термин «квалификатор» для обозначения квалификатора тега записи ACL.
Квалификатор обозначает идентификатор пользователя или группы для записей с типами тегов ACL_USER или ACL_GROUP соответственно. Записи с типами тегов, отличными от ACL_USER или ACL_GROUP, не имеют определенных квалификаторов.
Определены следующие типы тегов записи:
ACL_USER_OBJ Запись ACL_USER_OBJ обозначает права доступа для владельца файла.
ACL_USER Записи ACL_USER обозначают права доступа для пользователей, идентифицированных квалификатором записи.
ACL_GROUP_OBJ Запись ACL_GROUP_OBJ обозначает права доступа для группы файлов.
ACL_GROUP Записи ACL_GROUP обозначают права доступа для групп, идентифицированных квалификатором записи.
ACL_MASK Запись ACL_MASK обозначает максимальные права доступа, которые могут быть предоставлены записями типа ACL_USER, ACL_GROUP_OBJ или ACL_GROUP.
ACL_OTHER Запись ACL_OTHER обозначает права доступа для процессов, которые не соответствуют ни одной другой записи в ACL.
При выполнении проверки доступа записи ACL_USER_OBJ и ACL_USER проверяются по отношению к эффективному идентификатору пользователя. Эффективный идентификатор группы, а также все дополнительные идентификаторы групп проверяются по отношению к записям ACL_GROUP_OBJ и ACL_GROUP.
ДЕЙСТВИТЕЛЬНЫЕ ACL
Действительный ACL содержит ровно одну запись с каждым из типов тегов ACL_USER_OBJ, ACL_GROUP_OBJ и ACL_OTHER. Записи с типами тегов ACL_USER и ACL_GROUP могут появляться ноль или более раз в ACL. ACL, содержащий записи с типами тегов ACL_USER или ACL_GROUP, должен содержать ровно одну запись с типом тега ACL_MASK. Если ACL не содержит записей с типами тегов ACL_USER или ACL_GROUP, запись ACL_MASK является необязательной.
Все идентификаторы пользователей, используемые в качестве квалификаторов, должны быть уникальными среди всех записей тега ACL_USER, и все идентификаторы групп должны быть уникальными среди всех записей тега ACL_GROUP.
Функция acl_get_file() возвращает ACL с нулевым количеством записей в качестве ACL по умолчанию для каталога, если каталог не связан с ACL по умолчанию. Функция acl_set_file() также принимает ACL с нулевым количеством записей в качестве допустимого ACL по умолчанию для каталогов, что означает, что каталог не должен быть связан с ACL по умолчанию. Это эквивалентно использованию функции acl_delete_def_file().
СООТВЕТСТВИЕ МЕЖДУ ЗАПИСЯМИ ACL И БИТАМИ РАЗРЕШЕНИЙ ФАЙЛА
Разрешения, определяемые ACL, являются расширением разрешений, указанных в битах разрешений файла.
Существует соответствие между разрешениями владельца, группы и других пользователей файла и конкретными записями ACL: разрешения владельца соответствуют разрешениям записи ACL_USER_OBJ. Если в ACL есть запись ACL_MASK, разрешения группы соответствуют разрешениям записи ACL_MASK. В противном случае, если в ACL нет записи ACL_MASK, разрешения группы соответствуют разрешениям записи ACL_GROUP_OBJ. Разрешения других пользователей соответствуют разрешениям записи ACL_OTHER.
Разрешения владельца, группы и других пользователей файла всегда соответствуют разрешениям соответствующей записи ACL. Изменение битов разрешений файла приводит к изменению связанных записей ACL, и изменение этих записей ACL приводит к изменению битов разрешений файла.
СОЗДАНИЕ ОБЪЕКТОВ И ACL ПО УМОЛЧАНИЮ
ACL доступа к файловому объекту инициализируется при создании объекта с помощью функций creat(), mkdir(), mknod(), mkfifo() или open(). Если с каталогом связан ACL по умолчанию, режим, передаваемый в функции, создающие файловые объекты, и ACL по умолчанию каталога используются для определения ACL нового объекта:
Новый объект наследует ACL по умолчанию содержащего каталога в качестве своего ACL доступа.
Записи ACL доступа, соответствующие битам разрешений файла, изменяются таким образом, что они не содержат разрешений, которых нет в разрешениях, указанных в параметре `mode`.
Если с каталогом не связан ACL по умолчанию, режим, передаваемый в функции, создающие файловые объекты, и маска создания файла (см. umask(2)) используются для определения ACL нового объекта:
Новому объекту назначается ACL доступа, содержащий записи тегов ACL\_USER\_OBJ, ACL\_GROUP\_OBJ и ACL\_OTHER. Разрешения этих записей устанавливаются в разрешения, указанные в маске создания файла.
Записи ACL доступа, соответствующие битам разрешений файла, изменяются таким образом, чтобы они не содержали разрешений, которых нет в разрешениях, указанных в параметре `mode`.
АЛГОРИТМ ПРОВЕРКИ ДОСТУПА
Процесс может запросить доступ для чтения, записи или выполнения/поиска к файловому объекту, защищенному ACL. Алгоритм проверки доступа определяет, будет ли предоставлен доступ к объекту.
Если эффективный идентификатор пользователя процесса совпадает с идентификатором пользователя, являющегося владельцем файла, то:
если запись ACL_USER_OBJ содержит запрошенные разрешения, доступ предоставляется,
иначе доступ запрещается.
иначе, если эффективный идентификатор пользователя процесса совпадает с квалификатором любой записи типа ACL_USER, то:
если соответствующая запись ACL_USER и запись ACL_MASK содержат запрошенные разрешения, доступ предоставляется,
иначе доступ запрещается.
иначе, если эффективный идентификатор группы или любой из дополнительных идентификаторов групп процесса совпадает с группой файла или с квалификатором любой записи типа ACL_GROUP, то:
если ACL содержит запись ACL_MASK, то:
если запись ACL_MASK и любая из соответствующих записей ACL_GROUP_OBJ или ACL_GROUP содержат запрошенные разрешения, доступ предоставляется,
иначе доступ запрещается.
иначе (обратите внимание, что не может быть записей ACL_GROUP без записи ACL_MASK):
если запись ACL_GROUP_OBJ содержит запрошенные разрешения, доступ предоставляется,
иначе доступ запрещается.
иначе, если запись ACL_OTHER содержит запрошенные разрешения, доступ предоставляется.
иначе доступ запрещается.
Текстовые формы ACL
Определены длинная и короткая текстовые формы для представления ACL. В обеих формах записи ACL представляются в виде трех полей, разделенных двоеточием: тег типа записи ACL, квалификатор записи ACL и дискретные разрешения доступа. Первое поле содержит одно из следующих ключевых слов типа тега записи:
user Запись ACL пользователя указывает доступ, предоставленный либо владельцу файла (тег типа записи ACL_USER_OBJ), либо указанному пользователю (тег типа записи ACL_USER).
group Запись ACL группы указывает доступ, предоставленный либо группе файла (тег типа записи ACL_GROUP_OBJ), либо указанной группе (тег типа записи ACL_GROUP).
mask Запись маски ACL указывает максимальный доступ, который может быть предоставлен любой записью ACL, за исключением записи пользователя для владельца файла и записи other (тег типа записи ACL_MASK).
other Запись other ACL указывает доступ, предоставленный любому процессу, который не соответствует ни одной из записей ACL пользователя или группы (тег типа записи ACL_OTHER).
Второе поле содержит идентификатор пользователя или группы, связанный с записью ACL для записей типа тега записи ACL_USER или ACL_GROUP, и является пустым для всех остальных записей. Идентификатор пользователя может быть именем пользователя или десятичным номером идентификатора пользователя. Идентификатор группы может быть именем группы или десятичным номером идентификатора группы.
В третье поле входят дискретные разрешения доступа. Разрешения на чтение, запись и поиск/выполнение представлены символами r, w и x, соответственно. Каждый из этих символов заменяется символом "-", чтобы указать, что разрешение отсутствует в записи ACL. При преобразовании из текстовой формы во внутреннее представление разрешения, которые отсутствуют, указывать не обязательно.
В начале и в конце каждой записи ACL разрешено использование пробелов, а также непосредственно перед и после разделителя полей (символ двоеточия).
ДЛИННАЯ ФОРМА ТЕКСТА
В длинной форме текста каждая запись ACL содержится в отдельной строке. Кроме того, символ решетки (#) может начинать комментарий, который продолжается до конца строки. Если запись ACL_USER, ACL_GROUP_OBJ или ACL_GROUP содержит разрешения, которые также не содержатся в записи ACL_MASK, за этой записью следует символ решетки, строка «effective:» и эффективные разрешения доступа, определенные этой записью. Это пример длинной формы текста:
user::rw-
user:lisa:rw- #effective:r-
group::r-
group:toolies:rw- #effective:r-
mask::r-
other::r-
КОРОТКАЯ ФОРМА ТЕКСТА
Короткая форма текста представляет собой последовательность записей ACL, разделенных запятыми, и используется для ввода. Комментарии не поддерживаются. Ключевые слова типа записи могут быть указаны в полной не сокращенной форме или в сокращенной однобуквенной форме. Сокращение для user — u, для group — g, для mask — m и для other — o. Разрешения могут содержать не более одного из следующих символов в любом порядке: r, w, x.
Вот примеры короткой формы текста:
u::rw-,u:lisa:rw-,g::r--,g:toolies:rw-,m::r--,o::r-
g:toolies:rw,u:lisa:rw,u::wr,g::r,o::r,m::r
ОБОСНОВАНИЕ
Черновик IEEE 1003.1e (версия 17) определяет списки управления доступом, которые включают записи типа ACL_MASK, и определяет отображение между битами разрешений файлов, которое не является постоянным. Рабочая группа стандарта определила этот относительно сложный интерфейс, чтобы гарантировать, что приложения, соответствующие IEEE 1003.1 («POSIX.1»), по-прежнему будут работать должным образом в системах с ACL. Обоснование выбора этого интерфейса содержится в разделе B.23 черновика IEEE 100.1e (версия 17).
ИЗМЕНЕНИЯ В УТИЛИТАХ ФАЙЛОВ
В системе, поддерживающей ACL, утилиты файлов ls(1), cp(1) и mv(1) изменяют свое поведение следующим образом:
Для файлов, имеющих ACL по умолчанию или ACL доступа, содержащий более трех необходимых записей ACL, утилита ls(1) в длинной форме, генерируемой командой ls -l, отображает знак плюс (+) после строки разрешений.
Если указан флаг -p, утилита cp(1) также сохраняет ACL. Если это невозможно, выдается предупреждение.
Утилита mv(1) всегда сохраняет ACL. Если это невозможно, выдается предупреждение.
Влияние утилиты chmod(1) и системного вызова chmod(2) на ACL доступа описано в разделе «СООТВЕТСТВИЕ МЕЖДУ ЗАПИСЯМИ ACL И БИТАМИ РАЗРЕШЕНИЙ ФАЙЛОВ».
СТАНДАРТЫ
Документ IEEE 1003.1e (черновик 17) («POSIX.1e») описывает несколько расширений безопасности стандарта IEEE 100.1. Хотя работа над 1003.1e была прекращена, многие UNIX-подобные системы реализуют части черновика 17 POSIX.1e или более ранних черновиков.
Linux Access Control Lists (ACL) реализуют полный набор функций и утилит, определенных для списков управления доступом в POSIX.1e, и ряд расширений. Реализация полностью соответствует черновику POSIX.1e 17; расширения отмечены соответствующим образом. Функции управления списками управления доступом определены в библиотеке ACL (libacl, -lacl). Соответствующие интерфейсы POSIX определены в заголовочном файле
ЗАМЕЧАНИЯ
ЗАПРЕЩЕННЫЕ РАЗРЕШЕНИЯ И ПРОСТРАНСТВА ИМЕН ПОЛЬЗОВАТЕЛЕЙ LINUX
Хотя ACL можно использовать для запрета процессам разрешений на основе групп, в которых они состоят, это считается плохой практикой. Привилегированные вспомогательные программы, такие как newuidmap(1), могут предоставить непривилегированным процессам доступ к системному вызову setgroups(2), который позволяет им отказаться от дополнительных членских групп и сделать неэффективными ограничения, основанные на этом членстве. Для получения дополнительной информации см. user_namespaces(7).
ССЫЛКИ
chmod(1), creat(2), getfacl(1), ls(1), mkdir(2), mkfifo(2), mknod(2), mount(8), open(2), setfacl(1), stat(2), umask(1)
POSIX 1003.1e ЧЕРНОВИК 17
https://wt.tuxomania.net/publications/posix.1e/download.html
ФУНКЦИИ POSIX 1003.1e ПО КАТЕГОРИЯМ
Управление хранилищем ACL acl_dup(3), acl_free(3), acl_init(3)
Манипулирование записями ACL acl_copy_entry(3), acl_create_entry(3), acl_delete_entry(3), acl_get_entry(3), acl_valid(3)
acl_add_perm(3), acl_calc_mask(3), acl_clear_perms(3), acl_delete_perm(3),
acl_get_permset(3), acl_set_permset(3)
acl_get_qualifier(3), acl_get_tag_type(3), acl_set_qualifier(3), acl_set_tag_type(3)
Манипулирование ACL для объекта acl_delete_def_file(3), acl_get_fd(3), acl_get_file(3), acl_set_fd(3), acl_set_file(3)
Преобразование формата ACL acl_copy_entry(3), acl_copy_ext(3), acl_from_text(3), acl_to_text(3), acl_size(3)
ФУНКЦИИ POSIX 1003.1e ПО ДОСТУПНОСТИ
Первая группа функций поддерживается на большинстве систем с списками управления доступом, соответствующими POSIX, в то время как вторая группа поддерживается на меньшем количестве систем. Для приложений, которые будут переноситься, лучше избегать второй группы.
acl_delete_def_file(3), acl_dup(3), acl_free(3), acl_from_text(3), acl_get_fd(3),
acl_get_file(3), acl_init(3), acl_set_fd(3), acl_set_file(3), acl_to_text(3), acl_valid(3)
acl_add_perm(3), acl_calc_mask(3), acl_clear_perms(3), acl_copy_entry(3), acl_copy_ext(3),
acl_copy_int(3), acl_create_entry(3), acl_delete_entry(3), acl_delete_perm(3), acl_get_entry(3),
acl_get_permset(3), acl_get_qualifier(3), acl_get_tag_type(3), acl_set_permset(3),
acl_set_qualifier(3), acl_set_tag_type(3), acl_size(3)
РАСШИРЕНИЯ LINUX
Эти непереносимые расширения доступны в системах Linux.
acl_check(3), acl_cmp(3), acl_entries(3), acl_equiv_mode(3), acl_error(3), acl_extended_fd(3),
acl_extended_file(3), acl_extended_file_nofollow(3), acl_from_mode(3), acl_get_perm(3),
acl_to_any_text(3)
АВТОР
Andreas Gruenbacher, <_>