Le applicazioni Web ASP.NET protette si basano su un'infrastruttura di reti, host e piattaforme caratterizzata da un livello di protezione ottimale. Se tali elementi sono realmente efficaci, l'utente malintenzionato tenterà di sfruttare le vulnerabilità delle applicazioni e dei servizi Web, che generalmente utilizzano la porta 80 per l'ascolto. Se l'applicazione Web non è configurata in modo efficace, gli utenti malintenzionati possono accedere al sistema e sfruttarne le risorse.
Tra i compiti dell'amministratore vi è appunto l'analisi della configurazione predefinita a livello del computer e delle configurazioni delle singole applicazioni allo scopo di identificare e rimuovere le eventuali impostazioni vulnerabili o non protette.
In questo modulo vengono descritte le novità di ASP.NET dal punto di vista dell'amministratore di sistema e le modalità di configurazione delle impostazioni di protezione per l'intero computer e le singole applicazioni. Viene inoltre presentata la metodologia per la protezione delle applicazioni e dei servizi Web ASP.NET, che completa la metodologia per la protezione della rete, del server per applicazioni, del server dei database e del server Web già proposta.
Il modulo consente di:
| • | Archiviare le credenziali e le stringhe di connessione nel Registro di sistema mediante l'utilità Aspnet_setreg.exe. |
| • | Utilizzare i file di configurazione (*.config) per gestire l'ambiente delle applicazioni Web. |
| • | Imparare le modalità di applicazione ed elaborazione gerarchiche dei file Machine.config e Web.config. |
| • | Bloccare le impostazioni di configurazione. |
| • | Applicare i criteri di protezione per il computer e per l'applicazione Web. |
| • | Personalizzare le impostazioni di protezione di file e directory mediante l'elemento <location>. |
| • | Proteggere l'identità di processo ASP.NET e utilizzare la rappresentazione personalizzata nelle applicazioni ASP.NET. |
| • | Conoscere le autorizzazioni NTFS necessarie per gli account di processo ASP.NET. |
| • | Proteggere le risorse mediante l'autenticazione Forms e l'autorizzazione URL. |
| • | Proteggere lo stato sessione ASP.NET. |
| • | Proteggere una Web farm e la directory bin. |
Le informazioni contenute in questo modulo sono valide per i seguenti prodotti e tecnologie:
| • | Microsoft Windows Server 2000 |
| • | Microsoft .NET Framework 1.1 e ASP.NET 1.1 |
| • | Microsoft SQL Server 2000 |
Questo modulo verte sugli aspetti essenziali della protezione delle applicazioni ASP.NET. Per trarre il massimo vantaggio dal modulo:
| • | Consultare il modulo 16 "Protezione del server Web". In questo modulo vengono illustrate le modalità di protezione del sistema operativo Windows 2000 e di Microsoft .NET Framework. Una piattaforma di base protetta è un requisito indispensabile per la protezione di un'applicazione o di un servizio Web ASP.NET. |
| • | Utilizzare l'istantanea. Nella Tabella 19.4, alla fine del presente modulo, viene fornita l'istantanea di un'applicazione ASP.NET protetta con impostazioni di configurazione protette nei file Machine.config e Web.config. Utilizzare la tabella per la configurazione delle impostazioni del server e dell'applicazione. |
| • | Utilizzare l'elenco di controllo. In "Elenco di controllo: Protezione di ASP.NET", nella sezione "Elenco di controllo" di questa guida, viene fornito un ausilio stampabile di riferimento rapido. L'elenco di controllo basato sulle attività permette di valutare rapidamente l'ambito complessivo delle procedure necessarie e assiste nell'esecuzione delle singole fasi. |
Per informazioni correlate, consultare il modulo 20 "Hosting di più applicazioni ASP.NET", in cui viene descritto come isolare dalle risorse di sistema essenziali e le une dalle altre più applicazioni Web in esecuzione sullo stesso server. Per ulteriori informazioni sulla configurazione dei criteri di protezione dall'accesso di codice (Code Access Security, CAS) per applicazioni e servizi Web con attendibilità parziale, consultare il modulo 9 "Utilizzo della protezione dall'accesso di codice con ASP.NET".
Per proteggere l'applicazione ASP.NET è necessario rafforzare il sistema operativo e la base di installazione .NET Framework, quindi applicare impostazioni di configurazione protette per ridurre il profilo di attacco dell'applicazione.
Ad esempio:
| • | Servizi. .NET Framework installa il servizio Stato ASP.NET per gestire lo stato di sessione out-of-process di ASP.NET. Proteggere il servizio Stato ASP.NET se lo si installa, disattivarlo se non è necessario. |
| • | Protocolli. Limitare il numero di protocolli per i servizi Web in modo da ridurre la superficie dell'area esposta ad attachi. |
| • | Account. L'account ASPNET predefinito viene creato per le applicazioni Web in esecuzione, per i servizi Web e per il servizio Stato ASP.NET. Gli eventuali account personalizzati creati per l'esecuzione di processi o servizi devono essere configurati come account con privilegi minimi, ossia essere dotati dell'insieme minimo delle autorizzazioni NTFS e dei privilegi Windows necessari. |
| • | File e directory. Le directory Bin delle applicazioni, utilizzate per la memorizzazione degli assembly privati, devono essere protette per ridurre al minimo il rischio di scaricamento della logica aziendale da parte di un utente malintenzionato. |
| • | Archivio di configurazione . Molte delle impostazioni di protezione che controllano le aree funzionali, quali ad esempio l'autenticazione, l'autorizzazione, lo stato sessione e così via, vengono gestite nei file di configurazione XML Machine.config e Web.config. Per proteggere le applicazioni ASP.NET è necessario utilizzare impostazioni di configurazione protette. |
Di seguito vengono riportati informazioni e dettagli da prendere in considerazione prima di avviare il processo di protezione delle applicazioni e dei servizi Web.
In Microsoft Windows 2000, Internet Information Services (IIS) 5.0 esegue la totalità delle applicazioni e dei servizi Web nel processo di lavoro ASP.NET (Aspnet_wp.exe). L'unità di isolamento è il dominio dell'applicazione e ogni directory virtuale dispone di un proprio dominio di applicazione. Le impostazioni di configurazione a livello di processo vengono gestite dall'elemento <processModel> del file Machine.config.
In Microsoft Windows Server 2003, i pool di applicazioni IIS 6.0 consentono di isolare le applicazioni mediante processi separati. Per ulteriori informazioni, consultare il modulo 20 "Hosting di più applicazioni ASP.NET".
L'account ASPNET è un account locale con privilegi minimi creato quando si installa .NET Framework. Per impostazione predefinita esegue il processo di lavoro ASP.NET e il servizio Stato ASP.NET.
Se si sceglie di eseguire le applicazioni Web mediante un account personalizzato, configurare l'account con privilegi minimi. Così facendo si riducono i rischi derivanti dall'esecuzione di codice da parte di un utente malintenzionato in grado di sfruttare il contesto di protezione dell'applicazione. È inoltre necessario specificare le credenziali dell'account nell'elemento <processModel>. Non archiviare credenziali non crittografate: utilizzare lo strumento Aspnet_setreg.exe per archiviare credenziali crittografate nel Registro di sistema. All'account personalizzato è inoltre necessario concedere le autorizzazioni NTFS appropriate.
Aspnet_setreg.exe consente di archiviare le credenziali e le stringhe di connessione nel Registro di sistema in formato crittografato. Con questo strumento è possibile crittografare i seguenti attributi:
| • | <processModel userName = password= /> |
| • | <identity username = password= /> |
| • | <sessionState sqlConnectionString = stateConnectionString= /> |
Nell'esempio seguente viene mostrato l'elemento <processModel> con un account personalizzato prima e dopo l'esecuzione di Aspnet_setreg.exe per la protezione delle credenziali:
<!--Before--> <processModel userName="CustomAccount" password="Str0ngPassword" /> <!--After--> <processModel userName="registry:HKLM\SOFTWARE\YourApp\process\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourApp\process\ASPNET_SETREG,password"/>
È possibile scegliere il punto del Registro di sistema in cui archiviare i dati crittografati, che deve tuttavia trovarsi nella struttura HKEY_LOCAL_MACHINE. Oltre a crittografare i dati con l'interfaccia DPAPI (API di protezione dei dati) e ad archiviarli nel Registro di sistema, lo strumento applica un elenco di controllo di accesso (ACL, Access Control List) protetto per limitare l'accesso alla chiave del Registro di sistema. L'elenco di controllo di accesso della chiave del Registro di sistema garantisce Full Control (Controllo completo) per System, Administrators e Creator Owner. Se si utilizza lo strumento per crittografare le credenziali per l'elemento <identity> o la stringa di connessione per l'elemento <sessionState>, è necessario concedere l'accesso in lettura all'account di processo ASP.NET.
Per ottenere lo strumento Aspnet_setreg.exe e per ulteriori informazioni, vedere l'articolo 329290 della Microsoft Knowledge Base "How To: Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings" (in inglese).
Per impostazione predefinita le applicazioni ASP.NET sono prive di funzioni di rappresentazione. L'accesso alle risorse viene quindi eseguito utilizzando l'identità del processo di lavoro ASP.NET. Come requisito minimo, è necessario concedere l'accesso in lettura per l'identità di processo alle risorse Windows che dovranno essere utilizzate dall'applicazione creando un elenco di controllo di accesso adeguatamente configurato.
L'attivazione della rappresentazione consente di rappresentare il chiamante originario, ossia l'identità autenticata IIS, oppure un'identità fissa specificata nell'elemento <identity>. Per ulteriori informazioni, vedere "Rappresentazione" più avanti in questo modulo.
In genere le applicazioni ASP.NET non utilizzano la rappresentazione perché può incidere negativamente sulla progettazione, l'implementazione e la scalabilità. Ad esempio, l'utilizzo della rappresentazione impedisce la definizione di un pool di connessione di livello medio efficace, limitando così la scalabilità dell'applicazione. La rappresentazione può rivelarsi utile in scenari specifici, ad esempio quando l'applicazione utilizza il contesto di protezione dell'account utente anonimo per l'accesso alle risorse. Si tratta di una tecnica molto diffusa, spesso utilizzata quando lo stesso server ospita più applicazioni. Per ulteriori informazioni, consultare il modulo 20 "Hosting di più applicazioni Web".
Per impedire l'accesso alle risorse riservate è possibile utilizzare varie tecniche. In ASP.NET è disponibile l'elemento HttpForbiddenHandler, al quale è possibile mappare i tipi di file ASP.NET di cui si desidera impedire lo scaricamento su HTTP. I mapping vengono applicati con l'elemento <httpHandlers>.
In IISLockdown.exe è disponibile la libreria 404.dll. Questo file consente di configurare i servizi IIS per mappare le estensioni file indesiderate sulla libreria 404.dll, in modo da visualizzare il messaggio "HTTP 404 – File not found" ("File non trovato") alla richiesta dei tipi di file corrispondenti.
Infine, è possibile utilizzare il filtro ISAPI URLScan per bloccare le richieste inerenti a tipi di file e programmi eseguibili riservati. Il filtro URLScan viene fornito con lo strumento IISLockdown, ma può essere ottenuto separatamente. Per ulteriori informazioni, vedere l'articolo 307608 della Microsoft Knowledge Base "INFO: Using URLScan on IIS" e "Procedura: Utilizzo di URLScan" nella sezione "Procedure" di questa guida.
Per ulteriori informazioni su IISLockdown e URLScan, consultare il modulo 16 "Protezione del server Web".
L'elemento <appSettings> del file Web.config consente l'archiviazione dei dati di configurazione, quali ad esempio le stringhe di connessione ai database o le credenziali di account dei servizi, da parte delle applicazioni. Il vantaggio più importante offerto da questo elemento agli sviluppatori è costituito dalla possibilità di centralizzare e standardizzare l'archiviazione e il recupero dei dati di configurazione. Inoltre, la definizione di un punto unico nel file Web.config facilita le funzioni di amministrazione e distribuzione.
I dati riservati, quali le credenziali e le stringhe di connessione, non devono essere archiviati in formato non crittografato nei file di configurazione. Si consiglia pertanto agli sviluppatori di utilizzare DPAPI per crittografare i dati segreti prima dell'archiviazione.
Per ulteriori informazioni su AppSettings, vedere il programma "AppSettings in ASP.NET" su MSDN® TV all'indirizzo http://msdn.microsoft.com/msdntv (in inglese).
Le funzioni di gestione della configurazione disponibili in .NET Framework interessano una vasta gamma di impostazioni che consentono all'amministratore di gestire l'applicazione Web e il relativo ambiente. Tali impostazioni sono archiviate in vari file di configurazione XML. Alcuni file XML sono dedicati al controllo delle impostazioni a livello di computer, mentre altri controllano la configurazione specifica dell'applicazione.
I file di configurazione XML possono essere modificati con un editor di testo qualsiasi, ad esempio Blocco note, oppure con editor XML. Per i tag XML viene fatta distinzione tra maiuscole e minuscole, pertanto è necessario prestare attenzione al modo in cui vengono digitati.
Nalla Figura 19.1 vengono mostrati i file di configurazione utilizzati per configurare le applicazioni Web ASP.NET disponibili per l'amministratore.

