Szoftverfejlesztés .NET platformon - Jegyzet 11. fejezet
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
70-536 .NET framework 2.0 Application Development Foundation
%TOC{depth="3"}%
Code Access Security
CAS (Code Access Security): megmondja, hogy egy partially trusted kód milyen erőforrásokhoz (pl. registry, filerendszer, nyomtató, event log) férhet hozzá. Plusz funkciókat nyújt a Windows RBS (Role Based Security) szolgáltatásához képest felügyelt környezetben.
- kizárólag partially trusted kódban érvényesül, full trustedban nem
- csak felügyelt kódon érvényesül
- az alkalmazás jogai nem haladhatják meg a futtató user jogait
- szerep alapú
- Evidence-eket használ azonosításhoz.
Evidence alapján dől el, hogy a program milyen Code Group-ba kerül. 1 Code Group-hoz 1 Permission Set tartozik.
=Evidence=: assemblyt azonosító metainformáció. Ez alapján dönti el a CLR, hogy milyen code group-ba fog kerülni, azaz milyen jogokkal fog futni.
- lehet passport, password, PIN, Zone
- =Application Directory=: az assembly könyvtára
- =Hash=: alkalmazást azonosítja verziószámmal együtt
- =Publisher=: készítő digitális aláírása.
Feltételezi, hogy az alkalmazás is digitálisan alá van írva.
- =Site=: ahonnan az assemblyt letöltöttük
- =StrongName=: assembly teljes, globálisan egyedi neve.
Feltételezi, hogy az alkalmazás is digitálisan alá van írva.
- =URL=: az URL, ahonnan az alkalmazást letöltöttük
- =Zone=: a zóna, amiben az alkalmazás fut. Pl. internet zóna vagy intranet zóna.
- 2 típusa van: host evidence és assembly evidence
- Host evidence: assembly eredetét írja le (pl. appDir/url/site).
Megadhatja az identity-t is: hash/publisher/strong name. Fejlesztőtől jön.
- Assembly evidence: futtatótól jön.
=Permission= = CAS Access Control Entry
- alapból 19 elemi =Permission= van a .NET 2.0 Config Toolban, ezeket meg lehet adni imperatívan vagy deklaratívan
- Directory Services: Active Directoryhoz hozzáférés
- DNS: indíthat DNS névfeloldást
- Environment Variables: milyen környezeti változókhoz férhet hozzá (pl. User)
- Event Log: event logot csak olvashatja / auditálhatja is / teljes hozzáférése van
- File Dialog: Open/Save dialógusablakot nyithat-e
- File IO: milyen file-okhoz férhet hozzá, és milyen műveleteket végezhet rajtuk
- Isolated Storage File: hozzáférhet-e az Isolated Storage-hez, illetve mekkora kvótát kap
- Message Queue: milyen üzenetsorokhoz férhet hozzá
- Performance Counter: milyen Performance Counter-eket tudjon olvasni vagy írni
- Printing: nyomtathat-e
- Reflection: hozzáférhet-e más assemblykhez Reflection-nel
- Registry: Registry mely részein milyen műveleteket tudjon végezni
- Security: hozzáférhet-e a CAS feature-ökhöz (pl. hívhat-e nem felügyet kódot)
- Service Controller: milyen service-eket lásson és befolyásolhasson
- Socket Address: hova és milyen protokollon nyithat TCP kapcsolatot
- SQL Client: legyen-e adatbázis hozzáférése
- User Interface: hozhasson-e létre új ablakot, hozzáférjen-e a vágólaphoz
- Web Access: hova intézhessen HTTP kérést
- X509: hozzáférjen-e az X509 certificate store-hoz
- sajátot is lehet készíteni
Permission Set = CAS Access Control List, kézzel vagy előre definiált Permission halmaz
- =FullTrust=: minden jog, nincs CAS ellenőrzés
- =Everything=: minden, van CAS ellenőrzés
- =SkipVerification=: kihagyható a CAS ellenőrzés
- =Execution=: az assembly csak futáshoz kap jogot, semmi máshoz
- =Nothing=: az assembly semmilyen jogot nem kap, nem is futhat
- =LocalIntranet=: legtöbb jogot megkapja, de pl. a filerendszerhez csak Open és Save
dialógusokon keresztül férhet hozzá
- =Internet=: erősen korlátozott jogok, hogy ne okozhasson komolyabb kárt
Code Group: ehhez rendeljük hozzá a Permission Set-et (hasonló a User Group-hoz). A különbség az, hogy az assembly-ket nem kézzel kell Code Group-ba sorolni, hanem a nyújtott Evidence alapján kerülnek be valamelyikbe. Egy assembly több Code Group tagja is lehet, ekkor az általuk nyújtott Permission Set-ek unióját kapja meg. Emellett egymásba is ágyazhatók: ahhoz, hogy egy assembly bekerüljön a gyerek Code Group-ba, a szülőhöz szükséges Evidence-ekkel is rendelkeznie kell.
Beépített Code Group-ok
Zone | Evidence | Permission Set |
My_Computer_Zone | Zone: My Computer | FullTrust |
LocalIntranet_Zone | Zone: Local Intranet | LocalIntranet |
Internet_Zone | Zone: Internet | Internet |
Trusted_Zone | Zone: Trusted sites | Internet |
Restricted_Zone | Zone: Untrusted sites | Nothing |
Security Policy: Code Groupok és Permission Setek logikai csoportosítása. Azaz olyan szabályok összessége, ami meghatározza, hogy milyen Code Group-ba milyen Evidence-ekkel kerülhet be egy assembly.
A policy meghatározható Enterprise, Machine, User, Application Domain szinten. Az assembly jogai az egyes szinteken kapott jogok metszete lesznek. Alapból a Machine kivételével minden szint Full Trust-ra van állítva, azaz nincs CAS ellenőrzés.
CAS és OS Security
- A CAS független a Windows-os securitytól, más eszközök kellenek a konfiguráláshoz
- .NET Framework Configuration Tool (grafikus)
- Code Access Security Policy Tool (parancssoros, =caspol.exe=)
- A CAS az OS security és az assembly közötti rétegben helyezkedik el
Deklaratív CAS
Assemblyket és metódusokat lehet vele védeni
Cél: az alkalmazásnak pontosan annyi joga legyen, mint amennyi szükséges
- Az alkalmazás ne indulhasson el a szükséges jogok nélkül
- Saját sandbox kiépítése (a kódot ne lehessen támadó szándékkal kihasználni)
- Ellenőrizhető legyen, hogy az alkalmazás korlátozott CAS engedélyekkel fut, ezáltal futtatható
partially trusted zónában is (full trusted környezetben egyáltalán nincsen CAS)
Assembly CAS deklarációk:
CodeAccessSecurityPermissionAttribute
-ból származnak.
- =[DirectoryServicesPermission]=
- =[RegistryPermission]=
- =[UIPermission]=: debuggoláshoz szükséges =Unrestricted=true= paraméterrel
- =[WebPermission]=
- =[OraclePermission]=: hozzáférhet Oracle adatbázishoz
- ...
Minden fenti osztály rendelkezik property-kkel amelyekkel finomhangolhatók a jogosultságok. Ezen kívül örökölnek két property-t:
- =Action=: milyen akciót kell végrehajtani
- =SecurityAction.RequestMinimum=: =PolicyException=, ha nincs elég jogosultság
- =SecurityAction.RequestOptional=: minden jogról lemondok a felsoroltakon kívül, nem dob
Exception
-t - =SecurityAction.RequestRefuse=: explicit lemondás a felsorolt jogokról
- =Unrestricted=: ha =true=, nincs további megkötés
Példa: =[assembly:FileIOPermissionAttribute(SecurityAction.RequestMinimum, Read=@"C:\boot.ini")]=
Imperatív CAS
Kódrészleteket lehet vele védeni
=SecurityAction=: metódusokat véd meg. Használható deklaratívan és imperatívan is.
- =Demand=: hívóláncban felfelé mindenkinek rendelkeznie kell a joggal. Ha nem, =Exception=
- =LinkDemand=: a hívónak rendelkeznie kell a joggal, különben =Exception=.
Gyorsabb, mint a =Demand=, de kisebb biztonságot nyújt.
- =InheritanceDemand=: a leszármazott osztályoknak rendelkezniük kell legalább ennyi joggal
- =Deny=: explicit lemond a jogról
- =PermitOnly=: egy jogot kérünk, a többiről lemondunk
- =Assert=: a hívó jogaitól függetlenül jogot kérünk valamire.
Pl. Internet zónában a helyi merevlemezre akarunk menteni valamit.
[FileIOPermission(FileIOPermissionAccess.Write, @"C:\Program Files\")]
vagy
FileIOPermission fiop = new FileIOPermission(FileIOPermissionAccess.Write, @"C:\Program Files\"); fiop.Demand();
vagy
PermissionSet pset = new PermissionSet(PermissionState.None); pset.AddPermission(new FileIOPermission(FileIOPermissionAccess.Write, @"C:\Program Files\")); pset.Demand();
=CodeAccessPermission=: kódrészleteket véd meg
- =PermitOnly()=: feltételezi, hogy a hívó rendelkezik vmilyen joggal
- =RevertPermit()=
- =Assert()=: a hívó jogaitól függetlenül jogot ad valamire
- =RevertAssert()=: =Assert()= visszavonása
- =RevertPermitOnly()=
- =RevertAll()=
=SecurityManager.IsGranted(IPermission)=: assemblynek van-e joga valamihez. Deklaratív esetben nem tartalmazhat változót.
Permission
-t csak egyszer lehet assertálni. Ha többször akarjuk,
PermissionSet
-et kell összeállítani kódból, és arra hívni az
Assert
-et. Az
Assert
-et
RevertAssert
-tel lehet visszafordítani.
-- Peti - 2007.06.27.