Поделиться через


Автоматическое распространение наследуемых acEs

Функции setNamedSecurityInfoи SetSecurityInfo поддерживают автоматическое распространение наследуемых записей управления доступом (ACEs). Например, если эти функции используются для добавления наследуемого ACE в каталог в NTFS, система применяет ACE в соответствии с списками управления доступом (ACL) любых существующих подкаталогов или файлов.

Непосредственно примененные службы управления доступом имеют приоритет над унаследованными acEs. Система реализует этот приоритет путем размещения непосредственно примененных acEs перед унаследованными acEs в списке управления доступом (DACL). При вызове функции SetNamedSecurityInfo и SetSecurityInfo для задания сведений о безопасности объекта система вводит текущую модель наследования для списков управления всеми объектами в иерархии под целевым объектом. Для объектов, преобразованных в текущую модель наследования, SE_DACL_AUTO_INHERITED и SE_SACL_AUTO_INHERITED биты задаются в поле управления дескриптора безопасности объекта.

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

В системе используются следующие правила при распространении унаследованных acES на дочерние объекты:

  • Если дочерний объект без DACL наследует ACE, результатом является дочерний объект с DACL, который содержит только унаследованный ACE.
  • Если дочерний объект с пустым DACL наследует ACE, результатом является дочерний объект с DACL, который содержит только унаследованный ACE.
  • Если удалить наследуемый ACE из родительского объекта, автоматическое наследование удаляет все копии ACE, унаследованные дочерними объектами.
  • Если автоматическое наследование приводит к удалению всех acCL из DACL дочернего объекта, дочерний объект имеет пустой DACL, а не DACL.

Эти правила могут иметь неожиданный результат преобразования объекта без DACL в объект с пустым DACL. Объект без DACL разрешает полный доступ, но объект с пустым DACL не разрешает доступ. В качестве примера того, как эти правила могут создать пустой DACL, предположим, что вы добавляете наследуемый ACE в корневой объект дерева объектов. Автоматическое наследование распространяет наследуемый ACE ко всем объектам в дереве. Дочерние объекты, запущенные без DACL, теперь имеют DACL с унаследованным ACE. При удалении наследуемого ACE из корневого объекта система автоматически распространяет изменения на дочерние объекты. Дочерние объекты, запущенные без DACL (разрешая полный доступ), теперь имеют пустой DACL (не разрешая доступ).

Чтобы убедиться, что дочерний объект без DACL не влияет на наследуемые acEs, установите флаг SE_DACL_PROTECTED в дескрипторе безопасности объекта.

Сведения о том, как правильно создать DACL, см. в созданииDACL.