560 likes | 783 Views
Säkerhet och .NET. Johan Lindfors Developer Evangelist Microsoft AB. Vad kommer vi gå igenom?. Funktioner i .NET Framework för säkerhet Kod och bevisbaserad säkerhet Rollbaserad säkerhet Kryptering Säkra ASP.NET webbapplikationer Säkra ASP.NET webbservices
E N D
Säkerhet och .NET Johan Lindfors Developer Evangelist Microsoft AB
Vad kommer vi gå igenom? • Funktioner i .NET Framework för säkerhet • Kod och bevisbaserad säkerhet • Rollbaserad säkerhet • Kryptering • Säkra ASP.NET webbapplikationer • Säkra ASP.NET webbservices • Tips för att skriva säker kod med .NET Framework
Agenda • Funktioner i .NET Framework för säkerhet • Kod och bevisbaserad säkerhet • Rollbaserad säkerhet • Kryptering • Säkra ASP.NET webbapplikationer • Säkra ASP.NET webbservices • Tips för att skriva säker kod med .NET Framework
Trådhantering “COM Marshaler” Kontroll av datatyper Felhanterare Säkerhetsmotor “Debugger” MSILkompilatorer Kodhanterare Minneshanterare - GC Hanterad exekvering i .NET ..NET Framework basklasser Klassladdare
Ett typsäkert system • “Runtime” övervakar din kod • Säkerheten i .NET Framework erbjuder • Skydd mot buffertöverskrivningar • Ett kodbaserat säkerhetsregelverk • Typsäkra begränsningar i kod • Enbart åtkomst till auktoriserade minnesplatser • Enbart åtkomst till objekt genom exponerat gränssnitt • “AppDomain” erbjuder • Ökad prestanda och kodbaserad säkerhet
Buffertöverskrivningar • Verifiering av datatyper gör det svårt att av misstag skriva över skyddat minne • .NET Framework har stöd för… • Den “enklare” klassen “String” • Den kontrollerade “StringBuilder”-klassen • Försiktighet krävs fortfarande • Kod som markerats som “unsafe” • COM och Win32 interoperabilitet
Aritmetiska fel • Aritmetisk felkontroll genomförs med: • Nyckelordet “checked” • Inställningar för projektet byte b=0; while (true) { Console.WriteLine (b); checked { b++; } }
Assemblies och ”Strong Name” • Ett “strong name” är ett unikt ID som innehåller en publik nyckel • En assembly signeras digitalt med en nyckelfil • Signaturen från ett “strong name” verifieras när applikationen laddas • Fördelar med “Strong name” • Förhindrar påverkan utifrån • Konfirmerar identiteten på den som publicerat applikationen • Möjliggör helt skilda komponenter sida-vid-sida C:\> sn.exe –k MinPrivataOchPublikaNyckel.snk
Isolerad lagring • Erbjuder ett virtuell filssystem inom ett filsystem • Hanterar • Kvoteringar • Separering av filsystem baserat på identitet på applikationen eller användare • Därför kan applikationer och användare separeras IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForAssembly();
Agenda • Funktioner i .NET Framework för säkerhet • Kod och bevisbaserad säkerhet • Rollbaserad säkerhet • Kryptering • Säkra ASP.NET webbapplikationer • Säkra ASP.NET webbservices • Tips för att skriva säker kod med .NET Framework
Bevisbaserad säkerhet • Bevis kontrolleras när en assembly laddas • Bevis kan innehålla: • Information om “strong name” • URL, site och AppDir • Zon • Publicerare (“Authenticode”) • Hash • Bevis kan byggas ut • Bevis används av säkerhetssystemet för att bestämma rättigheterna för en assembly
Anropar ReadFile Anropar ReadFile Säkerhetskontroller 1. En assembly begär åtkomsten till en metod i din assembly 2. Din assembly skickar begäran vidare till en assembly i .NET Framework 3. Säkerhetssystemet gör en “demand” genom hela anropsstacken 4. Säkerhetssystemet ger åtkomst eller “kastar ett fel” Anropsstack EnAssembly Tilldela: Execute MinAssembly Tilldela: ReadFile “Permission Demand” Säkerhetssystemet .NET Framework Assembly Ge åtkomst? “Security exception”Ingen åtkomst Tilldela: ReadFile
Imperativa kontroller • Mer granulärt än deklarativt FileIOPermission filePerm = new FileIOPermission( FileIOPermissionAccess.Read, "C:\\temp.txt"); try { filePerm.Demand(); // Kod för att jobba mot filen här } Catch (SecurityException e) { // detta exekverar om åtkomsten vägras }
Deklarativa kontroller • Använd attribut för att genomföra säkerhetskontroller • Fel genererar “SecurityException” • Deklarativ säkerhet lagras som metadata, vilket ger: • Enklare genomgångar av kod • Konfiguration vid exekvering (CASPOL) [FileIOPermission(SecurityAction.Demand, Read="C:\\temp.txt")] public string ReadTempFile() { // Kod för att läsa filen här }
Assert • En “Assert” förhindrar “stack walk” • Användbart när: • Kod behöver åtkomst till en skyddad resurs, men åtkomsten är helt gömd från användarna • Kod behöver anropa ohanterad kod för att utföra en väldefinerad funktion, använd en kombination av “Demand” och “Assert” • Använd bara när det är absolut nödvändigt! • Se till att din kod inte kan användas av otillåtna applikationer och användare
Anropar ReadFile Anropar ReadFile Assert påverkar “StackWalk” • Var försiktig dock! • Kräver rättigheten - Assert • Kräver rättigheten som görs Assert på Anropsstack EnAssembly MinAssembly Assert: ReadFile “Permission Demand” Säkerhetssystemet .NET Framework Assembly Ge åtkomst? Tilldela: ReadFile
“Permission Requests” • Utvecklaren lägger till önskade rättigheter till en assembly med hjälp av attribut • 3 typer av begäran: • Ger en mekanism som: • Får en assembly att själv tala om rättighetskrav • Förenklar utrullning av assemblies • Förhindrar att en assembly laddas om inte dess krav är uppfyllda Minimum “Optional” “Refused”
”Permission Requests” // Jag kommer bara att köra om jag får anropa ohanterad kod [assembly:SecurityPermission( SecurityAction.RequestMinimum, UnmanagedCode=true)] // Jag måste ha rättigheter som i “FullTrust PermissionSet” [assembly:PermissionSet( SecurityAction.RequestMinimum, Name="FullTrust")] // Bara kod som signerats med 12789ADE...kan anropa mig [StrongNameIdentityPermission(SecurityAction.LinkDemand PublicKey = "12789ADE…", Version = "1.0.0.0")] public class MyClass { // MyClass can only be called by the assembly // with the strong name specified in the attribute }
Applikationer med ”Partial Trust” • Webbapplikationer har “full trust” innan .NET Framework 1.1 • .NET Framework 1.1 ger ASP.NET nivåer • Begränsa åtkomsten till resurser för ASP.NET <location allowOverride="true"> <system.web> <securityPolicy> <trustLevel name="Full" policyFile="internal"/> <trustLevel name="High" policyFile="web_hightrust.config"/> <trustLevel name="Medium" policyFile="web_mediumtrust.config"/> <trustLevel name="Low" policyFile="web_lowtrust.config"/> <trustLevel name="Minimal" policyFile="web_minimaltrust.config"/> </securityPolicy> <!-- level="[Full|High|Medium|Low|Minimal]" --> <trust level=“Full" originUrl=""/> </system.web> </location> Machine.config
Priviligerad kod i “sandlådor” • Inkapsla priviligerad kod i en wrapper • Gör “assert” på relevanta rättigheter • Installera wrappern i GAC • Använd “AllowPartiallyTrustedCallersAttribute” <trust level_”Medium” originUri_--/> Demand och Assert Åtkomst till resurs Wrapper Assembly (“Strong Name” och i GAC) Webbapp med“Partial Trust” Säker resurs “Sandboxad” kod
Agenda • Funktioner i .NET Framework för säkerhet • Kod och bevisbaserad säkerhet • Rollbaserad säkerhet • Kryptering • Säkra ASP.NET webbapplikationer • Säkra ASP.NET webbservices • Tips för att skriva säker kod med .NET Framework
Autentisering och auktorisering • Autentisering • Vem är du? • Är jag säker på att du är den du säger? • Auktorisering • Har du tillstånd att…? • Rollbaserad säkerhet i .NET Framework berör mest auktorisering
Generisk Windows Skräddarsydd Identiteter och “principals” • En identitet innehåller information om en användare, till exempel inloggningsnamn • En “principal” innehåller rollinformation om en användare eller dator
Identiteter och Windows • Använd objekten WindowsIdentity och WindowsPrincipal för: • En enstaka validering • Repeterad validering WindowsIdentity myIdent = WindowsIdentity.GetCurrent(); WindowsPrincipal myPrin = new WindowsPrincipal(myIdent); AppDomain.CurrentDomain.SetPrincipalPolicy( PrincipalPolicy.WindowsPrincipal); WindowsPrincipal myPrin = System.Threading.Thread.CurrentPrincipal;
Generiska identiteter • Skapa “GenericIdentity” och “GenericPrincipal” • Lägg “GenericPrincipal” till den aktuella tråden • “GenericPrincipal” kommer att användas vid framtida säkerhetskontroller på tråden GenericIdentity myIdent = new GenericIdentity("User1"); string[] roles = {"Manager", "Teller"}; GenericPrincipal myPrin = new GenericPrincipal(myIdent, roles); System.Threading.Thread.CurrentPrincipal = myPrin;
Rollbaserade kontroller (1/2) • Du kan använda egenskapen “Name” på “ID” objektet för att kontrollera inloggningsnamn • Använd metoden “IsInRole” på “Principal” för att kontrollera medlemskap i roller if (String.Compare(myPrin.Identity.Name, "DOMÄN\\Johan", true)==0) { // Få åtkomst till koden } if (myPrin.IsInRole("BUILTIN\\Administrators")) { // Få åtkomst till koden }
Rollbaserade kontroller (2/2) • Använd rättigheter för att kontrollera rollbaserade säkerhetskontroller • Imperativt • Deklarativt PrincipalPermission prinPerm = new PrincipalPermission("Teller", “Manager”, true); try { prinPerm.Demand(); // Matchar ovanstående aktiv “principal” } [PrincipalPermission(SecurityAction.Demand, Role="Teller", Authenticated=true)]
Agenda • Funktioner i .NET Framework för säkerhet • Kod och bevisbaserad säkerhet • Rollbaserad säkerhet • Kryptering • Säkra ASP.NET webbapplikationer • Säkra ASP.NET webbservices • Tips för att skriva säker kod med .NET Framework
Krypteringsgenomgång • .NET Framework har klasser som implementerar dessa operationer
Använd symmetrisk kryptering • Välj algoritm • TripleDESCryptoServiceProvider • RijndaelManaged • Generera en hemlig nyckel • Använd samma nyckel för kryptering och dekryptering • “FileStream” • “MemoryStream” • “NetworkStream”
Asymmetrisk kryptering • Välj krypteringsalgoritm • RSACryptoServiceProvider • DSACryptoServiceProvider • Generera ett nyckelpar • Kryptera eller dekryptera
Signering av data • Att signera data förhindrar påverkan och säkerställer identiteten på den som signerat • För att signera data • “Hasha” informationen • Kryptera resultatet med privat nyckel • För att verifiera den digitala signaturen: • Dekryptera signaturen med den publika nyckeln • Hasha informationen och jämför resultat
Agenda • Funktioner i .NET Framework för säkerhet • Kod och bevisbaserad säkerhet • Rollbaserad säkerhet • Kryptering • Säkra ASP.NET webbapplikationer • Säkra ASP.NET webbservices • Tips för att skriva säker kod med .NET Framework
Klienten begär sida Formulärbaserad autentisering Autentisering i ASP.NET Inte autentiserad Autentiserad Ingen åtkomst Inloggningssida(Användaren matar in uppgifter) Auktoriserad Inte autentiserad Autentiserad “Cookie” Begärd sida Auktoriserad
Konfigurera • Konfigurera IIS för anonym autentisering • Slå på autentisering i web.config • Sätt auktorisering • Bygg en inloggningssida <system.web> <authentication mode="Forms"> <forms loginUrl="login.aspx"/> </authentication> <authorization> <deny users="?"/> </authorization> </system.web>
Ytterligare förstärkningar • Säkra “cookies” • Nycklar specifika per applikation • <machineKey validationKey="AutoGenerate,IsolateApps"> • Används för att generera unika nycklar för varje applikation <authentication mode="Forms"> <forms loginUrl="login.aspx" protection="All" requireSSL="true" timeout="10" name="AppNameCookie" path="/FormsAuth" slidingExpiration="true" </forms> </authentication>
Användarenmatar in data Fel! Nej Valid inmatning? Valid inmatning? Ja Klient Server Nej Ja Webbapplikationenprocesserar… Validering av inmatning • Validering på klienten • Beror på version av webbläsare • Ger återkoppling omedelbart • Minskar antalet “postbacks” • Validering på servern • Repeterar all validering frånklienten • Kan validera mot lagradinformation
Valideringskontroller • Validering på klienten (“EnableClientScript”) • Validering på servern • “ControlToValidate” • “ErrorMessage”
Agenda • Funktioner i .NET Framework för säkerhet • Kod och bevisbaserad säkerhet • Rollbaserad säkerhet • Kryptering • Säkra ASP.NET webbapplikationer • Säkra ASP.NET webbservices • Tips för att skriva säker kod med .NET Framework
Säkra webbservices • Tre huvudsakliga modeller för att konfigurera säkerheten för XML Web Services: • På plattformsnivå (IPSEC, SSL) • På applikationsnivå (ACL, IP begränsningar) • På meddelandenivån (WSE) • Standarder för att stödja integritet och konfidentialitet på meddelandenivån: • XML Signatures • XML Encryption
Klient Service XML XML Säker transport Transport Transport Säkerhet på plattformsnivån Plattform och transport erbjuder säkerhet Autentisering av anroparen Integritet på meddelande Skyddat innehåll Säkerhet på transportnivå erbjuds av plattformen. T.ex. Windows använder Kerberos
XML meddelandet innehåller säkerhetsinformation Uppgifter för säkerhet Digitala signaturer Meddelanden kan krypteras Klient Service XML XML XML XML Vilken transport som helst Transport Transport Säkerheten äroberoende av transportprotokoll Säkerhet på meddelandenivån
“XML Signature” • En standardiserad XML syntax för att representera en digital signatur • Verifierar om ett meddelande ändrats under överföring • Signerar specifika delar av XML dokumentet eller meddelandet • Implementerat i .NET Framework • System.Security.Cryptography.Xml
“XML Encryption” • En standardiserad XML syntax för att definera information för kryptering • Kryptera utvalda delar av ett XML dokument eller meddelande • Stödjer både symmetriska och asymmetriska algoritmer • Inte inbyggt i senaste versionen av .NET Framework, men du kan skapa själv med: • System.Security.Cryptography • System.XML • System.IO.MemoryStream
WSE • Microsofts implementation av WS-Security: • Autentisering med SOAP huvuden • Kryptering av meddelanden • Signering av meddelanden • Implementerat i Microsoft.Web.Services.dll • Har också stöd för vidarehänvisning och tillägg
Agenda • Funktioner i .NET Framework för säkerhet • Kod och bevisbaserad säkerhet • Rollbaserad säkerhet • Kryptering • Säkra ASP.NET webbapplikationer • Säkra ASP.NET webbservices • Tips för att skriva säker kod med .NET Framework
Tips för säker kod (1 av 4 ) • Validera all användarinmatning • Håll uppsikt på data med mer än ett grundformat • Glöm inte “SQL injection” • Hantera känsligt data ansvarsfullt • Ta hänsyn till “reflection” • Använd attributet “NonSerializable” • Kryptera alla lagrade lösenord • Använd Dotfuscator
Tips för säker kod (2 av 4 ) • Kodbaserad säkerhet • Använd “permission requests” på assemblies för att minska din exponering • Undersök noggrant explicita rättigheter • Använd “Assert” när det är absolut nödvändigt • Anropa alltid “RevertAssert” • PInvoke och COM interoperabilitet • Använd “safe-native-unsafe” namngivning • Begär rättigheten att få exekvera ohanterad kod • Använd “sandboxing” mot ohanterade API-anrop