La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

La sicurezza di ASP.NET e IIS Raffaele Rialdi Microsoft C# MVPhttp://mvp.support.microsoft.com MVP Profilehttp://snipurl.com/f0cv Bloghttp://blogs/ugidotnet.org/raffaele.

Presentazioni simili


Presentazione sul tema: "La sicurezza di ASP.NET e IIS Raffaele Rialdi Microsoft C# MVPhttp://mvp.support.microsoft.com MVP Profilehttp://snipurl.com/f0cv Bloghttp://blogs/ugidotnet.org/raffaele."— Transcript della presentazione:

1 La sicurezza di ASP.NET e IIS Raffaele Rialdi Microsoft C# MVPhttp://mvp.support.microsoft.com MVP Profilehttp://snipurl.com/f0cv Bloghttp://blogs/ugidotnet.org/raffaele Vevy Europe SpA

2 Agenda IIS Asp.net.aspx,.asmx,.asax,.ascx,.soap,.rem,... NTFSLDAPSQL Web Application Anonymous Basic Windows Certificate None Windows Forms Passport Imperative Declarative Spying Spoofing / Tampering Sql/script Injection D.O.S. Autenticazione ("chi sei?") Autorizzazione ("cosa posso fare?") UrlAuthorizationModule FileAuthorizationModule NTFS Access Control List (ACL)

3 Meccanismi di Autenticazione IIS IIS Anonima Anonima Basic Basic Digest Digest Certificate Certificate Windows Windows Asp.net Asp.net Passport Passport Forms Forms IIS mappa l'utente su IUSR_nomemacchina IIS mappa l'utente su IUSR_nomemacchina Asp.net lo vede come "" Asp.net lo vede come "" Utente non viene riconosciuto anche se è in Lan Utente non viene riconosciuto anche se è in Lan Usano lo store delle credenziali di Windows Usano lo store delle credenziali di Windows Richiedono una CAL per ogni utente Richiedono una CAL per ogni utente Credenziali in chiaro (necessita SSL) Credenziali in chiaro (necessita SSL) La password non viaggia sulla rete La password non viaggia sulla rete

4 Differenze architetturali tra IIS5 e IIS6 inetinfo (IIS) account: localsystem worker process (w3wp) appdomain Una web application per appdomain App Pool 1 inetinfo (IIS) account: localsystem worker process (aspnet_wp) appdomain aspnet (default) Configurabile nel machine.config worker process (w3wp) appdomain worker process (w3wp) appdomain App Pool 2App Pool 3 appdomain Un account per App Pool. (token di processo) Devono essere membri del gruppo IIS_WPG Configurabile da IIS Network_service (default) User1User2 IIS 5IIS 6 HTTP.SYS (Kernel Mode)

5 Windows Authentication step-by-step 1. Web.config di default è pronto: 2. Impostare le autorizzazioni 3. Disabilitare l'autenticazione anonima in IIS... (prossime slide) 4. L'utente autenticato è: (stringa vuota se anonimo) 5. L'utente usato dal worker process è: ? utente anonimo * tutti gli utenti ? utente anonimo * tutti gli utenti System.Security.Principal.WindowsIdentity.GetCurrent().Name HttpContext.Current.User.Identity.Name

6 Internet Information Server IIS5 (Windows 2000 / XP Pro)

7 Internet Information Server IIS6 (Windows 2003)

8 IIS6 Application pool

9 Impersonation (solo con Windows Authentication) Il token di security dell'utente autenticato viene impostato sul thread. Il token di processo rimane invariato. Il token di security dell'utente autenticato viene impostato sul thread. Il token di processo rimane invariato. Se l'utente è anonimo, viene impersonato IUSR_NomePc Se l'utente è anonimo, viene impersonato IUSR_NomePc Sintassi (web.config): Sintassi (web.config): IIS5 non può eseguire più worker process sotto identità diverse Soluzione: impersonation di un utente specifico IIS5 non può eseguire più worker process sotto identità diverse Soluzione: impersonation di un utente specifico

10 I problemi architetturali di Impersonation Molti vogliono usare la security di Sql server Se il db è in rete, impersonation non funziona ma ci vuole invece delegation Se il db è in rete, impersonation non funziona ma ci vuole invece delegation Si perde il controllo centralizzato della security (accedere a Ntfs, Ldap, risorse in rete, DB) Si perde il controllo centralizzato della security (accedere a Ntfs, Ldap, risorse in rete, DB) La security 'per righe' fatta con sql server è un incubo La security 'per righe' fatta con sql server è un incubo

11 I problemi tecnologici di Impersonation Il token dell'utente non può essere usato per accedere a risorse remote (per es. la webapp non può usarlo per accedere un db in rete) La soluzione viene con Delegation che è di default disabilitata (proprio perchè è pericolosa!) Il token dell'utente non può essere usato per accedere a risorse remote (per es. la webapp non può usarlo per accedere un db in rete) La soluzione viene con Delegation che è di default disabilitata (proprio perchè è pericolosa!) Impersonation implica contesti diversi per ciascun utente. Questo significa niente connection pooling Impersonation implica contesti diversi per ciascun utente. Questo significa niente connection pooling Protezione limitata. Un eventuale buffer overrun può usare sia il token di thread (impersonato) che quello di processo (worker process) usando RevertToSelf. Protezione limitata. Un eventuale buffer overrun può usare sia il token di thread (impersonato) che quello di processo (worker process) usando RevertToSelf. Se chiamo un componente COM che sta in un apartment diverso, COM non userà il token di impersonazione ma quello di processo Se chiamo un componente COM che sta in un apartment diverso, COM non userà il token di impersonazione ma quello di processo

12 Scenario tipico di una webapp BrowserFirewall Web ServerData Server worker process token di processo = aspnet token di thread (solo se usa impersonation) Aliceaspnet Anche abilitando impersonation il Data Server verrà accesso come aspnet

13 Forms Authentication step-by-step 1. Abilitare l'autenticazione anonima in IIS 2. Impostare l'autenticazione e i suoi parametri 3. Impostare le autorizzazioni 4. Creare la pagina di login controllare l'utente e autorizzarlo if(UserDB.Check(txtUsername.Text, txtPassword.Text)) { FormsAuthentication.RedirectFromLoginPage( txtUsername.Text, ckRemember.Checked); } if(UserDB.Check(txtUsername.Text, txtPassword.Text)) { FormsAuthentication.RedirectFromLoginPage( txtUsername.Text, ckRemember.Checked); } ? utente anonimo * tutti gli utenti ? utente anonimo * tutti gli utenti

14 Forms Authentication gestire i ruoli 1. Gestire l'evento Application_AuthenticateRequest 2. Impostare le autorizzazioni per singole parti del sito protected void Application_AuthenticateRequest(Object sender, EventArgs e) { UserDB.AssignRoles(); } protected void Application_AuthenticateRequest(Object sender, EventArgs e) { UserDB.AssignRoles(); } L'ordine di valutazione delle autorizzazioni è dal primo verso l'ultimo. Il primo 'match' vince. L'ordine di valutazione delle autorizzazioni è dal primo verso l'ultimo. Il primo 'match' vince.

