DOT NET Security

Chia sẻ bởi Nguyễn Duy Diệu | Ngày 29/04/2019 | 113

Chia sẻ tài liệu: DOT NET Security thuộc Bài giảng khác

Nội dung tài liệu:

ASP.NET Security
Raffaele Rialdi MVP.NET
[email protected]
http://mvp.support.microsoft.com
MVP Profile: http://snipurl.com/7vyf
"Non esiste una patch per la stupidità"
http://www.sqlsecurity.com
Sponsor
Agenda
IIS
Asp.net
.aspx, .asmx, .asax, .ascx, .soap, .rem, ...
NTFS
LDAP
SQL
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)
SQL Injection
L`utente o un hacker che intercetta la comunicazione 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();
Prima query
Seconda query
Scartato
SQL Injection
... usare i parameters!!! ...
Usare i Parameters
exec sp_executesql N`Select * from authors
where au_lname like @au_lname`,
N`@au_lname varchar(40)`, @au_lname = ``` ; drop authors – `
string strSql = "Select * from authors where au_lname like @au_lname";

SqlCommand cmd = new SqlCommand(strSql, Cnn);
cmd.Parameters.Add("@au_lname", SqlDbType.VarChar,40);
SqlDataReader dr = cmd.ExecuteReader();
Raddoppio apici
Gli apici non sono l`unico problema:
select * from titles where royalty = 0 ; drop authors
Contromisura di asp.net 1.1
<%@ Page validateRequest="true" %>
(true by default)
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)

Opzione 2: criptare sul client, decrittarla sul server e validarla.
Sul client (durante la onsubmit) si cripta il contenuto con encode di javascript
il contenuto criptato si mette dentro un
sul server si usa HttpUtility.UrlDecode per decodificare la stringa

infine ...
si può usare Server.HtmlEncode per farlo apparire sulla pagina
si può fare il parsing per eliminare i tag pericolosi

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.

Soluzione:
Criptarli prima di mandarli al client
Decrittarli dentro un try/catch quando tornano al server
Protezione del Viewstate
Il Viewstate contiene lo stato dei controlli sul lato server
Se non è criptato, è facilmente visibile:
http://www.pluralsight.com/toolcontent/ViewStateDecoder11.zip

Soluzioni:
Criptarlo: <%@ Page enableViewStateMac=“true” />
Mac = machine authentication check
La chiave e il metodo di encryption sono specificati nel tag del machine.config (autogenerazione)
Per crearne e specificarne di nuovi nel web.config: Q312906
Salvarlo sul server:
http://www.aspalliance.com/articleViewer.aspx?aId=72&vId=&pId=
http://msdn.microsoft.com/msdnmag/issues/03/02/CuttingEdge/default.aspx
Proteggere le risorse
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, ...)

Soluzione 1: proteggere il file via NTFS (Windows auth.)
Soluzione 2: proteggere con asp.net
Associare i file da proteggere in IIS all`Isapi di Asp.net
Proteggere (ad esempio) i file mdb nel web.config:

type="System.Web.HttpForbiddenHandler" />


Meccanismi di
Autenticazione
IIS
Anonima
Basic
Digest
Certificate
Windows
Asp.net
Passport
Forms
Windows Authentication
step-by-step
Web.config di default è pronto:

Impostare le autorizzazioni


Disabilitare l`autenticazione anonima in IIS ...
(prossime slide)
L`utente autenticato è: (stringa vuota se anonimo)

L`utente usato dal worker process è:





?  utente anonimo
*  tutti gli utenti
System.Security.Principal.WindowsIdentity.GetCurrent().Name
HttpContext.Current.User.Identity.Name
Internet Information Server
IIS5 (Windows 2000 / XP Pro)
Internet Information Server
IIS6 (Windows 2003)
IIS6 Application pool
Impersonation
(solo con Windows Authentication)
Il token di security a livello di thread viene sostituito con quello dell`utente autenticato.
Il token di processo rimane invariato.
Se l`utente è anonimo, viene impersonato IUSR_NomePc
Sintassi (web.config):
IIS5 non può eseguire più worker process sotto identità diverse
Soluzione: impersonation di un utente specifico


I problemi architetturali
di Impersonation
Molti vogliono usare la security di Sql server
Se il db è in rete, ci vuole delegation
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
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!)
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.
Se chiamo un componente COM che sta in un apartment diverso, COM non userà il token di impersonazione ma quello di processo
Forms Authentication
step-by-step
Abilitare l`autenticazione anonima in IIS
Impostare l`autenticazione e i suoi parametri


Impostare le autorizzazioni



Creare la pagina di login controllare l`utente e autorizzarlo







if(UserDB.Check(txtUsername.Text, txtPassword.Text))
{
FormsAuthentication.RedirectFromLoginPage(
txtUsername.Text, ckRemember.Checked);
}
?  utente anonimo
*  tutti gli utenti
Forms Authentication
gestire i ruoli
Gestire l`evento Application_AuthenticateRequest



Impostare le autorizzazioni per singole parti del sito
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
UserDB.AssignRoles();
}









L`ordine di valutazione delle autorizzazioni è dal primo vero l`ultimo.

Il primo `match` vince.
Forms Authentication
Gestione utenti e ruoli
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!
}
}
Forms Authentication
Gestione utenti
Gli utenti si possono anche gestire nel web.config ma è sconsigliato:









Esempio
Forms Authentication
Forms Authentication
Tip
Diciamo di avere due Web Application ...
Prendiamo in considerazione:
Nome del cookie della Forms authentication
Path del cookie
Il tag nel web.config
(vedi http://support.microsoft.com?id=312906)

Se sono identici, l`utente potrà navigare da una all`altra senza doversi ri-autenticare
Se almeno un di questi è diverso, è necessario
ri-autenticarsi
Autenticazione mista
Windows / Forms
Il problema:
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
... Ma la Forms authentication richiede che IIS sia configurato come anonimo
(altrimenti compare la dialog di autenticazione)
Autenticazione mista
Windows / Forms
La soluzione:
Due pagine di Login: Forms e Windows
Web.config configurato per la Forms
Autorizzazione a tutti per
la pagina di Login Windows
IIS – WebApp: abilitare accesso anonimo
IIS – LoginWin.aspx: togliere accesso anonimo
LoginWin.aspx: Crea il ticket della Forms authenticaion a partire dalle credenziali Windows







Esempio
Autenticazione mista
Forms Authentication
con LDAP
LDAP è un protocollo per dialogare con Active Directory
Posso chiedere con LDAP:
di verificare le credenziali di un utente su AD
di darmi l`elenco dei gruppi a cui appartiene quell`utente
Il codice per fare queste due cose è qui:
http://support.microsoft.com/?id=326340
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

Un ottimo motivo per usarla è nelle WebApp con autenticazione mista Windows + Forms
Dove siamo?
Autenticazione
Autorizzazione
Controllo
Imperativo
Controllo
dichiarativo
Raffaele
IIS
Basic, Win, ...
Asp.net
Passport, Form
IIS
NTFS
Asp.net

Pagina si/no
Asp.net
PrincipalPermission, etc.
Codice si/no
Principal e Identity
La sicurezza basata sui ruoli secondo il framework
IIdentity rappresenta l`identità di un utente
WindowsIdentity, FormsIdentity, PassportIdentity, GenericIdentity



IPrincipal contiene l`Identity e i ruoli
WindowsPrincipal, GenericPrincipal



AuthenticationType
IsAuthenticated
Name
String. "Windows", "Forms", "Passport", ...
Bool. Indica se l`utente è autenticato
String. Nome dell`utente
Identity
IsInRole
IIdentity.
Bool. Indica se l`utente appartiene ad un certo ruolo (gruppo)
Sicurezza
imperativa e dichiarativa
Gli attrezzi del mestiere:
IPrincipal.IsInRole()  Imperativa (bool)



PrincipalPermission.Demand()  Imperativa (SecurityException)




PrincipalPermissionAttribute  Dichiarativa (SecurityException)


if(User.IsInRole("Admins")) { ... }
PrincipalPermission perm = new PrincipalPermission(null, "Admins");
perm.Demand();
PrincipalPermissionAttribute

[PrincipalPermission(SecurityAction.Demand, Role="Admins")]
public void MyAdminMethod() {...}
Esempio SecureHandler
Role Based Authorization
Asp.net 2.0
DEMO
Mai dare informazioni preziose
default:
Qualsiasi informazione sugli errori può essere sfruttata da un hacker.
Gli errori custom (che nascondono i dettagliati):
mode="Off"  mostrati a nessuno
mode="On"  mostrati a tutti
mode="RemoteOnly"  solo in remoto

Questo meccanismo è poco elastico
Possiamo usare un HttpModule per migliorare la situazione ....
CustomErrorHandler
(esempio)
Web.Config:

....



Due pagine di gestione errore:
SoftError.aspx (per utenti) e HardError.aspx (per admin)
Il Module redirige gli errori a seconda del ruolo dell`utente
Il Module gestisce gli errori Http e le Exception

... vediamo il codice ...
Esempio
CustomErrorHandler
Promemoria
Installate XP SP2 ovunque!
Aggiornare sempre con Windows Update
Proteggere i dati sensibili
DPAPI per criptare (vedi Pattern & Practices sul sito MSDN)
ASPnet_setreg.exe per salvare credenziali criptate nel registry
(per esempio di sql). Vedi Q329290 per i dettagli.
Eseguire logging e auditing
Usare UrlScan.  UrlScan Monitor (Lorenzo Barbieri)
http://www.gotdotnet.com/Community/Workspaces/workspace.aspx?id=c859a9fd-3cfd-4d2d-bbe9-4bcc334ed2c3
IIS LockDown (solo IIS5)
Secure Configuration Wizard (solo IIS6  W2K3 SP1)

Q & A
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
slide post-sessione
Path dell`isapi di asp.net (copiarla da quella di .aspx)
Asp.net authorization bug

Nei giorni del workshop è stato scoperto un bug sulla canonicalization degli URL in asp.net
Colpisce asp.net dietro ad IIS5 non protetto da UrlScan.
IIS6 neutralizza l`attacco proteggendo così asp.net.
Se l`url http://MySite/Reserved.aspx viene accesso via http://MySite%5CReserved.aspx , allora viene dato l`accesso nonostante la pagina Reserved.aspx sia tra quelle protette nel web.config con il tag

Rimedi:
seguire le indicazioni di http://support.microsoft.com?id=887459
scrivere un HttpModule che canonicalizzi gli url prima che asp.net autorizzi la richiesta
usare UrlScan
Maggiori dettagli (e link):
http://www.microsoft.com/security/incident/aspnet.mspx
http://blogs.ugidotnet.org/raffaele/
slide post-sessione
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...

Người chia sẻ: Nguyễn Duy Diệu
Dung lượng: | Lượt tài: 3
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)