Чтение и изменение дескрипторов безопасности

Чтение и изменение дескрипторов безопасности

После того как дескриптор безопасности связан с файлом, следующим шагом является определение кода защиты существующего файла и его возможное изменение. Для получения и установления кода защиты файла в терминах дескрипторов безопасности используются следующие функции: 

BOOL GetFileSecurity(LPCTSTR lpFileName, SECURITY_INFORMATION secInfo, PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD cbSd, LPDWORD lpcbLengthNeeded)

BOOL SetFileSecurity(LPCTSTR lpFileName, SECURITY_INFORMATION secInfo, PSECURITY_DESCRIPTOR pSecurityDescriptor) 

Переменная secInfo имеет тип перечисления и принимает значения:

OWNER_SECURITY_INFORMATION

GROUP_SECURITY_INFORMATION

DACL_SECURITY_INFORMATION

SACL_SECURITY_INFORMATION

которые позволяют указать, какую часть дескриптора безопасности необходимо получить или установить. Эти значения могут объединяться при помощи поразрядной операции "или".

Наилучшим способом определения необходимого размера возвращаемого буфера для функции GetFileSecurity является двукратный вызов этой функции. Во время первого вызова значение параметра cbSd может быть задано равным 0. После того как буфер выделен, вызовите эту функцию второй раз. Этот принцип применяется в программе 15.4.

Вряд ли следует подчеркивать тот факт, что для выполнения этих операций требуются соответствующие полномочия. Так, для успешного выполнения функции SetFileSecurity необходимо либо иметь полномочия на уровне WRITE_DAC, либо быть владельцем объекта.

Функции GetSecurityDescriptorOwner и GetSecurityDescriptorGroup позволяют извлекать идентификаторы SID из дескриптора безопасности, полученного при помощи функции GetFileSecurity. Для получения ACL следует воспользоваться функцией GetSecurityDescriptorDacl. 

BOOL GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbDaclPresent, PACL *pAcl, LPBOOL lpbDaclDefaulted) 

Параметры этой функции почти полностью совпадают с параметрами функции GetSecurityDescriptorDacl за исключением того, что возвращаются флаги,указывающие на то, действительно ли представлен разграничительный ACL и был ли он установлен по умолчанию или пользователем.

Чтобы иметь возможность интерпретировать список ACL, необходимо выяснить, сколько элементов АСЕ в нем содержится. 

BOOL GetAclInformation(PACL pAcl, LPVOID pAclInformation, DWORD cbAclInfo, ACL INFORMATION CLASS dwAclInfoClass) 

В большинстве случае параметр информационного класса ACL, dwAclInfoClass, равен AclSizeInformation, а параметр pAclInformation представляет собой структуру типа ACL_SIZE_INFORMATION. Другим возможным значением параметра класса является AclRevisionInformation.

В структуру ACL_SIZE_INFORMATION входят три элемента, наиболее важным из которых является AceCount, который указывает, сколько элементов содержится в списке. Чтобы выяснить, достаточно ли велик размер ACL, проверьте значения элементов AclBytesInUse и AclBytesFree структуры ACL_SIZE_INFORMATION.

Функция GetAce извлекает извлекает АСЕ по заданному индексу. 

BOOL GetAce(PACL pAcl, DWORD dwAceIndex, LPVOID *pAce) 

Для получения определенного элемента АСЕ (их общее количество теперь известно) следует указать его индекс. рАсе указывает на структуру АСЕ, в которой имеется элемент под названием Header, содержащий, в свою очередь, элемент АсеТуре. Для проверки типа можно использовать значения ACCESS_ALLOWED_ACE и ACCESS DENIED АСЕ. 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Центр обеспечения безопасности и компоненты безопасности

Из книги Windows Vista автора Вавилов Сергей

Центр обеспечения безопасности и компоненты безопасности В обеспечении безопасности компьютера участвуют специализированные службы и программы. Важнейшие из них находятся под контролем Центра обеспечения безопасности. Этот компонент Windows отслеживает стабильность


