Данная статья применима к:

  • 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 можно командой:

umask
Изменить значение umask для текущей среды исполнения можно командой umask с указанием нового значения:
umask 077
В приведенном примере команды устанавливается значение umask равное 077, то есть:

  • файлы будут создаваться с правами 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 устанавливаются по умолчанию.

При работе в командной строке проверить наличие пакета можно командой

apt-cache policy acl
Установить пакет можно командой:
sudo apt install acl
или использовать для проверки и установки графический менеджер пакетов (см. Графический менеджер пакетов synaptic).

Для работы с ACL используемая файловая система должна быть смонтирована с опцией монтирования acl. Проверить текущие опции монтирования можно командой:

sudo tune2fs -l /dev/sda1 | grep "Default mount options"

Default mount options: user_xattr acl
где /dev/sda1 — используемый для файловой системы дисковый раздел.

Файловые системы, монтируемые автоматически при загрузке ОС, обычно монтируются с поддержкой ACL (т. е. с опцей монтирования acl). Проверить опции монтирования, принятые по умолчанию, можно командой:

grep acl /etc/mke2fs.conf

default_mntopts = acl,user_xattr
Для добавляемых вручную файловых систем опцию монтирования acl может понадобиться указать явно:
sudo mount -o acl /dev/sdb1 /mnt

Модель управления доступом 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, например:

setfacl -m u:<имя_пользователя>:rwx filename
Назначение применяемого по умолчанию правила (опция -d команды setfacl):
setfacl -dm u::<имя_пользователя>:rwx dirname

Получение правил ACL выполняется командой getfacl:
getfacl filename

Ограничения на количество правил ACL

Правила ACL хранятся в расширенных атрибутах файловых объектов. В рекомендованной для Astra Linux файловой системе ext4 количество правил ACL, которые можно присвоить одному ФО, ограничивается правилом: все расширенные атрибуты должны помещаться в один логический дисковый блок. Одно правило ACL занимает 8 байт, таким образом в стандартном логическом блоке теоретически может поместиться около 500 правил ACL. Это — максимально возможное количество. На практике следует помнить, что при работе в Astra Linux Special Edition мандатные атрибуты ФО также хранятся в расширенных атрибутах, кроме того расширенные атрибуты могут использоваться различными приложениями для хранения своих метаданных, что уменьшает пространство для хранения ACL.

Маски ACL и эффективные права

Маска ACL задает максимально возможное значение прав, что позволяет принудительно ограничить действие всех назначенных для ФО правил ACL.

Маска ACL не применяется к правам пользователя-владельца ФО и правам "других" ("other").

 По умолчанию маска ФО создается автоматически при создании для ФО первого правила ACL, и изменяется автоматически по мере добавления новых правил, представляя собой объединение всех назначенных правил ACL (то есть маска, создаваемая по умолчанию, разрешает все операции, заданные правилами ACL, и не ограничивает работу правил ACL).

Получить значение маски можно командой:

getfacl filename
Например:

После выполнения команды создания правила ACL разрешающего только чтение ("r") для пользователя user1:

setfacl -m u:user1:r filename
маске ACL будет автоматически присвоено значение "r":
getfacl filename

...
mask::r
...

А после выполнения команды создания правила ACL разрешающего все операции ("rwx") для пользователя user2:
setfacl -m u:user2:rwx filename
маске ACL будет автоматически присвоено значение "rwx":
getfacl filename

...
mask::rwx
...
При необходимости ограничить права доступа маску можно задать принудительно, например, запретить все операции изменения, разрешенные с помощью ACL (опция -m команды setfacl):
setfacl -m m:rx filename
После принудительного задания маски проверка правил ACL ФО с помощью команды:
getfacl filename
покажет, что пользователь user2, которому правилами ACL разрешены любые действия, включая изменение объекта ("rwx"), теперь имеет эффективные (действующие) права, исключающие изменение объекта ("r-x"):
getfacl filename

...
user:user2:rwx               #effective:r-x
...

Применяемые по умолчанию правила ACL

