Poniższy artykuł pochodzi z serii Przygotowań do egzaminu 70-536.
Jak używać domeny aplikacji do uruchomienia Assemblies z ograniczonymi uprawnieniami
Ograniczenie uprawnień domeny aplikacji może znacznie ograniczyć ryzyko, że assemblies, której używamy nie wykona żadnych złośliwych działań. Training kit przytacza taki przykład:
Kupujemy assembly od kogoś i używamy jej do komunikacji z bazą danych. Jakiś gość znajduję lukę w kupionej assembly i używa do skonfigurowania “spyware’owej” aplikacji, która uruchamia się automatycznie przy starcie.
W momencie gdy użyjemy domeny aplikacji z ograniczonymi uprawnieniami, atakujący odkryje lukę ale nie będzie mógł jej wykorzystać ze względu na niewystarczające uprawnienia.
Aby ograniczyć uprawnienia, należy posłużyć się metodą zwaną “defense-in-depth”. Defense in depth jest to zasada bezpieczeństwa, która zapewnia wiele poziomów zabezpieczeń. Nawet jeśli nastąpi jakiś błąd assemblies jest chronione.
Miałem nadzieję, że w tym podrozdziale znajdzie się chociaż kawałek kodu a nie długi suchy tekst ale na nadziei się skończyło :) Training kit odsyła nas do chapteru 11, który będzie mówił o zabezpieczaniu aplikacji. Cóż…
Dostarczanie Host Evidence do assembly
Kiedy stworzymy domene aplikacji i uruchomimy assemblies, otrzymujemy kontrolę nad Host Evidence. Evidence są to informacje, które gromadzi runtime dotyczące tego, które kody grupy należą do assembly.
Przypisując Evidence do assembly, będziemy mogli kontrolować ich uprawnienia. Aby dostarczyć evidence do assembly, najpierw tworzymy obiekt System.Security.Policy.Evidence a następnie przekazujemy jako parametr do metody ExecudeAssembly.
Konstruktor klasy Evidence przyjmuje dwa obiekty tablicy. Musimy przekazać jedną tablicę, która reprezentuje host evidence, a drugą która reprezentuje assembly evidence. Obie te tablice mogą być null’em.
Najprostszym sposobem na kontrolowanie uprawnieć przypisanych do assembly w domenie aplikacji jest przekazanie “zone evidence” używając obiektu System.Security.Policy.Zone i enuma System.Security.SecurityZone. W poniższym przykładzie tworzymy najpierw tablicę typu object, tworzymy w niej obiekt Zone. Tablicy tej używamy następnie do stworzenia obiektu Evidence. Na końcu przekazujemy obiekt Evidence do ExecuteAssembly wraz z nazwą pliku assembly:
1: object[] hostEvidence = {new Zone(SecurityZone.Internet)};
2: Evidence internetEvidence = new Evidence(hostEvidence, null);
3: AppDomain myDomain = AppDomain.CreateDomain("MyDomain");
4: myDomain.ExecuteAssembly("SecondAssembly.exe", internetEvidence);
Kod spowoduje, że określone assembly uruchomi się w oddzielnej domenie aplikacji z uprawnieniami ustawionymi na grupę Internet_Zone.
Właściwości Domeny Aplikacji
Najbardziej użyteczne właściwości AppDomainSetup:
ActivationArguments – pobiera lub ustawia dane dotyczące uruchomienia domeny aplikacji
ApplicationBase – pobiera lub ustawia nazwe katalogu głównego zawierającego aplikację.
ApplicationName – pobiera lub ustawia nazwę aplikacji.
ApplicationTrust – pobiera lub ustawia obiekt zawierający informację o zabezpieczeniach
ConfigurationFile – pobiera lub ustawia nazwę pliku konfiguracyjnego dla domeny aplikacji
DisallowBindingRedirects – pobiera lub ustawia wartość czy domena aplikacji pozwala na wiążące przekierowaina
DisallowCodeDownload – pobiera lub ustawia wartość czy dozwolone jest ściąganie assemblies
DynamicBase - pobiera lub ustawia główny katalog gdzie znajdują się dynamicznie generowane pliki
LicenseFile – pobiera lub ustawia położenie pliku z licencją
Aby zastosować te właściwości w domenie aplikacji, tworzymy i konfigurujemy obiekt AppDomainSetup i przekazujemy go do metody AppDomain.CreateDomain. Poniższy kod przedstawia ten proces:
1: // Construct and initialize settings for a second AppDomain.
2: AppDomainSetup ads = new AppDomainSetup();
3: ads.ApplicationBase = "file://" + System.Environment.CurrentDirectory;
4: ads.DisallowBindingRedirects = false;
5: ads.DisallowCodeDownload = true;
6: ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
7: // Create the second AppDomain
8: AppDomain d = AppDomain.CreateDomain("New Domain", null, ads);
Aby przetestować właściwości dla bierzącej domeny aplikacji, używamy AppDomain.CurrentDomain.SetupInformation tak jak na poniższym przykładzie:
1: AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
2: Console.WriteLine(ads.ApplicationBase);
3: Console.WriteLine(ads.ApplicationName);
4: Console.WriteLine(ads.DisallowCodeDownload);
5: Console.WriteLine(ads.DisallowBindingRedirects);
No i to by było na tyle. Następny wpis o Windows Services. Zapraszam.
Kolejny artykuł z serii to 70-536 Tworzenie Windows Services