Powershell. Назначение ACL

Давайте разберемся в том, как назначать ACL, то есть права доступа к файловым ресурсам, средствами Powershell

Немного теории

В ходе статьи будут использоваться такие понятия как ACL и ACE, поэтому для начала давайте разберемся что они из себя представляют и чем отличаются друг от друга.

ACL(Access Control List) — представляет собой таблицу, которая определяет права доступа к объектам файловой системы. Включает в себя записи ACE.

ACE(Access Control Entries) — представляет собой запись, входящую в таблицу ACL, которая сопоставляет пользователя и его права доступа к объекту, включая параметры наследования доступа.

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

Назначение прав
# Считываем текущие параметры ACL для нашей папки
$acl = Get-Acl C:\temp\Test
# Посмотрим полученный ACL
$acl | fl *

# Создаем набор разрешений, который мы назначим папке
$permission = “user1”,”fullcontrol”,”containerinherit,objectinherit”,”none”,”allow”

# Смотрим текущие ACE
$acl.Access

# Создаем новый объект ACE на основе ранее записанных разрешений
$ace = new-object security.accesscontrol.filesystemaccessrule $permission

# Вносим сделанные изменения в исходный ACL
$acl.setaccessrule($ace)
# Назначаем ACL на выбранную папку
$acl | set-acl C:\temp\Test
Подробней про ACE

Посмотрим на примере записи ACE имеющийся по умолчанию у всех объектов ФС

Какими бывают параметры ACE и принимаемые ими значения:

FileSystemRights — Уровень доступа
Принимает большое количество параметров. Можете ознакомиться тут.
Чаще всего встречаются «FullControl» либо «ReadAndExecute, Synchronize»

AccessControlType — Назначаемый тип доступа:

  • Принимает значения Allow либо Deny

IdentityReference — определяет для какого пользователя или группы применяется ACE.

IsInherited — Указывает на то, была ли получена данная ACE запись от родительского объекта.
Соответствует графе в GUI «Унаследовано от\Inherited from»

  • Принимает значения True либо False
В скобках укажу краткое название параметров. Их вы можете встретить как при работе с ACL в PoSH, так и при работе к icacls в CMD

PropagationFlags — Имеется только у папок. Доступны следующие значения:

  • InheritOnly (IO) — указывает что ACE распространяется только на дочерние объекты(исключая текущую папку), к которым могут относится как файлы так и папки.
    В GUI соответствует всем пунктам выпадающего меню которые не включают текущую папку( для параметра «Применяется к:»)
  • NoPropagateInherit (NP) — обозначает что наследование не распространяется на дочерние объекты. В документации заявлено что данный флаг «Указывает, что ACE не распространяется на дочерние объекты»
    На самом деле полное отключение наследования дает только использование области применения «Только эта папка».
    А флаг NoPropagateInherit в свою очередь ограничивает глубину наследования только одним уровнем — то есть наследование ACE распространяется только на дочерние объекты, исключая более низкие уровни(grandchild objects)
    Соответствует чекбоксу GUI «Применять эти разрешения к объектам и контейнерам только внутри этого контейнера«
  • Недоступен в GUI, если значение параметра InheritOnly установлен как This folder only\Только для этой папки

InheritanceFlags — Так же имеется только у папок.
Определяет  для каких типов объектов будут наследоваться разрешения от текущего объекта к дочерним.
Соответствует значению GUI «Применяется к\Applies to»

Принимает значения:

  • ContainerInherit (CI) — наследование только для папок
  • ObjectInherit (OI) — наследование только для файлов

Так же приведу таблицу с комбинациями всех флагов

Комбинация флагов => Результат наследования
===========================================
No Flags => Target folder.
ObjectInherit => Target folder, child object (file), grandchild object (file).
ObjectInherit and NoPropagateInherit => Target folder, child object (file).
ObjectInherit and InheritOnly => Child object (file), grandchild object (file).
ObjectInherit, InheritOnly, and NoPropagateInherit => Child object (file).
ContainerInherit => Target folder, child folder, grandchild folder.
ContainerInherit, and NoPropagateInherit => Target folder, child folder.
ContainerInherit, and InheritOnly => Child folder, grandchild folder.
ContainerInherit, InheritOnly, and NoPropagateInherit => Child folder.
ContainerInherit, and ObjectInherit => Target folder, child folder, child object (file), grandchild folder, grandchild object (file).
ContainerInherit, ObjectInherit, and NoPropagateInherit => Target folder, child folder, child object (file).
ContainerInherit, ObjectInherit, and InheritOnly => Child folder, child object (file), grandchild folder, grandchild object (file).
ContainerInherit, ObjectInherit, NoPropagateInherit, InheritOnly => Child folder, child object (file).
Не перевожу название областей применения наследования, потому что не знаю как адекватно перевести Grandchild Object.
Но по смыслу понятно что это любые объекты с глубиной наследования больше чем 1 уровень
В итоге

Вот и все!
На первый взгляд немного заумно, но в реальности ничего сложного:

  • получили исходные ACL
  • указали ACE которые нужно заменить
  • назначили обновленный ACL на исходный объект

Добавить комментарий

Ваш адрес email не будет опубликован.