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


Список управления доступом

Список управления доступом (ACL) — это список записей управления доступом ( ACEs), созданных операционной системой для управления поведением безопасности, связанным с определенным (защищенным) объектом определенного типа. В Windows есть два типа ACL:

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

  • Системный список ACL — это перечень из нуля или более ACEs, описывающих политику аудита и сигнализации для защищенного объекта.

Термин "дискреционный" относится к различиям между обязательным и дискреционным контролем. В среде, в которой используются обязательные элементы управления, владелец объекта может не предоставить доступ к объекту. В дискреционной среде, например Windows, владелец объекта может предоставить такой доступ. Обязательные элементы управления обычно связаны с жесткими средами безопасности, такими как использование секционной безопасности, где система должна предотвратить раскрытие конфиденциальной информации между пользователями в одной системе.

Драйвер, создающий ACL, выполняет несколько ключевых действий.

  1. Выделите хранилище для ACL.

  2. Инициализируйте ACL.

  3. Добавьте ноль (или более) 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, но оно относится к конкретному механизму, который монитор ссылок на безопасность использует для определения того, следует ли предоставить или запретить доступ.