Biztonság.NET-ben Krizsán Zoltán iit1.0
Krizsán Zoltán iit Biztonság.NET-ben 2 Alapfogalmak Azonosítás (authentication) –Hitelesítés – Ki az aki a kérést küldi ? Engedélyezés (authorization) –Hozzáférés szabályozás – Milyen erőforrásokat érhet el, használhat ez a személy ? Integritás ellenőrzés (integrity check) –Hogyan biztosítható, hogy az adatokat útközben ne manipulálhassák ?
Krizsán Zoltán iit Biztonság.NET-ben 3 Windows biztonság Felhasználó hitelesítésen –Kerberos –NTLM –Publikus kulcs Objektum alapú hozzáférés szabályozás
Krizsán Zoltán iit Biztonság.NET-ben 4 +.NET biztonság Nem lehet kikerülni vagy lecserélni az op. rendszer vagy hálózat biztonságát Csak fokozni vagy kiterjeszteni lehet
Krizsán Zoltán iit Biztonság.NET-ben 5 Biztonsági modell filozófiája Segédalkalmazásokkal állítható! Ellenőrizhető: felhasználó kilétét - szerep alapú és vagy kód eredetét és vagy hívási láncot
Krizsán Zoltán iit Biztonság.NET-ben 6 Szerep alapú biztonság Tradicionális, elterjedt biztonsági ellenőrzés. A felhasználókat csoportokba rendezik, ezek a szerepek. A jogokat a szerepek kapják, nem a felhasználók. A.NET szál szinten kezeli a szerep alapú biztonságot.
Krizsán Zoltán iit Biztonság.NET-ben 7 Ellenőrzés helye Az operációs rendszer a kernelben vagy modulban. A.NET alaposztály-könyvtárában, az osztályok fv.-eiben. Az alkalmazás komponenseiben, osztályiban.
Krizsán Zoltán iit Biztonság.NET-ben 8 Biztonságot fenyegető szereplők Jóindulatú (ártatlan) hitelesített – óvatlan, figyelmetlen Rosszindulatú (támadó) –hitelesített felh. adatait megszerezni, használni. –Megváltoztatni a rendszer komponenseit észrevétlenül (buffer túlcsordulás)
Krizsán Zoltán iit Biztonság.NET-ben 9 Biztonsági fenyegetések Titoksértés Kód, illetéktelen személy - kényes bizalmas információ Ellenőrzés hamisítás Logok módosítása, zagyválása Azonosító megszerzése Jogosult felhasználó nevében … Jogosultság megszerzése jogosult felhasználó -> admin Szerviz elfojtás Sok felesleges, érvényes művelet -> szükséges funkciók lassulnak Mobil kód Letöltött kódok gyakran admin jog!
Krizsán Zoltán iit Biztonság.NET-ben 10 Megvalósítás Minden esetben Demand() fv. Hívás. (IPermission interface, PermissionSet osztály) SecurityException kivétel dobódik, ha nincs megfelelő jogosultság.
Krizsán Zoltán iit Biztonság.NET-ben 11 Osztálykönyvtár eszközei System.Security.Principal névtér Interface-ek (általánosak): Iidentity felhasználók adatai Iprincipal csoporttagság
Krizsán Zoltán iit Biztonság.NET-ben 12 IIdentity public interface IIdentity{ String Name{get;} String AuthenticationType{get;} bool IsAutenticated{get;} }
Krizsán Zoltán iit Biztonság.NET-ben 13 IPrincipal Minden szálhoz egy principal objektum Tread.CurrentPrincipal (olvasható - írható) public interface IPrincipal{ Iidentity Identity{get;} bool IsInRole(String Role); }
Krizsán Zoltán iit Biztonság.NET-ben 14 Általános osztályok Előre definiált, az alaposztály könyvtár eleme. Csak az interface-t implementálja. GenericIdentity GenericPrincipal
Krizsán Zoltán iit Biztonság.NET-ben 15 Windows specifikus osztályok WindowsIdentity Egy windows-os felhasználót kezel. WindowsPrincipal Windows-os csoporttagság nyilvántartása.
Krizsán Zoltán iit Biztonság.NET-ben 16 WindowsIdentity Az Iidentity fv.-ei +: –IsAnonymous –IsGuest –IsSystem –static GetAnonymous() –static GetCurrent() - win32 szál lehet, hogy más, mint a.NET Identity –Impersonate() - win32 szál felh. változtatása (erőforrás hozzáférés).
Krizsán Zoltán iit Biztonság.NET-ben 17 WindowsPrincipal Hasonló, mint a GenericPrincipal, de IsInRole() két fajta paraméterrel: –string BUILTIN\szerep GÉPNÉV\Felhasználó TARTOMÁNY\Felhasználó –felsosorolt (WindowsBuiltInRole) AcountOperator, Administrator, PowerUser BackupOperator, Guest, User, Replicator,...
Krizsán Zoltán iit Biztonság.NET-ben 18 Példa I Thread.CurrentPrincipal = new GenericPrincipal( new GenericIdentity(”Hát én”), null); Console.WriteLine( string.Format(”Az aktuális Identity: {0}\n \tTípusa: {1}”, Thread.CurrentPrincipal.Identity.Name, Thread.CurrentPrincipal.Identity.Name, Thread.CurrentPrincipal.Identity.GetType().FullName Thread.CurrentPrincipal.Identity.GetType().FullName));Console.WriteLine( string.Format(”Az aktuális Identity: {0}\n \tTípusa: {1}”, WindowsIdentity.GetCurrent().Name, WindowsIdentity.GetCurrent().Name, WindowsIdentity.GetCurrent().GetType().FullName WindowsIdentity.GetCurrent().GetType().FullName));
Krizsán Zoltán iit Biztonság.NET-ben 19 Példa II - MyIdentity public class MyIdentity : GenericIdentity{ private string m_fullName; public string FullName{ get{ return m_fullName;} } public MyIdentity (string userName, string fullName) : base(userName) { m_fullName = fullName;} public static MyIdentity Current{ get{ return (MyPrincipal.Current == null) ? return (MyPrincipal.Current == null) ? null : MyPrincipal.Current.Identity as MyIdentity; null : MyPrincipal.Current.Identity as MyIdentity;}}}
Krizsán Zoltán iit Biztonság.NET-ben 20 Példa II - MyPrincipal public class MyPrincipal : GenericPrincipal{ public MyPrincipal(MyIdentity ident, string[] roles) public MyPrincipal(MyIdentity ident, string[] roles) : base(ident,roles){} public override bool IsInRole(string role){ public override bool IsInRole(string role){ if (Identity != null && Identity.Name == ”Admin”) return true; if (Identity != null && Identity.Name == ”Admin”) return true; else return base.IsInRole(role); else return base.IsInRole(role); } public new MyIdentity Identity{ public new MyIdentity Identity{ get{return base.Identity as MyIdentity;} get{return base.Identity as MyIdentity;} } public static MyPrincipal Current{ public static MyPrincipal Current{ get{ return Thread.CurrentPrincipal as MyPrincipal;} get{ return Thread.CurrentPrincipal as MyPrincipal;} }}
Krizsán Zoltán iit Biztonság.NET-ben 21 Példa II - teszt kód static void Main(string[] args){ Thread.CurrentPrincipal = new GenericPrincipal(new MyIdentity("Admin", "Rendszer gizda"), null); Thread.CurrentPrincipal = new GenericPrincipal(new MyIdentity("Admin", "Rendszer gizda"), null); try{ try{ DoIt(); DoIt(); Thread.CurrentPrincipal = new GenericPrincipal(new MyIdentity("Krz", "Hát én ki más"), null); Thread.CurrentPrincipal = new GenericPrincipal(new MyIdentity("Krz", "Hát én ki más"), null); DoIt(); DoIt(); } catch(Exception e){Console.WriteLine("Kivétel: " + e.ToString ());} catch(Exception e){Console.WriteLine("Kivétel: " + e.ToString ());}} [PrincipalPermission(SecurityAction.Demand, Name="Admin") ] static void DoIt(){ MyIdentity MyI= Thread.CurrentPrincipal.Identity as MyIdentity; MyIdentity MyI= Thread.CurrentPrincipal.Identity as MyIdentity; Console.WriteLine("DoIt hívás: Név:{0} ({1})", Console.WriteLine("DoIt hívás: Név:{0} ({1})", MyI.Name, MyI.FullName); }
Krizsán Zoltán iit Biztonság.NET-ben 22 Biztonsági környezet öröklése Új szál esetén öröklődik a Pirncipal? –new Thread() -> igen –new Timer -> nem –.NET Remoting-> általában nem –Web Service-> általában nem
Krizsán Zoltán iit Biztonság.NET-ben 23 Alkalmazástartomány Szálak biztonsági környezetét egységesen szabályozhatjuk. AppDomain.SetPrincipalPolicy() Paraméterek lehetnek (PrincipalPolicy felsorolt típus): –NoPrincipal (null) –UnauthenticatedPrincipal (alapért., üres) –WindowsPrincipal
Krizsán Zoltán iit Biztonság.NET-ben 24 Nem szerep alapú biztonság Nem Mindet, vagy semmit, hanem –az adott program –adott erőforráson –milyen műveletet hajthat végre Kóderedet-alapú (evidence based security) Kódhozzáférési jogosultság (Code Access Security CAS)
Krizsán Zoltán iit Biztonság.NET-ben 25 Biztonsági házirend A programok jogait nem minden esetben a rendszergazda állítja és nem futásidőben. Előre elkészített szabályrendszer, amely kódról származó információk alapján meghatározza: –hogy mely erőforrásokon –milyen művelet(ek)et hajthat végre
Krizsán Zoltán iit Biztonság.NET-ben 26 Eredetigazolás, erdetinformáció kódról származó információ (bizonyíték - evidence) Beépített információk: –Információk szerelvényről: Hash Kiadó (kiadó digitális aláírása) Erős név –Információk indítás helyéről: Alkalmazásmappa Webhely URL Zóna Lehet saját is!
Krizsán Zoltán iit Biztonság.NET-ben 27 Kódhoz rendelhető jogok CodeAccessPermission osztály leszármazottjai Léteznek beépített jogok: –EnvironmentPermission –EventLogPermission –PrintingPermission –RegitryPermission –FileIO Permission –... Bővíthető saját jogokkal!
Krizsán Zoltán iit Biztonság.NET-ben 28 Jog csoportok, engedély halmazok Jogok csoportba rendezhetőek, nevesíthetőek (Named Permission Set)! Léteznek beépített engedélyhalmazok: –Nothing –Execution (nem használhat védett erőforrást) –Internet –LocalInternet –Everything (kivéve kód ellenőrzés kihagyása) –FullTrust (GAC-ban levők alapból) Saját definiálható!
Krizsán Zoltán iit Biztonság.NET-ben 29 Házirend felépítése, működése Fastruktúra Csomópontjaiban: feltétel (Kód eredetére) - engedélyhalmaz Ha a feltétel igaz, akkor –a program megkapja a jogokat –folytatódik a kiértékelés s gyermekkel Végigmegy a fán és összegzi azokat (UNIÓ). A fa egy szintjén csak egy levélre illeszkedhet! A rendszer többszintű, 4 fából áll.
Krizsán Zoltán iit Biztonság.NET-ben 30 Támogatott házirendek 1. szint Vállalati (Enterprise) : –Active Directory telepítheti –Tartományra érvényes 2. szint Számítógép (Machine) 3. szint Felhasználói (User) 4. szint Alkalmazástartományi (Application Domain) –Futtató hoszt által létrehozott
Krizsán Zoltán iit Biztonság.NET-ben 31 Házirendek végső jogosultsága A rendszer sorra kiértékeli az összes fát! Az 1. szinttől kezdődően a 4. szintig A végső jogosultság az egyes jogosultságok metszete.
Krizsán Zoltán iit Biztonság.NET-ben 32 Kiértékelést befolyásolása Kizárólagosság (Exclusive): Ha a fát bejárva elér egy ilyen csomópontot, nem megy tovább a gyerekre! Megy a következő fára. (Nem kaphat több jogot) Végső szint (Level Final): Az aktuális fánál abbahagyja a kiértékelést nem folytatja az alacsonyabb szintűvel! (Nem kaphat kevesebb jogot)
Krizsán Zoltán iit Biztonság.NET-ben 33 Házirend vizuálisan Vállalati Számítógép Felhasználó Alkalmazástartomány Kiértékelés Kibocsátó: MS Ms.Office Minden kód
Krizsán Zoltán iit Biztonság.NET-ben 34 Szerelvények - biztonság Szerelvényekhez is rendelhetőek biztonsági előírások: –Required –Optional –Refused Attribútummal valósítják meg!
Krizsán Zoltán iit Biztonság.NET-ben 35 Futó program végső jogosultsága ((MIN OPT) ALLOWED) \ REFUSED MIN, OPT : szerelvény által kért jogok ALLOWED : házirendból eredő jogok Szerelvény által visszautasított jogok Ha a MIN jog nem áll rendelkezésre, akkor kivétel keletkezik!
Krizsán Zoltán iit Biztonság.NET-ben 36 Jog, jogcsoport Legkisebb egység, erőforrásokon végezhető műveletek halmazak. public interface IPermission{ IPermission Union(IPermission rhs); IPermission Union(IPermission rhs); IPermission Intercect(IPermission rhs); IPermission Copy(); Void Demand(); } PermissionSet osztály (ICollection)
Krizsán Zoltán iit Biztonság.NET-ben 37 Ellenőrzés fajtái Op. rendszer: erőforrást Alkalmazás: Feladatot, funkciót Keretrendszer: személy, jog, stack módja: –Deklaratív –Imperatív
Krizsán Zoltán iit Biztonság.NET-ben 38 Deklaratív ellenőrzés Attribútum segítségével (beépül metaadatba) Az engedély paramétereit már fordítási időben tudni kell! Gyors Könnyen felderíthető, dokumentálható Szerelvényre, tfv.-re érvényes.
Krizsán Zoltán iit Biztonság.NET-ben 39 Imperatív ellenőrzés Permission vagy PermissionSet osztály egy példányának létrehozása. Majd Demand fv.-ével is. Futásidejű Kivétel elkapása. Kódszintű
Krizsán Zoltán iit Biztonság.NET-ben 40 Stack ellenőrzés Minden metódus híváshoz veremkeret. Biztonsági ell. (Demand) esetén bejárja a hívási vermet, és megvizsgálja a fv.-ek veremkereteit. Minden Win32API hívás előtt Demand()!
Krizsán Zoltán iit Biztonság.NET-ben 41 Ellenőrzés módosítói A hagyományos ell. módosítják! Assert: nem vizsgál tovább, engedélyez Deny: nem vizsgál tovább, tilt Permit Only: Aktuálisra assert, többire Deny
Krizsán Zoltán iit Biztonság.NET-ben 42 Stack ellenőrzés szabályai Engedélyen, vagy engedélyhalmazon hívható módosító. Csak egy módosító lehet aktív. Művelet elvégzése után szokás visszavonni (RevetAll, RevertAssert, …). Konstruktorban tilos a veremvizsgálat! Demand() helyett lehet LinkDemand() – nem jár végig a vermen, csak az aktuálisat vizsgálja! Reflexiónál LinkDeman() -> Demand()
Krizsán Zoltán iit Biztonság.NET-ben 43 Biztonság beállítása Jogok –Caspol.exe -házirend –művelet pl.: -addfullTrust –.NET Configurartor Engedély –Configurator (beépített) –XML fájlból (beépített, saját)