Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_drsp_04.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
136 Кб
Скачать
☆

2. Структура ідентифікатора безпеки

Як було вже сказано в пункті 1, ідентифікатор безпеки (SID) є бінарним представленням облікового запису, яке використовується операційною системою для управління доступом до об'єктів. У операційних системах Windows ідентифікатори безпеки представляються структурою наступного типу :

typedef struct _SID {

BYTE Revision; // версія SID

BYTE SubAuthorityCount; // кількість відносних ідентифікаторів

SID_IDENTIFIER_AUTHORITY IdentifierAuthority; // авторизація

DWORD SubAuthority[ANYSIZE_ARRAY];

// // відносні ідентифікатори

} SID;

Звідси видно, що структура sid має змінну довжину, яка залежить від кількості відносних ідентифікаторів облікового запису.

Ідентифікатор безпеки повинен містити ідентифікатор облікового запису, який зберігається в поле IdentifierAuthority і, принаймні, один othoсительный ідентифікатор облікового запису.

Ідентифікатор облікового запису, який визначає її рівень авторизації або, іншими словами, приналежність облікового запису якійсь безлічі облікових записів, задається структурою типу :

typedef struct _SID_IDENTIFIER_AUTHORITY {

BYTE Value[6]; // значення ідентифікатора облікового запису

} SID.IDENTIFIER.AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;

Наприклад, ідентифікатор безпеки, що вказує на локальний рівень авторизації, визначається таким чином:

##define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2}

У операційних системах Windows зумовлені наступні ідентифікатори безпеки :

  • SECURITY_NULL_SID_AUTHORITY - 0;

  • SECURITY_WORLD_SID_AUTHORITY - 1;

  • SECURITY_LOCAL_SID_AUTHORITY - 2;

  • SECURITY_CREATOR_SID_AUTHORITY - 3;

  • SECURITY_NON_UNIQUE_AUTHORITY - 4;

  • SECURITY_NT_AUTHORITY - 5.

Кожен з них, природно, визначається як масив байт.

3. Створення ідентифікатора безпеки

Для визначення довжини буфера пам'яті, який буде потрібно для створення Ідентифікатора безпеки, використовується функція GetSidLengthRequired, яка має наступний прототип, :

DWORD GetSidLengthRequired(

UCHAR nSubAuthorityCount // кількість відносних ідентифікаторів

);

Єдиний параметр цієї функції повинен містити кількість відносних ідентифікаторів, які передбачається записати в ідентифікатор безпеки. Функція GetSidLengthRequired завжди успішно завершує свою роботу і повертає кількість байт, потрібних для зберігання ідентифікатора безпеки. Приклад використання функції GetSidLengthRequired буде наведений далі, в програмі з лістингу 1, яка ініціалізувала ідентифікатор безпеки за допомогою функції InitializeSid.

Для ініціалізації ідентифікатора безпеки використовується функція InitializeSid, яка має наступний прототип, :

BOOL InitializeSid(

PSID pSid, // покажчик на ідентифікатор безпеки

// // покажчик на ідентифікатор облікового запису

PSID_IDENTIFIER_AUTHORITY pldent i f ierAuthori ty,

BYTE nSubAuthorityCount // кількість відносних ідентифікаторів

);

Параметр psid повинен вказувати на структуру типу sid, яка ініціалізується. Пам'ять під структуру має бути зарезервована зухвалою програмою. Параметр pidentifierAuthority повинен вказувати на структуру типу sid_identifier_authority, яка визначає ідентифікатор облікового запису. Значення, задане в цій структурі, буде записано в ідентифікатор безпеки, на який вказує параметр psid. Параметр nSubAuthorityCount повинен вказувати на кількість відносних ідентифікаторів облікового запису, які будуть записані в ідентифікатор безпеки, відповідний цьому обліковому запису. Функція InitializeSid записує це значення в ідентифікатор безпеки. Самі значення відносних ідентифікаторів мають бути записані в ідентифікатор безпеки окремо. Для цього може використовуватися функція GetSidSubAuthority.

Для визначення адреси відносного ідентифікатора облікового запису В ідентифікаторі безпеки використовується функція GetSidSubAuthority, яка має наступний прототип, :

PDWORD GetSidSubAuthority(

PSID pSid, // покажчик на ідентифікатор безпеки

DWORD nSubAuthority // номер відносного ідентифікатора

);

Параметри функції GetSidSubAuthority мають наступне призначення. Параметр psid повинен вказувати на структуру типу sid, в якій визначатиметься адреса відносного ідентифікатора безпеки. Параметр nSubAuthorityCount повинен вказувати на номер відносного ідентифікатора, адреса якого визначатиметься.

Для перевірки того, чи правильно в створеному ідентифікаторі безпеки встановлена версія і чи не виходить кількість відносних ідентифікаторів за допустимі межі, використовується функція isvaiidsid, яка має наступний прототип:

BOOL IsValidSid(

PSID pSid // покажчик на ідентифікатор безпеки

);

У лістингу 1 приведена програма, в якій ініціалізувався ідентифікатор безпеки, використовуючи функцію initiaiizesid. Причому заздалегідь за допомогою функції GetSidLengthRequired Визначається довжина ідентифікатора безпеки. Після ініціалізації ідентифікатора безпеки за допомогою функції GetSidSubAuthority визначається індекс відносного ідентифікатора, після чого встановлюється його значення. Потім перевіряється правильність ідентифікатора безпеки за допомогою виклику функції IsValidSid.

Лістинг 1. Ініціалізація ідентифікатора безпеки

##include <stdio.h>

##include <windows.h>

int main()

{

DWORD dwSidLength; // довжина пам'яті для SID

SID *pSid = NULL; // покажчик на SID

// // покажчик на відносний ідентифікатор облікового запису

DWORD *pSubAuthority = NULL;

// // ідентифікатор облікового запису

SID_IDENTIFIER_AUTHORITY sia = SECURITY_LOCAL_SID_AUTHORITY;

// // определеем довжину SID з одним відносним ідентифікатором облікового запису

dwSidLength = GetSidLengthRequired(1);

printf("SID length: %u\n", dwSidLength);

// // захоплюємо пам'ять під SID

pSid = (SID*) new UCHAR[dwSidLength];

// // ініціалізували SID

if(!InitializeSid(

pSid, // покажчик на SID

& &sia, // ідентифікатор облікового запису

1)) // кількість відносних ідентифікаторів

{

printf( "Initialized SID failed.\n");

return 1;

}

printf("SID is initialized.\n");

// // визначуваний покажчик на відносний ідентифікатор

pSubAuthority = GetSidSubAuthority(pSid, 0);

// // встановлюємо значення відносного ідентифікатора

* *pSubAuthority = SECURITY_LOCAL_RID;

// // перевіряємо достовірність SID

if(!IsValidSid(pSid))

{

printf( "The SID is not valid.\n");

return 1;

}

printf("The SID is valid.\n");

// // звільняємо SID

delete[] pSid;

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]