Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Список управления доступом (ACL) — это список записей управления доступом ( ACEs), созданных операционной системой для управления поведением безопасности, связанным с определенным (защищенным) объектом определенного типа. В Windows есть два типа ACL:
Дискреционный список контроля доступа (ACL) — это список нулевых строк или больше элементов управления доступом (ACE), описывающих права доступа для защищенного объекта. Этот доступ является дискреционным, потому что он осуществляется по усмотрению владельца или любого пользователя с соответствующими правами.
Системный список ACL — это перечень из нуля или более ACEs, описывающих политику аудита и сигнализации для защищенного объекта.
Термин "дискреционный" относится к различиям между обязательным и дискреционным контролем. В среде, в которой используются обязательные элементы управления, владелец объекта может не предоставить доступ к объекту. В дискреционной среде, например Windows, владелец объекта может предоставить такой доступ. Обязательные элементы управления обычно связаны с жесткими средами безопасности, такими как использование секционной безопасности, где система должна предотвратить раскрытие конфиденциальной информации между пользователями в одной системе.
Драйвер, создающий ACL, выполняет несколько ключевых действий.
Выделите хранилище для ACL.
Инициализируйте ACL.
Добавьте ноль (или более) ACEs в ACL.
В следующих примерах кода показано, как создать ACL:
dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
if (!dacl) {
return;
}
status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
Предыдущий фрагмент кода создает пустой ACL. В примере кода выделяется значительный объем памяти, так как мы не знаем размер, необходимый для ACL.
На этом этапе ACL пуст, так как у него нет записей ACE. Пустой ACL запрещает доступ любому пользователю, пытающемуся получить доступ к объекту, так как отсутствуют записи, предоставляющие такой доступ. Следующий фрагмент кода добавляет ACE в этот ACL:
status = RtlAddAccessAllowedAce(dacl, ACL_REVISION, FILE_ALL_ACCESS, SeExports->SeWorldSid);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
Добавленный ACE предоставляет доступ любой сущности, обращающейся к объекту, что и является целью идентификатора безопасности доступа мира (SeWorldSid). Обычно этот идентификатор безопасности представлен как "Все" в других системных служебных программах Windows.
При создании списков контроля доступа важно разместить записи ACE с запретом доступа в начале ACL и записи ACE с разрешением доступа в конце ACL. Этот порядок важен. В противном случае монитор ссылок безопасности предоставит доступ, если он находит ACE, разрешающий доступ, до ACE, запрещающего доступ, при оценке ACL. Это поведение хорошо задокументировано в пакете SDK для Microsoft Windows, но оно относится к конкретному механизму, который монитор ссылок на безопасность использует для определения того, следует ли предоставить или запретить доступ.