Figura 19.1
File di configurazione ASP.NET
I file Machine.config e Web.config hanno in comune numerosi elementi XML e sezioni di configurazione. Machine.config viene utilizzato per applicare i criteri globali del computer a tutte le applicazioni .NET Framework eseguite sul computer locale. Per personalizzare le impostazioni delle singole applicazioni gli sviluppatori possono inoltre utilizzare file Web.config specifici.
Nota: i file eseguibili di Windows, quali le applicazioni WinForm, vengono configurati mediante i file di configurazione. I nomi di tali file derivano dal nome del file eseguible dell'applicazione, ad esempio App.exe.config, dove app è il nome dell'applicazione.
Le modifiche apportate ai file di configurazione vengono applicate in modo dinamico e generalmente non richiedono il riavvio del server o dei servizi. Fanno eccezione le modifiche apportate all'elemento <processModel> del file Machine.config, descritto più avanti in questo modulo.
Nella Tabella 19.1 vengono indicati i percorsi dei file di configurazione.
Tabella 19.1 Percorsi dei file di configurazione
| File di configurazione | Percorso |
Machine.config | %windir%\Microsoft.NET\Framework\{versione}\CONFIG |
Web.config | \inetpub\wwwroot\web.config |
Enterprisesec.config | %windir%\Microsoft.NET\Framework\{versione}\CONFIG |
Security.config | %windir%\Microsoft.NET\Framework\{versione}\CONFIG |
Security.config | \Documents and Settings\{utente}\Dati |
Web_hightrust.config | %windir%\Microsoft.NET\Framework\{versione}\CONFIG |
Per ulteriori informazioni sui file di configurazione CAS delle applicazioni Web ASP.NET, consultare il modulo 9 "Utilizzo della protezione dall'accesso di codice con ASP.NET".
Per un'amministrazione di tipo centralizzato è possibile applicare le impostazioni in Machine.config. Le impostazioni presenti nel file Machine.config definiscono i criteri a livello del computer e possono essere utilizzate anche per applicare la configurazione specifica di un'applicazione mediante gli elementi <location>. Gli sviluppatori possono fornire file di configurazione specifici per le applicazioni al fine di ignorare determinati aspetti dei criteri globali del computer. Per le applicazioni Web ASP.NET, un file Web.config è disponibile nella directory principale virtuale dell'applicazione e facoltativamente nelle sottodirectory della directory principale virtuale. Osservare la disposizione mostrata nella Figura 19.2.

