Prostředí .NET nabízí dva způsoby ochrany prostředků a kódů před neautorizovanými kódy a uživateli.
Chráněný přístup ke zdrojovým kódům
Přístup mezi kódy a síťovými zdroji a operacemi je ovládán pomocí povolení a zákazů (permissions)
Bezpečnost založená na rolích (Role-based security)
Přináší informace potřebné k rozhodnutí, zda uživatel bude mít přístup k datům či prostředkům nebo ne. Zakládá se na uživatelově identitě, roli nebo obojím. Příklad role může být administrátor, uživatel apod.
První způsob ochrany kodů chrání počítačové systémy před záludnými mobilními kódy a nechává legitimní mobilní kódy bezpečně fungovat.
Mobilní kód přichází z jakéhokoliv zdroje a může být vsazen a použit v mnoha prostředích. Běžné zdroje zahrnují e-mailové přílohy, dokumenty a downloadované soubory z Internetu. Mnoho uživatelů se někdy setkalo s takovým záludným kódem, at již se jedná o počítačové viry nebo červy poškozující nebo ničící data a tím i čas a peníze.
V prostředí .NET Framework dovoluje mechanisums chráněného přístupu různé stupně důvěryhodnosti kódů. Důvěryhodnost kódů závisí na jejich původu a jiných aspektech identity kódu. Mechanismus chráněného přístupu ke kódům používá funkce typu definování povolení, umožnění určitému kódu žádat o povolení k přístupu, která potřebuje k běhu, a následně přidělování povolení k přístupu.
Chráněný přístup ke (zdrojovým) kódům může omezit možnost útoku spouštěného kódu a tím minimalizovat škodu vyplývající z bezpečnostních slabin.
Klasický příklad chráněného přístupu budeme demostrovat na souborových operacích. Omezme se pouze na povolení/zamezení čtení ze souboru pro určitý kód.
using System; using System.Security.Permissions; ... string user; user = ... // vytvoreni noveho permission a nastaveni pouze pro cteni souboru "file.txt" new FileIOPermission perm = new FileIOPermission(FileIOPermissionAccess.Read, "file.txt"); // povoli se pristup k danemu prostredku, zde cteni souboru if(user == "safeuser") perm.Assert(); // zakaze se pristup else perm.Deny(); ... |
Lze vytvářet celé kolekce povolení. Pokud chceme používat takovéto kolekce, vkládáme jednotlivé instance tříd Permission (např. FileIOPermission) do instance typu PermissionSet.
Role jsou pojmenované skupiny uživatelů seskupené podle stejných práv. Může se zde vyskytovat i principal, což se dá volně přeložit jako "představitel hlavní role". Principal může být členem jedné nebo více skupin. Běžící aplikace pak může zjistit identitu současného principala a případně se dotázat, zda vyhovuje roli nezbytné pro provedení určité operace.
U podniků je důležitá identita uživatelů založená na přihlašování do systému Windows. V tom případě lze použít třídu WindowsPrincipal, aby zjistila roli současného principala.
using System; using System.Security.Principal; ... // zjisteni informaci o aktualnim uzivateli pocitace WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent()); // uzivatelske jmeno Console.WriteLine("User name: " + wp.Identity.Name); // vypise true, pokud aktualni uzivatel ma administratorska prava Console.WriteLine("Authentication Type: " +wp.IsInRole(WindowsBuiltInRole.Administrator); |
Někdy se ovšem může hodit vytvořit si vlastní role a oprávnění. Pak se použije třída GenericPrincipal.
... // vytvoreni pole s pouzivanymi rolemi pro uzivatele jmenem jason string[] jasonRoles = new string[5]; jasonRoles[0] = "admin"; // .... // vytvori se nova vseobecna identita se jmenem jason GenericIdentity gi = new GenericIdentity("jason"); // vytvoreni principala a prirazeni mu roli GenericPrincipal gp = new GenericPrincipal(gi, roles); // vypis na obrazovku jmena uzivatelskeho principala Console.WriteLine("name : " + gp.Identity.Name); // vypise: "name : jason" Console.WriteLine("is admin: " + gp.IsInRole("admin")); // vypise: "is admin: True" ... |
Příklad na vytvoření instance třídy GenericPrincipal a zjištění informací o instanci třídy WindowsPrincipal je k dispozici ke stažení zde. |