В последних предыдущих версиях Solaris поддерживалась реализация списков ACL, в первую очередь основанная на спецификации списков ACL согласно проекту стандарта POSIX. Списки ACL на основе проекта POSIX используются для защиты файлов UFS. Они преобразуются в версиях NFS, предшествующих версии 4.
При внедрении NFSv4 новая модель списков ACL полностью поддерживает возможности совместного функционирования клиентов UNIX и не UNIX, обеспечиваемые NFSv4. Новая реализация списков ACL согласно спецификации NFSv4 обеспечивает расширенную семантику на основе списков ACL типа NT.
Ниже приведены основные отличия новой модели списков ACL.
Списки ACL основаны на спецификации NFSv4 и похожи на списки ACL типа NT.
Более структурированный набор прав доступа. Дополнительная информация приведена в Таблица 8–2.
Они настраиваются и отображаются с помощью командchmod и ls, а не setfacl и getfacl.
Расширенная семантика наследования для обозначения способа применения прав доступа от каталогов к подкаталогам и т. д. Для получения дополнительной информации см. Наследование списков ACL.
Обе модели списков ACL обеспечивают более структурированное управление доступом по сравнению со стандартными разрешениями для файлов. Как и списки ACL на основе проекта POSIX, новые списки ACL состоят из ряда записей управления доступом (ACE).
Списки ACL на основе проекта POSIX используют одну запись для определения разрешений и запретов. В новой модели списков ACL имеются два типа записей ACE, влияющих на проверку доступа: ALLOW и DENY. Нельзя наследовать от любой одиночной записи ACE, определяющего набор разрешений, независимо от того, были ли разрешения, не определенные в данной записи ACE, разрешены или отвергнуты.
Преобразование между списками ACL типа NFSv4 и списками ACL на основе проекта POSIX выполняется следующим образом.
В случае использования средства с поддержкой списков ACL, например команд cp, mv, tar, cpio или rcp, для перемещения файлов UFS со списками ACL в файловую систему ZFS, списки ACL на основе проекта POSIX преобразуются в эквивалентные списки ACL типа NFSv4.
Некоторые списки ACL типа NFSv4 преобразуются в списки ACL на основе проекта POSIX. Если списки ACL типа NFSv4 невозможно преобразовать в списки ACL на основе проекта POSIX, отображается следующее сообщение:
# cp -p filea /var/tmp cp: failed to set acl entries on /var/tmp/filea |
В случае создания архива UFS при помощи командtar или cpioс параметром сохранения списков ACL (tar-p или cpio -P) в системе с данной версией Solaris списки ACL не сохраняются при извлечении архива в систему с предыдущей версией.
Все файлы извлекаются с правильными правами для файлов, однако записи в списках ACL игнорируются.
Для извлечения данных в файловую систему ZFS можно использовать команду ufsrestore. Если в первоначальные данные входят списки ACL типа POSIX, они преобразуются в списки ACL типа NFSv4.
При попытке установки списков ACL типа NFSv4 для файла UFS появится следующее сообщение:
chmod: ERROR: ACL type's are different |
При попытке установки списков ACL на основе проекта POSIX для файла ZFS появятся следующие сообщения:
# getfacl filea File system doesn't support aclent_t style ACL's. See acl(5) for more information on Solaris ACL support. |
Для получения информации о других ограничениях, связанных со списками ACL и продуктами для резервного копирования, см. Сохранение данных ZFS с использованием сторонних решений для резервного копирования
Два основных формата списков ACL описываются следующим образом:
Синтаксис для настройки тривиальных списков ACL
chmod [options] A[index]{+|=}owner@ |group@ |everyone@: разрешения_доступа/...[:флаги_наследования]: deny | allow файл
chmod [options] A-owner@, group@, everyone@:разрешения_доступа /...[:флаги_наследования]:deny | allow файл ...
chmod [options] A[index]- файл
Синтаксис для настройки нетривиальных списков ACL
chmod [options] A[index]{+|=}user|group:name:разрешения_доступа /...[:флаги_наследования]:deny | allow файл
chmod [options] A-user|group:name:разрешения_доступа /...[:флаги_наследования]:deny | allow файл ...
chmod [options] A[index]- файл
Определяет значение тип_записи_ACL для тривиальных списков ACL. Описание типов записи ACLприведено в Таблица 8–1.
Определяет значение тип_записи_ACL для явно задаваемого синтаксиса ACL. Для типов записи ACL "пользователь" и "группа" также необходимо указать значения идентификатор_записи_ACL, имя_пользователя или имя_группы Описание типов записи ACL приведено в Таблица 8–1.
Определяет наличие или отсутствие разрешений на доступ. Описание прав доступа списков ACL приведено в Таблица 8–2.
Определяет дополнительный список флагов наследования списков ACL. Описание флагов наследования списков ACL приведено вТаблица 8–3.
Определяет наличие или отсутствие разрешений на доступ.
В следующем примере значение идентификатор_записи_ACL не учитывается.
group@:write_data/append_data/execute:deny |
Следующий пример включает значение идентификатор_записи_ACL, поскольку в списке ACL задан определенный пользователь (тип_записи_ACL).
0:user:gozer:list_directory/read_data/execute:allow |
При отображении записи ACL выглядит следующим образом:
2:group@:write_data/append_data/execute:deny |
Обозначение 2 или индекс_идентификатор в данном примере определяет запись ACL в большом списке ACL, который может содержать несколько записей для владельца, определенных пользователей, группы и всех пользователей. Для указания на фрагмент списков ACL, который требуется изменить, можно указать индекс_идентификатор с помощью команды chmod. Например, в командеchmod можно определить индекс 3 как A3 аналогично следующему:
chmod A3=user:venkman:read_acl:allow filename |
В следующей таблице описаны типы записей ACL, т. е. представление владельца, группы и других пользователей.
Таблица 8–1 Типы записей ACL
Тип записи ACL |
Описание |
---|---|
owner@ |
Определяет права доступа, предоставляемые владельцу объекта. |
group@ |
Определяет права доступа, предоставляемые группе, владеющей объектом. |
everyone@ |
Определяет права доступа, предоставляемые любому пользователю или группе, не соответствующим любой другой записи ACL. |
user |
При указании имени пользователя определяет права доступа, предоставляемые дополнительному пользователю объекта. Должна включать значение идентификатор_записи_ACL, содержащее имя_пользователя или идентификатор_пользователя. Если это значение не представляет собой действительный числовой идентификатор пользователя (UID) или имя_пользователя, то тип записи ACL считается недопустимым. |
group |
При указании имени группы определяет права доступа, предоставляемые дополнительной группе пользователя объекта. Должна включать значение идентификатор_записи_ACL, содержащее имя_группы или идентификатор_группы. Если это значение не представляет собой действительный числовой идентификатор группы (GID) или имя_группы, то тип записи ACL считается недопустимым. |
Права доступа к спискам ACL описаны в следующей таблице.
Таблица 8–2 Права доступа к спискам ACL
Право доступа |
Сокращенное право доступа |
Описание |
---|---|---|
add_file |
w |
Разрешение на добавление нового файла в каталог. |
add_subdirectory |
p |
Разрешение на создание подкаталога в каталоге. |
append_data |
p |
Местозаполнитель. В настоящее время не используется. |
delete |
d |
Разрешение на удаление файла. |
delete_child |
D |
Разрешение на удаление файла или каталога внутри каталога. |
выполнить |
x |
Разрешение на выполнение файла или поиска в содержимом каталога. |
list_directory |
r |
Разрешение на перечисление содержимого каталога. |
read_acl |
c |
Разрешение на чтение списка ACL (команда ls). |
read_attributes |
a |
Разрешение для чтения базовых атрибутов файла (отличных от списков ACL). Базовые атрибуты можно рассматривать как атрибуты на уровне команды "stat". Установка этого бита маски доступа означает, что объект может выполнять команды ls((1) и stat(2). |
read_data |
r |
Разрешение для чтения содержимого файла. |
read_xattr |
R |
Разрешение для чтения расширенных атрибутов файла или поиска в каталоге расширенных атрибутов файла. |
synchronize |
s |
Метка-заполнитель. В настоящее время не используется. |
write_xattr |
W |
Разрешение для создания расширенных атрибутов или записи в каталог расширенных атрибутов. Предоставление пользователю этих разрешений означает возможность создания каталога расширенных атрибутов для файла. Разрешениями для атрибутов файла определяется возможность доступа пользователя к атрибуту. |
write_data |
w |
Разрешение для изменения или замены содержимого файла. |
write_attributes |
A |
Разрешение для изменения данных о времени, связанных с файлом или каталогом, на произвольное значение. |
write_acl |
C |
Разрешение для создания или изменения списков ACL с помощью команды chmod. |
write_owner |
o |
Разрешение для изменения владельца или группы владельца файла. Или возможность выполнения для данного файла команд chown или chgrp . Разрешение для владения файлом или изменения группы владельца файла на группу, в состав которой входит пользователь. Для изменения владельца или группы владельца файла на произвольного пользователя или группу необходимо право PRIV_FILE_CHOWN. |
Цель наследования списков ACL заключается в переносе в новый файл или каталог соответствующих списков ACL с учетом существующих битов разрешений в родительском каталоге
По умолчанию наследование списков ACL не осуществляется. При выборе для каталога нетривиального списка ACL этот ACL не наследуется последующими каталогами. Для файла или каталога необходимо специально задавать наследование списков ACL.
Необязательные флаги наследования описаны в следующей таблице.
Таблица 8–3 Флаги наследования списков ACL
Флаг наследования |
Сокращенное название |
Описание |
---|---|---|
file_inherit |
f |
Наследование файлами каталога только списками ACL из родительского каталога. |
dir_inherit |
d |
Наследование списков ACL в подкаталогах только из родительского каталога. |
inherit_only |
i |
Наследование списков ACL из родительского каталога, но только по отношению к новым файлам или подкаталогам, а не непосредственно к каталогу. Для определения наследуемого списков ACL необходимо установить флаг file_inherit, флаг dir_inherit или оба флага. |
no_propagate |
n |
Наследование списков ACL из родительского каталога содержимым первого уровня каталога, но не второго или последующих уровней. Для определения наследуемых списков ACL необходимо установить флаг file_inherit, флаг dir_inherit или оба флага. |
- |
нет |
Разрешение не предоставляется. |
Кроме того, для файловой системы можно установить политику наследования списков ACL по умолчанию, которая может быть более или менее строгой, в зависимости от свойстваaclinherit файловой системы. Для получения дополнительной информации см. следующий раздел.
В файловой системе ZFS доступны два режима свойств, связанных со списками ACL:
aclinherit – это свойство определяет поведение наследования списков ACL. Допустимы следующие значения:
discard – для новых объектов при создании файла и каталога записи списков ACL не наследуются. ACL для файла или каталога равноценен режиму разрешений, заданному для файла или каталога.
noallow – для новых объектов наследуются только ACL с типом доступа deny.
restricted – при наследовании записи ACL для новых объектов разрешения write_owner и write_acl удаляются.
passthrough – если для свойства установлено значение passthrough, режим создаваемых файлов определяется наследуемыми записями ACE. Если наследуемых записей ACE, влияющих на режим, не существует, устанавливается режим, запрошенный приложением.
passthrough-x – семантика совпадает с таковой для passthrough, за следующим исключением: при включении passthrough-x файлы создаются с полномочиями на исполнение (x), но только если полномочия на исполнение настроены в режиме создания файла и в наследуемом ACE, который воздействует на режим.
По умолчанию для свойства aclinherit задан режим restricted.
aclmode – это свойство модифицирует поведение списков ACL при первоначальном создании файла, а также каждый раз, когда режим файла или каталога изменяется командой chmod. Допустимы следующие значения:
discard – удаляются все записи ACL, за исключением необходимых для определения режима файла или каталога.
groupmask – разрешения пользователя или группы пользователей списков ACL сокращаются таким образом, чтобы они не превышали биты разрешений группы, за исключением случаев, когда идентификатор пользователя в записи совпадает с идентификатором владельца файла или каталога. В последнем случае разрешения списков ACL сокращаются таким образом, чтобы они не превышали биты разрешений владельца.
passthrough – при выполнении операцииchmod записи ACE, отличные от owner@,group@и everyone@ остаются неизменными. Записи ACE, содержащие owner@, group@или everyone@отключаются, чтобы установить режим доступа к файлу согласно параметрам операции chmod.
По умолчанию для свойства aclmode задан режим groupmask.