Применяемые по умолчанию правила ACL обеспечивают механизм наследования прав доступа, удобный для управления правами дискреционного доступа к вложенным каталогам с их содержимым. Применяемые по умолчанию правила ACL могут быть установлены только на каталоги. Если на каталог установлены применяемые по умолчанию правила ACL, то всеми файловыми объектам, создаваемыми в этом каталог, наследуются эти правила ACL, причем каталогами правила наследуются как применяемые по умолчанию, файлами - как эффективные (с учетом действующей маски).

Применяемые по умолчанию правила ACL:

  1. Наследуются файловыми объектами, создаваемыми в каталоге, но не действуют на сам каталог, поэтому при установке правил ACL следует не забывать устанавливать на каталоги их собственные правила ACL;
  2. Не наследуются автоматически файловыми объектами, уже существующими в каталоге на момент установки правил, т.е.: если правила по умолчанию применяются к непустому каталогу, то необходимо либо вручную установить правила ACL (для подкаталогов - также и правила по умолчанию) на существующие в каталоге объекты, либо пересоздать эти объекты после установки правил по умолчанию на каталог.

Для создания применяемых по умолчанию правил ACL используется ключ -d команды setfacl, пример см. ниже.

Как это работает

Соответствие между правилами ACL и базовыми правами доступа

Разрешения доступа, определяемые правилами ACL имеют приоритет перед базовыми правами доступа.

Существует соответствие между пользователем-владельцем, группой-владельцем и прочими:

  • Права пользователя владельца представляются правилом ACL типа user без определения имени:

    u::rwx
  • Права группы-владельца соответствуют:
    • при наличии маски - значению, заданному маской;
    • при отсутствии маски - правилу ACL типа group без определения имени:

      g::r-x
  • Права для прочих субъектов соответствуют правилу ACL типа other.

Это соотвествие однозначно: изменение базовых прав доступа всегда изменяет соответствующие им правила ACL, а изменение правил ACL изменяет соответствующие им базовые права.

Алгоритм проверки права доступа

После того, как субъект доступа запрашивает разрешение на выполнение операции чтения, изменения или исполнения/поиска с неким ФО, проверка выполняется по следующим правилам:

  • Эффективный идентификатор субъекта доступа равен идентификатору пользователя-владельца ФО?
    • Да:
      • Соответствующее пользователю-владельцу правило ACL содержит разрешение на запрошенную операцию?
        • Да: Доступ предоставляется;
        • Нет: Доступ запрещается;
    • Нет:
      • Существует правило ACL типа user, идентификатор пользователя в котором равен эффективному идентификатору субъекта доступа?
        • Да:
          • Разрешенные в этом правиле ACL права и права в маске ACL содержат разрешение на запрошенную операцию?
            • Да: Доступ предоставляется;
            • Нет: Доступ запрещается;
        • Нет:
          • Для всех правил ACL типа group, идентификатор в которых равен эффективному идентификатору любой группы, включающей субъект доступа или равен идентификатору группы-владельца ФО:
            • Существует маска ACL?
                • Да:
                  • Маска и любое из соответствующих правил содержат разрешение на запрошенную операцию?
                    • Да: Доступ предоставляется;
                    • Нет: Доступ запрещается;
                • Нет:
                  • Любое из соответствующих правил содержит разрешение на запрошенную операцию?
                    • Да: Доступ предоставляется;
                    • Нет: Доступ запрещается;
          • Правило ACL типа other содержит разрешение на запрошенную операцию?
            • Да: Доступ предоставляется;
            • Нет: Доступ запрещается.

Создание файловых объектов

Правила ACL для ФО создаются при создании ФО любым из системных вызовов: creat(), mkdir(), mknod(), mkfifo(), open().

Если для каталога, содержащего создаваемый ФО, определены применяемые по умолчанию правила ACL, то:

  1. Создаваемый ФО наследует применяемые по умолчанию правила ACL;
  2. Правила ACL, соответствующие базовым правилам доступа к ФО, модифицируются так, чтобы они не содержали прав, не заданных параметром mode системного вызова

