Ідентифікатор безпеки
Ідентифікатор безпеки (англ. Security Identifier, SID) в операційних системах Windows) — це унікальний незмінний ідентифікатор користувача, групи користувачів або інших захищених елементів. Захищений елемент має один SID протягом всього циклу існування, і всі властивості цього елемента, включаючи його назву (ім'я), пов'язані з SID. Такий підхід дозволяє, зокрема, перейменовувати елементи без впливу на атрибути безпеки об'єктів, які відносяться до нього.
Windows використовує SID для ідентифікації машин та всіх інших об'єктів системи безпеки: облікових записів домену, користувачів і груп. Імена таких об'єктів є лише зрозумілішими для користувачів формами подання SID.
Структура ідентифікатора безпеки
SID складається з 48-розрядного значення, за яким іде кілька 32-розрядних компонентів. Як правило, SID подають у форматі S-R-I-s-s... (див. таблицю).
S | Літера "S", яка означає, що послідовність чисел є ідентифікатором безпеки |
---|---|
R | Число, яке показує номер версії SID |
I | 48-розрядне число, яке представляє уповноважений орган, що видав SID |
s | 32-розрядне число, яке представляє уповноважений орган нижнього рівня. Це значення називають також відносним ідентифікатором (relative identifier, RID).
SID може містити довільну кількість уповноважених органів нижнього рівня |
Від початку використання захисту на основі ідентифікаторів безпеки номер версії структур SID дорівнює 1. Ідентифікатор уповноваженого органу показує, ким саме було створено SID, тобто хто володіє та керує обліковим записом, який пов’язаний з SID. Уповноважений орган представляють 48-бітовим числом, яке у Delphi (див. модуль Windows.pas) оголошено так[1]:
_SID_IDENTIFIER_AUTHORITY = record Value: array[0..5] of Byte; end; TSIDIdentifierAuthority = _SID_IDENTIFIER_AUTHORITY;
Уповноважені органи, які видають SID
Частково перелік уповноважених органів наведено у таблиці:
Уповноважений орган, який видає SID | Значення | Опис |
---|---|---|
SECURITY_NULL_SID_AUTHORITY | 0 | Використовується для стрворення порожньої групи (вона не представляє нікого), SID якої дорівнює S-1-0-0 |
SECURITY_WORLD_SID_AUTHORITY | 1 | Використовується для створення облікового запису стандартної групи "Всі" (Everybody). SID дорівнює S-1-1-0 |
SECURITY_LOCAL_SID_AUTHORITY | 2 | Використовується для створення групи локальних користувачів Local. SID цієї групи становить S-1-2-0 |
SECURITY_CREATOR_SID_AUTHORITY | 3 | Використовують для створення стандартних SID власників (Creator Owner). SID власника – S-1-3-0, групи власника – S-1-3-1 |
SECURITY_NT_AUTHORITY | 5 | Використовують для створення облікових записів користувачів та груп, починаючи з Windows 2000 і новіших. SID таких користувачів та груп починається з S-1-5. При цьому перший уповноважений орган нижнього рівня завжди дорівнює SECURITY_NT_NON_UNIQUE (21) |
Згадані у таблиці ідентифікатори безпеки однакові для всіх систем Windows на платформі NT. Єдиним органом, який видає SID користувачам та групам, є SECURITY_NT_AUTHORITY. Такі ідентифікатори не є універсальними і розглядаються лише в межах окремої копії Windows.
Відносні ідентифікатори
Орган SECURITY_NT_AUTHORITY має перелік відносних ідентифікаторів, які вказують на можливі стандартні органи нижнього рівня. Так, SECURITY_LOCAL_SYSTEM_RID (18) визначає системний обліковий запис LocalSystem\Система, а SECURITY_NT_NON_UNIQUE (21) свідчить, що SID не є унікальним. Детальніше ознайомитися зі списком стандартних RID можна в MSDN.
Комбінуючи стандартні RID із відповідними їм уповноваженими органами, можна створювати стандартні SID. Вони представляють системних користувачів, відомих кожній копії Windows у будь-якій мережі.
Дослідження взаємозв'язку між SID та назвою користувача
Щоб уявити, що являє собою SID, проведемо такий експеримент. Системними засобами створимо локальний обліковий запис користувача (рівень привілеїв не важливий, він у подальшому буде видалений). Для цього потрібно:
- викликати вікно "Керувння комп’ютером" (наприклад, вибравши команду "Керування" у контекстному меню, викликаному на піктограмі "Мій комп’ютер" робочого столу);
- перейти до пункту "Локальні користувачі та групи" (Local Users and Groups), далі вибрати елемент "Користувачі" (Users);
- викликати контекстне меню і вибрати із нього команду "Створити користувача" (New User);
- у вікні, яке з’явиться, ввести назву користувача та пароль, і натиснути кнопку OK.
Далі щойно створеному користувачеві слід дати будь-які права на доступ до якогось файлу. Для цього потрібно викликати вікно властивостей файлу (наприклад, з Провідника Windows), перейти на сторінку "Безпека" та додати попередньо створеного користувача (див. рис.). На рисунку у списку присутній користувач з назвою TempUser.
Після цього видалимо раніше створеного користувача (скориставшись, наприклад, вже описаною утилітою "Керування комп’ютером") і ще раз подивимось на список користувачів, які мають доступ до нашого файлу (див. рис.). Тепер замість облікового запису TempUser буде присутній невідомий обліковий запис, для якого буде вказано його ідентифікатор безпеки (S-1-5-21-3840520539…). Зауважимо: щоб побачити вказаний ефект, може бути необхідне перезавантаження системи (після видалення користувача).
Із зображеного на малюнку SID бачимо, що його видано системою Windows (5, уповноважний орган SECURITY_NT_AUTHORITY). Першим уповноваженим органом нижнього рівня також є система безпеки, яка вказує, що ідентифікатор безпеки не є унікальним і діє лише в межах даної копії Windows (21, відносний ідентифікатор SECURITY_NT_NON_UNIQUE).
"Добре відомі" SID
Windows містить ряд жорстко визначених ідентифікаторів безпеки, які представляють типові (стандартні) захищені суб'єкти безпеки (користувачі, групи користувачів, облікові записи тощо). Їхні типові значення наведено у таблиці:
SID | Опис |
---|---|
S-1-1-0 | Будь-хто (Everyone) |
S-1-5-18 | Обліковий запис локальної системи Local System, який використовується операційною системою |
S-1-5-21domain-500 | Administrator - обліковий запис системного адміністратора |
Повний список "добре відомих" SID можна прогрлянути у статті [2]
Імена відомих ідентифікаторів може змінюватися, тому для роботи з ними слід використовувати функції створення SID з зумовлених констант, а не використовувати ім'я відомого SID. Наприклад, в американській версії Windows є відомий SID назвою «BUILTIN\Administrator», який у поточні українській версії Windows має назву «BUILTIN\Адміністратор».
Робота з SID
Щоб отримати ідентифікатор безпеки для користувача з певним іменем, використовують функцію LookupAccountName (опис подано мовою Delphi[1]):
function LookupAccountName(
lpSystemName, lpAccountName: PWideChar;
Sid: PSID;
var cbSid: DWORD;
ReferencedDomainName: PWideChar;
var cbReferencedDomainName: DWORD;
var peUse: SID_NAME_USE
): BOOL;
Або наступну функцію PowerShell:
function get_sid($username) {
$objUser = New-Object System.Security.Principal.NTAccount($username)
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$strSID.Value
}
Якщо потрібно отримати назву користувача за відомим ідентифікатором безпеки, використовують функцію LookupAccountSid (опис подано мовою Delphi[1]):
function LookupAccountSid(
lpSystemName: PWideChar;
Sid: PSID;
Name: PWideChar;
var cbName: DWORD;
ReferencedDomainName: PWideChar;
var cbReferencedDomainName: DWORD;
var peUse: SID_NAME_USE
): BOOL;
Див. також
Примітки