Правило 28: Избегайте возвращения «дескрипторов» внутренних данных

Из книги Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ автора Мейерс Скотт

Правило 28: Избегайте возвращения «дескрипторов» внутренних данных Представим, что вы работаете над приложением, имеющим дело с прямоугольниками. Каждый прямоугольник может быть представлен своим левым верхним углом и правым нижним. Чтобы объект Rectangle оставался


15.8. Передача дескрипторов

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

15.8. Передача дескрипторов Когда мы говорим о передаче открытого дескриптора от одного процесса другому, обычно подразумевается одно из двух:? наследование всех открытых дескрипторов родительского процесса дочерним после вызова fork;? сохранение открытых дескрипторов при


Счетчики дескрипторов процессов

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Счетчики дескрипторов процессов Распространенной ошибкой программистов является пренебрежение закрытием дескрипторов после того, как необходимость в них отпала; это может стать причиной утечки ресурсов, что, в свою очередь, может приводить к снижению


Дублирование дескрипторов

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Дублирование дескрипторов Родительскому и дочернему процессам может требоваться различный доступ к объекту, идентифицируемому дескриптором, который наследует дочерний процесс. Кроме того, процессу вместо псевдодескриптора, получаемого с помощью функции GetModuleFileName или


Общий обзор средств безопасности: дескриптор безопасности

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Общий обзор средств безопасности: дескриптор безопасности Анализ дескриптора безопасности предоставляет хорошую возможность для общего ознакомления с наиболее важными элементами системы безопасности Windows. В этом разделе речь будет идти о самых различных элементах


11.5.3. Дублирование файловых дескрипторов

Из книги Linux программирование в примерах автора Роббинс Арнольд

11.5.3. Дублирование файловых дескрипторов Иногда процессам требуется создать новый файловый дескриптор, который ссылается на ранее открытый файл. Командные оболочки используют эту функциональность для перенаправления стандартного ввода, вывода и потока ошибок по


22.3.7. Закрытие файловых дескрипторов

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

22.3.7. Закрытие файловых дескрипторов В системах Linux и Unix файловые дескрипторы, как правило, наследуются через системные вызовы exec() (и всегда наследуются через fork() и vfork()). В большинстве случаев такое поведение нежелательно, поскольку только разделяться должны только stdin,


9.6.2.2. Переопределение дескрипторов (handle)

Из книги Безопасность информационных систем. Учебное пособие автора Погонышева Дина Алексеевна

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


9.1.1.2. Разделение дескрипторов файлов

Из книги автора

9.1.1.2. Разделение дескрипторов файлов Атрибуты, которые порожденный процесс наследует от родителя, устанавливаются в те же значения, которые были в родительском процессе в момент выполнения fork(). Однако, с этого момента два процесса продолжают идти собственными путями


9.1.1.3. Разделение дескрипторов файлов и close()

Из книги автора

9.1.1.3. Разделение дескрипторов файлов и close() Тот факт, что несколько дескрипторов файлов могут указывать на один и тот же открытый файл, имеет важное следствие: файл не закрывается до тех пор, пока не будут закрыты все дескрипторы файла.Позже в главе мы увидим, что несколько


Максимальное число дескрипторов для функции select

Из книги автора

Максимальное число дескрипторов для функции select Ранее мы сказали, что большинство приложений не используют много дескрипторов. Например, редко можно найти приложение, использующее сотни дескрипторов. Но такие приложения существуют, и часто они используют функцию select


15.7. Передача дескрипторов

Из книги автора

15.7. Передача дескрипторов Когда нам требуется передать дескриптор от одного процесса другому, обычно мы выбираем одно из двух решений:1. Дочерний процесс использует все открытые дескрипторы совместно с родительским процессом после вызова функции fork.2. Все дескрипторы


5.2. Место информационной безопасности экономических систем в национальной безопасности страны

Из книги автора

5.2. Место информационной безопасности экономических систем в национальной безопасности страны В современном мире информационная безопасность становится жизненно необходимым условием обеспечения интересов человека, общества и государства и важнейшим, стержневым,