reklama

Poznáváme C# a Microsoft .NET 78. Díl – CAS II.

Osvětlení dalších několika možností programového využití CAS je tématem tohoto dílu, kde se mimo jiné seznámíme s metodou PermitOnly, třídou PermissionSet a definicí vyžadovaných oprávnění pro assembly.

Využití metody PermitOnly

Po minulém díle již známe metody rozhraní IStackWalk pro dočasné ovlivnění možnosti přístupu ke zdroji.Těmito metodami jsou metoda Deny pro dočasné odepření přístupu ke zdroji a metoda Assert sloužící pro dočasné povolení přístupu ke zdroji. Tuto dvojici doplňuje metoda PermitOnly, která je podobná metodě Deny avšak s tím rozdílem, že na rozdíl do metody Deny neodepře přístup pouze k jednomu specifickému typu zdroje, ale ke všem chráněným zdrojům vyjma toho, který je představován objektem oprávnění, na němž je metoda PermitOnly zavolána. Tento postup se hodí v případě, kdy potřebujeme zajistit, že naše aplikace přistupuje pouze ke specifickému zdroji. Následující zdrojový kód představuje příklad na použití výše zmíněné metody.
/// <summary>
/// Priklad na pouziti metody PermitOnly
/// </summary>
public static class PermitOnlyExample
{
     public static void TestPermitOnly()
     {
         //vytvoreni objektu opravneni
         EnvironmentPermission envPerm = new EnvironmentPermission(EnvironmentPermissionAccess.AllAccess, "OS");  
         //zamezeni pristupu ke vsem ostatnim zdrojum
         envPerm.PermitOnly();
 
  //je povolen pristup pouze ke promenne OS - cteni bude uspesne
         string os = Environment.GetEnvironmentVariable("OS");
         Console.WriteLine(os);
 
         try
         {
             //tento pokus o precteni skonci vyjimkou
             string temp = Environment.GetEnvironmentVariable("TEMP");
             Console.WriteLine(temp);
         }
         catch(SecurityException)
         {
             Console.WriteLine("Pristup k promenne prostredi byl odepren");
         }
         Stream stream = null;
         try
         {
             //zkouska pro pristup k souboru taktez selze
             stream = File.Open("C:/file.txt", FileMode.Open);
         }
         catch(SecurityException)
         {
             Console.WriteLine("Pristup k souboru byl odepren");
         }
         finally
         {
             if (stream != null)
             {
                 stream.Close();
             }
         }
         //zruseni omezeni pristupu
         CodeAccessPermission.RevertPermitOnly();
 
         try
         {
             //tento pokus o precteni jiz bude uspesny
             string temp = Environment.GetEnvironmentVariable("TEMP");
             Console.WriteLine(temp);
         }
         catch (SecurityException)
         {
             Console.WriteLine("Pristup byl odepren");
         }
     }
 
}
 
Po použití metody PermitOnly v příkladu je povolen pouze přístup k systémové proměnné s názvem OS. Pokud se někdo pokusí přistoupit k jakémukoli jinému zdroji, než je tento, tak pokus skončí vyhozením bezpečnostní výjimky SecurityException. Takže čtení proměnné TEMP i přístup k souboru skončí neúspěchem, dokud nebude toto omezení zrušeno pomocí statické metody RevertPermitOnly na třídě CodeAccessPermission.

Metoda IsSubsetOf

Často při udělování oprávnění jsou assembly přidělena i další oprávnění, které z přidělení vyplývají. Jednoduchým příkladem je oprávnění typu FileIOPermission, tedy neomezený přístup k obsahu jednotky C:\, kde můžeme logicky předpokládat, že máme právo i pro přistup k podadresářům této jednotky. Cestou, jakou máme možnost zjistit, jestli je nějaké oprávnění obsažené v jiném oprávnění je využití metody IsSubsetOf na objektu oprávnění.
//vytvoreni objektu opravneni pro pristup k cele jednotce
FileIOPermission perm1 = new FileIOPermission(FileIOPermissionAccess.AllAccess, @"C:\");
//vytvoreni objektu opravneni pro pristup k adresari na jednotce
FileIOPermission perm2 = new FileIOPermission(FileIOPermissionAccess.Read, @"C:\Temp");
 
//podminka bude splnena
if (perm2.IsSubsetOf(perm1))
{
      Console.WriteLine("Opravneni perm2 JE podmnozinou perm1");
}
else
{
      Console.WriteLine("Opravneni perm2 NENI podmnozinou perm1");
}

Třída PermissionSet

Z minulých dílů víme, že se při konfiguraci systému zabezpečení CAS pracuje s kódovými skupinami a sadami oprávnění, kde sada oprávnění slouží jako seznam oprávnění, která může kód v dané skupině vykonávat. Se sadou oprávnění můžeme pracovat i na úrovni zdrojového kódu, což se hodí v případě, kdy potřebujeme pracovat na vyšší úrovni, než na úrovni jednoho oprávnění. K tomuto účelu využijeme třídy PermissionSet, do které můžeme přidat instance oprávnění různých typů a pak s nimi pracovat jako s celkem.
//vytvoreni prazdne sady opravneni
PermissionSet set = new PermissionSet(null);
//pridani jednotlivych opravneni do sady
set.AddPermission(new RegistryPermission(PermissionState.Unrestricted));
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.Write, "C:/file.txt"));
set.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.AllFlags));
Console.WriteLine("Pocet opravneni v sade : {0}", set.Count);
try
{
     //vyzadani vsech obsazenych opravneni v sade
     set.Demand();
}
catch(SecurityException)
{
        Console.WriteLine("Nepodarilo se vyzadat nejake opravneni v sade");
}
//vyjmuti urciteho typu opravneni
set.RemovePermission(typeof(FileIOPermission));
Console.WriteLine("Pocet opravneni v sade : {0}", set.Count);
           
//docasne povoleni pristupu ke vsem zdrojum v sade
set.Assert();
           
//provedeni nejakych operaci se zdroji
           
//navraceni do puvodniho stavu
CodeAccessPermission.RevertAssert();
 
Jelikož třída PermissionSet implementuje rozhraní IStackWalk, je možné použít i metody Assert, PermitOnly a Deny, kde se jejich užití váže ke všem instancím oprávnění obsažených v sadě.

Vyžadování oprávnění na úrovni assembly

S našimi dosavadními znalostmi systému zabezpečení CAS víme, že jej lze využít k vyžádání jednotlivých oprávnění, nebo i celých sad oprávnění , za běhu aplikace. Často ovšem je vhodnější zajistit požadovaná oprávnění již při nahrávání assembly běhovým prostředím. Tímto způsobem jsme totiž schopni reagovat na nedostatečná přidělená oprávnění již při startu aplikace. Aby byl tento postup efektivní, musíme být schopni uvést seznam oprávnění, která naše assembly ke korektnímu běhu potřebuje, a na úrovni assembly je vyžádat. K vyžádání na úrovni assembly použijeme nám již známé deklarativní zabezpečení ovšem s tím, že cíl atributu bude assembly  v kombinaci s použitím tří dosud nepoznaných hodnot výčtu SecurityAction, kterými jsou:
  • RequestMinimum (minimální oprávnění) – oprávnění, které je nezbytné ke korektnímu běhu assembly
  • RequestOptional (nepovinná oprávnění) – oprávnění, které assembly může potřebovat, ale bez něhož je možný její běh
  • RequestRefuse (odmítnutá oprávnění) – oprávnění, které nebude kódu v assembly uděleno
Řekněme, že naše assembly potřebuje ke svému běhu oprávnění pro neomezenou práci s izolovaným úložištěm. Proto provedeme žádost o minimální oprávnění.
[assembly: IsolatedStorageFilePermission(SecurityAction.RequestMinimum , Unrestricted = true)]
Atributy pro žádost oprávnění na úrovni assembly je zvykem umisťovat do souboru AssemblyInfo.cs, který je ke každému projektu vygenerován vývojovým prostředím Visual Studio .NET.
 
Kdybychom naopak chtěli zamezit použití chráněného zdroje kódem assembly, použijeme akci RequestRefuse.
[assembly:FileIOPermission(SecurityAction.RequestRefuse, Write = "C:/file.txt")]
Přesvědčit se o funkčnosti můžeme, pokud použijeme tento atribut na assembly ve které se nachází příklad na použití třídy PermissionSet. Když toto omezení bude na úrovni assembly definováno, žádost o oprávnění v sadě skončí neúspěchem, protože se v sadě nachází oprávnění FileIOPermission pro soubor file.txt na jednotce C:\.
 
Trochu komplikovanější je použití akce RequestOptional. Pokud  použijete žádost o nepovinné oprávnění, buďte připraveni na to, že všechna ostatní oprávnění, která nejsou explicitně vyžádána pomocí RequestMinimum nebo RequestMinimal, budou odmítnuta a to i když podle nastavení na ně má assembly právo. Jinými slovy, je to  jako kdyby na všechna ostatní oprávnění byla použita akce RequestRefuse.
 
Příklady ke článku si můžete stáhnout zde.

Témata článku: Software, Microsoft, Programování, Catch

3 komentáře

Nejnovější komentáře

  • yo 11. 8. 2006 13:01:20
    Ukladat nastavenia do profile (Application Settings, Local Settings) alebo...
  • lada 11. 8. 2006 7:49:32
    Nevite jak lze nastavit aby aplikce měla právo zapisovat do souboru (s...
  • gully, gully 11. 8. 2006 0:15:26
    Off-line verzi seriálu si můžete stáhnout z
reklama
Určitě si přečtěte

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 104

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 36

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 74

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

** V notebooku s cenou nad 20 tisíc nesmí chybět kvalitní displej a rychlé úložiště ** Za dalších deset tisíc můžete dostat navíc styl nebo výkonnější komponenty ** Vybírat můžete z různých velikostí i konstrukcí

8.  12.  2016 | Stanislav Janů | 85


reklama