ASP.NET%20Security - PowerPoint PPT Presentation

About This Presentation
Title:

ASP.NET%20Security

Description:

ASP.NET Security Raffaele Rialdi MVP.NET malta_at_vevy.com ... UrlAuthorizationModule FileAuthorizationModule NTFS Access Control List (ACL) ... – PowerPoint PPT presentation

Number of Views:290
Avg rating:3.0/5.0
Slides: 37
Provided by: micros528
Category:

less

Transcript and Presenter's Notes

Title: ASP.NET%20Security


1
ASP.NET Security
"Non esiste una patch per la stupidità"
http//www.sqlsecurity.com
  • Raffaele Rialdi MVP.NET
  • malta_at_vevy.com
  • http//mvp.support.microsoft.comMVP Profile
    http//snipurl.com/7vyf

2
Agenda
Spoofing / Tampering
Spying
Sql/script Injection
D.O.S.
Autenticazione ("chi sei?")
Autorizzazione ("cosa posso fare?")
IIS
  • Anonymous
  • Basic
  • Windows
  • Certificate
  • NTFS Access Control List (ACL)

Asp.net.aspx, .asmx, .asax, .ascx, .soap, .rem,
...
  • UrlAuthorizationModule
  • FileAuthorizationModule

Web Application
  • None
  • Windows
  • Forms
  • Passport
  • Imperative
  • Declarative

NTFS
LDAP
SQL
3
Meccanismi diAutenticazione
  • IIS
  • Anonima
  • Basic
  • Digest
  • Certificate
  • Windows
  • Asp.net
  • Passport
  • Forms

IIS mappa l'utente su IUSR_nomemacchina Asp.net lo vede come "" Utente non viene riconosciuto anche se è in Lan
Usano lo store delle credenziali di Windows Richiedono una CAL per ogni utente
La password non viaggia sulla rete
Credenziali in chiaro (necessita SSL)
4
Windows Authenticationstep-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 è

ltauthentication mode"Windows" /gt
ltauthorizationgt ltdeny users"?" /gt ltallow
users"" /gt lt/authorizationgt
? ? utente anonimo ? tutti gli utenti
HttpContext.Current.User.Identity.Name
System.Security.Principal.WindowsIdentity.GetCurre
nt().Name
5
Internet Information ServerIIS5 (Windows 2000 /
XP Pro)
6
Internet Information ServerIIS6 (Windows 2003)
7
IIS6 Application pool
8
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) ltidentity impersonatetrue
    /gt
  • IIS5 non può eseguire più worker process sotto
    identità diverseSoluzione impersonation di un
    utente specificoltidentity impersonatetrue
    user"xxx" password"zzz" /gt

9
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
  • 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

10
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

11
Forms Authenticationstep-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

ltauthentication mode"Forms"gt ltforms
name"myCookieName" loginUrl"/Login.aspx"
/gt lt/authenticationgt
ltauthorizationgt ltdeny users"?" /gt ltallow
users"" /gt lt/authorizationgt
? ? utente anonimo ? tutti gli utenti
if(UserDB.Check(txtUsername.Text,
txtPassword.Text)) FormsAuthentication.Redirect
FromLoginPage( txtUsername.Text,
ckRemember.Checked)
12
Forms Authenticationgestire i ruoli
  1. Gestire l'evento Application_AuthenticateRequest
  2. Impostare le autorizzazioni per singole parti del
    sito

protected void Application_AuthenticateRequest(Obj
ect sender, EventArgs e) UserDB.AssignRoles()

ltlocation path"Backoffice.aspx"gt ltsystem.webgt
ltauthorizationgt ltdeny users"?" /gt ltallow
roles"admins" /gt ltdeny users""
/gt lt/authorizationgt lt/system.webgt lt/locationgt
L'ordine di valutazione delle autorizzazioni è
dal primo verso l'ultimo. Il primo 'match' vince.
13
Forms AuthenticationGestione 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.Ge
nericPrincipal (CurrentUser.Identity,
roles) private static string
GetRolesForUser(string User) string roles
new string2 roles0 "Administrators"
roles1 "Users" return roles // Solo per
la demo!
14
Principal e IdentityLa sicurezza basata sui
ruoli secondo il framework
  • IIdentity rappresenta l'identità di un
    utenteWindowsIdentity, FormsIdentity,
    PassportIdentity, GenericIdentity
  • IPrincipal contiene l'Identity e i
    ruoliWindowsPrincipal, GenericPrincipal
  • String. "Windows", "Forms", "Passport", ...
  • Bool. Indica se l'utente è autenticato
  • String. Nome dell'utente

AuthenticationType
IsAuthenticated
Name
  • IIdentity.
  • Bool. Indica se l'utente appartiene ad un certo
    ruolo (gruppo)

Identity
IsInRole
15
Forms AuthenticationGestione utenti
  • Gli utenti si possono anche gestire nel
    web.config ma è sconsigliato

