
- •Навчальні та виховні цілі:
- •1. Функції для роботи з привілеями
- •1.1. Ініціалізація локального ідентифікатора
- •1.2. Отримання локального ідентифікатора і імені привілею
- •1.3. Отримання імені привілею для відображення
- •2. Робота з маркерами доступу
- •2.1. Відкриття маркера доступу процесу
- •2.3. Структури, використовувані для роботи з маркером доступу
- •2.4. Отримання інформації з маркера доступу
- •2.5. Зміна інформації в маркері доступу
- •2.6. Налаштування привілеїв
- •2.7. Налаштування груп
- •2.8. Створення маркера обмеженого доступу
2.5. Зміна інформації в маркері доступу
Для зміни в маркері доступу інформації, використовуваної в алгоритмі для задавання за умовчанням атрибутів безпеки нового об'єкту, застосовується функція SetTokenInformation, яка має наступний прототип:
BOOL SetTokenInformation(
HANDLE TokenHandle, // дескриптор маркера доступу
TOKEN_INFORMATION_CLASS TokenInformationClass, // тип інформації
LPVOID TokenInformation, // покажчик на буфер з інформацією
DWORD TokenInformationLength // довжина буфера з інформацією
);
В разі вдалого завершення функція поверне ненульове значення, а в разі невдачі — FALSE. Код помилки в разі невдалого завершення функції можна отримати за допомогою виклику функції GetLastError. Параметри функції SetTokenInformation мають наступне призначення.
Параметр TokenHandle повинен містити дескриптор маркера доступу, з якого витягується інформація. Причому цей маркер доступу має бути відкритий в режимі token_adjust_default.
Параметр TokenInformationClass повинен містити одне із значень переліку типу token_information_class, яке вказує, яку інформацію в маркері доступу змінює функція. При використанні функції SetTokenInformation в цьому параметрі можуть бути встановлені тільки наступні константи:
- TokenOwner — інформація про власника об'єкту за умовчанням;
- TokenPrimaryGroup — інформація про первинну групу власника об'єкту за умовчанням;
- TokenDefaultDacl — інформація про список DACL об'єкту за умовчанням.
Параметр TokenInformation повинен указувати на буфер з інформацією, яка буде встановлена в маркер доступу. Залежно від значення, заданого параметром TokenInformationClass, інформація в буфері повинна зберігатися в структурі одного з наступних типів:
- TokenPrimaryGroup — TOKEN_PRIMARY_GROUP;
- TokenDefaultDacl — TOKEN_DEFAULT_DACL;
- TokenSource — TOKEN_SOURCE.
Параметр TokenInformationLength повинен містити довжину буфера, на який вказує параметр TokenInformation.
У лістингу 7.3.6 (Додаток А) приведена програма, в якій функція SetTokenInformation змінює ідентифікатор безпеки власника об'єкту, який використовується в алгоритмі установки власника нового об'єкту за умовчанням.
2.6. Налаштування привілеїв
Тепер розглянемо, як налаштовувати привілеї в маркері доступу. Взагалі привілеї даються користувачеві при реєстрації цього користувача в системі. Кожен користувач має свій набір привілеїв, деякі з яких можуть бути встановлені або дійсні, а деякі — скинуті або відмінені. Маркер доступу отримує свій набір привілеїв з облікового запису користувача, який є джерелом створення даного маркера доступу. Додати нові або видалити існуючі привілеї в маркері доступу неможливо. Можна тільки зробити привілей дійсним або відміненим. Тобто, іншими словами, встановити або скинути привілей відповідно. Назвемо таку роботу з привілеями налаштуванням привілеїв в маркері доступу.
Для налаштування привілеїв, доступних в маркері доступу, використовується функція AdjustTokenPrivileges, яка має наступний прототип:
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // дескриптор маркера доступу
BOOL DisableAllPrivileges, // прапор скидання всіх привілеїв
PTOKEN_PRIVILEGES NewState, // новий стан привілеїв
DWORD BufferLength, // довжина буфера PreviousState
PTOKEN_PRIVILEGES PreviousState, // старий стан привілеїв
PDWORD ReturnLength // необхідна довжина буфера PreviousState
);
В разі вдалого завершення функція поверне ненульове значення, а в разі невдачі — FALSE. Код помилки в разі невдалого завершення функції можна отримати за допомогою виклику функції GetLastError. Параметри функції AdjustTokenPrivileges мають наступне призначення.
Параметр TokenHandle повинен містити дескриптор маркера доступу, в якому налаштовуються привілеї. Причому маркер доступу має бути відкритий в режимі token_adjust_privileges.
У параметрі DisabieAiiPriviieges має бути встановлене одне із значень: FALSE або TRUE. Якщо встановлено значення FALSE, то функція налаштовує привілеї відповідно до інформації, заданої параметром NewState. Якщо ж в цьому параметрі встановлено значення TRUE, то функція відміняє всі привілеї в заданому маркері доступу.
Параметр NewState повинен вказувати на структуру типу token_privileges, яка містить привілеї і нові стани для кожного з перерахованих привілеїв. Якщо для привілею встановлений прапор se_privilege_enabled, то привілей стає дійсним, інакше — привілей відміняється.
Параметр BufferLength повинен містити розмір буфера пам'яті, на який вказує параметр PreviousState. Якщо в PreviousState встановлено значення NULL, то в цьому параметрі може бути встановлене значення 0.
Параметр PreviousState повинен вказувати на буфер, в який функція запише структуру типа token_privileges. Ця структура міститиме попередній стан привілеїв маркера доступу. У цьому параметрі може бути встановлене значення NULL. В цьому випадку функція не поверне попередній стан привілеїв маркера доступу. Якщо довжина буфера недостатня для запису попереднього стану привілеїв, то функція закінчиться невдачею, а необхідна довжина буфера буде записана в змінну, на яку указує параметр ReturnLength. При цьому відмітимо, що попередній стан привілеїв маркера доступу використовується для відновлення привілеїв в первинний стан.
Параметр ReturnLength повинен вказувати на змінну типу PDWORD, в яку функція запише необхідний розмір буфера для попереднього стану привілеїв маркера доступу, якщо розмір, заданий параметром BufferLength, менше за необхідний. Якщо в параметрі PreviousState встановлено значення NULL, то в цьому параметрі також може бути встановлене значення NULL.