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


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

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

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

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

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

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

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

  2. Инициализация ACL.

  3. Добавьте к списку 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 при оценке ACL. Это поведение хорошо задокументировано в пакете SDK для Microsoft Windows, но оно относится к конкретному механизму, который монитор ссылок на безопасность использует для определения того, следует ли предоставить или запретить доступ.