Share via


Creare un server IIS 7.0 personalizzato

di Mike Volodarsky

Introduzione

IIS 6.0 e versioni precedenti hanno implementato la maggior parte delle funzionalità server ampiamente usate all'interno del server stesso. Al contrario, IIS 7.0 e versioni successive del motore server Web offre un'architettura modulare in cui praticamente tutte le funzionalità del server vengono fornite come componenti collegabili. Ciò consente notevoli miglioramenti a livello generale, tra cui:

  • Possibilità di controllare esattamente il set di funzionalità caricato/usato nel server, rimuovendo le funzionalità non necessario per ridurre l'area di attacco/footprint di memoria del server
  • Possibilità di sostituire ogni funzionalità con implementazioni di terze parti o personalizzate
  • Possibilità di specializzare il server in base al proprio ruolo nella topologia del server
  • Controllo avanzato sul set di funzionalità del server, sia a livello granulare che delegabile dall'applicazione

Questi componenti server, noti come moduli, vengono caricati durante l'inizializzazione del processo di lavoro del pool di applicazioni e forniscono servizi di elaborazione delle richieste nel server. Ogni applicazione IIS 7.0 e versioni successive è una combinazione di servizi forniti dai moduli abilitati per l'applicazione e il contenuto associato usato da questi servizi. Il server fornisce due ruoli principali interpretati dai moduli:

  • Fornitura di servizi di richiesta, ad esempio l'autenticazione o la memorizzazione nella cache di output (simile ai filtri ISAPI in IIS 6.0)
  • Gestione delle richieste, ad esempio gestione dei file statici, CGI o elaborazione di pagine ASP.NET (simile alle estensioni ISAPI in IIS 6.0)

Abilitando moduli diversi, il server può essere configurato per fornire i servizi richiesti dalle applicazioni nel server.

Le attività illustrate in questo articolo includono:

  • Verifica della configurazione del server, del valore predefinito e del set di moduli caricati nel server per impostazione predefinita
  • Rimozione di tutti i moduli per rimuovere il server fino alla configurazione minima ed esaminare l'effetto sul footprint
  • Creazione di un server personalizzato mediante l'aggiunta incrementale di moduli per supportare uno scenario specifico

Revisione della configurazione del modulo predefinita

La configurazione del server principale è contenuta nel file applicationHost.config, che si trova nella directory %windir%\system32\inetsrv\config\di configurazione di IIS . Nel gruppo di sezioni viene esaminata la configurazione <system.webServer> seguente:

<globalModules> Sezione. Questa sezione a livello di server contiene l'elenco dei moduli caricati dal processo di lavoro del server e le DLL native associate che implementano la relativa funzionalità.

<modules> Sezione. Questa sezione a livello di applicazione contiene l'elenco dei moduli abilitati per una determinata applicazione. Questa sezione consente di selezionare il subset di moduli caricati che devono essere attivi in un'applicazione e anche di caricare moduli aggiuntivi a livello di applicazione.

<handlers> Sezione. Questa sezione a livello di URL contiene i mapping del gestore usati dal server per eseguire il mapping delle richieste in ingresso a un modulo specifico che lo elabora. Si tratta di un mapping ASP.NET unificato delle richieste ai gestori dei tipi di contenuto nativo e gestito.

La descrizione completa di tutti i moduli IIS è disponibile nella panoramica dei moduli IIS 7.0 e versioni successive.

Creare un backup di configurazione

Prima di tutto, viene eseguito il backup della configurazione del server in modo che sia possibile ripristinarla, se necessario. Eseguire il comando seguente da un prompt dei comandi in esecuzione come Amministrazione istrator:

%windir%\system32\inetsrv\appcmd add backup initial

È quindi possibile ripristinare la configurazione del server allo stato iniziale eseguendo:

%windir%\system32\inetsrv\appcmd restore backup initial

Esaminare l'elenco predefinito dei moduli

Passare alla <sezione system.webServer>/<globalModules> . Questa sezione, che può essere configurata solo a livello di server, contiene i moduli caricati da ogni processo di lavoro del server. Ogni voce configura un modulo con un nome specifico e la DLL che implementa la funzionalità di tale modulo:

<globalModules>

    <!--several modules omitted -->

    <add name="BasicAuthenticationModule" image="…\authbas.dll" />

    <add name="WindowsAuthenticationModule" image="…\authsspi.dll" />

</globalModules>

Esaminare i nomi dei vari moduli nella configurazione del server predefinita. I servizi noti forniti come parte del server in IIS 6.0 sono noti:

Modulo Autenticazione di Windows, autenticazione della richiesta NTLM

<add name="WindowsAuthenticationModule" image="…\authsspi.dll" />

Modulo Gestore file statico, gestione dei file statici

<add name="StaticFileModule" image="…\static.dll" />

Modulo di compressione dinamica, compressione delle risposte

<add name="DynamicCompressionModule" image="…\compdyn.dll" />

Passare alla <sezione system.webServer>/<modules> . Questa sezione, che può essere configurata a livello di server o applicazione, specifica quale dei moduli caricati nella <sezione globalModules> è abilitata per una determinata applicazione. Nella maggior parte dei casi, si noterà che questa sezione elenca i nomi dei moduli visualizzati nella sezione, abilitandoli per impostazione predefinita per tutte le applicazioni.

Nota

Alla fine dell'elenco sono presenti alcuni elementi aggiuntivi: questi sono moduli gestiti sviluppati usando il modello di estendibilità ASP.NET. Altre informazioni sulla creazione di modalità gestite nella procedura dettagliata Sviluppare un modulo con .NET .

Passare alla <sezione system.webServer>/<handlers> . Questa sezione, che può essere configurata a livello di server, applicazione o URL, specifica come vengono gestite le richieste. I moduli in genere partecipano a ogni richiesta e a ogni richiesta, mentre i gestori ottengono solo richieste per un URL specifico.

Un buon esempio di modulo è il modulo di compressione. Il modulo di compressione esamina ogni risposta e lo comprime se necessario. Il gestore di pagina ASP.NET è un buon esempio di gestore. Riceve solo le richieste di cui è stato eseguito il mapping, ad esempio le richieste con estensione .aspx. L'elenco <handlers> definisce i mapping tra una richiesta in base all'URL e al verbo e un modulo di gestione che verrà usato per elaborare questa richiesta. Sono inoltre disponibili alcune informazioni aggiuntive usate per configurare ogni mapping, che non è lo stato attivo in questo argomento.

<handlers>
    <!-- certain details omitted -->
    <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" ... />
    <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" ... />
    <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST"  modules="IsapiModule" ... />
</handlers>

Esame del footprint del server

  1. Aprire Internet Explorer e effettuare una richiesta al server specificando l'URL seguente e premendo INVIO:

    http://localhost/iisstart.htm
    

    Viene avviato il pool di applicazioni server e viene usato il documento di iisstart.htm.

  2. Avviare Gestione attività e passare alla scheda Processi. Poiché il processo di lavoro IIS viene eseguito con un account utente diverso, è necessario selezionare "Mostra processi per tutti gli utenti". Si notino le dimensioni del processo di lavoro del server w3wp.exe.
    Screenshot che mostra Gestione attività di Windows. La scheda Processi è selezionata.
    Figura 1: Gestione attività che mostra il processo di lavoro IIS

  3. Eseguire ora la riga di comando seguente:

    TASKLIST /fi "imagename eq w3wp.exe" /m
    

    Si noterà che più di 90 DLL vengono caricate dal processo di lavoro. La maggior parte di esse si trova nella directory ...\intersrv\: molte di queste sono DLL di modulo visualizzate nella prima attività quando si esamina la <sezione globalModules> e altre che supportano .NET Framework e il runtime del server stesso.

Rimozione del server

Nell'attività precedente è stato esaminato l'elenco predefinito dei componenti caricati dal server, che contiene più di 35 moduli che hanno fornito vari servizi che vanno dall'autenticazione alla gestione di file statici. Ognuno dei componenti caricati nel server ha un impatto sul footprint del server, sulla superficie di attacco, sulle prestazioni di runtime e naturalmente sul set di funzionalità abilitato.