Figura 19.2
Configurazione gerarchica
Nella Figura 19.2, l'applicazione Web AppRoot dispone di un file Web.config memorizzato nella directory principale virtuale. La sottodirectory SubDir1, che non è una directory virtuale, contiene a sua volta un file Web.config, applicato quando una richiesta HTTP indica l'indirizzo http://AppRoot/SubDir1. Se una richiesta indica SubDir2, una directory virtuale, tramite AppRoot, ad esempio http://Server/AppRoot/SubDir2, verranno applicate le impostazioni dei file Machine.config e Web.config contenuti nella directory AppRoot. Se invece una richiesta indica SubDir2 ignorando AppRoot, ad esempio http://Server/SubDir2, verranno applicate solo le impostazioni del file Machine.config.
In ogni caso, le impostazioni di base provengono dal file Machine.config. In seguito le impostazioni sostitutive e le aggiunte vengono lette dai file Web.config specifici.
Se lo stesso elemento di configurazione viene utilizzato nel file Machine.config e in uno o più file Web.config, l'impostazione del file con livello gerarchico inferiore prevarrà sulle impostazioni di livello più elevato. Le nuove impostazioni di configurazione non applicate a livello del computer possono essere applicate ai file Web.config; inoltre, determinati elementi sono in grado di cancellare le impostazioni del livello superiore mediante l'elemento <clear>.
Nella seguente tabella viene indicata l'origine delle impostazioni di configurazione combinate per una combinazione di richieste Web applicata alla Figura 19.2.
Tabella 19.2 Applicazione delle impostazioni di configurazione
| Richiesta HTTP | Origine impostazioni combinate |
http://Server/AppRoot | Machine.config |
http://Server/AppRoot/SubDir1 | Machine.config |
http://Server/AppRoot/SubDir2 | Machine.config |
http://Server/Subdir2 | Machine.config |
L'elemento <location> viene utilizzato per tre scopi principali:
| • | Applicazione delle impostazioni di configurazione a file di applicazione specifici. |
| • | Centralizzazione delle funzioni di amministrazione mediante l'utilizzo delle impostazioni di applicazine specifiche contenute nel file Machine.config. |
| • | Blocco delle impostazioni di configurazione per impedirne la sostituzione a livello dell'applicazione. |
Il tag <location> può essere utilizzato nel file Machine.config o nel file Web.config. Con Machine.config, l'eventuale percorso specificato deve essere completo e includere il nome del sito Web e il nome della directory virtuale, nonché, facoltativamente, una sottodirectory e un nome file. Ad esempio:
<location path="Web Site Name/VDirName/SubDirName/PageName.aspx" > <system.web> . . . </system.web> </location>
Nota: quando si utilizza il tag di percorso presente nel file Machine.config è necessario includere il nome del sito Web.
Con Web.config, il percorso è di tipo relativo e include la directory virtuale dell'applicazione. Ad esempio:
<location path="SubDirName/PageName.aspx" > <system.web> . . . </system.web> </location>
Per applicare le impostazioni di configurazione a un file specifico si utilizza l'attributo path. Ad esempio, per applicare le regole di autorizzazione al file Pagename.aspx dal file Web.config, utilizzare l'elemento <location> seguente:
<location path="SubDirName/PageName.aspx" >
<system.web>
<authorization>
<deny roles="hackers" />
</authorization>
</system.web>
</location>Utilizzando istruzioni <location> che specificano i percorsi delle directory delle applicazioni è inoltre possibile attivare impostazioni di applicazioni specifiche in Machine.config. In questo modo si centralizzano le funzioni di amministrazione. Nel frammento di codice seguente, ad esempio, viene mostrato come applicare l'utilizzo dell'autenticazione Windows e impedire l'utilizzo della rappresentazione in una particolare applicazione.
<location path="Default Web Site/YourApp">
<system.web>
<authentication mode="Windows"/>
<identity impersonate="false"/>
</system.web>
</location>Per impedire che le singole applicazioni possano annullare la configurazione dei criteri a livello del computer, inserire le impostazioni in un elemento <location> nel file Machine.config e impostare l'attributo allowOverride="false".
Ad esempio, per applicare criteri globali di computer che non possano essere annullati al livello dell'applicazione, utilizzare l'elemento <location> seguente:
<location path="" allowOverride="false">
<system.web>
... machine-wide defaults
</system.web>
</location>
Lasciando vuoto l'attributo path, si indica che le impostazioni devono essere applicate al computer, mentre allowOverride="false" garantisce che le impostazioni del file Web.config non andranno a sostituirsi ai valori specificati. Il tentativo di aggiunta di nuovi elementi al file Web.config genererà un'eccezione, anche nel caso in cui gli elementi di Machine.config corrispondano agli elementi di Web.config.
Le impostazioni del file Machine.config applicano i valori predefiniti a livello di computer per il server. Quando si desidera adottare una particolare configurazione per tutte le applicazioni del server, utilizzare l'attributo allowOverride="false" nell'elemento <location> come descritto in precedenza. Questa tecnica risulta particolarmente adeguata per gli scenari di hosting in cui è necessario applicare aspetti del criterio di protezione a tutte le applicazioni del server.
Per le impostazioni che possono essere configurate per singola applicazione, è buona norma disporre di un file Web.config specifico. Malgrado sia possibile configurare singole applicazioni dal file Machine.config utilizzando più elementi <location>, disporre di file Web.config distinti offre notevoli vantaggi per la distribuzione e consente di limitare le dimensioni dei file Machine.config.
L'elemento da prendere in considerazione è rappresentato dalle impostazioni che devono essere applicate dai criteri a livello di computer. La scelta dipende dallo scenario specifico in cui si opera. Di seguito vengono descritti alcuni scenari comuni.
| • | Autenticazione di Windows. Immaginare uno scenario con portale di rete Intranet aziendale in cui si desidera che l'autenticazione venga dissociata dall'applicazione e sia controllata dall'organizzazione tramite Active Directory. In uno scenario del genere, mediante la configurazione indicata di seguito è possibile applicare l'autenticazione Windows ma consentire alle singole applicazioni di utilizare la rappresentazione: <location path="" allowOverride="false">
<system.web>
<authentication mode="Windows"/>
</system.web>
</location>
|
| • | Scenario di hosting. Le aziende che offrono servizi di host devono vincolare le applicazioni in modo che non possano accedere alle relative risorse e dispongano di accesso limitato alle risorse essenziali del sistema. Per raggiungere tale obiettivo è possibile configurare tutte le applicazioni per l'esecuzione con livello di attendibilità parziale. Il livello di attendibilità media, ad esempio, vincola un'applicazione in modo che possa accedere unicamente ai file contenuti nella propria gerarchia di directory virtuale e non possa accedere ad altri tipi di risorse. Per ulteriori informazioni, consultare il modulo 9 "Utilizzo della protezione dall'accesso di codice con ASP.NET". Per applicare i criteri di attendibilità media a tutte le applicazioni del server, utilizzare la configurazione seguente: <location path="" allowOverride="false>
<system.web>
<trust level="Medium" />
</system.web>
</location> |
I file di configurazione contengono dati riservati, pertanto necessitano di elenchi ACL opportunamente configurati che ne limitino l'accesso.
Per impostazione predefinita il file Machine.config è configurato con l'elenco ACL seguente:
Administrators: Full Control System: Full Control Power Users: Modify Users: Read and Execute LocalMachine\ASPNET (process identity): Read and Execute
Nota: su Windows Server 2003, agli account Servizio locale (Local Service) e Servizio di rete (Network Service) viene garantito anche l'accesso in lettura.
Ai membri del gruppo Users viene garantito l'accesso in lettura per impostazione predefinita, dal momento che tutto il codice gestito eseguito sul computer deve essere in grado di leggere il contenuto del file Machine.config.
L'elenco ACL predefinito del file Machine.config è un valore predefinito protetto. Se tuttavia si dispone di una sola applicazione Web in esecuzione sul server oppure se tutte le applicazioni Web utilizzano la stessa identità di processo, è possible limitare ulteriormente l'ACL eliminando la voce di controllo dell'accesso utente (ACE). Quando si rimuove "users" dall'elenco DACL è necessario aggiungere in modo esplicito l'identità di processo Web.
.NET Framework non installa alcun file Web.config. Se si installa un'applicazione che fornisce il proprio file Web.config, generalmente l'elenco ACL viene ereditato dalla directory inetpub, che per impostazione predefinita garantisce l'accesso in lettura ai membri del gruppo Everyone. Per bloccare il file Web.config specifico di un'applicazione, utilizzare gli elenchi ACL riportati di seguito.
Per .NET Framework versione 1.0:
Administrators: Full control System: Full control ASP.NET process identity: Read UNC Identity: Read Impersonated Identity (Fixed Identity): Read Impersonated Identity (Original Caller): Read
Per .NET Framework versione 1,1:
Administrators: Full control System: Full control ASP.NET process identity: Read UNC Identity: Read Impersonated Identity (Fixed Identity): Read
Se le applicazioni utilizzano la rappresentazione di un account esplicito (se cioè rappresentano un'identità fissa), quale ad esempio <identity impersonate="true" username="WebUser" password="Y0urStr0ngPassw0rd$"/>, l'account (in questo caso WebUser) e il processo necessitano dell'accesso in lettura (Read).
Se la base del codice si trova in una condivisione UNC (Universal Naming Convention), è necessario garantire l'accesso in lettura all'identità di token UNC fornita da IIS.
Se la rappresentazione viene utilizzata ma non vengono utilizzate credenziali esplicite, come ad esempio nell'istruzione <identity impersonate="true"/> e nessuna convenzione UNC, in .NET Framework 1.1 dovrà essere garantito l'accesso solo al processo. Per .NET Framework 1.0 sarà necessario configurare anche l'elenco ACL per garantire l'accesso in lettura a qualsiasi identità che verrà rappresentata; in altre parole, dovrà essere garantito l'accesso in lettura al chiamante originario.
Il livello di attendibilità di un'applicazione determina le autorizzazioni garantite dai criteri CAS. Viene quindi stabilito in quale misura l'applicazione può accedere alle risorse protette ed eseguire operazioni che richiedono privilegi.
Utilizzare l'elemento <trust> per configurare il livello di attendibilità dell'applicazione. Per impostazione predefinita il livello di configurazione è impostato su Full (Completo) come mostrato di seguito:
<!-- level="[Full|High|Medium|Low|Minimal]" --> <trust level="Full" originUrl=""/>
Questo frammento di codice indica che all'applicazione vengono garantite autorizzazioni CAS complete e senza limitazioni. Con questo tipo di configurazione la possibilità o l'impossibilità di accedere alle risorse da parte dell'applicazione dipende esclusivamente dalle impostazionidi protezione del sistem operativo.
Se si imposta il livello di attendibilità su un valore diverso da Full, è possibile suddividere le applicazioni Web ASP.NET esistenti a seconda dei tipi di risorse alle quali possono accedere e alle operazioni che sono in grado di eseguire. Si consiglia di provare le applicazioni con ciascuno dei livelli di attendibilità disponibili.
Per ulteriori informazioni sulla creazione di applicazioni Web con attendibilità parziale che utilizzano la protezione CAS, consultare il modulo 9 "Utilizzo della protezione dall'accesso di codice con ASP.NET." Per ulteriori informazioni sull'utilizzo dei livelli di attendibilità per fornire l'isolamento delle applicazioni, consultare il modulo 20 "Hosting di più applicazioni Web".
Le applicazioni e i servizi Web ASP.NET vengono eseguiti in un'istanza condivisa del processo di lavoro ASP.NET (Aspnet_wp.exe). Le impostazioni a livello di processo, compresa l'identità di processo, vengono gestite tramite l'elemento <processModel> del file Machine.config.
L'identità del processo di lavoro ASP.NET viene configurata tramite l'impostazione degli attributi userName e password per l'elemento <processModel>. Nel configurare l'identità di processo, tenere presente quanto riportato di seguito:
| • | Utilizzare l'account ASPNET predefinito. |
| • | Utilizzare un account personalizzato con privilegi minimi. |
| • | Crittografare le credenziali <processModel>. |
| • | Non eseguire ASP.NET con l'account SYSTEM. |
L'account ASPNET locale è l'account con privilegi minimi predefinito destinato in modo specifico all'esecuzione delle applicazioni e dei servizi Web ASP.NET. Se possibile, utilizzarlo servendosi della configurazione predefinita seguente:
<processModel enable="true" userName="machine" password="AutoGenerate" ... />
Se è necessario utilizzare un'identità alternativa per eseguire il processo di lavoro ASP.NET, accertarsi che l'account utilizzato sia configurato come account con privilegi minimi. In questo modo si limitano i danni che potrebbero essere causati da un utente malintenzionato in grado di eseguire il codice sfruttando il contesto di protezione del processo.
Si potrebbe decidere di utilizzare un account alternativo perché è necessario connettersi a un database Microsoft SQL Server™ remoto o a una risorsa di rete utilizzando l'autenticazione Windows. Tenere presente che per questo scopo è possibile utilizzare l'account ASPNET locale. Per ulteriori informazioni, vedere "Accesso ai dati" più avanti in questo modulo.
Per ulteriori informazioni sulle autorizzazioni NTFS richieste dall'account di processo ASP.NET, vedere "ACL e autorizzazioni" più avanti in questo modulo.
Agli account di processo ASP.NET è inoltre necessario concedere i diritti utente seguenti:
| • | Accesso al computer dalla rete. |
| • | Accesso come processo batch. |
| • | Accesso come servizio. |
| • | Rifiuto dell'accesso locale. |
| • | Rifiuto dell'accesso tramite Servizi terminal. |
Se è necessario utilizzare un account personalizzato, non archiviare credenziali non crittografate in Machine.config: eseguire l'utilità Aspnet_setreg.exe per archiviare le credenziali crittografate nel Registro di sistema.
| • | Per crittografare le credenziali per <processModel>
|
Per ulteriori informazioni, vedere l'articolo 329290 della Microsoft Knowledge Base "How To: Use the ASP.NET Utility to Encrypt Credentials and Sessione State Connection Strings" (in inglese).
Non utilizzare l'account SYSTEM per eseguire ASP.NET e non concedere all'account di processo ASP.NET il diritto utente "Agisci come parte del sistema operativo". L'inosservanza di queste istruzioni annulla il principio di privilegio minimo e aumenta i danni che potrebbero essere causati da un utente malintenzionato in grado di eseguire codice sfruttando il contesto di protezione del processo dell'applicazione Web.
Per impostazione predefinita le applicazioni ASP.NET sono prive di funzioni di rappresentazione. Il contesto di protezione dell'account del processo di lavoro ASP.NET (ASPNET per impostazione predefinita) viene utilizzato quando l'applicazione accede alle risorse di Windows.
L'elemento <identity> viene utilizzato per attivare la rappresentazione. È possibile rappresentare:
| • | Il chiamante originario (l'identità autenticata IIS) |
| • | Un'identità fissa |
Per rappresentare il chiamante originario, utilizzare la configurazione seguente:
<identity impersonate="true" />
La rappresentazione utilizza il token di accesso fornito da IIS che rappresenta il chiamante autenticato. Può trattarsi dell'account utente Internet anonimo, ad esempio, se l'applicazione utilizza l'autenticazione basata su form, oppure di un account Windows che rappresenta il chiamante originario se l'applicazione utilizza l'autenticazione Windows.
Se si rende possibile la rappresentazione del chiamante originario, tenere presente quanto riportato di seguito:
| • | La scalabilità delle applicazioni risulta ridotta in quanto non è possibile raggruppare in modo efficace le connessioni al database. |
| • | Le attività di amministrazione aumentano perché è necessario configurare elenchi ACL sulle risorse back-end per i singoli utenti. |
| • | La delega richiede l'autenticazione Kerberos e un ambiente Windows 2000 adeguatamente configurato. |
Per ulteriori informazioni, vedere "How To: Implement Kerberos Delegation for Windows 2000" in the "How To" section of "Microsoft patterns & practices Volume I, Building Secure ASP.NET Web Applications: Authentication, Authorization, and Secure Communication" all'indirizzo http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/SecNetHT05.asp (in inglese).
Per rappresentare un'identità fissa, specificarla tramite gli attributi userName e password per l'elemento <identity>:
<identity impersonate="true" userName="MyServiceAccount"
password="Str0ng!Passw0rd"/>
Non archiviare le credenziali non crittografate come mostrato nell'esempio: utilizzare lo strumento Aspnet_setreg.exe per crittografare le credenziali e archiviarle nel Registro di sistema.
| • | Per crittografare le credenziali per <identity>
|
Per ulteriori informazioni, vedere l'articolo 329290 della Microsoft Knowledge Base "How To: Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings" (in inglese).
Diritto utente Agisci come parte del sistema operativo
Quando si rappresenta un'identità fissa specificando gli attributi userName e password, l'account di processo di ASP.NET versione 1.0 richiede il diritto utente "Agisci come parte del sistema operativo" di Windows 2000. Poiché ciò innalza l'account di processo ASP.NET a un livello di privilegi simile a quello dell'account System locale, la rappresentazione di un'identità fissa con ASP.NET versione 1.0 è sconsigliata.
Nota: se si esegue ASP.NET versione 1.1 su Windows 2000 o Windows 2003 Server, questo diritto utente non è necessario.
Per la rappresentazione delle identità è necessario configurare in modo adeguato le autorizzazioni NTFS. Per ulteriori informazioni, vedere "ACL e autorizzazioni" più avanti in questo modulo.
L'elemento <authentication> consente di configurare la modalità di autenticazione utilizzata dall'applicazione.
La modalità di autenticazione appropriata dipende dal tipo di progettazione dell'applicazione o del servizio Web. L'impostazione Machine.config predefinita applica un valore predefinito di autenticazione Windows protetta, come mostrato di seguito.
<!-- authentication Attributes:
mode="[Windows|Forms|Passport|None]" -->
<authentication mode="Windows" />
Per utilizzare l'autenticazione basata su form, impostare innanzi tutto mode="Forms" per l'elemento <authentication>. Quindi configurare l'autenticazione basata su form utilizzando l'elemento figlio <forms>. Nel frammento seguente viene mostrata la configurazione protetta dell'elemento di autenticazione <forms>:
<authentication mode="Forms">
<forms loginUrl="Restricted\login.aspx" Login page in an SSL protected folder
protection="All" Privacy and integrity
requireSSL="true" Prevents cookie being sent over http
timeout="10" Limited session lifetime
name="AppNameCookie" Unique per-application name
path="/FormsAuth" and path
slidingExpiration="true" > Sliding session lifetime
</forms>
</authentication>
Per migliorare la protezione dell'autenticazione basata su form, seguire i consigli riportati di seguito:
| • | Partizionare il sito Web. |
| • | Impostare protection="All". |
| • | Utilizzare valori di timeout piccoli per i cookie. |
| • | Valutare l'opportunità di utilizzare una scadenza prefissata. |
| • | Utilizzare SSL con l'autenticazione basata su form. |
| • | Se non si utilizza SSL, impostare slidingExpiration = "false". |
| • | Non utilizzare l'elemento <credentials> sui server di produzione. |
| • | Configurare l'elemento <machineKey>. |
| • | Utilizzare nomi e percorsi univoci per i cookie. |
Separare le zone di accesso pubblico e limitato del sito Web. Collocare la pagina di accesso dell'applicazione nonché le pagine e le risorse alle quali dovrebbero accedere soltanto gli utenti dell'autenticazione in una cartella separata dalle zone di accesso pubblico. Proteggere le sottocartelle riservate configurandole in IIS per la richiesta dell'accesso SSL, quindi utilizzare gli elementi <authorization> per limitare l'accesso e provocare una procedura di accesso specifica. Ad esempio, la configurazione Web.config seguente consente a chiunque di accedere alla directory corrente (accesso pubblico), ma impedisce agli utenti non autenticati di accedere alla sottocartella riservata. Qualsiasi tentativo di accesso alla sottocartella provoca una procedura di accesso Forms.
<system.web>
<!-- The virtual directory root folder contains general pages.
Unauthenticated users can view them and they do not need
to be secured with SSL. -->
<authorization>
<allow users="*" />
</authorization>
</system.web>
<!-- The restricted folder is for authenticated and SSL access only. -->
<location path="Restricted" >
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
Per ulteriori considerazioni di programmazione, ad esempio sulle modalità di spostamento tra le pagine ad accesso limitato e ad accesso libero, vedere "Autenticazione basata su form" nel modulo 10 "Creazione di pagine e controlli ASP.NET protetti."
Questa impostazione garantisce che il cookie dell'autenticazione basata su form venga crittografato per salvaguardare la privacy e l'integrità. Le chiavi e gli algoritmi utilizzati per la crittografia del cookie sono specificati nell'elemento <machineKey>.
I controlli della crittografia e dell'integrità impediscono la manomissione del cookie, ma non riducono il rischio di attacchi di tipo riproduzione del cookie nel caso in cui un utente malintenzionato riesca ad acquisire il cookie. Inoltre, utilizzare SSL per impedire che un utente malintenzionato possa acquisire il cookie utilizzando il software di monitoraggio della rete. I cookie possono essere rubati con attacchi di tipo XSS (Cross-site Scripting, Script tra siti) e ciò malgrado l'utilizzo di SSL. Per ridurre al minimo tale rischio, è opportuno dotare l'applicazione di una strategia di convalida dell'input appropriata.
Utilizzare valori di timeout piccoli per limitare la durata delle sessioni e ridurre le possibilità di attacchi di tipo riproduzione di cookie.
Valutare l'opportunità di impostare slidingExpiration="false" nell'elemento <forms> per stabilire la scadenza del cookie, anziché reimpostare la scadenza dopo ogni richiesta Web. Tale impostazione è importante se non si utilizza SSL per proteggere il cookie.
Nota: questa funzione è disponibile in .NET Framework versione 1.1.
Utilizzare SSL per proteggere le credenziali e il cookie di autenticazione. SSL impedisce agli utenti malintenzionati di acquisire le credenziali o il cookie di autenticazione basata su form utilizzato per identificare se stessi nei confronti dell'applicazione. Un cookie di autenticazione rubato equivale a un accesso rubato.
Impostare requireSSL="true". Ciò comporta l'impostazione dell'attributo Secure nel cookie, che garantisce che il cookie non venga trasmesso da un browser al server tramite un collegamento HTTP. È richiesto il protocollo HTTPS (SSL).
Nota: si tratta di un'impostazione di .NET Framework versione 1.1, che assume dati di programmazione esplicita per impostare l'attributo Secure del cookie nelle applicazioni create con la versione 1.0. Per ulteriori informazioni e codice di esempio, consultare il modulo 10 "Creazione di pagine e controlli ASP.NET protetti".
Con l'impostazione di slidingExpiration su 'false' si definisce il periodo di timeout del cookie come numero di minuti trascorsi dalla prima creazione del cookie. Senza tale impostazione il timeout viene rinnovato a ogni richiesta inviata al server Web. L'acquisizione del cookie fornisce all'utente malintenzionato la quantità di tempo necessaria per accedere all'applicazione in qualità di utente autenticato.
Nota: questa funzione è disponibile in .NET Framework versione 1.1.
La possibilità di archiviare le credenziali utente in file di configurazione XML viene fornita come supporto per le funzioni di sviluppo rapido e di test limitato. Non utilizzare le credenziali reali dell'utente finale. Le credenziali dell'utente finale non devono essere archiviate nei file di configurazione sui server di produzione. Le applicazioni di produzione dovrebbero implementare archivi di credenziali utente personalizzati, ad esempio, in un database di SQL Server.
L'elemento <machineKey> definisce gli algoritmi utilizzati per crittografare il cookie dell'autenticazione basata su form. Questo elemento consente inoltre di gestire le chiavi di crittografia. Per ulteriori informazioni, vedere la sezione "MachineKey" più avanti in questo modulo.
Utilizzare valori univoci per gli attributi name e path. Con l'impostazione di nomi univoci si evitano i problemi che possono verificarsi quando si ospitano più applicazioni sullo stesso server.
A meno che un utente non disponga di un'autorizzazione esplicita per accedere a una risorsa, ad esempio una pagina Web particolare, un file di risorsa, una directory e così via, la configurazione dovrebbe rifiutare l'accesso per impostazione predefinita. In ASP.NET sono disponibili due gatekeeper configurabili che possono essere utilizzati per controllare l'accesso alle risorse riservate. Sono:
| • | Autorizzazione file. Questo gatekeeper viene implementato dal modulo HTTP |
| • | Autorizzazione URL. Questo gatekeeper viene implementato dal modulo HTTP |
Questo gatekeeper può essere utilizzato soltanto dalle applicazioni che utilizzano l'autenticazione Windows e dispongono della configurazione seguente:
<authentication mode="Windows"/>
Il gatekeeper viene attivato automaticamente quando si utilizza l'autenticazione Windows e non richiede la rappresentazione. Per configurarlo, configurare gli ACL Windows su file e cartelle. Tenere presente che il gatekeeper controlla l'accesso ai soli tipi di file mappati da IIS all'estensione ISAPI ASP.NET Aspnet_isapi.dll.
Questo gatekeeper può essere utilizzato da qualsiasi applicazione. Per la configurazione si utilizzano elementi <authorization> che controllano gli utenti e i gruppi di utenti ai quali viene consentito l'accesso all'applicazione. Di seguito viene riportato l'elemento predefinito contenuto nel file Machine.config:
<authorization>
<!-- allow/deny Attributes:
users="[*|?|name]"
* - All users
? - Anonymous users
[name] - Named user
roles="[name]" -->
<allow users="*"/>
</authorization>
Utilizzare le istruzioni riportate di seguito per configurare in modo appropriato il gatekeeper Autorizzazione URL.
| • | Generalmente le impostazioni di autorizzazione contenute nel file Web.config valgono per tutti i file della directory corrente e delle relative sottodirectory, a meno che una sottodirectory non contenga un proprio file Web.config con un elemento <authorization>. In questo caso le impostazioni della sottodirectory annullano le impostazioni della directory superiore. |
| • | L'autorizzazione URL viene applicata soltanto ai tipi di file mappati da IIS all'estensione ISAPI ASP.NET Aspnet_isapi.dll. |
| • | Quando l'applicazione utilizza l'autenticazione Windows, si autorizza l'accesso agli account utente e di gruppo di Windows. I nomi utente assumono il formato "autorità\NomeUtenteWindows" e i nomi di ruolo assumono il formato "autorità\NomeGruppoWindows", dove "autorità" è un nome di dominio o il nome del computer locale, a seconda del tipo di account interessato. Numerosi account noti vengono rappresentati con stringhe "BUILTIN". Ad esempio, il gruppo degli amministratori locali è "BUILTIN\Administrators", mentre il gruppo degli utenti locali è "BUILTIN\Users". Nota: con NET Framework versione 1.0, per l'autorità e il nome del gruppo viene fatta distinzione tra maiuscole e minuscole. Il nome del gruppo deve corrispondere esattamente al nome del gruppo visualizzato in Windows. |
| • | Quando l'applicazione utilizza l'autenticazione basata su form, si autorizzano l'utente e i ruoli personalizzati gestiti nel proprio archivio utente personalizzato. Se ad esempio si utilizza Forms per autenticare gli utenti rispetto a un database, l'autorizzazione viene definita in base ai ruoli recuperati dal database. |
| • | Per applicare le impostazioni di autorizzazione a singoli file o a singole directory, è possibile utilizzare il tag <location>. Nell'esempio seguente vengono mostrate le modalità di applicazione dell'autorizzazione a un file specifico denominato page.aspx: <location path="page.aspx" />
<authorization>
<allow users="DomainName\Bob, DomainName\Mary" />
<deny users="*" />
</authorization>
</location> |
Le applicazioni che si basano su uno stato sessione per singolo utente possono archiviare lo stato sessione negli elementi seguenti:
| • | Processo di lavoro ASP.NET |
| • | Servizio stato out-of-process che può essere eseguito sul server Web o su un server remoto |
| • | Archivio dati di SQL Server |
L'indirizzo specifico e i dettagli di connessione sono memorizzati nell'elemento <sessionState> nel file Machine.config. Di seguito viene riportata l'impostazione predefinita:
<sessionState mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10" sqlConnectionString="data
source=127.0.0.1;Integrated Security=SSPI"
cookieless="false" timeout="20"/>
Nota: se non si utilizza il servizio Stato ASP.NET sul server Web, utilizzare lo snap-in Servizi MMC per disattivarlo.
Se si utilizza un archivio SQL Server per lo stato sessione, seguire i consigli riportati di seguito per proteggere lo stato sessione.
| • | Utilizzare l'autenticazione Windows per il database |
| • | Crittografare sqlConnectionString |
| • | Limitare l'accesso dell'applicazione al database |
| • | Proteggere il canale |
Per ulteriori informazioni sull'impostazione del database di archiviazione SQL Server per lo stato sessione, vedere l'articolo 311209 della Microsoft Knowledge Base "How To: Configure ASP.NET for Persistent SQL Server Session State Management" (in inglese).
Se si utilizza mode="SQLServer", ricorrere all'autenticazione Windows per connettersi al database dello stato e utilizzare un account con privilegi minimi, quale ad esempio un account ASPNET locale duplicato. Così facendo si potrà utilizzare una connessione attendibile, la stringa di connessione non conterrà le credenziali e queste ultime non verranno passate tramite cavo al database.
Crittografare il valore dell'attributo sqlConnectionString con lo strumento Aspnet_setreg.exe. Tale operazione si rivela particolarmente importante se si utilizza l'autenticazione SQL per connettersi al database dello stato a causa della presenza delle credenziali nella stringa di connessione, ma è consigliata anche se si utilizza l'autenticazione Windows.
| • | Per crittografare sqlConnectionString
|
È necessario limitare l'accesso dell'applicazione al database in modo che l'applicazione possa essere utilizzata esclusivamente per accedere alle necessarie tabelle di stato e alle stored procedure utilizzate da ASP.NET per l'esecuzione di query nel database.
| • | Per limitare l'accesso dell'applicazione al database dello stato
|
Per proteggere uno stato sessione riservato nella rete tra il server Web e l'archivio remoto dello stato, proteggere il canale di comunicazione tra i due server utilizzando IPSec o SSL. La privacy e l'integrità dei dati relativi allo stato della sessione verranno salvaguardati in tutta la rete. Se si utilizza SSL, sarà necessario installare un certificato server sul server del database. Per ulteriori informazioni sull'utilizzo di SSL con SQL Server, consultare il modulo 18 "Protezione del server database".
Se si utilizza mode=StateServer, seguire i consigli riportati di seguito per proteggere lo stato sessione:
| • | Utilizzare un account con privilegi minimi per eseguire il servizio stato |
| • | Proteggere il canale |
| • | Prendere in considerazione l'impostazione di un'altra porta predefinita |
| • | Crittografare la stringa di connessione dello stato |
Il servizio stato viene eseguito per impostazione predefinita mediante l'account locale con privilegi minimi ASPNET. Non dovrebbe essere necessario modificare tale configurazione.
Se il servizio stato si trova su un server remoto, proteggere il canale di comunicazione con l'archivio remoto utilizzando IPSec per far sì che lo stato utente rimanga privato e inalterato.
Per l'ascolto il servizio Stato ASP.NET utilizza la porta 42424. Per evitare di utilizzare questa porta predefinita e nota, impostarne un'altra modificando la chiave del Registro di sistema seguente:
HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters
Il numero della porta è definito dal valore con nome Port. Se si cambia il numero di porta nel Registro di sistema, impostando ad esempio 45678, sarà necessario modificare anche la stringa di connessione nell'elemento <sessionState> come indicato di seguito:
stateConnectionString="tcpip=127.0.0.1:45678"
Crittografare il valore dell'attributo stateConnectionString per nascondere l'indirizzo IP e il numero di porta dell'archivio dello stato. Utilizzare lo strumento Aspnet_setreg.exe.
| • | Per crittografare stateConnectionString
|
Se le applicazioni utilizzano lo stato di visualizzazione, accertarsi che sia protetto con codici di autenticazione dei messaggi (MAC) per fare sì che non venga modificato nel client. Utilizzando l'elemento <pages> nel file Machine.config è possibile attivare o disattivare lo stato di visualizzazione e la protezione MAC per tutte le applicazioni del computer.
Per impostazione predefinita, l'attributo enableViewStateMac nell'elemento <pages> del file Machine.config garantisce la protezione dello stato di visualizzazione con un codice di autenticazione dei messaggi.
<pages buffer="true" enableSessionState="true"
enableViewState="true" enableViewStateMac="true"
autoEventWireup="true" validateRequest="true"/>
Se si utilizza lo stato di visualizzazione, accertarsi che enableViewStateMac sia impostato su true. L'elemento <machineKey> definisce gli algoritmi utilizzati per proteggere lo stato di visualizzazione.
L'elemento <machineKey> consente di specificare le chiavi di crittografia, le chiavi di convalida e gli algoritmi utilizati per proteggere i cookie dell'autenticazione basata su form e lo stato di visualizzazione a livello di pagina. Nell'esempio di codice seguente viene presentata l'impostazione predefinita del file Machine.config:
<machineKey validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps" validation="SHA1"/>
Nel configurare l'elemento <machineKey>, seguire i consigli riportati di seguito:
| • | Utilizzare chiavi di crittografia univoche con più applicazioni |
| • | Impostare validation="SHA1" |
| • | Generare manualmente le chiavi per le Web farm |
Se si ospitano più applicazioni su un solo server Web, è preferibile utilizzare chiavi univoche per ciascuna applicazione del computer piuttosto che una chiave singola per tutte le applicazioni. In questo modo si evita che un'applicazione possa ottenere lo stato di visualizzazione o cookie crittografati dell'autenticazione negli ambienti di hosting senza la necessaria autorizzazione.
Utilizzare anche l'impostazione IsolateApps. Si tratta di una nuova impostazione di .NET Framework versione 1.1 che induce ASP.NET a generare automaticamente le chiavi di crittografia e a renderle univoche per ogni applicazione.
L'attributo validation specifica l'algoritmo utilizzato per il controllo dell'integrità dello stato di visualizzazione a livello di pagina. I valori possibili sono "SHA1", "MD5" e "3DES".
Se nell'elemento <forms> viene utilizzato protection="All", il cookie dell'autenticazione basata su form viene crittografato, operazione che a sua volta garantisce l'integrità. Indipendentemente dall'impostazione dell'attributo validation, l'autenticazione basata su Form utilizza TripleDES (3DES) per crittografare il cookie.
Nota: la crittografia del cookie dell'autenticazione basata su form è indipendente dall'impostazione validationkey e la chiave si basa sull'attributo decryptionKey.
Se nell'elemento <machineKey> viene impostato validation="SHA1", viene eseguito il controllo dell'integrità dello stato di visualizzazione a livello di pagina con l'algoritmo SHA1, presupponendo che l'elemento <pages> sia configurato per i codici MAC dello stato di visualizzazione. Per ulteriori informazioni, vedere "Stato di visualizzazione" nelle pagine precedenti di questo modulo.
È inoltre possibile impostare l'attributo di convalida su MD5. Si consiglia tuttavia di utilizzare SHA1 in quanto produce un hash più grande ed è quindi considerato più sicuro.
Se nell'elemento <machineKey> viene impostato validation="3DES", lo stato di visualizzazione a livello di pagina viene crittografato, operazione che fornisce anche il controllo dell'integrità, con l'algoritmo 3DES, anche se l'elemento <pages> è configurato per i codici MAC dello stato di visualizzazione.
Nelle Web farm è necessario impostare valori di chiave espliciti e utilizzare gli stessi valori su tutti i computer membri. Vedere "Considerazioni sulle Web farm" più avanti in questo modulo.
L'elemento <compilation> controlla le impostazioni del compilatore utilizzate per la compilazione dinamica delle pagine avviata quando un client richiede una pagina Web (file .aspx file) o un servizio Web (file .asmx). Le build di debug non devono essere utilizzate sul server di produzione: le informazioni di debug rivestono una particolare importanza per i malintenzionati in quanto possono rivelare i dettagli del codice sorgente.
Questo elemento controlla il processo di compilazione. Accertarsi che le compilazioni di debug siano disattivate sui server di produzione. Impostare debug="false" come mostrato di seguito:
<compilation debug="false" explicit="true" defaultLanguage="vb" />
Per impostazione predefinita, i file temporanei vengono creati e compilati nella directory seguente:
%winnt%\Microsoft.NET\Framework\{version}\Temporary ASP.NET Files
Utilizzando l'attributo tempDirectory è possibile specificare percorsi diversi per le singole applicazioni, anche se ciò non comporta vantaggi supplementari in termini di protezione.
Nota: L'identità di processo ASP.NET specificata nell'elemento <processModel> richiede diritti di accesso Full Control (Controllo completo) per la directory di compilazione temporanea.
Non archiviare i file di debug, con estensione .pdb, su un server di produzione insieme agli assembly.
Si consiglia di disattivare la funzione di tracciatura sui server di produzione in quanto le informazioni di traccia a livello di sistema possono essere un valido aiuto per l'utente malintenzionato per definire l'applicazione e sondarne i punti deboli.
La funzione di tracciatura viene configurata con l'elemento <trace>. Impostare enabled="false" sui server di produzione come segue:
<trace enabled="false" localOnly="true" pageOutput="false"
requestLimit="10" traceMode="SortByTime"/>
Se non è assolutamente necessario individuare i problemi in situazioni di utilizzo reale delle applicazioni, è preferibile simulare i problemi in un ambiente di test. In alternativa, è possibile attivare la tracciatura e impostare localOnly="true" per impedire che i dettagli della funzione vengano restituiti ai client remoti.
Fare in modo che i dettagli delle eccezioni non vengano trasmessi dalle applicazioni Web al client. Le informazioni di diagnostica a livello di sistema possono essere utilizzate per conoscere l'applicazione e sondarne i punti deboli da sfruttare in attacchi futuri.
L'elemento <customErrors> consente di configurare messaggi di errore generici personalizzati da trasmettere al client quando si verifica una condizione di eccezione dell'applicazione. La pagina dell'errore dovrebbe includere un messaggio di errore adeguatamente generico e, facoltativamente, dettagli di supprto aggiuntivi. Questo elemento può essere utilizzato anche per restituire pagine di errore diverse a seconda della condizione di eccezione.
Verificare che l'attributo della modalità sia impostato su "On" e di aver specificato una pagina di reindirizzamento predefinita, come mostrato di seguito:
<customErrors mode="On" defaultRedirect="YourErrorPage.htm" />
L'attributo defaultRedirect consente di utilizzare una pagina di errore personalizzata per l'applicazione, che potrebbe ad esempio includere informazioni dettagliate sui contatti di supporto.
Nota: non utilizzare mode="Off" in quanto provoca la trasmissione al client di pagine di errore dettagliate che contengono informazioni a livello di sistema.
Se si desidera vengano generate pagine di errore distinte per i vari tipi di errore, utilizzare uno o più elementi <error> come mostrato di seguito. In questo esempio gli errori di tipo "404 (non trovato)" vengono trasmessi a una pagina, gli errori di tipo "500 (errori interni del sistema)" vengono trasmessi a un'altra pagina e tutti gli altri errori vengono trasmessi alla pagina specificata nell'attrobuto defaultRedirect.
<customErrors mode="On" defaultRedirect="YourErrorPage.htm"> <error statusCode="404" redirect="YourNotFoundPage.htm"/> <error statusCode="500" redirect="YourInternalErrorPage.htm"/> </customErrors>
Non esporre gli endpoint dei servizi remoti .NET sui server Web Internet. Per disattivare i servizi remoti, disattivare le richieste relative alle estensioni .rem e .soap mappandole all'elemento HttpForbiddenHandler. Utilizzare gli elementi riportati di seguito dopo <httpHandlers>:
<httpHandlers> <add verb="*" path="*.rem" type="System.Web.HttpForbiddenHandler"/> <add verb="*" path="*.soap" type="System.Web.HttpForbiddenHandler"/> . . . </httpHandlers>
Nota: ciò non impedisce il collegamento di un'applicazione Web residente su un server Web a un oggetto downstream mediante l'infrastruttura dei servizi remoti. Viene tuttavia impedito ai client di connettersi agli oggetti residenti sul server Web.
Configurare i servizi Web utilizzando l'elemento <webServices>. Per definire una configurazione protetta per i servizi Web:
| • | Disattivare i servizi Web se non sono necessari |
| • | Disattivare i protocolli inutilizzati |
| • | Disattivare la generazione automatica del linguaggio WSDL |
Se i servizi Web non vengono utilizzati, è preferibile disattivarli mappando le richieste dell'estensione file .asmx (servizio Web) a HttpForbiddenHandler nel file Machine.config,come indicato di seguito:
<httpHandlers> <add verb="*" path="*.asmx" type="System.Web.HttpForbiddenHandler"/> . . . </httpHandlers>
L'elemento <protocols> definisce i protocolli supportati dai servizi Web. Per impostazione predefinita, i protocolli HttpPost e HttpGet sono disattivati in .NET Framework versione 1.1:
<webServices>
<protocols>
<add name="HttpSoap1.2"/>
<add name="HttpSoap"/>
<!-- <add name="HttpPost"/> -->
<!-- <add name="HttpGet"/> -->
<add name="HttpPostLocalhost"/>
<add name="Documentation"/>
</protocols>
</webServices>
Disattivando i protocolli non necessari, compresi HttpPost e HttpGet, si riduce la superficie dell'area esposta agli attacchi. Ad esempio, un utente malintenzionato esterno può incorporare un collegamento dannoso in un messaggio di posta elettronica per eseguire un servizio Web interno utilizzando il contesto di protezione dell'utente finale. La disattivazione del protocollo HttpGet è una contromisura efficace. Da vari punti di vista, questo scenario è simile a un attacco di tipo XSS. Un variante di questo attacco utilizza un tag <img src="..." /> in una pagina Web con accesso pubblico per incorporare una chiamata GET in un servizio Web di una rete Intranet. Entrambi gli attacchi consentono a un utente esterno di richiamare un servizio Web interno. La disattivazione del protocollo HttpGetè una contromisura efficace.
Se il server di produzione fornisce servizi Web che possono essere rilevati pubblicamente, è necessario attivare HttpGet e HttpPost per far sì che i servizi possano essere rilevati con tali protocolli.
Il protocollo Documentation viene utilizzato per generare dinamicamente WSDL (Web Service Description Language). WSDL descrive le caratteristiche di un servizio Web, quali le relative firme dei metodi e i protocolli supportati. I client utilizzano queste informazioni per costruire messaggi formattati in modo appropriato. Per impostazione predefinita, i servizi Web espongono pubblicamente WSDL, rendendolo così disponibile a chiunque possa connettersi al server Web attraverso Internet.
IN alcuni casi, può essere utile distribuire manualmente i file WSDL ai partner e impedire l'accesso pubblico. Tramite questo approccio, il team di sviluppo è in grado di fornire singoli file .wsdl per ciascun servizio Web al team delle operazioni. Il team delle operazioni può quindi distribuirli ai partner specificati che desiderano utilizzare i servizi Web.
Per disattivare il protocollo Documentation, impostarlo come commento in Machine.config nel modo seguente:
<webServices>
<protocols>
<add name="HttpSoap"/>
<!-- <add name="Documentation"/> -->
</protocols>
</webServices>Per impedire che risorse e file protetti vengano scaricati attraverso HTTP, mapparli su HttpForbiddenHandler di ASP.NET.
I gestori HTTP si trovano in Machine.config sotto l'elemento <httpHandlers>. I gestori HTTP consentono l'elaborazione delle richieste Web relative a estensioni file specifiche. I servizi remoti non devono essere attivati sui server Web front-end; attivare i servizi remoti solo su server di applicazione di livello intermedio che sono isolati da Internet.
| • | In Machine.config per i gestori HTTP sono mappate le estensioni file seguenti: |
| • | .aspx viene utilizzata per le pagine di ASP.NET. |
| • | .rem e .soap vengono utilizzate per i servizi remoti. |
| • | .asmx viene utilizzata per i servizi Web. |
| • | .asax, .ascx, .config, .cs, .csproj, .vb, .vbproj, .webinfo, .asp, .licx, .resx e .resources rappresentano risorse protette e sono mappate su System.Web.HttpForbiddenHandler. |
Per le risorse di .NET Framework, se non si utilizza un'estensione file mappare l'estensione su System.Web.HttpForbiddenHandler in Machine.config, come mostrato nell'esempio seguente:
<add verb="*" path="*.vbproj" type="System.Web.HttpForbiddenHandler" />
In questo caso l'estensione file .vbproj è mappata su System.Web.HttpForbiddenHandler. Se un client richiede un percorso che termina ocn .vbproj, allora ASP.NET restituisce un messaggio indicante "This type of page is not served."
| • | Per la gestione delle estensioni file di .NET Framework vengono applicate le linee guida seguenti: |
| • | Mappare le estensioni inutilizzate a HttpForbiddenHandler. Se non vengono fornite pagine ASP.NET, mappare l'estensione .aspx a HttpForbiddenHandler. Se non si utilizzano i Servizi Web, mappare l'estensione .asmx a HttpForbiddenHandler. |
| • | Disattivare i servizi remoti sui server Web Internet. Mappare le estensioni dei servizi remoti (.soap e .rem) sui server Web Internet su HttpForbiddenHandler. |
La directory bin sotto la directory principale virtuale di un'applicazione ASP.NET contiene gli assembly privati dell'applicazione, comprendenti le implementazioni a livello di classe di pagina dell'applicazione se i file di codice sottostante sono stati utilizzati durante lo sviluppo.
Per proteggere la directory bin dell'applicazione e la logica aziendale contro download intenzionali:
| • | Rimuovere le autorizzazioni Web. |
| • | Rimuovere tutte le impostazioni di autenticazione. |
Utilizzare lo snap-in IIS e assicurarsi che la directory bin non disponga di autorizzazioni di esplorazione Lettura, Scrittura o Directory . Assicurarsi inoltre che le autorizzazioni Esecuzione non siano impostate su Nessuna.
Utilizzare lo snap-in per rimuovere le impostazioni di autenticazione dalla directory bin. Questo determina la negazione di tutti gli accessi.
Gli account con privilegi minimi, come ASPNET, dispongono di autorizzazioni sufficienti per scrivere record nel registro eventi utilizzando le origini degli eventi esistenti. Tuttavia, essi non dispongono di autorizzazioni sufficienti per creare nuove origini di eventi. A tal scopo, è necessario inserire una nuova voce sotto la seguente chiave di registro:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\<log>
Per evitare questo problema, è possibile creare origini di eventi al momento dell'installazione quando sono disponibili privilegi di amministratore. È possibile utilizzare una classe installer .NET, la cui istanza può essere creata da Windows Installer , se si utilizza lo sviluppo .msi, o dall'utilità di sistema InstallUtil.exe in caso contrario. Per ulteriori informazioni sull'utilizzo dei programmi di installazione del registro eventi, consultare il modulo 10 "Creazione di pagine e controlli ASP.NET protetti".
Se non è possibile creare origini di eventi al momento dell'installazione, è necessario aggiungere l'autorizzazione alla seguente chiave di registro e consentire l'accesso all'account di processo di ASP.NET o a qualsiasi account rappresentato se l'applicazione utilizza la rappresentazione.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
Come minimo, gli account devono disporre delle seguenti autorizzazioni:
| • | Ricerca valore chiave |
| • | Imposta valore chiave |
| • | Crea sottochiave |
| • | Enumera sottochiavi |
| • | Notifica |
| • | Lettura |
Qualsiasi file a cui accede l'applicazione deve disporre di una voci di controllo dell'accesso (ACE) nell'elenco ACL che concede, come minimo, accesso in lettura all'account di processo di ASP.NET o all'identità rappresentata. Normalmente, gli elenchi ACL sono configurati nella directory e il file eredita l'impostazione.
Oltre a utilizzare autorizzazioni NTFS per limitare l'accesso ai file e alle directory, è anche possibile utilizzare livelli di attendibilità di ASP.NET per inserire vincoli nelle applicazioni e nei servizi Web per limitare le aree del file system a cui hanno accesso. Ad esempio, le applicazioni Web di media attendibilità possono accedere solo ai file all'interno della propria gerarchia di directory virtuale.
Per ulteriori informazioni sui criteri di protezione CAS di ASP.NET, leggere il modulo 9 "Utilizzo della protezione dall'accesso di codice con ASP.NET".
L'account di processo di ASP.NET e, per certe directory, qualsiasi identità di rappresentazione, se le applicazioni utilizzano la rappresentazione, richiede le seguenti autorizzazioni NTFS. Le autorizzazioni mostrate nella tabella 19.3 anno utilizzate in aggiunta a qualsiasi autorizzazione che potrebbe essere necessaria all'applicazione per accedere a risorse specifiche del file system.
Tabella 19.3 Autorizzazioni NTFS necessarie per gli account di processo di ASP.NET
| Directory | Autorizzazioni necessarie |
File di ASP.NET temporanei%windir%\Microsoft.NET\Framework\{versione}File di ASP.NET temporanei | Account di processo e identità rappresentate: |
Directory temporanea (%temp%) | Account di processo: |
Directory di .NET Framework%windir%\Microsoft.NET\Framework\{versione} | Account di processo e identità rappresentate: |
Directory configurazione .NET Framework%windir%\Microsoft.NET\Framework\{versione}\CONFIG | Account di processo e identità rappresentate: |
Radice sito Web | Account processo: |
Directory principale sistema | Account processo: |
Cache dell'assembly globale | Account di processo e identità rappresentate: |
Directory contenuti | Account di processo: |
Qualsiasi chiave di registro a cui accede l'applicazione deve disporre di una voci di controllo dell'accesso nell'elenco ACL che concede, come minimo, accesso in lettura all'account di processo di ASP.NET o all'identità rappresentata.
Per accedere a un database remoto mediante l'autenticazione di Windows dall'applicazione ASP.NET, sono disponibili le seguenti opzioni:
| • | Utilizzare l'account di processo ASP.NET predefinito. Utilizzare l'account di ASP.NET predefinito creando lo stesso nome utente e password sul server di database. In Windows 2000, l'account di processo predefinito è ASPNET. In Windows Server 2003, l'account di processo predefinito è NetworkService. Lo svantaggio dell'utilizzo di account locali è che se è possibile creare un'immagine del database SAM, che richiede privilegi di amministratore, allora è possibile accedere alle credenziali. Il vantaggio principale è che è possibile definire gli ambiti degli account locali a livello di specifici server, cosa difficile da ottenere tramite account di dominio. |
| • | Utilizzare un account di dominio con privilegi minimi per eseguire ASP.NET. Questo approccio semplifica l'amministrazione, e significa che non è necessario sincronizzare le password degli account in mirroring. Esso non funzionerà se il server Web e il server di database si trovano in domini non attendibili separati, o se un firewall separa i due server e non autorizza le porte necessarie per l'autenticazione di Windows. |
| • | Rappresentare l'account Web anonimo. In Windows Server 2003, è possibile seguire diverse applicazioni in processi di lavoro separati, utilizzando pool di applicazioni IIS 6.0 e configurando un'identità separata per ciascuna. |
Qualunque sia l'approccio utilizzato, limitare l'account dell'applicazione nel database. A tal scopo, creare un accesso SQL Server per l'account al quale concedere l'accesso al database richiesto, quindi limitare le relative autorizzazioni in modo che possa accedere solamente al minimo necessario di oggetti del database. Idealmente, si dovrebbero limitare le autorizzazioni in modo che il nome di accesso possa accedere solamente alle stored procedure utilizzate dall'applicazione o dal servizio Web.
La seguente procedura presuppone che venga utilizzato un account locale in mirroring, ma lo stesso approccio può essere utilizzato con un account di dominio per limitare le funzionalità dell'account nel database.
| • | Per configurare l'accesso al database per l'applicazione ASP.NET
|
Sono disponibili due metodi principali attraverso i quali l'applicazione ASP.NET può utilizzare condivisioni UNC:
| • | Accedendo ai file su condivisioni UNC |
| • | Ospitando applicazioni su condivisioni UNC |
Se l'applicazione accede ai file su una condivisione UNC, l'account di processo di ASP.NET o qualsiasi identità rappresentata deve disporre dei diritti di accesso appropriati definiti dall'elenco ACL sulla condivisione e sulla directory o file sottostante.
Se si utilizza l'account di processo locale di ASPNET, questo non dispone di un'identità di rete, quindi è necessario creare un account in mirroring sul server remoto con un nome utente e una password corrispondenti, oppure è necessario utilizzare un account di dominio con privilegi minimi che ha accesso a entrambi i server. In Windows Server 2003, l'account NetworkService che viene utilizzato per eseguire le applicazioni Web ASP.NET può essere autenticato attraverso la rete, quindi è sufficiente concedere i diritti di accesso all'account del computer.
È possibile utilizzare IIS per configurare una directory virtuale che punti a una condivisione UNC situata su un altro computer, ad esempio, \\serverremoto\nomeapp. Procedendo in tal senso, IIS richiede di fornire credenziali di account, che vengono utilizzate per stabilire una connessione con il computer remoto.
Nota: le credenziali dell'account vengono memorizzate in formato crittografato nel metabase IIS ma sono disponibili attraverso una API. È necessario assicurarsi di utilizzare un account con privilegi minimi. Per ulteriori informazioni, vedere l'articolo della Microsoft Knowledge Base 280383, "IIS Security Recommendations When You Use a UNC Share and Username and Password Credentials" (in inglese).
Se l'applicazione risiede su una condivisione UNC, ASP.NET rappresenta il token UNC fornito da IIS (creato dalle credenziali dell'account fornite a IIS) per accedere a tale condivisione, a meno che non sia stata attivata la rappresentazione e sia stata utilizzata un'identità di rappresentazione fissa, come è mostrato nella seguente configurazione:
<identity impersonate="true" userName="registry:HKLM\SOFTWARE\YourApp\identity\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourApp\identity\ASPNET_SETREG,password"/>
Se è stato fornito un account di rappresentazione fissa attraverso gli attributi userName e password, ASP.NET lo utilizza in alternativa al token UNC di IIS per accedere alla condivisione. L'account di rappresentazione fisso viene utilizzato anche da qualsiasi accesso a risorse eseguito dall'applicazione.
Nota: nell'esempio precedente, è stato utilizzato Aspnet_setreg.exe per memorizzare le credenziali nel Registro di sistema.
Se si attiva la rappresentazione del chiamante originale (identità di IIS autenticata) mediante la seguente configurazione, ASP.NET utilizza ancora il token UNC per accedere ai file dell'applicazione sulla condivisione, sebbene qualsiasi accesso a risorse eseguito dall'applicazione utilizzi il token di rappresentazione.
<identity impersonate="true" />
Nota: anche l'account utilizzato per la condivisione UNC deve essere in grado di leggere Machine.config.
Alle applicazioni in una condivisione UNC viene concessa l'autorizzazione intranet impostata dai criteri di protezione dell'accesso di codice. L'autorizzazione intranet impostata non contiene AspNetHostingPermission, richiesta per l'esecuzione dalle applicazioni Web ASP.NET, così l'applicazione non verrà eseguita senza esplicite modifiche dei criteri di protezione.
Sono disponibili due opzioni:
| • | Concedere attendibilità totale alla condivisione UNC sulla quale è ospitata l'applicazione. |
| • | Configurare i criteri di protezione dell'accesso di codice per concedere al codice AspNetHostingPermission e qualsiasi altra autorizzazione che potrebbe essere necessaria in base ai tipi di risorse a cui accedere e alle operazioni da eseguire. Per ulteriori informazioni sui criteri di protezione dell'accesso di codice di ASP.NET e sulla asndbox di codice privilegiato, leggere il modulo 9 "Utilizzo della protezione dall'accesso di codice con ASP.NET". Nota: quando si configurano i criteri di protezione, è necessario concedere l'attendibilità alla condivisione (utilizzando un percorso di file) invece che alla zona. Questo fornisce una migliore capillarità perché non vengono influenzate tutte le applicazioni in una particolare zona. |
L'applicazione utilizza l'identità di processo o di rappresentazione quando chiama risorse COM (ndash), come i componenti per servizi. L'autenticazione dal lato client e i livelli di rappresentazione vengono configurati mediante gli attributi di livello comAuthenticationLevel e comImpersonation nell'elemento <processModel> in Machine.config.
Per ulteriori informazioni e consigli, vedere "Considerazioni sui servizi Enterprise" nel modulo 17 "Protezione del server per applicazioni".
ASP.NET è dotato delle seguenti funzionalità per aiutare a contrastare attacchi denial of service rivolti a contro applicazioni ASP.NET:
| • | Per impostazione predefinita le richieste POST sono limitate a 4 megabyte (MB). |
| • | Prima che le richieste vengano inserite in coda per l'elaborazione i client vengono controllati per verificare che siano ancora connessi. Questo viene fatto nel caso un aggressore invii diverse richieste e quindi li disconnetta. |
| • | L'esecuzione della richiesta scade dopo un limite che può essere configurato. |
I valori di configurazione vengono mantenuti nell'elemento <httpRuntime> in Machine.config. Il seguente esempio di codice mostra le impostazioni predefinite di un Machine.config versione 1.1:
<httpRuntime executionTimeout="90"
maxRequestLength="4096"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
enableVersionHeader="true"/>
È anche possibile ridurre l'attributo maxRequestLength per impedire che gli utenti carichino file molto grandi. Il valore massimo consentito è 4 MB. Nella competizione Open Hack, maxRequestLength era limitata a 0,5 MB come è mostrato nel seguente esempio:
<system.web> <!-- 1/2 MB Max POST length --> <httpRuntime maxRequestLength="512"/> </system.web>
Nota: ASP.NET non gestisce gli attacchi a livello di pacchetto. Ciò può essere affrontato rafforzando lo stack TCP/IP. Per ulteriori informazioni sulla configurazione dello stack TCP/IP, vedere "Procedura: Rafforzamento delle protezioni dello stack TCP/IP" nella sezione "Procedura" di questa guida.
Se l'applicazione Web ASP.NET viene eseguita in una Web farm, allora non vi sono garanzie che le richieste successive da uno stesso client saranno servite dallo stesso server Web. Le implicazioni riguardano:
| • | Stato sessione |
| • | Crittografia e verifica |
| • | DPAPI |
Per evitare affinità di server, mantenere lo stato della sessione out-of-process di ASP.NET nel database di stato di ASP.NET SQL Server o nel servizio di stato out-of-process che viene eseguito su un computer remoto. Per ulteriori informazioni sulla protezione dello stato della sessione in un archivio di stato remoto, vedere la sezione "Stato sessione" precedentemente in questo documento.
Le chiavi utilizzate per crittografare e verificare i cookie di autenticazione basata su form e visualizzare lo stato devono essere le stesse attraverso tutti i server in una Web farm. Le impostazioni AutoGenerate nell'elemento <machineKey> devono essere sostituite con valori di chiave comuni.
Per ulteriori informazioni sulla generazione e la configurazione di chiavi, vedere l'articolo 312906 della Microsoft Knowledge Base "How To: Create Keys by Using Visual C# .NET for Use in Forms Authentication" (in inglese).
Per crittografare i dati, a volte gli sviluppatori utilizzano DPAPI. Se si utilizza DPAPI con la chiave di computer per memorizzare i segreti, la stringa crittografata è specifica di un determinato computer e non è possibile copiare i dati crittografati attraverso computer in una Web farm o in un cluster.
Se si utilizza DPAPI con una chiave utente, è possibile decrittografare i dati in qualsiasi computer con un profilo utente comune. Tuttavia, questo non è consigliato in quando i dati possono essere decrittografati su qualsiasi computer nella rete in grado di eseguire codice mediante l'account che ha crittografato i dati.
DPAPI è idealmente adeguato per memorizzare segreti di configurazione, ad esempio, stringhe di connessione di database, che risiedono su un server Web. Vanno utilizzate altre tecniche di crittografia quando i dati crittografati sono memorizzati su un server remoto, ad esempio, in un database. Per ulteriori informazioni sulla memorizzazione di dati crittografati nel database, vedere il modulo 14 "Creazione di codice di accesso ai dati protetto."
La seguente istantanea mostra gli attributi di un'applicazione ASP.NET protetta e consente di confrontare rapidamente e facilmente le impostazioni con la propria configurazione.
Tabella 19.4: Istantanea di una configurazione di applicazione ASP.NET protetta
| Componente | Caratteristiche |
Identità di processo | Il processo di lavoro di ASP.NET viene eseguito come ASPNET: <processModel username="machine" password="AutoGenerate" /> L'account personalizzato, se utilizzato, ha privilegi minimi. <processModel userName="registry:HKLM\SOFTWARE\YourApp\ process\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourApp\ process\ASPNET_SETREG,password"/> |
Rappresentazione | Le identità di rappresentazione sono crittografate nel Registro di sistema: <identity impersonate="true" userName="registry:HKLM\SOFTWARE\YourApp\ identity\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourApp\ identity\ASPNET_SETREG,password"/> |
Autenticazione | Il sito Web è partizionato per l'accesso pubblico e limitato. <forms loginUrl="Restricted\login.aspx" protection="All" requireSSL="true" timeout="10" name="AppNameCookie" path="/FormsAuth" slidingExpiration="true" /> Il cookie di autenticazione è crittografato e l'integrità viene controllata. |
Autorizzazione | Gli elenchi ACL sono configurati nelle risorse ASP.NET. |
Stato sessione | Il servizio di stato ASP.NET è disattivato se non necessario. <sessionState mode="Off " /> Il canale di comunicazione con l'archivio di stato remoto è crittografato se necessario. |
Stato visualizzazione | Il MAC di stato della visualizzazione è attivato nell'elemento <pages> in Machine.config. |
Chiave di computer | L'attributo validation è impostato su SHA1. <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1"/> |
Risorse proibite | Le risorse proibite sono mappate su System.Web.HttpForbiddenHandler. |
Debug | Le build di debug sono disattivate: <compilation debug="false" . . . |
Tracciatura | La tracciatura è disattivata. <trace enabled='false' localOnly='true . . . |
Gestione delle eccezioni | Gli errori personalizzati sono attivati.
<customErrors mode="On"
defaultRedirect="YourErrorPage.htm" /> |
Servizi remoti | I servizi remoti sono attivati sui server Web Internet: <httpHandlers> <add verb="*" path="*.soap" type="System.Web.HttpForbiddenHandler"/> <add verb="*" path="*.rem" type="System.Web.HttpForbiddenHandler"/> . . . </httpHandlers> |
Servizi Web | I servizi Web sono attivati se non richiesti:
<httpHandlers>
<add verb="*" path="*.asmx"
type="System.Web.HttpForbiddenHandler"/>
. . .
</httpHandlers>
I protocolli non necessari sono disattivati: <webServices> <protocols> <!-- <add name="HttpPost"/> --> <!-- <add name="HttpGet"/> -->.... Il protocollo Documentation è disattivato per impedire la generazione automatica di WSDL: <webServices> <protocols> <!--<add name="Documentation"/>--> . . . |
Directory bin | La directory bin è protetta. |
In questo modulo è stato dimostrato come proteggere un'applicazione Web o un servizio Web ASP.NET concentrando l'attenzione sulle categorie che includono account, servizi, protocolli, file e directory, e sui dati di configurazione che vengono mantenuti nei file Machine.config e Web.config. È stato inoltre dimostrato come proteggere varie aree funzionali che dipendono dalle applicazioni Web e servizi Web ASP.NET, tra cui autenticazione, autorizzazione, stato sessione e accesso ai dati.
Per un elenco di controllo correlato, vedere "Elenco di controlo: Protezione di ASP.NET" nella sezione "Elenco di controllo" di questa guida.
Per ulteriori informazioni, vedere le seguenti risorse e articoli:
| • | È possibile scaricare Web Services Enhancements (WSE) 1.0 SP1 per Microsoft .NET all'indirizzo http://microsoft.com/downloads/details.aspx?FamilyId=06255A94-2635-4D29-A90C-28B282993A41&aylangs=en (in inglese). |
| • | Articolo 329290 della Microsoft Knowledge Base, "How To: Use the ASP.NET Utility to Encrypt Credentials and Sessine State Connection Strings" (in inglese). |
| • | Articolo 311209 della Microsoft Knowledge Base, "How To: Configure ASP.NET for Persistent SQL Server Session State Management" (in inglese). |
| • | Articolo 312906 della Microsoft Knowledge Base, "How To: Create Keys by Using Visual C# .NET for Use in Forms Authentication" (in inglese) |
| • | "Procedura: Implement Kerberos Delegation for Windows 2000" nella sezione "How To" di "Microsoft patterns & practices Volume I, Building Secure ASP.NET Web Applications: Authentication, Authorization, and Secure Communication" at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/SecNetHT05.asp (in inglese). |
| • | Per ulteriori informazioni sulle considerazioni scaturite dal concorso Open Hack, vedere l'articolo di MSDN "Building and Configuring More Secure Web Sites" all'indirizzo http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/openhack.asp (in inglese). |