3. Způsoby ochrany prostředků a kódů

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.

3.1. Chráněný přístup ke kódům (code access security)

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.

[ukázka kódu]
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.

3.2. Bezpečnost založená na rolích (Role-based security)

[znalosti]

Druhý způsob ochrany dat je založen na tzv. rolích. Prostředí .NET Framework uvádí sjednocený model pro správu uživatelovy identity a rolí pro autorizaci. Model je založen na tzv. principalovi jako uživateli, jehož kód je prováděn. Autentifikace je proces ověřování pověření a zjištění identity principala. Principal může mít žádnou nebo i více rolí reprezentující stupeň jeho pověření.

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.

[ukázka kódu]
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.

[ukázka kódu]
...
   // 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 ke stažení]

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.