Prima di creare un server personalizzato con solo le funzionalità necessarie nell'attività successiva, viene creato un server Web veloce, piccolo e sicuro rimuovendo tutti i moduli ed eseguendo il server vuoto.

Se il file applicationHost.config è stato modificato durante l'attività precedente, è possibile ripristinarlo allo stato originale eseguendo %windir%\system32\inetsrv\appcmd restore backup initial dalla riga di comando.

Ora per rimuovere il server.

  1. Usare un editor di testo per aprire %windir%\system32\inetsrv\config\applicationHost.config.

  2. Passare alla <system.webServer>/<globalModules> sezione .

  3. Rimuovere tutte le voci dell'insieme, in modo che rimanga solo una definizione di sezione vuota:

    <globalModules> 
        <!—Remove Everything --> 
    </globalModules>
    
  4. Incollare gli elementi in una finestra del Blocco note scratch da usare in un secondo momento. Ripetere la stessa operazione con la <sezione system.webServer>/<modules> . Rimuovere tutte le voci in questa sezione e incollarle in un blocco note scratch per usarle in un secondo momento. In questo modo non si abilitano più i moduli caricati. Incollare questi elementi tagliati in una finestra del Blocco note scratch per usarli in un secondo momento.

  5. Ripetere la stessa operazione con la <system.webServer>/<handlers> sezione . Rimuovere tutte le voci in questa sezione per assicurarsi che non vengano specificati mapping di gestori con i moduli disabilitati. Incollare gli elementi in un blocco note scratch per usarli in un secondo momento. Salvare il file applicationHost.config per rendere effettive le modifiche.

Esaminare il footprint del server rimosso

A questo punto, è possibile caricare il server rimosso. Verranno ripetuti i passaggi precedenti per esaminare il nuovo footprint del server.

  1. Aprire Internet Explorer e effettuare una richiesta al server specificando l'URL seguente e premendo INVIO:

    http://localhost/iisstart.htm
    

    Verrà avviato il pool di applicazioni server e verrà restituito un errore al browser perché non è registrato alcun gestore per gestire la risorsa richiesta.

  2. Eseguire Gestione attività e passare alla scheda Processi. Si notino le dimensioni del processo di lavoro del server w3wp.exe.

  3. Eseguire la riga di comando seguente:

    TASKLIST /fi "imagename eq w3wp.exe" /m
    

    Osservare che il footprint del server è stato ridotto a circa 8 Mb. Nell'intervallo di tempo del server, il footprint del server vuoto verrà ulteriormente ridotto.

    Vengono caricate solo 50 DLL, rispetto a 90 o più. Ciò indica che il server non ha caricato alcuna DLL del modulo, che è direttamente e indirettamente considerata la differenza di conteggio delle DLL. Non solo i servizi disabilitati nel server, ma anche nessun codice per queste funzionalità viene caricato nel processo. Dopo l'ottimizzazione, il numero di DLL del server vuoto sarà notevolmente inferiore.

Nell'attività successiva verrà compilato il server personalizzato con solo le funzionalità desiderate.

Creazione di un server personalizzato

Nell'attività precedente il server è stato rimosso fino alla configurazione minima, con solo il motore server principale in esecuzione e non sono stati caricati moduli aggiuntivi. A questo momento, viene creato il server personalizzato da usare come file server Web in una rete aziendale. A tale scopo, il server viene abilitato per fornire solo i servizi seguenti:

  • Usare i file statici
  • Elencare le directory
  • Proteggere il contenuto con l'autenticazione di base e le regole di autorizzazione basate su URL

Abilitare il server per la gestione di file statici

