Лабораторная работа № 7 (6 часов) .
Тема: Списки контроля доступа Access Control List (ACL).
Цель: Ознакомиться со списками контроля доступа.
Теоретические сведения:
Security descriptor содержит информацию о владельце объекта, а также может включать следующие списки контроля доступа Access-Contol List (ACL):
ACL - acces control list - фундаментальная часть Windows NT . ACL определяет, какой у вас доступ на те или иные ресурсы . Состоит из 2-х частей : 1. DACL - определяет права доступа к ресурсам 2. SACL - контролирует эти права Следующий код определяет, распространяется ли ACL на диск С: #include "stdafx.h" #include "stdio.h" #include <windows.h> int main() { char * vol = "c:\\"; DWORD f = 0 ; if(GetVolumeInformation(vo1,NULL,0,NULL,NULL,&f,NULL,0)) { printf ("%s support ACLs",vo1,(f & FS_PERSISTENT_ACLS) ? "" : "NOT"); } else { printf ("error"); } return 0; } DACL сосотоит из одного или нескольких ACE - access control entries . ACE состоит из SID (Security ID) - и описания того, что может делать этот SID с ресурсом. SID представляет пользователя, группу или компьютер. Например, если аккаунт, который определяет ваши права на ресурс , есть EveryOne (Deny Full Control), то SID = S-1-1-0 . Каждый дескриптор имеет свое описание, которое можно найти в sddl.h .
Например, пусть у нас имеется ресурс, к которому надо привязать 3 SID - Full Control , Read , Deny Access . 1. Инициализация : PSID pEveryoneSID = NULL, pAdminSID = NULL, pNetworkSID = NULL; PACL pACL = NULL; PSECURITY_DESCRIPTOR pSD = NULL; 2. Создаем 3 SID-а: SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY; //deny Access SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; //read AllocateAndInitializeSid(&SIDAuthNT, 2,SECURITY_BUILTIN_DOMA IN_RID, DOMAIN_ALIAS_RID_ADMI NS,0, 0, 0, 0, 0, 0,&pAdminSID) //admin 3. Создаем ACL с 3-мя ACE : if (ERROR_SUCCESS != SetEntriesInAcl(NUM_ACES,ea,NULL,&pACL))throw GetLastError(); 4. Создаем Дескриптор pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_ LENGTH); 5. Добавляем ACL к дескриптору : if (!SetSecurityDescriptorDacl(pSD,TRUE,pACL,FALSE)) {throw GetLastError();} else {SECURITY_ATTRIBUTES sa;sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = FALSE;sa.lpSecurityDescriptor = pSD; 6. Привяжем SID к конкретному файлу if (!CreateDirectory("C:\\Program Files\\MyStuf f", &sa)) throw GetLastError(); Этот пример создает всего лишь 3 SID на файл и не создает каких-то прав доступа . Следующий пример создает ACL для директории : if (ConvertStringSecurityDescriptorToSecurityDescriptor( szSD,SDDL_REVISION_1,&(sa.lpSecurityDescriptor),NULL)) { CreateDirectory("C:\\MyDir", &sa ) } С использованием стандартной библиотеки ATL создание сидов упрощается : //The user accounts CSid sidBlake("Northwindtraders\\blake"); CSid sidAdmin = Sids::Admins(); CSid sidGuests = Sids::Guests(); //Create the ACL, and populate with ACEs. //Note the deny ACE is placed before the allow ACEs. CDacl dacl; dacl.AddDeniedAce(sidGuests, GENERIC_ALL); dacl.AddAllowedAce(sidBlake, GENERIC_READ); dacl.AddAllowedAce(sidAdmin, GENERIC_ALL); //Create the security descriptor and attributes. CSecurityDesc sd; sd.SetDacl(dacl); CSecurityAttributes sa(sd); //Create the directory with the security attributes. if (CreateDirectory("c:\\MyTestDir", &sa)) cout << "Directory created!" << endl; В Windows 2000 , кроме ACL , существуют другие защитные механизмы : 1. NET Framework Roles NET-приложения могут использовать principal identity и роли . Пример применения роли в веб-сервисе : WindowsPrincipal wp = (HttpContext.Current.User as WindowsPrincipal); if (wp.IsInRole("Managers" )) Cоздание самой роли на c# : GenericIdentity id = new GenericIdentity("Blake"); String[] roles = {"Manager","Tester"}; GenericPrincipal pr = new GenericPrincipal(id,roles); 2. COM+ Roles 3. IP restrictions Позволяет ограничить доступ к IIS по определенным ip-адресам или доменам .