Дескриптор безопасности
Дескриптор безопасности (англ. security descriptor) — это структура данных в операционных системах семейства Windows, содержащая информацию о безопасности объекта (например, файла, папки, процесса, раздела реестра, именованного канала). Дескриптор безопасности определяет, кто и какие действия может выполнять с объектом, а также какие события аудита должны регистрироваться при попытках доступа. Он является основным элементом дискреционной модели управления доступом (DAC) и системой обязательного контроля целостности (IL) в Windows.
Структура дескриптора безопасности
Дескриптор безопасности состоит из нескольких ключевых полей, которые могут быть представлены как в двоичном, так и в текстовом формате (например, в строке Security Descriptor Definition Language — SDDL).
Основные компоненты
- Revision (версия): Указывает версию структуры дескриптора. В современных системах Windows (начиная с Windows 2000) используется версия 1.
- Sbz1 (резервное поле): Зарезервированное поле, обычно равно нулю.
- Control (флаги управления): Набор битовых флагов, описывающих свойства дескриптора. Ключевые флаги включают:
SE_OWNER_DEFAULTED: Указывает, что владелец был установлен по умолчанию, а не явно задан.SE_GROUP_DEFAULTED: Аналогично для группы.SE_DACL_PRESENT: Указывает, что в дескрипторе присутствует дискреционный список управления доступом (DACL).SE_DACL_DEFAULTED: DACL был установлен по умолчанию.SE_SACL_PRESENT: Указывает на наличие системного списка управления доступом (SACL) для аудита.SE_SACL_DEFAULTED: SACL был установлен по умолчанию.SE_SELF_RELATIVE: Указывает, что дескриптор хранится в «самоотносительном» формате (все компоненты расположены последовательно в одном блоке памяти). Если флаг не установлен, дескриптор является «абсолютным» (содержит указатели на отдельные блоки памяти).SE_DACL_PROTECTED: Запрещает наследование записей DACL от родительского объекта.SE_SACL_PROTECTED: Запрещает наследование записей SACL.SE_DACL_AUTO_INHERIT_REQ: Указывает, что DACL должен быть автоматически унаследован от родительского объекта.SE_SACL_AUTO_INHERIT_REQ: Аналогично для SACL.SE_DACL_AUTO_INHERITED: Указывает, что DACL был автоматически унаследован от родительского объекта.SE_SACL_AUTO_INHERITED: Аналогично для SACL.
- Owner (владелец): Идентификатор безопасности (SID) пользователя или группы, которые являются владельцем объекта. Владелец имеет неотъемлемое право изменять дескриптор безопасности объекта, даже если ему явно запрещён доступ по DACL.
- Group (группа): SID первичной группы владельца. Используется в основном в системах POSIX, но поддерживается в Windows для совместимости.
- DACL (Discretionary Access Control List): Дискреционный список управления доступом. Содержит список записей управления доступом (ACE), которые явно разрешают или запрещают доступ определённым субъектам (пользователям или группам). Если DACL отсутствует (флаг
SE_DACL_PRESENTне установлен), объект считается незащищённым, и любой субъект имеет полный доступ. Если DACL присутствует, но пуст, доступ запрещён всем субъектам. - SACL (System Access Control List): Системный список управления доступом. Содержит записи ACE, которые определяют, какие попытки доступа (успешные или неудачные) должны регистрироваться в журнале безопасности (аудит). SACL также может использоваться для реализации политик обязательного контроля целостности (например, метки низкого, среднего, высокого или системного уровня целостности).
Форматы представления
- Бинарный (двоичный): Используется ядром Windows для хранения в памяти и на диске (например, в метаданных файловой системы NTFS).
- Текстовый (SDDL): Строковое представление, используемое для передачи дескрипторов между процессами, в скриптах PowerShell, в реестре и в некоторых API. Пример SDDL для файла:
O:BAG:SYD:(A;;FA;;;BA)(владелец — Built-in Administrators, группа — SYSTEM, DACL разрешает полный доступ администраторам).
История и развитие
Концепция дескриптора безопасности была введена в Windows NT 3.1 (1993 год) и с тех пор является основой модели безопасности Windows. В Windows 2000 была добавлена поддержка наследования DACL и SACL, а также введён формат SDDL. В Windows Vista (2006) была добавлена поддержка обязательных меток целостности (Integrity Levels), которые хранятся в SACL. В последующих версиях Windows (7, 8, 10, 11) механизм управления дескрипторами безопасности был расширен для поддержки новых типов объектов (например, контейнеров приложений UWP, виртуальных машин Hyper-V) и более сложных политик аудита.
Применение
Управление доступом к объектам
Основное назначение дескриптора безопасности — контроль доступа. Когда процесс пытается выполнить операцию (например, открыть файл для чтения), система безопасности Windows (Security Reference Monitor — SRM) выполняет следующие шаги:
- Извлекает дескриптор безопасности объекта.
- Определяет SID субъекта (пользователя и групп, в которых он состоит).
- Проверяет, предоставлены ли субъекту необходимые права доступа согласно DACL. Проверка производится путём последовательного просмотра записей ACE до тех пор, пока не будет найдена явно разрешающая или запрещающая запись. Если запрещающая запись найдена первой, доступ запрещается (принцип «запрет имеет приоритет»).
- Если доступ разрешён, система проверяет, не требуется ли аудит данной операции (согласно SACL).
- Если доступ запрещён, процесс получает код ошибки
ACCESS_DENIED.
Аудит безопасности
SACL позволяет администраторам настроить аудит попыток доступа к объекту. Например, можно настроить аудит всех неудачных попыток чтения конфиденциального файла. Записи аудита записываются в журнал безопасности Windows (Event Log — Security).
Контроль целостности
Начиная с Windows Vista, SACL используется для хранения метки целостности (Integrity Level) объекта. Метка целостности определяет уровень доверия к объекту. Процесс с низким уровнем целостности (например, Internet Explorer в защищённом режиме) не может изменять объекты с более высоким уровнем целостности, даже если DACL явно разрешает запись. Это обеспечивает дополнительный уровень защиты от вредоносного ПО.
Примеры использования
В файловой системе NTFS
Каждый файл и папка на томе NTFS имеет дескриптор безопасности, который хранится в атрибуте $SECURITY_DESCRIPTOR. При создании файла дескриптор наследуется от родительской папки (если не установлен флаг SE_DACL_PROTECTED). Пользователь может просмотреть и изменить дескриптор через вкладку «Безопасность» в свойствах файла.
В реестре Windows
Каждый ключ реестра также имеет дескриптор безопасности. Это позволяет администраторам ограничивать доступ к критическим разделам реестра (например, HKEY_LOCAL_MACHINE\SYSTEM).
В объектах ядра
Дескрипторы безопасности используются для защиты объектов ядра, таких как процессы, потоки, семафоры, мьютексы, события, именованные каналы и разделяемая память. Например, процесс может быть защищён от открытия другим процессом, если его дескриптор не предоставляет соответствующих прав.
В PowerShell
Командлеты Get-Acl и Set-Acl позволяют получать и изменять дескрипторы безопасности объектов. Пример: ``powershell $acl = Get-Acl -Path "C:\MyFolder" $acl | Format-List ``
Критика и ограничения
- Сложность: Дескрипторы безопасности, особенно с большим количеством ACE, могут быть сложны для понимания и отладки. Неправильная настройка DACL может привести к непреднамеренному раскрытию данных или блокировке доступа.
- Производительность: Проверка доступа при каждом обращении к объекту требует вычислительных ресурсов, особенно при большом количестве ACE. Влияние на производительность обычно незначительно, но может быть заметно на высоконагруженных серверах.
- Наследование: Механизм наследования DACL может приводить к неожиданным результатам, если родительские объекты имеют сложную структуру. Например, изменение DACL родительской папки может автоматически изменить доступ ко всем вложенным файлам.
- Отсутствие поддержки в некоторых файловых системах: Файловые системы, отличные от NTFS (например, FAT32, exFAT), не поддерживают дескрипторы безопасности. При копировании файлов между разделами NTFS и FAT32 дескрипторы теряются.
Источники
- Microsoft Docs. «Security Descriptors». Windows App Development.
- Microsoft Docs. «Security Descriptor Definition Language (SDDL)». Windows App Development.
- Solomon, D. A., & Russinovich, M. E. (2005). Windows Internals: Covering Windows Server 2003, Windows XP, and Windows 2000 (4th ed.). Microsoft Press.
- Russinovich, M. E., & Solomon, D. A. (2009). Windows Internals: Covering Windows Server 2008 and Windows Vista (5th ed.). Microsoft Press.
- Microsoft Docs. «Access Control Lists (ACLs)». Windows App Development.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →