IIS contiene molteplici componenti che costituiscono il cuore del software che svolgono funzioni importanti. Tanto più si conoscono in dettaglio questi componenti, tanto più sarà possibile ottenere vantaggi nella gestione del server web, nell'ottimizzazione delle performance e nella risoluzione dei problemi che potrebbero insorgere.
Focalizzeremo la nostra attenzione sui cinque moduli che compongono il core di IIS 6.0:
- HTTP Protocol Stack
- Worker Process
- WWW Service Administration and Monitoring
- Inetinfo.exe
- IIS Metabase
HTTP Protocol Stack
Il protocol stack è l'implementazione e la gestione software di un protocollo, in questo caso il protocollo HTTP, tramite cui avvengono tutte le transazioni di dati fra il client ed il server. In IIS 6.0 è gestito dal file HTTP.sys, che è un componente del sistema di networking di Windows 2003.
HTTP.sys ha la funzione di ascoltare tutte le richieste HTTP in entrata, di smistarle, e di restituire un output. A differenza delle precedenti versioni di IIS dove per gestire le richieste HTTP veniva utilizzato un modulo che lavorava in user-mode e si basava sulle Windows Socket Api (Winsock), HTTP.sys gira in kernel-mode. I vantaggi nell'adottare questo tipo di soluzione sono essenzialmente due:
- Kernel-mode caching: le richieste considerate in cache sono servite senza passare alla modalità user-mode. Ad ogni richiesta HTTP infatti, il Worker Process istruisce HTTP.sys se mettere in cache o meno la risposta, in base ad alcuni calcoli effettuati tramite l'algoritmo chiamato "activity-period cache algorithm". In caso affermativo, HTTP.sys memorizza in cache l'intero output della richiesta, per servirlo più velocemente nelle successive richieste. Grazie a questo sistema aumenta il numero di pagine che possono essere servite contemporaneamente al secondo e la velocità nei tempi di risposta, appunto perchè HTTP.sys non deve mai entrare in user-mode.
- Kernel-mode request queuing: le richieste causano una minore quantità di "context switch", ossia di cambiamento e ripristino degli stati della CPU, in quanto il kernel assegna direttamente le singole richieste al corretto worker process. Quando non ci sono worker process disponibili per accettare una richiesta, si forma una coda di richieste che attendono fino a quando il primo worker process non è disponibile.
Da quanto appena descritto, implementando questa nuova struttura si ottengono ulteriori benefici:
- Se un worker process fallisce, l'errore viene riconosciuto dal kernel che reimmette la richiesta in coda per essere processata da un nuovo worker process. Essendo questo processo automatizzato, il servizio rimane attivo e l'utente non si accorge di alcun errore.
- Le richiesta sono gestite più velocemente in quanto è il kernel che gestisce e smista tutto, in questo modo l'instradamento di una richiesta avviene fra una applicazione kernel-mode ad una user-mode, piuttosto che fra due applicazioni user-mode.
Come funziona HTTP.sys
HTTP.sys memorizza una mappa di tutti i siti web creati in IIS e rimane quindi in attesa di qualsiasi richiesta HTTP per questi siti web. Il ruolo di HTTP.sys è quello quindi di ricevere tutte le richieste in ingresso, metterle in coda, attendere che il worker process elabori la richiesta ed infine restituire l'output al client. Come detto sopra, HTTP.sys lavora in kernel-mode. Questo significa che per la CPU è una applicazione fidata, che può svolgere qualsiasi istruzione su qualsiasi indirizzo di memoria.
Per ovviare a qualsiasi problema di sicurezza, Microsoft ha fatto si che HTTP.sys non esegua in alcun modo alcuna porzione di codice: ha semplicemente una funzione di smistamento delle richieste. Anche nel caso di pagine salvate in cache, HTTP.sys non eseguirà alcun codice, evitando quindi che bug nel codice delle pagine web possa intaccare la sicurezza del sistema.
Questo modulo ha infine funzione di logging di tutto il servizio WWW e di implementare la funzionalità QoS, quality of service.
Il Worker Process
Il worker process è un componente del core di IIS 6.0 che elabora le richieste provenienti da HTTP.sys e lavora in user-mode. È la parte del web server che elabora il codice, sia di pagine statiche, sia di pagine dinamiche in ASP.NET, sia dei filtri esterni come ISAPI Rewrite o le Common Gateway Interface (CGI).
Le richieste HTTP quindi sono gestite e smistate da HTTP.sys ai vari worker process: ecco perchè HTTP.sys non esegue alcun codice. Per aumentare la sicurezza, i worker process girano sotto l'account "Network Service" che ha le caratteristiche di maggiore sicurezza in quanto ha una quantità di privilegi sul sistema operativo scarsissima che consente giusto di eseguire le operazioni necessarie.
WWW Service Administration and Monitoring
Il WWW Service Administration and Monitoring è un componente del core che ha la funzione di amministrare il server e di monitorarlo. È un modulo gestito da "Svchost.exe" e gira in user-mode e propone una serie di innovative caratteristiche per facilitare la gestione di un server web.
Poiché questo modulo contiene una serie di funzionalità critiche come la possibilità di lavorare sulla configurazione del server, non può eseguire alcun codice esterno, proprio come HTTP.sys. Anche in questo caso l'esecuzione del codice è affidata al worker process, per aumentare notevolmente la sicurezza nell'esecuzione di qualsiasi applicazione.
HTTPAdministration
HTTPAdministration è il modulo che si occupa di prelevare la configurazione del webserver dal Metabase e di inizializzare il namespace per HTTP.sys, allocando le risorse necessarie al funzionamento dei vari siti configurati per IIS.
Generalizzando, HTTPAdministrator gestisce in maniera specifica la configurazione del server, verificando automaticamente se sono avvenuti cambiamenti o modifiche ed allocando le nuove risorse e le nuove configurazioni automaticamente in memoria.
Worker Process Administration
Il WWW Service è responsabile del funzionamento del worker process, adempiendo a tutte le operazioni quali l'avvio e il mantenimento delle informazioni per far lavorare correttamente il worker process. Inoltre il WWW Service verifica, in baso allo stato del worker process, se è il caso di riavviarlo, reciclarlo o avviarne un ulteriore al fine di evitare blocchi nella gestione delle richieste e per prevenire la saturazione delle richieste servibili.
Inetinfo.exe
Inetinfo è un componente che lavora in user-mode. Quando IIS lavora in worker process isolation mode, cioè quando ogni applicazione è isolata dalle altre e quindi un errore non incide sugli altri processi, gestisce il Metabase e tutte le applicazioni che non riguardano il web service di IIS 6.0, come per esempio FTP, SMTP, NNTP.
Quando invece lavora in IIS 5.0 isolation mode, cioè quando una applicazione gira in uno spazio di memoria separato dal web server e dalle altre applicazioni, Inetinfo.exe gestisce alcune applicazioni come i filtri ISAPI o altre applicazioni web e svolge le principali operazioni che svolgeva in IIS 5.0.
IIS Metabase
L'ultimo modulo che compone il core di IIS 6.0 è il Metabase, un semplice file XML che contiene la configurazione del server. Nel Metabase sono presenti la maggior parte dei parametri di configurazioni, tranne pochissime eccezioni che sono salvate nel registro di sistema. Possiamo asserire che qualsiasi configurazione modificabile dall'interfaccia utente, appartiene al Metabase.
La peculiarità di questo nuovo sistema è che innanzitutto è editabile con qualsiasi editor di testo, senza quindi dover eseguire script o programmi esterni ed aumentando quindi la sicurezza. Inoltre, usando XML, è più semplice verificare se il file è integro oppure corrotto e quindi provvedere senza troppi problemi al backup ed al ripristino. Nelle precedenti versioni di IIS le configurazioni erano salvate nel file Metabase.bin ed era molto più complicato e meno versatile gestirne la configurazione.
In IIS 6.0 invece, il Metabase è composto da due file salvati su disco ed una versione caricata in memoria durante l'esecuzione del server. Nel file MetaBase.xml vengono salvate le configurazioni specifiche per l'installazione corrente di IIS. Nel file MBSchema.xml è salvato invece lo schema del metabase, descrivendo gli attributi per ogni singolo parametro configurabile in MetaBase.xml.
Quando si avvia IIS, viene caricata la configurazione in memoria per creare quello che viene definito in memory metabase, che contiene il contenuto di ambedue i file citati sopra. IIS 6.0 si occuperà di aggiornare e di sincronizzare ogni modifica della configurazione dal disco alla memoria e di rendere disponibile tale configurazione a tutte le applicazioni che hanno a che fare con IIS.
Una caratteristica molto utile del Metabase è la creazione di punti di salvataggio, definiti versioning and history. Ogni volta che si modifica la configurazione del server web, viene salvato nella cartella history il vecchio file di configurazione per poter essere ripristinato in qualsiasi momento. In questo modo in caso di errore o configurazione sbagliata, sarà possibile andare a ripescare il vecchio file funzionante dal disco fisso, ripristinando la funzionalità del server.
Conclusioni
In questo articolo abbiamo visto i componenti del core di IIS 6.0 e le loro funzionalità. Da quanto emerso, emerge l'impegno di Microsoft nell'aumentare prestazioni e sicurezza di IIS, proponendo soluzioni molto interessanti quali l'implementazione di HTTP.sys per gestire e smistare le richieste nella maniera più celere possibile e del worker process, un modulo fondamentale per aumentare gli standard di sicurezza di questo server web che non ha una storia molto felice.