Если применяемые по умолчанию правила не заданы, то:

  1. Создаваемому ФО присваиваются правила ACL user, group и other, соответствующие базовым правилам, и их значения устанавливаются в соответствии с действующим параметром umask;
  2. Значения созданных правил изменяются, чтобы они не содержали прав, не заданных параметром mode системного вызова.

Изменения в инструментах для работы с файлами

  • Для ФО, имеющих применяемые по умолчанию правила ACL, или имеющих более трех базовых правил ACL, инструмент ls при выводе данных в подробном формате (опция -l) добавляет символ "+" в конце строки прав доступа;
  • Инструмент копирования файлов cp при использование опции -p старается также скопировать правила ACL, и выдает предупреждение, если это не удается;
  • Инструмент перемещения файлов mv всегда пытается сохранить правила ACL. и выдает предупреждение, если это не удается.

Инструменты для работы с правилами ACL

Для работы с ACL доступны два инструмента командной строки:

  • setfacl — установка правил ACL файловых объектов;
  • getfacl — получение правил ACL файловых объектов.

Полная информация по опциям этих инструментов доступна в справочной системе man:

man acl
man setfacl
man getfacl
Далее приводятся примеры типичных операций с правилами ACL.

Примеры команд управления ACL

Создать правило ACL, разрешающее операцию чтения ("r") указанного ФО указанному пользователю:

setfacl -m u:<имя_пользователя>:r <имя_ФО>
Получить правила ACL указанного ФО:
getfacl <имя_ФО>
Создать правила ACL, разрешающие операцию изменения ("w") указанному пользователю для указанного каталога и входящих в этот каталог ФО рекурсивно:
setfacl -R -m u:<имя_пользователя>:w <имя_каталога>
Создать правило ACL, разрешающее операции чтения и изменения ("rw") указанной группе пользователей:
setfacl -m g:<имя_группы>:rw <имя_ФО>
Удалить все правила ACL указанного ФО:
setfacl -b <имя_ФО>
Удалить правила ACL указанного пользователя для указанного ФО:
setfacl -x u:<имя_пользователя> <имя_ФО>
Установить для указанного каталога правило ACL и применяемые по умолчанию правила ACL. Устанавливаются права на чтение и исполнение ("r-x") для указанного пользователя:
setfacl -m u:<имя_пользователя>:r-x <имя_ФО>
setfacl -d -m u:<имя_пользователя>:r-x <имя_ФО>
Удалить правила ACL указанного ФО, применяемые по умолчанию:
setfacl -k <имя_ФО>
Установить правила ACL из конфигурационного файла. Конфигурационный файл задается в формате вывода команды getfacl. Пример конфигурационного файла:

# 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:

setfacl --restore=acl.txt
Установить правило ACL, запрещающее указанному пользователю доступ к указанному ФО:
setfacl -m u:<имя_пользователя>:0 <имя_ФО>

Пример использования наследования ACL

В примере создается и настраивается каталог, содержимое которого доступно одновременно двум пользователям. При создании файлов новые файлы получают свои базовые атрибуты (пользователь-владелец и группа-владелец), и вдобавок получают унаследованные правила ACL. Такая организация прав доступа может применяться при совместной работе над проектами.

Содание каталога:

mkdir <имя_каталога>
Настройка правил ACL и применяемых по умолчанию правил ACL для пользователя 1:
setfacl -m u:<имя_пользователя1>:7 <имя_каталога>
setfacl -d -m u:<имя_пользователя1>:7 <имя_каталога>
Настройка правил ACL и применяемых по умолчанию правил ACL для пользователя 2:
setfacl -m u:<имя_пользователя2>:7 <имя_каталога>
setfacl -d -m u:<имя_пользователя2>:7 <имя_каталога>
Как упоминалось выше, заданные для каталога применяемые по умолчанию правила ACL не действуют на сам каталог, поэтому правила ACL на каталог должны быть установлены отдельной командой.