Informazioni sulla delega della configurazione di IIS 7.0
di Saad Ladki
Introduzione
IIS introduce un nuovo sistema di configurazione basato su file per la sua settima versione del prodotto. Questo nuovo sistema sottolinea un sistema basato sui dati adatto per un'intera piattaforma Web in cui tecnologie come ASP.NET,Dac e persino componenti di terze parti possono usare ed estendere questo archivio di configurazione in qualsiasi sito o proprietà dell'applicazione.
Il sistema si basa su file XML definiti in un formato semplice e chiaro con una sintassi simile a ASP.NET file web.config. Questi file di configurazione contengono le impostazioni nei raggruppamenti logici e qualsiasi modifica ai file viene immediatamente riflessa nel sito o nell'applicazione le cui proprietà vengono modificate.
Questo nuovo sistema offre anche un'esperienza di amministrazione delegata in cui gli amministratori possono consentire ai proprietari di siti e applicazioni di modificare impostazioni specifiche; e, l'impatto di queste modifiche è limitato al sito o all'applicazione specifico in questione. Questo modello introduce il concetto di applicazioni autonome in cui le impostazioni di contenuto e configurazione sono ospitate nella directory del sito o dell'applicazione e possono essere distribuite x-copy da un computer a un altro.
File di configurazione e schema di configurazione
IIS 7.0 e versioni successive ha un file di configurazione centrale denominato applicationHost.config che si trova in %WINDIR%\System32\InetSrv\Config\
. Questo file sostituisce il file metabase.xml usato da IIS 6.0 per l'archivio di configurazione. Questo nuovo sistema di configurazione è molto semplice, basato su file, ma molto potente. Non è disponibile alcun servizio di configurazione, poiché IISADMIN non è necessario. Ogni processo di lavoro ha un'istanza di un componente lettore di configurazione e recupera direttamente la configurazione dai file.
Inoltre, non è disponibile alcuna rappresentazione in memoria della configurazione. Una volta rilasciata una modifica a un file, viene prelevata immediatamente dal processo di lavoro e riflessa nel sito, nell'applicazione o nella directory virtuale specificata.
Il file applicationHost.config contiene impostazioni globali per le diverse funzionalità e componenti di IIS e altre tecnologie Web. Qualsiasi proprietà impostata in questo file verrà applicata a tutti i siti, le applicazioni e le directory virtuali nel computer.
Il lettore di configurazione usato da IIS comprende il formato, la sintassi e la denominazione corretta di ogni sezione di configurazione, elemento e attributo perché sono definiti in un file di schema. Lo schema per la configurazione è definito nei file che si trovano nella %WINDIR%\System32\InetSrv\Config\Schema\
directory . Quando si crea un'istanza del sistema di configurazione, il processo di lavoro legge lo schema in memoria e consente al sistema di comprendere le proprietà disponibili per essere impostate e il relativo formato. Almeno, IIS_schema.xml, ASPNET_schema.xml e FX_schema.xml file si trovano in questa directory e definiscono la struttura di configurazione per le sezioni applicabili rispettivamente a IIS, ASP.NET e alle funzionalità di .NET Framework.
Lo schema definisce diversi aspetti della configurazione e delle relative sezioni, ad esempio la denominazione di sezioni e proprietà, i tipi previsti per i valori, l'intervallo di questi valori o se uno di essi è univoco o obbligatorio. Definisce anche il valore predefinito che verrà preso da un attributo specifico. Nel caso specificato in cui una proprietà non è definita in applicationHost.config, il relativo valore viene ricavato dall'impostazione predefinita specificata nel file di schema.
Oltre a questo file centrale, applicationHost.config, diversi file web.config possono essere visualizzati a qualsiasi livello della gerarchia url. Questi file possono essere visualizzati nel sito, nell'applicazione, nella directory virtuale o anche nei livelli di percorso fisico. Questi file definiscono le proprietà i cui valori sostituiscono le impostazioni globali definite in applicationHost.config. Tuttavia, queste modifiche sono applicabili solo all'ambito in cui viene visualizzato il file, ad esempio per il sito, l'applicazione, la directory virtuale o il percorso fisico in cui risiede il file web.config.
Gerarchia di configurazione ed efficace configurazione
Oltre a applicationHost.config, IIS usa ASP.NET, che si basa sia sui file machine.config che sui file web.config radice. Il file machine.config definisce le proprietà necessarie per tutte le funzionalità del framework. Il file web.config radice definisce le impostazioni globali per le proprietà definite per tutte le applicazioni Web ASP.NET. Questi due file sono analoghi a applicationHost.config di IIS. I tre file esistono perché la versione di .NET Framework e IIS separatamente. In un sistema Windows Server specifico possono essere installate più versioni di Framework con una singola versione di IIS.
Pertanto, una gerarchia di configurazione viene definita e calcolata per le impostazioni di configurazione del sistema. La gerarchia inizia da machine.config, quindi passa al file web.config radice, seguito da applicationHost.config. Da quel momento in poi, qualsiasi file web.config facoltativo che si trova nel sito, a livello di applicazione o di directory virtuale viene aggiunto e applicato alla gerarchia. Alla fine, le proprietà ereditano dal file padre al file figlio da machine.config fino all'ultimo file web.config (se presente) e la configurazione effettiva viene calcolata per un determinato percorso.
Il comportamento di ereditarietà viene eseguito per impostazione predefinita. Qualsiasi impostazione a un livello inferiore nella gerarchia esegue l'override di un'impostazione padre definita in un file al di sopra del livello corrente. Tuttavia, andando oltre la gerarchia, l'ambito della configurazione è più limitato. Quando le impostazioni dei file machine.config, root web.config e applicationHost.config si applicano a tutti gli elementi del sistema, le impostazioni dei file web.config facoltativi si applicano solo al percorso corrente e al seguente (sia che si tratti di un sito, di un'applicazione o di una directory virtuale).
Sezioni di configurazione
All'interno di un file di configurazione sono disponibili impostazioni che possono essere lette e impostate. Le impostazioni vengono raggruppate in modo strutturato. Più impostazioni simili o applicabili a una funzionalità specifica (i.e. ASP, autenticazione, ISAPI e così via) vengono raggruppate in blocchi di unità logica denominati sezioni di configurazione. Ogni sezione di configurazione può includere altre sezioni di configurazione, ma in genere definiscono elementi, raccolte o attributi.
Un elemento di configurazione è un elemento XML che definisce più attributi di configurazione. Una raccolta di configurazione è un caso speciale di un elemento di configurazione che contiene un elenco di elementi definiti con le direttive di configurazione add/remove/clear. Infine, gli attributi di configurazione sono impostazioni di configurazione foglia che rappresentano attributi XML.
Il frammento di codice seguente mostra le impostazioni per la <sezione defaultDocument> . La parola abilitata è un attributo in cui la parola files è un elemento che include un elenco di altri elementi definiti dalla direttiva add e una serie di attributi.
<defaultDocument enabled="true">
<files>
<add value="Default.htm" />
<add value="Default.asp" />
<add value="index.htm" />
<add value="index.html" />
<add value="iisstart.htm" />
<add value="default.aspx" />
</files>
</defaultDocument>
Questa sezione di configurazione ha uno schema associato. Il frammento di codice seguente illustra lo schema per la <sezione defaultDocument> nel file IIS_schema.xml. Lo schema definisce il nome della sezione e lo spazio dei nomi in cui viene visualizzato (in questo caso system.webServer). Inoltre, lo schema descrive gli attributi e gli elementi e per ogni nome, tipo, valori predefiniti e altri dati interessanti.
<sectionSchema name="system.webServer/defaultDocument">
<attribute name="enabled" type="bool" defaultValue="true" />
<element name="files">
<collection addElement="add" clearElement="clear" removeElement="remove" mergeAppend="false">
<attribute name="value" type="string" isUniqueKey="true"/>
</collection>
</element>
</sectionSchema>
Sezione speciale: <configSections>
La <configSections>
sezione di configurazione è una sezione speciale definita in applicationHost.config. Viene usato come punto del Registro di sistema per le sezioni di configurazione del server IIS. In questa sezione vengono registrate le sezioni di configurazione correnti disponibili nel sistema. Nel caso specificato che il sistema di configurazione sia esteso e che venga aggiunta una sezione personalizzata al server, è necessario registrarla aggiungendo una voce di elemento a questa sezione.
Il frammento di codice seguente mostra la <configSections>
voce per la <sezione defaultDocument> . Altre voci sono state omesse per motivi di chiarezza. La parte interessante di <configSections>
è la voce del gruppo di sezioni che definisce lo spazio dei nomi di ogni sezione, in questo caso system.webServer e il valore dell'attributo overrideModeDefault, che per questa sezione è "Allow". Poiché allowDefinition non è dichiarato, viene ricavato dallo schema e il valore predefinito è "Everywhere".
<configSections>
<sectionGroup name="system.webServer">
<section name="defaultDocument" overrideModeDefault="Allow" />
</sectionGroup>
</configSections>
Oltre a definire una sezione e il relativo gruppo di sezioni, sono definiti due attributi chiave: overrideModeDefault e allowDefinition.
L'attributo overrideModeDefault è un attributo facoltativo che definisce lo stato bloccato di una sezione. I valori disponibili sono Allow o Deny. Il valore predefinito è "Allow". Tutte le sezioni IIS correlate a qualsiasi aspetto critico, di sicurezza o di prestazioni del server sono bloccate con questo attributo impostato su "Nega". Se l'attributo overrideModeDefault è impostato su "Deny", tutti i file di configurazione a un livello inferiore (ad esempio i file web.config) che impostano un valore per una proprietà per la sezione di configurazione specifica non sono in grado di rendere effettivi ed eseguire l'override dei valori globali. Ciò comporta una violazione del blocco e si verifica un errore.
L'attributo allowDefinition è un altro attributo facoltativo che definisce il livello della gerarchia in cui è possibile definire la sezione e impostare le proprietà. Se il valore è MachineOnly, la sezione può essere impostata solo in applicationHost.config o machine.config. Se il valore è MachineToRootWeb, la sezione può essere impostata nei file MachineOnly o anche nella radice web.config. Se il valore è MachineToApplication, la sezione può essere impostata in tutti i tre file precedenti o anche nei file web.config nella cartella radice dell'applicazione. Infine, se il valore è Everywhere (ovvero l'impostazione predefinita) può essere impostato in qualsiasi file di configurazione, indipendentemente da quelli che influiscono sulla configurazione a livello globale o nei file web.config che si applicano a un determinato sito, applicazione o directory virtuale.
Il concetto di località
Qualsiasi impostazione specificata in un determinato file della gerarchia di configurazione si applica a tale livello e al di sotto, con la possibilità di essere sottoposta a override da file figlio. Tuttavia, è possibile specificare e applicare le impostazioni di configurazione a determinati percorsi nel file di configurazione corrente usando il tag location con un attributo path. Se il file di configurazione è applicationHost.config, i tag di percorso possono includere un percorso che va da tutti i siti, le applicazioni e le directory virtuali nel sistema a un sito, un'applicazione, una directory virtuale o un file specifici. Il tag di percorso può anche essere specificato nei file web.config e può includere qualsiasi percorso relativo per i percorsi sotto il sito corrente, l'applicazione o la directory virtuale.
Il frammento di codice seguente illustra come specificare una proprietà di configurazione applicabile solo al sito per sviluppatori. Questa operazione può essere ottenuta anche tramite un file web.config nel contenuto del sito. La configurazione efficace per il sito per sviluppatori sarà l'elenco di voci per la raccolta di file in applicationHost.config più il percorso e qualsiasi file web.config per il sito.
<location path="Developer Site" overrideMode="Allow">
<defaultDocument enabled="true">
<files>
<add value="Developer.htm" />
</files>
</defaultDocument>
</location>
Se non viene dichiarato alcun percorso, che equivale a specificare un punto (.), il percorso viene compreso come da questo livello e sotto a tutti i percorsi figlio. Questa operazione in applicationHost.config specifica anche la configurazione per il livello globale.
Un attributo che può essere definito in un tag di posizione è overrideMode. Analogamente a overrideModeDefault, specifica se la sezione di configurazione specificata a cui si fa riferimento e le proprietà impostate nel tag di posizione corrente possono essere modificate e sottoposte a override a livelli inferiori della gerarchia.
Blocco e sblocco di una sezione
Il concetto iniziale di blocco di una sezione tramite il tag overrideModeDefault nella <configSections>
sezione può essere preso e esteso per essere più granulare. Consentendo l'override di una sezione a <configSections>
livello, la sezione viene aperta e i relativi valori possono essere sostituiti da chiunque nel sistema tramite file web.config a qualsiasi livello dello spazio dei nomi URL. Tuttavia, ciò può comportare un grave rischio di sicurezza e può causare effetti negativi sulla disponibilità o sulle prestazioni del sistema. Tramite i tag di posizione, è possibile usare l'attributo overrideMode e specificare lo stato di blocco di una sezione e vincolarlo per un determinato percorso.
Il frammento di codice seguente illustra come sbloccare la <windowsAuthentication>
sezione per tutti i siti, le applicazioni e le directory virtuali nel sistema. Questa operazione viene eseguita impostando "Consenti" nell'attributo overrideModeDefault. Lo svantaggio di questo approccio è che sblocca una sezione per tutti e chiunque sia in grado di eseguire l'override delle impostazioni a livello di sito o applicazione tramite file web.config.
<section name="windowsAuthentication" overrideModeDefault="Allow" />
Il frammento di codice seguente mostra come ottenere la stessa operazione, sbloccando la <windowsAuthentication>
sezione, ma solo per administratorSite in modo che le proprietà per tale sezione possano essere modificate tramite file web.config a livello di sito AdministratorSite. Gli altri siti del sistema hanno il comportamento predefinito di una sezione bloccata <windowsAuthentication>
. Questa operazione viene eseguita tramite l'attributo overrideMode.
<location path="AdministratorSite" overrideMode="Allow">
<security>
<authentication>
<windowsAuthentication enabled="false">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
</location>
The location tag path can be specified here a site, application or even a virtual directory to which the administrator wants to unlock configuration and/or apply configuration at that level.
È possibile ottenere il comportamento opposto, che blocca una sezione per un sito specifico, mentre il resto del sistema è in grado di modificarlo. Ad esempio, <defaultDocument> è una sezione con l'attributo overrideModeDefault impostato su "Allow" nella <configSections>
sezione, ma tramite un tag location, è possibile bloccare questa sezione per il sito di base. I frammenti di codice seguenti illustrano come eseguire questa operazione impostando anche in modo che l'unico valore accettato dal sistema come pagina predefinita per il server venga visualizzato come home page è intitolato basic.htm. La direttiva clear nulls qualsiasi valore ereditato dai livelli precedenti nella gerarchia di configurazione, che in questo caso è l'elenco globale dei file di applicationHost.config.
<location path="Basic Site" overrideMode="Deny">
<defaultDocument enabled="true">
<files>
</clear>
<add value="basic.htm" />
</files>
</defaultDocument>
</location>
Blocco granulare
L'apertura di una sezione tramite un tag di posizione è un modo efficace per sbloccare una sezione e tutte le relative proprietà per il proprietario del sito o dell'applicazione del percorso specificato. Si tratta di un approccio all-or-nothing per consentire ai proprietari di siti e applicazioni di avere accesso illimitato a una sezione. Tuttavia, a volte gli amministratori desiderano un controllo specifico su determinate proprietà in una sezione e desiderano il controllo su un determinato valore. Altri possono essere delegati. È qui che entra in gioco un blocco granulare.
Il blocco granulare è un raggruppamento di attributi specifici che possono essere impostati su elementi o altri attributi. Il blocco granulare può dichiarare se i percorsi al di sotto di quello corrente possono modificare i valori di configurazione. I valori possono essere letti, ma se sono impostati blocchi, non possono essere modificati o persino dichiarati. Non modificare i valori i cui blocchi sono impostati, perché ciò comporterà errori di violazione del blocco della configurazione.
Il primo attributo nel raggruppamento di blocco granulare è lockAttributes. LockAttributes definisce un elenco delimitato da virgole di attributi bloccati per i percorsi al di sotto del livello di configurazione corrente. Accetta anche un asterisco (*) come valore, il che significa che tutti gli attributi sono bloccati. A questo punto, la sezione di configurazione può essere letta nei percorsi a livello figlio e anche negli attributi bloccati, ma la modifica di quelle protette genera errori.
Il frammento di codice seguente illustra come bloccare lo stato abilitato della <sezione defaultDocument> per il sito per sviluppatori. Se il proprietario del sito per sviluppatori disabilita la funzionalità predefinita del documento o anche dichiara la proprietà con lo stesso valore indicato nel tag location, si verifica una violazione del blocco.
<location path="Developer Site" >
<defaultDocument enabled="true" lockAttributes="enabled" />
</location>
Il secondo attributo nel raggruppamento di blocchi granulare è lockElements. LockElements definisce un elenco delimitato da virgole di elementi bloccati per i percorsi al di sotto del livello di configurazione corrente. Come lockAttributes, accetta anche un asterisco (*) come valore, il che significa che tutti gli elementi sono bloccati. Ciò è molto utile per le sezioni di configurazione con più elementi o raccolte e devono essere protetti per i percorsi a livello figlio. Anche in questo caso, la modifica di uno dei valori bloccati genera errori.
Il frammento di codice seguente illustra come bloccare la raccolta di file per il sito per sviluppatori. In questo modo viene lasciato al proprietario del sito di decidere se la funzionalità predefinita del documento è abilitata o meno; ma, se abilitata, non può modificare i valori globali ed eredita ciò che l'amministratore del computer ha dichiarato in applicationHost.config.
<location path="Developer Site">
<defaultDocument enabled="true" lockElements="files" >
<files>
<add value="Developer.htm" />
</files>
</defaultDocument>
</location>
L'esempio lockElement è utile anche all'interno delle raccolte per bloccare le direttive di tale raccolta. Le direttive sono parole chiave come aggiungere, rimuovere, cancellare una raccolta. Bloccando le direttive, un amministratore può ottimizzare se un elenco di raccolte è disponibile per l'aggiunta o la rimozione di determinati o tutti gli elementi.
Il frammento di codice seguente illustra come bloccare la rimozione e la cancellazione delle voci correnti nella raccolta di file. Il proprietario del sito può aggiungere nuove voci alla raccolta di file, se necessario. Se il proprietario del sito specifica un tag non crittografato o tenta di rimuovere una voce, si verifica una violazione del blocco.
<location path="Developer Site">
<defaultDocument enabled="true" >
<files lockElements="clear,remove">
<add value="Developer.htm" />
</files>
</defaultDocument>
</location>
Besides lockAttribute and lockElement, there are negative counterparts: lockAllAttributesExcept, and lockAllElementsExcept. These attributes achieve the inverse action of the previous ones in which the comma-separated list declares the attributes and elements to be unlocked while the rest are not available to be edited in child paths.
È disponibile anche un attributo lockItem . Questo blocca un attributo e funziona a livello di attributo XML. Il frammento di codice seguente mostra come l'amministratore del sito è in grado di eseguire qualsiasi operazione, ad esempio aggiungere o rimuovere voci nella raccolta, ad eccezione della modifica della voce basic.htm nella raccolta di file.
<location path="Developer Site">
<defaultDocument enabled="true" >
<files>
<add value="basic.htm" lockItem="true"/>
</files>
</defaultDocument>
</location>
Riepilogo
Questo documento ha descritto una panoramica di base del sistema di configurazione, dei relativi file, funzionalità di schema e delega. Sono state illustrate anche la gerarchia di configurazione e la configurazione efficace. L'articolo presenta anche un'introduzione alle sezioni di configurazione e alla relativa struttura di elementi e attributi. Ha illustrato il concetto di posizione, blocco e blocco granulare.
In generale, IIS introduce e nuovo sistema di configurazione basato su file con funzionalità per avere tutte le configurazioni in un file di configurazione centrale o distribuito tramite file web.config in cui gli amministratori di siti e applicazioni sono in grado di modificare le proprietà applicabili alle applicazioni e al contenuto. Con il modello di configurazione distribuita il concetto di applicazioni autonome in cui le impostazioni di contenuto e configurazione sono ospitate nella directory del sito o dell'applicazione e possono essere distribuite x-copy da un computer a un altro è abilitato.