Per eseguire questa attività, si presuppone che l'attività precedente sia stata seguita e rimossa dal server rimuovendo tutti i moduli in esecuzione. In questo stato, il server restituisce sempre risposte di errore 401 vuote a tutte le richieste, perché nessun modulo viene caricato per fornire alcun tipo di elaborazione delle richieste.

  1. Usare un editor di testo per aprire %windir%\system32\inetsrv\config\applicationHost.config.

  2. Passare alla <sezione system.webServer>/<globalModules> . Aggiungere le 2 righe in grassetto sotto all'interno dell'insieme: copiarlo dal riquadro scratch usato in precedenza per salvare gli elementi predefiniti della raccolta. Viene caricato il modulo del gestore di file statico, responsabile della gestione delle richieste per i file statici e del modulo di autenticazione anonima, che produce un token di autenticazione predefinito per la richiesta:

    <globalModules>
        <add name="StaticFileModule" image="%windir%\System32\inetsrv\static.dll" />
        <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" />
    </globalModules>
    
  3. Passare alla <sezione system.webServer>/<modules> . Abilitare il gestore di file statici e le modalità di autenticazione anonima aggiungendo la riga in grassetto seguente:

    <modules>
    
        <add name="AnonymousAuthenticationModule" />
    
        <add name="StaticFileModule" />
    
    </modules>
    
  4. Passare alla <sezione system.webServer>/<handlers> . Eseguire il mapping del gestore di file statico a tutte le richieste di file aggiungendo la riga in grassetto seguente:

    <handlers>
        <add name="StaticFile" path="*" verb="GET,HEAD"  modules="StaticFileModule" resourceType="Either" requireAccess="Read"/>
    </handlers>
    
  5. Salvare il file applicationHost.config.

  6. Aprire Internet Explorer ed effettuare una richiesta all'URL seguente:

    http://localhost/iisstart.htm
    

    Viene utilizzato il documento richiesto. È stata abilitata la funzionalità di gestione dei file statici nel server.

  7. Richiedere quindi l'elenco della directory inviando una richiesta all'URL seguente:

    http://localhost
    

    Si ottiene una risposta vuota perché non viene attualmente caricato, abilitato e mappato alla directory di elaborazione liste: viene inviata una risposta vuota (200 OK). Nell'attività successiva verrà aggiunto il gestore.

Abilitare il server per fornire elenchi di directory

Per eseguire questa attività, si presuppone che siano state eseguite le attività precedenti, rimosso il server da zero e aggiunta la funzionalità di gestione dei file.

  1. Usare un editor di testo per aprire %windir%\system32\inetsrv\config\applicationHost.config.

  2. Come in precedenza, aggiungere la configurazione seguente per abilitare il modulo di esplorazione della directory ed eseguirne il mapping per gestire le richieste di directory (la configurazione cumulativa sarà esattamente come specificato di seguito dopo questo passaggio, basandosi sulla parte superiore del passaggio precedente):

    <globalModules>
        <add name="AnonymousAuthenticationModule" image="%windir%\system32\inetsrv\authanon.dll" />
        <add name="StaticFileModule" image="%windir%\system32\inetsrv\static.dll" />
        <add name="DirectoryListingModule" image="%windir%\System32\inetsrv\dirlist.dll" />
    </globalModules>
    
    <modules>
        <add name="AnonymousAuthenticationModule" />
        <add name="StaticFileModule" />
        <add name="DirectoryListingModule" />
    </modules>
    
    <handlers>
        <add name="StaticFile" path="*" verb="GET,HEAD" modules="StaticFileModule,DirectoryListingModule"  resourceType="Either" requireAccess="Read" />
    </handlers>
    

    A questo punto, è stata abilitata la funzionalità elenco directory nel server. Tuttavia, la funzionalità espone una configurazione aggiuntiva per motivi di sicurezza che controllano se l'elenco di directory è consentito o meno. Questa configurazione viene specificata nella <sezione system.webServer>/<directoryBrowse> .

  3. Modificare la voce in <directoryBrowse enabled="true" />

  4. Salvare il file applicationHost.config.

  5. Aprire Internet Explorer e ripetere la richiesta alla directory richiedendo l'URL seguente:

http://localhost

Viene utilizzato l'elenco della directory richiesta. È stata abilitata la funzionalità di elenco delle directory nel server.

Aggiungere quindi i servizi di autenticazione e autorizzazione per proteggere il contenuto nel server da accessi non autorizzati.

Protezione delle risorse con autorizzazione URL