15 Forms Authentication Gestione utenti e ruoli Si costruisce una piccola classe: Si costruisce una piccola classe: public class UserDB { public static bool CheckUser(string Username, string Password) { return (Username == Password);// Solo per la demo!!! ;-) } public static void AssignRoles() { IPrincipal CurrentUser = HttpContext.Current.User; if(CurrentUser != null && CurrentUser.Identity.IsAuthenticated && CurrentUser.Identity.AuthenticationType == "Forms") { string User = CurrentUser.Identity.Name; string [] roles = GetRolesForUser(User); CurrentUser = new System.Security.Principal.GenericPrincipal (CurrentUser.Identity, roles); } private static string[] GetRolesForUser(string User) { string[] roles = new string[2]; roles[0] = "Administrators"; roles[1] = "Users"; return roles;// Solo per la demo! } public class UserDB { public static bool CheckUser(string Username, string Password) { return (Username == Password);// Solo per la demo!!! ;-) } public static void AssignRoles() { IPrincipal CurrentUser = HttpContext.Current.User; if(CurrentUser != null && CurrentUser.Identity.IsAuthenticated && CurrentUser.Identity.AuthenticationType == "Forms") { string User = CurrentUser.Identity.Name; string [] roles = GetRolesForUser(User); CurrentUser = new System.Security.Principal.GenericPrincipal (CurrentUser.Identity, roles); } private static string[] GetRolesForUser(string User) { string[] roles = new string[2]; roles[0] = "Administrators"; roles[1] = "Users"; return roles;// Solo per la demo! }

16 Principal e Identity La sicurezza basata sui ruoli secondo il framework IIdentity rappresenta l'identità di un utente WindowsIdentity, FormsIdentity, PassportIdentity, GenericIdentity IIdentity rappresenta l'identità di un utente WindowsIdentity, FormsIdentity, PassportIdentity, GenericIdentity IPrincipal contiene l'Identity e i ruoli WindowsPrincipal, GenericPrincipal IPrincipal contiene l'Identity e i ruoli WindowsPrincipal, GenericPrincipal AuthenticationType IsAuthenticated Name String. "Windows", "Forms", "Passport",... String. "Windows", "Forms", "Passport",... Bool. Indica se l'utente è autenticato Bool. Indica se l'utente è autenticato String. Nome dell'utente String. Nome dell'utente String. "Windows", "Forms", "Passport",... String. "Windows", "Forms", "Passport",... Bool. Indica se l'utente è autenticato Bool. Indica se l'utente è autenticato String. Nome dell'utente String. Nome dell'utente Identity IsInRole IIdentity. IIdentity. Bool. Indica se l'utente appartiene ad un certo ruolo (gruppo) Bool. Indica se l'utente appartiene ad un certo ruolo (gruppo) IIdentity. IIdentity. Bool. Indica se l'utente appartiene ad un certo ruolo (gruppo) Bool. Indica se l'utente appartiene ad un certo ruolo (gruppo)

17 Forms Authentication Gestione utenti Gli utenti si possono anche gestire nel web.config ma è sconsigliato: Gli utenti si possono anche gestire nel web.config ma è sconsigliato:

18 Esempio Forms Authentication

19 Forms Authentication Tip Diciamo di avere due Web Application... Diciamo di avere due Web Application... Prendiamo in considerazione: Prendiamo in considerazione: 1. Nome del cookie della Forms authentication 2. Path del cookie 3. Il tag nel web.config (vedi Se sono identici, l'utente potrà navigare da una all'altra senza doversi ri-autenticare Se sono identici, l'utente potrà navigare da una all'altra senza doversi ri-autenticare Se almeno uno di questi è diverso, sarà necessario ri-autenticarsi Se almeno uno di questi è diverso, sarà necessario ri-autenticarsi

20 Autenticazione mista Windows / Forms Il problema: In Windows Authentication, l'header HTTP "LOGON_USER" contiene il nome utente In Windows Authentication, l'header HTTP "LOGON_USER" contiene il nome utente Se IIS è configurato come anonimo, NON viene passato il nome utente anche se siamo loggati sul dominio Se IIS è configurato come anonimo, NON viene passato il nome utente anche se siamo loggati sul dominio... Ma la Forms authentication richiede che IIS sia configurato come anonimo (altrimenti compare la dialog di autenticazione)... Ma la Forms authentication richiede che IIS sia configurato come anonimo (altrimenti compare la dialog di autenticazione)

21 Autenticazione mista Windows / Forms La soluzione: Due pagine di Login: Forms e Windows Due pagine di Login: Forms e Windows Web.config configurato per la Forms Web.config configurato per la Forms Autorizzazione a tutti per la pagina di Login Windows Autorizzazione a tutti per la pagina di Login Windows IIS – WebApp: abilitare accesso anonimo IIS – WebApp: abilitare accesso anonimo IIS – LoginWin.aspx: togliere accesso anonimo IIS – LoginWin.aspx: togliere accesso anonimo LoginWin.aspx: Crea il ticket della Forms authenticaion a partire dalle credenziali Windows LoginWin.aspx: Crea il ticket della Forms authenticaion a partire dalle credenziali Windows

22 Esempio autenticazione mista

23 Forms Authentication con LDAP LDAP è un protocollo per dialogare con Active Directory LDAP è un protocollo per dialogare con Active Directory Posso chiedere con LDAP: Posso chiedere con LDAP: di verificare le credenziali di un utente su AD di verificare le credenziali di un utente su AD di darmi l'elenco dei gruppi a cui appartiene quell'utente di darmi l'elenco dei gruppi a cui appartiene quell'utente Il codice per fare queste due cose è qui: Il codice per fare queste due cose è qui: Metodo 1: Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean Metodo 1: Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean Metodo 2: Public Function GetGroups() As String Metodo 2: Public Function GetGroups() As String Un ottimo motivo per usarla è nelle WebApp con autenticazione mista Windows + Forms Un ottimo motivo per usarla è nelle WebApp con autenticazione mista Windows + Forms

24 Dove siamo? Autenticazione Autorizzazione Controllo Imperativo Controllo dichiarativo RaffaeleRaffaele IIS Basic, Win,... Asp.net Passport, Form IIS NTFS Asp.net Pagina si/no Asp.net PrincipalPermission, etc. Codice si/no

25 Sicurezza imperativa e dichiarativa Gli attrezzi del mestiere: Gli attrezzi del mestiere: IPrincipal.IsInRole() Imperativa (bool) IPrincipal.IsInRole() Imperativa (bool) PrincipalPermission.Demand() Imperativa (SecurityException) PrincipalPermission.Demand() Imperativa (SecurityException) PrincipalPermissionAttribute Dichiarativa (SecurityException) PrincipalPermissionAttribute Dichiarativa (SecurityException) if(User.IsInRole("Admins")) {... } PrincipalPermission perm = new PrincipalPermission(null, "Admins"); perm.Demand(); PrincipalPermission perm = new PrincipalPermission(null, "Admins"); perm.Demand(); PrincipalPermissionAttribute [PrincipalPermission(SecurityAction.Demand, Role="Admins")] public void MyAdminMethod() {...} PrincipalPermissionAttribute [PrincipalPermission(SecurityAction.Demand, Role="Admins")] public void MyAdminMethod() {...}

26 Esempio SecureHandler Role Based Authorization

27 Mai dare informazioni preziose default: Mai dare informazioni preziose default: Qualsiasi informazione sugli errori può essere sfruttata da un hacker. Qualsiasi informazione sugli errori può essere sfruttata da un hacker. Gli errori custom (che nascondono i dettagliati): Gli errori custom (che nascondono i dettagliati): mode="Off" mostrati a nessuno mode="Off" mostrati a nessuno mode="On" mostrati a tutti mode="On" mostrati a tutti mode="RemoteOnly" solo in remoto mode="RemoteOnly" solo in remoto Questo meccanismo è poco elastico Questo meccanismo è poco elastico Possiamo usare un HttpModule per migliorare la situazione.... Possiamo usare un HttpModule per migliorare la situazione....

28 CustomErrorHandler (esempio) 1. Web.Config: Web.Config: Due pagine di gestione errore: SoftError.aspx (per utenti) e HardError.aspx (per admin) 3. Il Module redirige gli errori a seconda del ruolo dell'utente 4. Il Module gestisce gli errori Http e le Exception... vediamo il codice...

29 Esempio CustomErrorHandler

30 HttpRequestValidationException (true by default) Riconosce un eventuale input malizioso dell'utente e lancia l'eccezione HttpRequestValidationException Riconosce un eventuale input malizioso dell'utente e lancia l'eccezione HttpRequestValidationException Se però voglio accettare una stringa html/script dall'utente? Opzione 1: validateRequest = false (vale per tutta la pagina) e validarla. Opzione 1: validateRequest = false (vale per tutta la pagina) e validarla. Opzione 2: criptare sul client, decrittarla sul server e validarla. Opzione 2: criptare sul client, decrittarla sul server e validarla. 1. Sul client (durante la onsubmit) si cripta il contenuto con encode di javascript 2. il contenuto criptato si mette dentro un 2. il contenuto criptato si mette dentro un 3. sul server si usa HttpUtility.UrlDecode per decodificare la stringa La validazione... si può usare Server.HtmlEncode per farlo apparire sulla pagina si può usare Server.HtmlEncode per farlo apparire sulla pagina si può fare il parsing per eliminare i tag pericolosi si può fare il parsing per eliminare i tag pericolosi

31 Spesso viene usato un campo hidden per conservare i dati tra un postback e l'altro Spesso viene usato un campo hidden per conservare i dati tra un postback e l'altro La modifica (tampering) dei campi hidden è banale e, se non controllata adeguatamente, può comportare un duro attacco. La modifica (tampering) dei campi hidden è banale e, se non controllata adeguatamente, può comportare un duro attacco.Soluzione: Criptarli prima di mandarli al client Criptarli prima di mandarli al client Decrittarli dentro un try/catch quando tornano al server Decrittarli dentro un try/catch quando tornano al server

32 Protezione del Viewstate Il Viewstate di default è un campo Il Viewstate di default è un campo Il Viewstate contiene lo stato dei controlli sul lato server Il Viewstate contiene lo stato dei controlli sul lato server Se non è criptato, è facilmente visibile: Se non è criptato, è facilmente visibile: 1. Criptarlo: Mac = machine authentication check La chiave e il metodo di encryption sono specificati nel tag del machine.config (autogenerazione) La chiave e il metodo di encryption sono specificati nel tag del machine.config (autogenerazione) Per crearne e specificarne di nuovi nel web.config: Q Per crearne e specificarne di nuovi nel web.config: Q Salvarlo sul server:

33 Proteggere le risorse Molti file non devono poter essere scaricati via http dall'utente Molti file non devono poter essere scaricati via http dall'utente Nel machine.config Asp.net protegge di default alcuni tipi di file dal download (.cs,.config,...) Nel machine.config Asp.net protegge di default alcuni tipi di file dal download (.cs,.config,...) Soluzione 1: custodirlo fuori dalla cartella virtuale Soluzione 1: custodirlo fuori dalla cartella virtuale Soluzione 2: proteggere il file via NTFS (se si usa impersonation.) Soluzione 2: proteggere il file via NTFS (se si usa impersonation.) Soluzione 3: proteggere con asp.net Soluzione 3: proteggere con asp.net Associare i file da proteggere in IIS all'Isapi di Asp.net Associare i file da proteggere in IIS all'Isapi di Asp.net Proteggere (ad esempio) i file mdb nel web.config: Proteggere (ad esempio) i file mdb nel web.config:

34 CAS e ASP.net Livello di TrustRestrizioni della CAS Full Nessuna restrizione sulle permission. Applicazioni possono accedere a risorse controllate dalle impostazioni del sistema operativo Possono essere fatte operazioni che richiedono un alto privilegio High Non si può chiamare codice nativo Non si possono usare serviced components Non si può scrivere nell'event log Non si può accedere alle code di msmq Non si può usare data source di tipo OLE DB Medium L'accesso ai file è ristretto alla cartella dell'applicazione Non si può accedere al registry Low Non si può accedere a SQL Server Non si può chiamare CodeAccessPermission.Assert Minimal Si ha solo il diritto di esecuzione e nulla di più

35 Q & A....

36 © Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

37 SQL Injection Un pirata può devastare il db... Un pirata può devastare il db... Select * from authors where au_lname like ' ' ; drop authors - - ' string strSql = "Select * from authors where au_lname like '" + TextBox1.Text + "'"; SqlCommand cmd = new SqlCommand(strSql, Cnn); SqlDataReader dr = cmd.ExecuteReader(); string strSql = "Select * from authors where au_lname like '" + TextBox1.Text + "'"; SqlCommand cmd = new SqlCommand(strSql, Cnn); SqlDataReader dr = cmd.ExecuteReader(); Prima query Seconda query ScartatoScartato

38 SQL Injection... usare i parameters!!!... I Parameters incrementano anche le performance: I Parameters incrementano anche le performance: non c'è conversione da string a tipo sul db non c'è conversione da string a tipo sul db la query rimane compilata e preparata sul db server la query rimane compilata e preparata sul db server exec sp_executesql N'Select * from authors where au_lname = ' ' ' ; drop authors - - ' exec sp_executesql N'Select * from authors where au_lname = ' ' ' ; drop authors - - ' apice raddoppiato da ADO.NET Gli apici non sono l'unico problema: select * from titles where royalty = 0 ; drop authors string strSql = "Select * from authors where au_lname SqlCommand cmd = new SqlCommand(strSql, Cnn); SqlDbType.VarChar,40); SqlDataReader dr = cmd.ExecuteReader(); string strSql = "Select * from authors where au_lname SqlCommand cmd = new SqlCommand(strSql, Cnn); SqlDbType.VarChar,40); SqlDataReader dr = cmd.ExecuteReader();

39 XSS: Cross Site Scripting From: Hacker To: Raffaele Subject: Free gift Click here to win From: Hacker To: Raffaele Subject: Free gift Click here to win 1.Normale navigazione 2. con link contenente un attacco XSS 3.Il link effetua una GET sul sito della banca con la QueryString 4.La banca (non protetta da XSS) restituisce nella pagina html lo script inviato 5.Lo script viene eseguito dal browser e le informazioni riservate arrivano al pirata

40 Mappare una estensione in IIS Affinchè asp.net (e quindi handlers e moduli) abbiano il controllo di un tipo di file (.jpg nell'esempio) è necessario configurare IIS Affinchè asp.net (e quindi handlers e moduli) abbiano il controllo di un tipo di file (.jpg nell'esempio) è necessario configurare IIS slide post-sessione Path dell'isapi di asp.net (copiarla da quella di.aspx)

41 Promemoria Installate XP SP2 e Win2K3 SP1! Installate XP SP2 e Win2K3 SP1! Aggiornare sempre con Windows Update Aggiornare sempre con Windows Update Proteggere i dati sensibili Proteggere i dati sensibili DPAPI per criptare (vedi Pattern & Practices sul sito MSDN) DPAPI per criptare (vedi Pattern & Practices sul sito MSDN) ASPnet_setreg.exe per salvare credenziali criptate nel registry (per esempio di sql). Vedi Q per i dettagli. ASPnet_setreg.exe per salvare credenziali criptate nel registry (per esempio di sql). Vedi Q per i dettagli. Eseguire logging e auditing Eseguire logging e auditing Usare UrlScan. UrlScan Monitor (Lorenzo Barbieri) 9fd-3cfd-4d2d-bbe9-4bcc334ed2c3 Usare UrlScan. UrlScan Monitor (Lorenzo Barbieri) 9fd-3cfd-4d2d-bbe9-4bcc334ed2c3 IIS LockDown (solo IIS5) IIS LockDown (solo IIS5) Secure Configuration Wizard (solo IIS6 W2K3 SP1) Secure Configuration Wizard (solo IIS6 W2K3 SP1) slide post-sessione


Scaricare ppt "La sicurezza di ASP.NET e IIS Raffaele Rialdi Microsoft C# MVPhttp://mvp.support.microsoft.com MVP Profilehttp://snipurl.com/f0cv Bloghttp://blogs/ugidotnet.org/raffaele."

Presentazioni simili


Annunci Google