ltauthentication mode"Forms"gt ltforms
name"myCookieName" loginUrl"/Login.aspx"gt ltcr
edentials passwordFormat "SHA1" ltuser
name"UserName1" password"SHA1EncryptedPassword1"
/gt lt/credentialsgt lt/formsgt lt/authenticationgt
16
EsempioForms Authentication
17
Forms AuthenticationTip
  • Diciamo di avere due Web Application ...
  • Prendiamo in considerazione
  • Nome del cookie della Forms authentication
  • Path del cookie
  • Il tag ltmachineKey ... /gt nel web.config(vedi
    http//support.microsoft.com?id312906)
  • 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

18
Autenticazione mistaWindows / 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)

19
Autenticazione mistaWindows / 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

ltlocation path"LoginWin.aspx"gt ltsystem.webgt lta
uthorizationgt ltallow users""
/gt lt/authorizationgt lt/system.webgt lt/locationgt
20
EsempioAutenticazione mista
21
Forms Authenticationcon 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 è
    quihttp//support.microsoft.com/?id326340
  • 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

22
Dove siamo?
Autenticazione
IISBasic, Win, ...
Asp.netPassport, Form
Raffaele
Pagina si/no
Autorizzazione
IISNTFS
Asp.netltauthorization ... /gt
Codice si/no
Controllo Imperativo
Controllo dichiarativo
Asp.netPrincipalPermission, etc.
23
Sicurezzaimperativa 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() ...
24
Esempio SecureHandlerRole Based Authorization
25
Mai dare informazioni preziosedefault
ltcustomErrors mode"RemoteOnly" /gt
  • 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 ....

26
CustomErrorHandler(esempio)
  • Web.ConfigltcustomErrors mode"On"
    defaultRedirect"/HttpErrors.aspx" /gt....
    lthttpModulesgt ltadd type"CustomErrorHandler.RafE
    rrorModule, CustomErrorHandler"
    name"RafErrorModule"/gtlt/httpModulesgt
  • Due pagine di gestione erroreSoftError.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 ...

27
EsempioCustomErrorHandler
28
SQL Injection
  • Un pirata può devastare il db ...

string strSql "Select from authors where
au_lname like '" TextBox1.Text
"'" SqlCommand cmd new SqlCommand(strSql,
Cnn) SqlDataReader dr cmd.ExecuteReader()
Select from authors where au_lname like ' '
drop authors - - '
Prima query
Seconda query
Scartato
29
SQL Injection... usare i parameters!!! ...
  • I Parameters incrementano anche le performance
  • non c'è conversione da string a tipo sul db
  • la query rimane compilata e preparata sul db
    server

string strSql "Select from authors where
au_lname like _at_au_lname" SqlCommand cmd new
SqlCommand(strSql, Cnn) cmd.Parameters.Add("_at_au_l
name", SqlDbType.VarChar,40) SqlDataReader dr
cmd.ExecuteReader()
exec sp_executesql N'Select from authors where
au_lname like _at_au_lname', N'_at_au_lname
varchar(40)', _at_au_lname ' ' ' drop
authors - - '
apice raddoppiato da ADO.NET
Gli apici non sono l'unico problemaselect
from titles where royalty 0 drop authors
30
XSS Cross Site Scripting
From Hacker To Raffaele Subject Free
gift Click here to win
?
?
?
?
?
?
  1. Normale navigazione
  2. Email 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

31
Contromisura di asp.net 1.1lt_at_ Page
validateRequest"true" gt(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) e validarla.
  • 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 ltinput
    typehiddengt
  • sul server si usa HttpUtility.UrlDecode per
    decodificare la stringa
  • La validazione ...
  • si può usare Server.HtmlEncode per farlo apparire
    sulla pagina
  • si può fare il parsing per eliminare i tag
    pericolosi

32
ltInput typehidden /gt
  • 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

33
Protezione del Viewstate
  • Il Viewstate di default è un campo ltinput
    typehidden /gt
  • Il Viewstate contiene lo stato dei controlli sul
    lato server
  • Se non è criptato, è facilmente
    visibilehttp//www.pluralsight.com/toolcontent/V
    iewStateDecoder11.zip
  • Soluzioni
  • Criptarlo lt_at_ Page enableViewStateMactrue
    /gtMac machine authentication check
  • La chiave e il metodo di encryption sono
    specificati nel tag ltmachineKeygt del
    machine.config (autogenerazione)
  • Per crearne e specificarne di nuovi nel
    web.config Q312906
  • Salvarlo sul serverhttp//www.aspalliance.com/ar
    ticleViewer.aspx?aId72vIdpIdhttp//msdn.micr
    osoft.com/msdnmag/issues/03/02/CuttingEdge/default
    .aspx

34
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 custodirlo fuori dalla cartella
    virtuale
  • Soluzione 2 proteggere il file via NTFS (se si
    usa impersonation.)
  • Soluzione 3 proteggere con asp.net
  • Associare i file da proteggere in IIS all'Isapi
    di Asp.net
  • Proteggere (ad esempio) i file mdb nel
    web.configlthttpHandlersgt ltadd verb""
    path".mdb" type"System.Web.HttpForbiddenHandl
    er" /gtlt/httpHandlersgt

35
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

Path dell'isapi di asp.net (copiarla da quella di
.aspx)
36
Q A
  • ....
Write a Comment
User Comments (0)
About PowerShow.com