Per eseguire questa attività, si presuppone che siano state seguite le attività precedenti, rimosso il server fino a nulla e aggiunta la funzionalità di elenco di file e directory.

  1. Usare un editor di testo per aprire %windir%\system32\inetsrv\config\applicationHost.config.

  2. Questa volta vengono aggiunti due moduli:

    • Modulo di autenticazione di base, che supporta lo schema di autenticazione di base su http1.1 rispetto alle credenziali di Windows del server
    • Modulo di autorizzazione URL, che supporta il controllo degli accessi in base a regole utente e ruolo
  3. Per aggiungere questi moduli, aggiungere le voci di caricamento del modulo alla <sezione system.webServer>/<globalModules> e quindi abilitare i moduli nella <sezione system.webServer>/<modules> , come illustrato in precedenza per il gestore di file statici e il browser di directory.

    Nota

    Questa volta non è necessario aggiungere nulla alla <sezione system.webServer>/<handlers> , perché questi moduli non forniscono la gestione delle richieste, ma forniscono solo servizi di richiesta a tutte le richieste. La configurazione finale dopo aver aggiunto gli elementi seguenti in grassetto avrà un aspetto simile al seguente:

    <globalModules>
        <add name="AnonymousAuthenticationModule" image="%windir%\system32\inetsrv\authanon.dll" /> 
        <add name="StaticFileModule" image="%windir%\system32\inetsrv\static.dll" /> 
        <add name="DirectoryListingModule" image="%windir%\system32\inetsrv\dirlist.dll" /> 
        <add name="UrlAuthorizationModule" image="%windir%\System32\inetsrv\urlauthz.dll" />      
        <add name="BasicAuthenticationModule" image="%windir%\System32\inetsrv\authbas.dll" /> 
    </globalModules> 
    
    <modules> 
        <add name="AnonymousAuthenticationModule" /> 
        <add name="StaticFileModule" /> 
        <add name="DirectoryListingModule" /> 
        <add name="BasicAuthenticationModule" /> 
        <add name="UrlAuthorizationModule" /> 
    </modules>
    

    Per usare le funzionalità aggiunte, è necessario configurarle.

  4. Abilitare il servizio di autenticazione di base. Passare all'elemento <basicAuthentication> e impostare l'attributo enabled su true:

    <basicAuthentication enabled="true" />
    
  5. Disabilitare l'autenticazione anonima. Passare all'elemento <anonymousAuthentication> e impostare l'attributo enabled su false:

    <anonymousAuthentication enabled="false" userName="IUSR" />
    

    In questo modo viene disabilitata l'autenticazione anonima e è necessario che il modulo di autenticazione di base esegua correttamente l'autenticazione dell'utente prima che venga concesso l'accesso.

  6. Salvare il file applicationHost.config.

  7. Aprire Internet Explorer e ripetere la richiesta alla directory richiedendo l'URL seguente:

    http://localhost
    

    Richiede un elenco di directory. Poiché il browser non ha eseguito l'autenticazione, il modulo di autorizzazione URL rifiuta la richiesta. Il modulo di autenticazione di base intercetta il rifiuto e attiva una richiesta di autenticazione di base nel browser, causando la visualizzazione della finestra di dialogo di accesso di autenticazione di base.

  8. Accedere con credenziali non valide. La richiesta viene rifiutata, con una richiesta di nuovo di credenziali.

  9. Accedere con l'account Amministrazione istrator usato per accedere al computer. Viene visualizzato l'elenco di directory che indica che al server sono state aggiunte funzionalità di autenticazione e autorizzazione.

Riepilogo

In questo articolo è stata illustrata la natura componente del server, sono state esaminate le funzionalità iis fornite e è stato illustrato come creare un server Web personalizzato con solo i servizi richiesti da un utente.

Prima di usare di nuovo il server, annullare le modifiche apportate alla configurazione del server eseguita come parte di questa procedura dettagliata. Se è stato creato un backup in precedenza, ripristinarlo eseguendo %windir%\system32\inetsrv\appcmd restore backup initial dalla riga di comando.

Per altre informazioni, vedere i collegamenti seguenti: