Minulý díl poodhalil základní koncepty zabezpečení platformy .NET. My se dnes začneme zabývat konceptem CAS – Code Access Security, což v češtině znamená zabezpečení přístupu ke kódu.
Použití CAS
Smyslem CAS je řízení přístupu k chráněným prostředkům, jako jsou síť, místní disk, proměnné prostředí atd. Primárním účelem ovšem není ochrana těchto prostředků před uživateli aplikace, ale ochrana před zlomyslným kódem, který si například můžeme stáhnout z internetu či jiného nedůvěryhodného umístění. Tento systém zabezpečení běží neustále na pozadí a kontroluje zda-li všichni volající v zásobníku volání mají přístup k danému prostředku.
Pokud tomu tak není je vyhozena bezpečnostní výjimka. Možná některé z vás zarazilo ono neustálé procházení zásobníku volání a kontrola oprávnění a položili jste si otázku „A co výkon?“. Ano toto procházení zásobníku volání si bere svou daň v podobě výkonu, ale je to velmi důležité, jinak by totiž mohla assembly, která nemá dostatečnou důvěru a tedy i práva, využít volání jiné assembly s vyšší důvěrou a zneužít ji k narušení bezpečnosti.
Kromě této automatické práci na pozadí jsme schopni tento systém zabezpečení i využít na úrovni našich zdrojových kódů. Můžeme zjistit, jestli jsou v daném kontextu k dispozici potřebná oprávnění a podle toho reagovat chováním aplikace, nebo můžeme povolit či zakázat přístup k určitému prostředku ostatním assembly. Možnosti jsou opravdu bohaté a s většinou se pokusíme v rámci článků o bezpečnosti seznámit. Nyní přejděme k pojmům, se kterými jsme se seznámili v minulém díle, tedy ke kódovým skupinám a sadám oprávnění a podívejme se na ně blíže.
Kódové skupiny
K tomu, aby běhové prostředí CLR vědělo jaké oprávnění má přidělit assembly v době kdy ji zavádí do paměti, musí zjistit do jaké kódové skupiny daná assembly patří. Oprávnění totiž nejsou definována pro jednotlivé assembly, ale pro jejich skupiny, což konfiguraci zabezpečení činí velmi příjemnou. To jaké assembly budou patřit do jakých skupin, může být určeno několika různými cestami. Vždy je totiž potřeba přesně definovat podle jaké vlastnosti budou assembly přiřazovány k určité kódové skupině. Těmito vlastnostmi mohou být například:
- Zóna – zóna odkud assembly pochází (Internet, Intranet, Lokální počítač, Důvěryhodné server…)
- Server – server odkud assembly pochází
- Silný název assembly
- Vydavatel assembly
- URL – URL odkud assembly pochází
- Aplikační adresář – znamená, že assembly pochází z adresáře aplikace nebo z adresáře vnořeného
Nejčastěji používanou vlastností používanou pro určení členství v určité skupině je zóna, vydavatel assembly či silné jméno.
Po instalaci .NET frameworku je již několik kódových skupin předpřipraveno. Všechny tyto předpřipravené skupiny mají jako podmínku členství použitu právě zmíněnou zónu. Pro případy, kdy chceme přiřadit oprávnění assembly na základě jiných podmínek než je zóna původu musíme definovat vlastní kódovou skupinu. Při definici vlastní kódové skupiny totiž určujeme podmínku členství jednotlivých assembly do dané skupiny. Touto podmínkou může být právě jedna z možných vlastností. Assembly samozřejmě může splňovat více podmínek členství kódových skupin a tím pádem může být členem více různých kódových skupin.
Ke konfiguraci zabezpečení platformy .NET můžeme použít dvou cest. Tou první je utilita caspol.exe, se kterou se pracuje pomocí příkazového řádku a druhá cesta je představována modulem snap-in do konzoly MMC. Podle mého názoru je konfigurace příjemnější pomocí modulu, ale každý nechť činí konfiguraci podle svého gusta.
Konfigurace kódových skupin probíhá na třech různých úrovních a to na úrovni Enterprise (podniková – rozlehlá síť), Machine (počítače) a User (uživatele), což se projeví při výpočtu efektivních oprávnění pro danou assembly. Na to se podíváme později. Implicitně jsou kódové skupiny definovány pouze na úrovni počítače, tudíž oprávnění definována pouze pro ně.

Karta podmínka členství ve skupině v modulu snap-in ke správě zabezpečení .NET frameworku

Založení nové kódové skupiny pomocí modulu snap-in
Sady oprávnění
Již tedy víme, že běhové prostředí CLR při každém zavádění assembly do paměti shromažďuje legitimaci assembly a na základě těchto informací přiřadí assembly do jednotlivých skupin. To jaké operace je umožněno kódům v assembly provádět je definováno pomocí sad oprávnění. Sada oprávnění jsou to z důvodu, že v .NET frameworku se k jednotlivým kódovým skupinám neasociují jednotlivá oprávnění, ale přidružují se k blokům, které mohou obsahovat několik oprávnění. Každá kódová skupina definuje, kterou sadu oprávnění získá kód, který do ní patří.

Karta zobrazující přidruženou sadu oprávnění k určité kódové skupině
Tyto sady tedy obsahují výčet oprávnění pro vykovávání přístupů k prostředkům, mezi nejpoužívanější patří například tyto typy oprávnění:
- FileIOPermission – oprávnění pro práci se soubory a s adresáři
- DnsPermission – oprávnění pro práci se službou DNS
- EventLogPermission – oprávnění pro práci z protokolem událostí
- EnvironmentPermission – oprávnění pro práci s proměnnými prostředí
- OleDbPermission – oprávnění k přístupu k databázím pomocí rozhraní OLE DB
- PrintingPermission – oprávnění k tisku
- ReflectionPermission – oprávnění k používání mechanismu reflexe
- RegistryPermission – oprávnění k používání registrů systému Windows
- SecurityPermission – oprávnění ke spouštění kódu, využívání mechanismu zabezpečení, volání neřízeného kódu…
- SqlClientPermission – oprávnění k využívání funkčnost datového poskytovatele pro SQL server
- SocketPermission – oprávnění k přijímání či vytváření spojení transportní vrstvy protokolu TCP/IP
- UIPermission – oprávnění k využívání uživatelského rozhraní
- WebPermission – oprávnění k přístupu ke zdrojům pomocí protokolu HTTP
Stejně jako v případě kódových skupin jsou i oprávnění definována na třech úrovních (Uživatel, počítač, podniková síť). Na úrovní počítače jsou po instalaci prostředí .NET vytvořeny základní sady oprávnění:
- FullTrust – Tato sada oprávnění uděluje kódu neomezený přístup k chráněným prostředkům. Jinými slovy pokud je assembly členem kódové skupiny, ke které je přidružena tato sada oprávnění, může její kód provádět takřka vše.
- SkipVerification – Umožňuje přeskočit ověřování bezpečnostním systémem
- Execution – Povoluje spouštění kódu v assembly avšak ne přístup k chráněným prostředkům
- Nothing -Tato sada neobsahuje žádné oprávnění ani oprávnění na spouštění kódu assembly
- LocalIntranet – Výchozí sada oprávnění pro kód pocházející z místního intranetu
- Internet – Výchozí sada oprávnění pro kód pocházející z internetu
- Everything – Tato sada oprávnění obsahuje všechna oprávnění kromě oprávnění přeskočit ověřování

Zobrazení sady oprávnění

Založení nové sady oprávnění
Výsledná oprávnění kódu
Jak jsem zmínil o pár řádek výše, tak assembly může patřit do několika různých kódových skupin. Jelikož každá kódová skupina má k sobě přidruženu jednu sadu oprávnění je otázkou, jaké má vlastně assembly výsledná oprávnění, pokud patří do různých kódových skupin. Navíc ještě když můžou být kódové skupiny definovány na třech úrovních. Není to ale vůbec složité. Na jedné úrovni jsou celková oprávnění sjednocením všech oprávnění, které jsou jednotlivým skupinám přiřazena. Lze tedy jinými slovy říci, že každým členstvím ve skupině assembly přibývají oprávnění.
Pokud nám do tohoto výpočtu celkových oprávnění vstoupí ještě různé úrovně, na kterých mohou kódové skupiny a sady oprávnění existovat, musíme vědět to, že výsledná práva jsou průnikem celkových oprávnění na jednotlivých úrovních. To znamená, že na nižších úrovních mohou být jednotlivá oprávnění překryta, což velmi zpříjemňuje práci správcům, kteří jsou díky této vlastnosti schopni určit specifická oprávnění pro konkrétní uživatele.
Příštím dílem se již začneme zaobírat programovým využitím systému zabezpečení.