Данная статья применима к:
- Astra Linux
Введение. Что такое ACL
Списки управления доступом (Access Control Lists, ACL) предоставляют администраторам ОС Astra Linux расширенные возможности точного определения индивидуальных правил дискреционного доступа к файловым объектам (далее — ФО). При использовании ACL правила могут быть заданы индивидуально для любых пользователей и/или групп пользователей, дополняя и расширяя базовый механизм «пользователь-владелец — группа-владелец - прочие».
С помощью ACL доступ может быть предоставлен пользователю или группе независимо от доступа других пользователей, участия в группах и предоставления доступа к иным ФО. Дополнительно предоставляются:
механизм масок, позволяющий ограничивать права доступа;
механизм наследования ACL (ACL по умолчанию), позволяющий определять порядок автоматического присвоения атрибутов доступа создаваемым новым ФО.
Далее под термином "доступ" подразумевается дискреционный доступ к файловым объектам.
Обозначения
Права доступа управляют возможностью выполнения следующих операций:
чтение (read, буквенный код r, числовой код 4, битовая маска 100);
изменение (write, буквенный код w, числовой код 2, битовая маска 010);
исполнение (execute, буквенный код x, числовой код 1, битовая маска 001).
Набор прав доступа может обозначаться строками, числами и битовыми масками, при этом на первом месте всегда операция "чтение", на втором — операция "изменение" и на третьем — операция "исполнение". Порядок записи:
при обозначении символьной строкой каждое из прав доступа обозначается соответствующим ему буквенным кодом, а отсутствие права — символом «-» в соответствующей позиции, например:
rwx — разрешены все операции;
r-x — разрешены операции чтения и исполнения (r и x), а операция изменения запрещена;
при обозначении числами используются суммы числовых кодов разрешенных прав, например:
буквенному коду rwx соответствует число 7 (4+2+1);
буквенному коду r-x соответствует число 5 (4+1);
при обозначении битовыми масками суммируются битовые маски разрешенных прав:
буквенному коду rwx соответствуют число 7 и битовая маска 111;
буквенному коду r-x соответствуют число 5 и битовая маска 101.
Для каждого ФО базовые права доступа определяются для трех субъектов доступа:
пользователь-владелец;
группа-владелец;
прочие;
Соответственно, полный набор прав доступа может быть представлен:
символьной строкой из 9 символов, по три символа для каждого субъекта доступа:
rwxr-xr-x
числом из трех восьмеричных цифр, по одной цифре для каждого субъекта доступа:
755
битовой маской, по три бита для каждого субъекта доступа:
111 101 101
В любом способе представления на первом месте всегда записываются права пользователя-владельца, на втором — права группы-владельца, на третьем — прочих субъектов доступа.
Базовая модель управления дискреционным доступом к файловым объектам
Как указано выше, каждому ФО присваивается набор из трех групп прав доступа:
права доступа для пользователя-владельца (user);
права доступа для группы-владельца (group);
права доступа для прочих (other).
При использовании базовой модели управления дискреционным доступом для каждого ФО используется один и только один набор прав доступа. В такой модели управления доступом чтобы предоставить доступ к ФО пользователю, не являющемуся пользователем-владельцем, нужно:
либо сменить пользователя-владельца — тогда доступ потеряется у исходного пользователя-владельца;
либо включить нового пользователя в группу-владельца - но тогда этот пользователь получит доступ ко всем ФО, у которых владельцем является эта группа;
либо разрешить доступ «всем остальным», но доступ будет предоставлен всем, а не только новому пользователю.
Такая точность управления доступом недостаточна для решения практических задач, поэтому в дополнение к базовым атрибутам используются списки управления доступом (Access Control Lists, ACL).
Создание новых файловых объектов и umask
При создании новых ФО в рамках базовой модели по умолчанию применяются следующие права доступа:
для файлов: 666 т.е для всех субъектов доступа разрешены чтение и изменение;
для каталогов: 777, т.е для всех субъектов доступа разрешены чтение, изменение и исполнение (операция "исполнение" для каталогов имеет значение "поиск ФО, находящихся в каталоге").
Однако внутри системных вызовов, создающих файловые объекты, к применяемым по умолчанию правам доступа применяется значение umask - маски режима создания файлов.
Umask — это битовая маска, в которой единичные биты обозначают запрет выставления соответствующего бита разрешения. По умолчанию значение umask равно 022, то есть:
для файлов: для применяемых по умолчанию прав доступа 666 (rw-rw-rw-, 110 110 110) после применения umask 022 (000 010 010) файл будет создан с правами 644 (rw-r--r--, 110 100 100):
110 110 110 - 000 010 010 = 110 100 100
для каталогов для применяемых по умолчанию прав доступа 777 (rwxrwxrwx, 111 111 111) после применения umask 022 (000 010 010) файл будет создан с правами 755 (rwxr-xr-x, 111 101 101):
111 111 111 - 000 010 010 = 111 101 101
Umask применяется в текущей среде исполнения. Получить текущее значение umask можно командой:
файлы будут создаваться с правами 600 (rw-------, 110 000 000), т.е. будет применяться полный запрет доступа всем, кроме пользователя-владельца;
каталоги будут создаваться с правами 700 (rwx------, 111 000 000), что обеспечивает также полный запрет доступа всем, кроме пользователя-владельца.
Поддерживает ли используемая ОС работу с ACL
На момент написания данной статьи все варианты исполнения Astra Linux поддерживают работу с ACL на уровне ядра. Также работа с ACL поддерживается рекомендованной к использованию в Astra Linux файловой системой ext4 (ACL также поддерживается файловыми системами Btrfs, ext2, ext3, xfs и др.).
Инструменты командной строки для работы с ACL содержатся в пакете acl и при стандартной установке Astra Linux устанавливаются по умолчанию.
При работе в командной строке проверить наличие пакета можно командой
Для работы с ACL используемая файловая система должна быть смонтирована с опцией монтирования acl. Проверить текущие опции монтирования можно командой:
Default mount options: user_xattr acl
Файловые системы, монтируемые автоматически при загрузке ОС, обычно монтируются с поддержкой ACL (т. е. с опцей монтирования acl). Проверить опции монтирования, принятые по умолчанию, можно командой:
default_mntopts = acl,user_xattr
Модель управления доступом ACL
При использовании ACL каждому ФО могут быть присвоены дополнительные правила доступа к этому ФО. Правила могут быть следующих типов:
user — правило определяет индивидуальные права доступа для указанного пользователя, например:
user:admin:rwx
разрешает пользователю admin выполнять все операции с ФО ("rwx"). Таких правил у каждого ФО может быть несколько. Правило ACL типа user без указания имени пользователя соответствует правилу для пользователя-владельца ФО и является обязательным для любого ФО;
group — правило определяет индивидуальные права доступа для группы, например:
group:kvm:r-x
разрешает участникам группы kvm выполнять чтение и исполнение ФО ("r-x"). Таких правил у каждого ФО может быть несколько. Правило ACL типа group без указания имени группы соответствует правилу для группы-владельца ФО и является обязательным для любого ФО;
other - права доступа для всех остальных:
other::r--
Это правило единственное и обязательное для любого ФО. В этом правиле какое-либо имя отсутствует, и это правило соответствует правилу "прочие" базовой системы.
Для краткости название типа правила может сокращаться до первой буквы, а символы "-" - пропускаться:
u:admin:rwx g:kvm:rx о::r
Кроме этих правил существуют правила типа mask (маска) и правила, определяющие применяемые по умолчанию правила ACL (default ACL) для новых создаваемых ФО (см. далее).
Назначение правил ACL ФО выполняется командой setfacl с опцией -m, например:
Получение правил ACL выполняется командой getfacl:
Ограничения на количество правил ACL
Правила ACL хранятся в расширенных атрибутах файловых объектов. В рекомендованной для Astra Linux файловой системе ext4 количество правил ACL, которые можно присвоить одному ФО, ограничивается правилом: все расширенные атрибуты должны помещаться в один логический дисковый блок. Одно правило ACL занимает 8 байт, таким образом в стандартном логическом блоке теоретически может поместиться около 500 правил ACL. Это — максимально возможное количество. На практике следует помнить, что при работе в Astra Linux Special Edition мандатные атрибуты ФО также хранятся в расширенных атрибутах, кроме того расширенные атрибуты могут использоваться различными приложениями для хранения своих метаданных, что уменьшает пространство для хранения ACL.
Маски ACL и эффективные права
Маска ACL задает максимально возможное значение прав, что позволяет принудительно ограничить действие всех назначенных для ФО правил ACL.
По умолчанию маска ФО создается автоматически при создании для ФО первого правила ACL, и изменяется автоматически по мере добавления новых правил, представляя собой объединение всех назначенных правил ACL (то есть маска, создаваемая по умолчанию, разрешает все операции, заданные правилами ACL, и не ограничивает работу правил ACL).
Получить значение маски можно командой:
После выполнения команды создания правила ACL разрешающего только чтение ("r") для пользователя user1:
...
mask::r
...
А после выполнения команды создания правила ACL разрешающего все операции ("rwx") для пользователя user2:
...
mask::rwx
...
...
user:user2:rwx #effective:r-x
...
Применяемые по умолчанию правила ACL
Применяемые по умолчанию правила ACL обеспечивают механизм наследования прав доступа, удобный для управления правами дискреционного доступа к вложенным каталогам с их содержимым. Применяемые по умолчанию правила ACL могут быть установлены только на каталоги. Если на каталог установлены применяемые по умолчанию правила ACL, то всеми файловыми объектам, создаваемыми в этом каталог, наследуются эти правила ACL, причем каталогами правила наследуются как применяемые по умолчанию, файлами - как эффективные (с учетом действующей маски).
Применяемые по умолчанию правила ACL:
- Наследуются файловыми объектами, создаваемыми в каталоге, но не действуют на сам каталог, поэтому при установке правил ACL следует не забывать устанавливать на каталоги их собственные правила ACL;
- Не наследуются автоматически файловыми объектами, уже существующими в каталоге на момент установки правил, т.е.: если правила по умолчанию применяются к непустому каталогу, то необходимо либо вручную установить правила ACL (для подкаталогов - также и правила по умолчанию) на существующие в каталоге объекты, либо пересоздать эти объекты после установки правил по умолчанию на каталог.
Для создания применяемых по умолчанию правил ACL используется ключ -d команды setfacl, пример см. ниже.
Как это работает
Соответствие между правилами ACL и базовыми правами доступа
Разрешения доступа, определяемые правилами ACL имеют приоритет перед базовыми правами доступа.
Существует соответствие между пользователем-владельцем, группой-владельцем и прочими:
Права пользователя владельца представляются правилом ACL типа user без определения имени:
u::rwx
- Права группы-владельца соответствуют:
- при наличии маски - значению, заданному маской;
при отсутствии маски - правилу ACL типа group без определения имени:
g::r-x
- Права для прочих субъектов соответствуют правилу ACL типа other.
Это соотвествие однозначно: изменение базовых прав доступа всегда изменяет соответствующие им правила ACL, а изменение правил ACL изменяет соответствующие им базовые права.
Алгоритм проверки права доступа
После того, как субъект доступа запрашивает разрешение на выполнение операции чтения, изменения или исполнения/поиска с неким ФО, проверка выполняется по следующим правилам:
- Эффективный идентификатор субъекта доступа равен идентификатору пользователя-владельца ФО?
- Да:
- Соответствующее пользователю-владельцу правило ACL содержит разрешение на запрошенную операцию?
- Да: Доступ предоставляется;
- Нет: Доступ запрещается;
- Соответствующее пользователю-владельцу правило ACL содержит разрешение на запрошенную операцию?
- Нет:
- Существует правило ACL типа user, идентификатор пользователя в котором равен эффективному идентификатору субъекта доступа?
- Да:
- Разрешенные в этом правиле ACL права и права в маске ACL содержат разрешение на запрошенную операцию?
- Да: Доступ предоставляется;
- Нет: Доступ запрещается;
- Разрешенные в этом правиле ACL права и права в маске ACL содержат разрешение на запрошенную операцию?
- Нет:
- Для всех правил ACL типа group, идентификатор в которых равен эффективному идентификатору любой группы, включающей субъект доступа или равен идентификатору группы-владельца ФО:
- Существует маска ACL?
- Да:
- Маска и любое из соответствующих правил содержат разрешение на запрошенную операцию?
- Да: Доступ предоставляется;
- Нет: Доступ запрещается;
- Маска и любое из соответствующих правил содержат разрешение на запрошенную операцию?
- Нет:
- Любое из соответствующих правил содержит разрешение на запрошенную операцию?
- Да: Доступ предоставляется;
- Нет: Доступ запрещается;
- Любое из соответствующих правил содержит разрешение на запрошенную операцию?
- Да:
- Существует маска ACL?
- Правило ACL типа other содержит разрешение на запрошенную операцию?
- Да: Доступ предоставляется;
- Нет: Доступ запрещается.
- Для всех правил ACL типа group, идентификатор в которых равен эффективному идентификатору любой группы, включающей субъект доступа или равен идентификатору группы-владельца ФО:
- Да:
- Существует правило ACL типа user, идентификатор пользователя в котором равен эффективному идентификатору субъекта доступа?
- Да:
Создание файловых объектов
Правила ACL для ФО создаются при создании ФО любым из системных вызовов: creat(), mkdir(), mknod(), mkfifo(), open().
Если для каталога, содержащего создаваемый ФО, определены применяемые по умолчанию правила ACL, то:
- Создаваемый ФО наследует применяемые по умолчанию правила ACL;
- Правила ACL, соответствующие базовым правилам доступа к ФО, модифицируются так, чтобы они не содержали прав, не заданных параметром mode системного вызова
Если применяемые по умолчанию правила не заданы, то:
- Создаваемому ФО присваиваются правила ACL user, group и other, соответствующие базовым правилам, и их значения устанавливаются в соответствии с действующим параметром umask;
- Значения созданных правил изменяются, чтобы они не содержали прав, не заданных параметром mode системного вызова.
Изменения в инструментах для работы с файлами
- Для ФО, имеющих применяемые по умолчанию правила ACL, или имеющих более трех базовых правил ACL, инструмент ls при выводе данных в подробном формате (опция -l) добавляет символ "+" в конце строки прав доступа;
- Инструмент копирования файлов cp при использование опции -p старается также скопировать правила ACL, и выдает предупреждение, если это не удается;
- Инструмент перемещения файлов mv всегда пытается сохранить правила ACL. и выдает предупреждение, если это не удается.
Инструменты для работы с правилами ACL
Для работы с ACL доступны два инструмента командной строки:
- setfacl — установка правил ACL файловых объектов;
- getfacl — получение правил ACL файловых объектов.
Полная информация по опциям этих инструментов доступна в справочной системе man:
man setfacl
man getfacl
Примеры команд управления ACL
Создать правило ACL, разрешающее операцию чтения ("r") указанного ФО указанному пользователю:
setfacl -d -m u:<имя_пользователя>:r-x <имя_ФО>
# file: filename # owner: root # group: root user::rwx user:username1:r-x group::--- mask::r-x other::--- # file: filename # owner: root # group: root user::rwx user:username2:r-- group::--- mask::r-- other::---
Команда для установки правил ACL:
Пример использования наследования ACL
В примере создается и настраивается каталог, содержимое которого доступно одновременно двум пользователям. При создании файлов новые файлы получают свои базовые атрибуты (пользователь-владелец и группа-владелец), и вдобавок получают унаследованные правила ACL. Такая организация прав доступа может применяться при совместной работе над проектами.
Содание каталога:
setfacl -d -m u:<имя_пользователя1>:7 <имя_каталога>
setfacl -d -m u:<имя_пользователя2>:7 <имя_каталога>