Erstellen eines benutzerdefinierten IIS 7.0-Servers
von Mike Volodarsky
Einführung
IIS 6.0 und frühere Versionen implementierten die meisten häufig verwendeten Serverfunktionen innerhalb des Servers selbst. Im Gegensatz dazu bietet IIS 7.0 und höher eine modulare Architektur, auf der praktisch alle Serverfeatures als austauschbare Komponenten bereitgestellt werden. Dies ermöglicht enorme Verbesserungen im gesamten Board, darunter:
- Die Möglichkeit, genau zu steuern, welche Gruppe von Features geladen / auf dem Server verwendet werden und Entfernen nicht benötigter Features, um die Angriffsfläche / den Speicherbedarf des Servers zu reduzieren
- Die Möglichkeit, jedes Feature durch Drittanbieter oder benutzerdefinierte Implementierungen zu ersetzen
- Die Möglichkeit, den Server basierend auf seiner Rolle in der Servertopologie zu spezialisieren
- Erweiterte Kontrolle über den Featuresatz des Servers, sowohl auf feinkörniger Ebene als auch auf anwendungsdelegierbarer Ebene
Diese Serverkomponenten, die als Module bezeichnet werden, werden während der Initialisierung des Arbeitsprozesses des Anwendungspools geladen und stellen Anforderungsverarbeitungsdienste auf dem Server bereit. Jede Anwendung, die IIS 7.0 und höher ist, ist eine Kombination von Diensten, die von Modulen bereitgestellt werden, die für die Anwendung aktiviert sind, und zugehörigen Inhalten, die von diesen Diensten verwendet werden. Der Server bietet zwei Hauptrollen, die von Modulen gespielt werden:
- Bereitstellen von Anforderungsdiensten, z. B. Authentifizierung oder Ausgabezwischenspeicherung (ähnlich wie ISAPI-Filter in IIS 6.0)
- Bereitstellen der Anforderungsverarbeitung, z. B. statische Dateiverarbeitung, CGI oder ASP.NET-Seitenverarbeitung (ähnlich wie ISAPI-Erweiterungen in IIS 6.0)
Durch die Aktivierung verschiedener Module kann der Server so konfiguriert werden, dass er die Dienste bereitstellt, die von den Anwendungen auf dem Server benötigt werden.
Die in diesem Artikel veranschaulichten Aufgaben umfassen:
- Überprüfen der Serverkonfiguration, dem Standard und der Gruppe von Modulen, die standardmäßig auf dem Server geladen wurden
- Entfernen aller Module, um den Server auf die minimale Konfiguration herunterzusetzen und die Auswirkungen auf den Speicherbedarf zu untersuchen
- Erstellen eines benutzerdefinierten Servers durch inkrementelles Hinzufügen von Modulen zur Unterstützung eines bestimmten Szenarios
Überprüfen der Standardmodulkonfiguration
Die Hauptserverkonfiguration ist in der Datei applicationHost.config enthalten, die sich im IIS-Konfigurationsverzeichnis %windir%\system32\inetsrv\config\
befindet. Wir betrachten die folgende Konfiguration, die in der Abschnittsgruppe <system.webServer>
enthalten ist:
<globalModules>
-Abschnitt. Dieser Abschnitt auf Serverebene enthält die Liste der Module, die vom Serverarbeitsprozess geladen wurden, und die zugehörigen systemeigenen DLLs, die ihre Funktionalität implementieren.
<modules>
-Abschnitt. Dieser Abschnitt auf Anwendungsebene enthält die Liste der Module, die für eine bestimmte Anwendung aktiviert sind. Dieser Abschnitt dient zum Auswählen der Teilmenge der geladenen Module, die in einer Anwendung aktiv sein sollten, und zum Laden zusätzlicher Module auf Anwendungsebene.
<handlers>
-Abschnitt. Dieser Abschnitt auf URL-Ebene enthält die Handlerzuordnungen, die der Server verwendet, um eingehende Anforderungen einem bestimmten Modul zuzuordnen, das es verarbeitet. Dies ähnelt den IIS 6.0-Scriptmaps oder ASP.NET und dient einer einheitlichen Zuordnung von Anforderungen an systemeigene und verwaltete Inhaltstyphandler.
Die vollständige Beschreibung aller IIS-Module ist in der Modulübersicht von IIS 7.0 und höher verfügbar.
Erstellen einer Konfigurationssicherung
Zunächst sichern wir die Serverkonfiguration so, dass sie bei Bedarf wiederhergestellt werden kann. Führen Sie den folgenden Befehl über eine Eingabeaufforderung aus, die als Administrator ausgeführt wird:
%windir%\system32\inetsrv\appcmd add backup initial
Anschließend können wir die Serverkonfiguration in den Anfangszustand wiederherstellen, indem wir Folgendes ausführen:
%windir%\system32\inetsrv\appcmd restore backup initial
Überprüfen der Standardliste von Modulen
Navigieren Sie zum Abschnitt <system.webServer>/<globalModules>. Dieser Abschnitt, der nur auf Serverebene konfiguriert werden kann, enthält die Module, die von jedem Serverarbeitsprozess geladen werden. Jeder Eintrag konfiguriert ein Modul mit einem bestimmten Namen und die DLL, welche die Funktionalität dieses Moduls implementiert:
<globalModules>
<!--several modules omitted -->
<add name="BasicAuthenticationModule" image="…\authbas.dll" />
<add name="WindowsAuthenticationModule" image="…\authsspi.dll" />
</globalModules>
Schauen Sie sich die Namen der verschiedenen Module in der Standardserverkonfiguration an – wir sehen vertraute Dienste, die als Teil des Servers in IIS 6.0 bereitgestellt werden:
Windows-Authentifizierungsmodul, NTLM-Anforderungsauthentifizierung
<add name="WindowsAuthenticationModule" image="…\authsspi.dll" />
Static File Handler-Modul, dient statischen Dateien
<add name="StaticFileModule" image="…\static.dll" />
Dynamisches Komprimierungsmodul, Komprimierung von Antworten
<add name="DynamicCompressionModule" image="…\compdyn.dll" />
Navigieren Sie zum Abschnitt <system.webServer>/<modules>. Dieser Abschnitt, der auf Server- oder Anwendungsebene konfiguriert werden kann, gibt an, welche Module im Abschnitt <globalModules> für eine bestimmte Anwendung aktiviert sind. In den meisten Fällen sehen wir, dass in diesem Abschnitt die Namen der Module aufgelistet sind, die wir im Abschnitt gesehen haben, wodurch sie standardmäßig für alle Anwendungen aktiviert werden.
Hinweis
Am Ende der Liste gibt es ein paar zusätzliche Elemente – dies sind verwaltete Module, die mit dem ASP.NET Erweiterbarkeitsmodell entwickelt wurden. Weitere Informationen zum Erstellen von verwalteten Modi finden Sie in der exemplarischen Vorgehensweise Entwickeln eines Moduls mithilfe von .NET.
Navigieren Sie zum Abschnitt <system.webServer>/<handlers>. Dieser Abschnitt, der auf Server-, Anwendungs- oder URL-Ebene konfiguriert werden kann, gibt an, wie Anforderungen verarbeitet werden. Module nehmen in der Regel an jeder Anforderung teil, während Handler nur Anforderungen für eine bestimmte URL abrufen.
Ein gutes Beispiel für ein Modul ist das Komprimierungsmodul. Das Komprimierungsmodul untersucht jede Antwort und komprimiert sie bei Bedarf. Der ASP.NET Seitenhandler ist ein gutes Beispiel für einen Handler. Er empfängt nur Anforderungen, die ihm zugeordnet sind, z. B. Anforderungen mit der Erweiterung .aspx. Die <handlers>
-Liste definiert die Zuordnungen zwischen einer Anforderung basierend auf der URL und dem Verb und einem Behandlungsmodul, das zum Verarbeiten dieser Anforderung verwendet wird. Es gibt auch einige zusätzliche Informationen, die zum Konfigurieren der einzelnen Zuordnungen verwendet werden, was nicht der Fokus in diesem Artikel ist.
<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>
Prüfung des Serverspeicherbedarfs
Öffnen Sie Internet Explorer, und stellen Sie eine Anforderung an den Server, indem Sie die folgende URL angeben und die EINGABETASTE drücken:
http://localhost/iisstart.htm
Dadurch wird der Serveranwendungspool gestartet und das iisstart.htm Dokument bedient.
Starten Sie den Task-Manager und wechseln Sie zur Registerkarte „Prozesse“. Da der IIS-Arbeitsprozess unter einem anderen Benutzerkonto ausgeführt wird, müssen Sie „Prozesse für alle Benutzer anzeigen“ überprüfen. Beachten Sie die Größe des w3wp.exe Serverarbeitsprozesses.
Abbildung 1: Task-Manager mit dem IIS-ArbeitsprozessFühren Sie jetzt die folgende Befehlszeile aus:
TASKLIST /fi "imagename eq w3wp.exe" /m
Wir sehen, dass mehr als 90 DLLs vom Arbeitsprozess geladen werden. Die meisten davon befinden sich im Verzeichnis ...\intersrv\ – viele davon sind Modul-DLLs, die wir bei der ersten Aufgabe beim Betrachten des Abschnitts <globalModules> gesehen haben und einige andere, die .NET Framework und die Serverlaufzeit selbst unterstützen.
Verkleinern des Servers auf die minimale Konfiguration
In der vorherigen Aufgabe haben wir die Standardliste der vom Server geladenen Komponenten untersucht, die über 35 Module enthielten, die verschiedene Dienste bereitstellten, von der Authentifizierung bis hin zur statischen Dateibereitstellung. Jede der auf dem Server geladenen Komponenten wirkt sich auf den Serverbedarf, die Angriffsfläche, die Laufzeitleistung und natürlich den aktivierten Featuresatz aus.
Bevor wir unseren eigenen benutzerdefinierten Server mit nur der Funktionalität erstellen, die in der nächsten Aufgabe erforderlich ist, erstellen wir einen schnellen, kleinen und sicheren Webserver, indem wir alle Module entfernen und den leeren Server ausführen.
Wenn wir die Datei applicationHost.config während der vorherigen Aufgabe geändert haben, können wir sie mithilfe von %windir%\system32\inetsrv\appcmd restore backup initial
aus der Befehlszeile in den ursprünglichen Zustand wiederherstellen.
Verkleinern Sie jetzt den Server auf die minimale Konfiguration.
Verwenden Sie einen Text-Editor, um
%windir%\system32\inetsrv\config\applicationHost.config
zu öffnen.Navigieren Sie zum
<system.webServer>/<globalModules>
-Abschnitt.Entfernen Sie alle Einträge in der Auflistung, sodass nur eine leere Abschnittsdefinition bleibt:
<globalModules> <!—Remove Everything --> </globalModules>
Fügen Sie die Elemente zur späteren Verwendung in ein Entwurfsnotizblockfenster ein. Wiederholen Sie denselben Vorgang mit dem Abschnitt <system.webServer>/<modules>. Entfernen Sie alle Einträge unter diesem Abschnitt, und fügen Sie sie zur späteren Verwendung in einen Entwurfsnotizblock ein. Dadurch wird sichergestellt, dass keine Module aktiviert werden, die nicht mehr geladen werden. Fügen Sie diese ausgeschnittenen Elemente in ein Entwurfsnotizblockfenster ein, um sie später zu verwenden.
Wiederholen Sie denselben Vorgang mit dem
<system.webServer>/<handlers>
-Abschnitt. Entfernen Sie alle Einträge in diesem Abschnitt, um sicherzustellen, dass wir keine Handlerzuordnungen mit deaktivierten Modulen angeben. Fügen Sie die Elemente zur späteren Verwendung in ein Entwurfsnotizblock ein. Speichern Sie die Datei applicationHost.config, um die Änderungen zu bewirken.
Untersuchen des verkleinerten Serverbedarfs
An diesem Punkt sind wir bereit, unseren auf die minimale Konfiguration verkleinerten Server zu laden – wir werden die vorherigen Schritte wiederholen, um den neuen Speicherbedarf des Servers zu untersuchen.
Öffnen Sie Internet Explorer, und stellen Sie eine Anforderung an den Server, indem Sie die folgende URL angeben und die EINGABETASTE drücken:
http://localhost/iisstart.htm
Dadurch sollte der Serveranwendungspool gestartet und ein Fehler an den Browser zurückgegeben werden, da kein Handler für die angeforderte Ressource registriert ist.
Führen Sie den Task-Manager aus, und wechseln Sie zur Registerkarte „Prozesse“. Beachten Sie die Größe des w3wp.exe Serverarbeitsprozesses.
Führen Sie die folgende Befehlszeile aus:
TASKLIST /fi "imagename eq w3wp.exe" /m
Beachten Sie, dass der Speicherbedarf des Servers auf etwa 8 Mb reduziert wurde. Im Serverzeitrahmen wird der Speicherbedarf des leeren Servers weiter reduziert.
Im Vergleich zu 90 oder mehr werden nur 50 DLLs geladen – dies weist darauf hin, dass der Server keine der Modul-DLLs geladen hat, die direkt und indirekt die Differenz der DLL-Anzahl berücksichtigt haben. Nicht nur die Dienste sind auf dem Server deaktiviert, sondern es wird auch kein Code für diese Features im Prozess geladen. Nach der Optimierung wird die DLL-Anzahl des leeren Servers deutlich niedriger sein.
In der nächsten Aufgabe erstellen wir den benutzerdefinierten Server nur mit den gewünschten Features.
Erstellen eines benutzerdefinierten Servers
In der vorherigen Aufgabe haben wir den Server auf die minimale Konfiguration verkleinert, wobei nur das Kernservermodul ausgeführt wird und keine zusätzlichen Module geladen wurden. Jetzt erstellen wir den benutzerdefinierten Server, der als Webserver in einem Unternehmensnetzwerk verwendet werden soll. Dazu ermöglichen wir dem Server, nur die folgenden Dienste bereitzustellen:
- Bereitstellen statischer Dateien
- Verzeichnisauflistungen bereitstellen
- Schützen der Inhalte mit Standardauthentifizierungs- und URL-basierten Autorisierungsregeln
Aktivieren des Servers für statische Dateien
Um diese Aufgabe auszuführen, wird davon ausgegangen, dass wir die vorherige Aufgabe befolgt und den Server verkleinert haben, indem wir alle laufenden Module entfernt haben. In diesem Zustand gibt der Server immer leere 401-Fehlerantworten auf alle Anforderungen zurück, da keine Module geladen werden, um überhaupt irgendeine Art von Anforderungsverarbeitung bereitzustellen.
Verwenden Sie einen Text-Editor, um
%windir%\system32\inetsrv\config\applicationHost.config
zu öffnen.Navigieren Sie zum Abschnitt <system.webServer>/<globalModules>. Fügen Sie die 2 fetten Zeilen unten in der Sammlung hinzu – kopieren Sie sie aus dem zuvor verwendeten Entwurfsnotizblock, um die Standardsammlungselemente zu speichern. Dadurch wird das statische Dateihandlermodul geladen, das für die Bereitstellung von Anforderungen für statische Dateien verantwortlich ist, und das Modul für die anonyme Authentifizierung, das ein Standardauthentifizierungstoken für die Anforderung erzeugt:
<globalModules> <add name="StaticFileModule" image="%windir%\System32\inetsrv\static.dll" /> <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" /> </globalModules>
Navigieren Sie zum Abschnitt <system.webServer>/<modules>. Aktivieren Sie den statischen Dateihandler und die anonymen Authentifizierungsmodi, indem Sie die fette Zeile unten hinzufügen:
<modules> <add name="AnonymousAuthenticationModule" /> <add name="StaticFileModule" /> </modules>
Navigieren Sie zum Abschnitt <system.webServer>/<handlers>. Ordnen Sie den statischen Dateihandler allen Dateianforderungen zu, indem Sie die fette Zeile unten hinzufügen:
<handlers> <add name="StaticFile" path="*" verb="GET,HEAD" modules="StaticFileModule" resourceType="Either" requireAccess="Read"/> </handlers>
Speichern Sie die Datei applicationHost.config.
Öffnen Sie Internet Explorer, und stellen Sie eine Anforderung an die folgende URL:
http://localhost/iisstart.htm
Dies dient dem angeforderten Dokument. Wir haben die Funktion zum Bereitstellen statischer Dateien auf dem Server erfolgreich aktiviert.
Fordern Sie als Nächstes die Verzeichnisauflistung an, indem Sie eine Anforderung an die folgende URL stellen:
http://localhost
Wir erhalten eine leere Antwort, da zurzeit kein Handler geladen, aktiviert und dem Prozessverzeichnisauflistung zugeordnet ist – eine leere Antwort wird gesendet (200 OK). In der nächsten Aufgabe fügen wir den Handler hinzu.
Aktivieren des Servers zum Bereitstellen von Verzeichniseinträgen
Um diese Aufgabe auszuführen, wird davon ausgegangen, dass wir die vorherige Aufgabe befolgt und den Server verkleinert, und dann die Dateifunktion hinzugefügt haben.
Verwenden Sie einen Text-Editor, um
%windir%\system32\inetsrv\config\applicationHost.config
zu öffnen.Fügen Sie wie zuvor die unten aufgeführte Konfiguration hinzu, um das Modul Verzeichnissuche zu aktivieren, und ordnen Sie es zu, damit es Verzeichnisanforderungen bedient (die Gesamtkonfiguration sieht nach diesem Schritt genau wie unten angegeben aus, und baut auf dem vorherigen Schritt auf):
<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>
Nun haben wir die Verzeichnisauflistungsfunktion auf dem Server aktiviert. Das Feature macht jedoch aus Sicherheitsgründen zusätzliche Konfigurationen verfügbar, die steuern, ob die Verzeichnisauflistung zulässig ist. Diese Konfiguration wird im Abschnitt <system.webServer>/<directoryBrowse> angegeben.
Ändern des Eintrags in <directoryBrowse enabled="true" />
Speichern Sie die Datei applicationHost.config.
Öffnen Sie Internet Explorer und wiederholen Sie die Anforderung an das Verzeichnis, indem Sie die folgende URL anfordern:
http://localhost
Dies dient der Auflistung des angeforderten Verzeichnisses. Wir haben die Verzeichnisauflistungsfunktion auf dem Server erfolgreich aktiviert.
Als Nächstes fügen wir die Authentifizierungs- und Autorisierungsdienste hinzu, um den Inhalt auf dem Server vor unbefugtem Zugriff zu schützen.
Schützen von Ressourcen mit URL-Autorisierung
Um diese Aufgabe auszuführen, wird davon ausgegangen, dass wir die vorherige Aufgabe befolgt und den Server verkleinert, und dann die Dateibereitstellungs- und Verzeichnisauflistungsfunktion hinzugefügt haben.
Verwenden Sie einen Text-Editor, um
%windir%\system32\inetsrv\config\applicationHost.config
zu öffnen.Dieses Mal fügen wir zwei Module hinzu:
- Das Standardauthentifizierungsmodul, welches das Standardauthentifizierungsschema über http1.1 für die Windows-Serveranmeldeinformationen unterstützt
- Das URL-Autorisierungsmodul, das benutzer- und rollenbasierte Zugriffssteuerung unterstützt
Um diese Module hinzuzufügen, fügen Sie die Modulladeeinträge zum Abschnitt <system.webServer>/<globalModules> hinzu, und aktivieren Sie dann die Module im Abschnitt <system.webServer>/<modules>, wie wir es zuvor für den statischen Dateihandler und den Verzeichnisbrowser getan haben.
Hinweis
Dieses Mal müssen wir dem Abschnitt <system.webServer>/<handlers> nichts hinzufügen, da diese Module keine Anforderungsverarbeitung bereitstellen – sie stellen nur Anforderungsdienste für alle Anforderungen bereit. Die endgültige Konfiguration nach dem Hinzufügen der fetten Elemente unterhalb sieht wie folgt aus:
<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>
Um die hinzugefügten Features verwenden zu können, müssen wir sie konfigurieren.
Aktivieren Sie den Standardauthentifizierungsdienst. Navigieren Sie zum <basicAuthentication>-Element und legen Sie das aktivierte Attribut auf „true“ fest:
<basicAuthentication enabled="true" />
Anonyme Authentifizierung deaktivieren. Navigieren Sie zum Element <anonymousAuthentication> und legen Sie das aktivierte Attribut auf „false“ fest:
<anonymousAuthentication enabled="false" userName="IUSR" />
Dadurch wird die anonyme Authentifizierung deaktiviert und erfordert, dass das Standardauthentifizierungsmodul den Benutzer erfolgreich authentifiziert, bevor der Zugriff gewährt wird.
Speichern Sie die Datei applicationHost.config.
Öffnen Sie Internet Explorer und wiederholen Sie die Anforderung an das Verzeichnis, indem Sie die folgende URL anfordern:
http://localhost
Dies fordert eine Verzeichnisauflistung an. Da der Browser uns nicht authentifiziert hat, lehnt das URL-Autorisierungsmodul die Anforderung ab. Das Standardauthentifizierungsmodul fängt die Ablehnung ab und löst eine Standardauthentifizierungsabfrage zurück in den Browser aus, wodurch der Browser das Anmeldedialogfeld für die Standardauthentifizierung anzeigt.
Melden Sie sich mit ungültigen Anmeldeinformationen an. Die Anforderung wird abgelehnt, wobei eine Anforderung erneut zur Eingabe von Anmeldeinformationen auffordert.
Melden Sie sich mit dem Administratorkonto an, mit dem Sie sich beim Computer angemeldet haben. Die Verzeichnisauflistung wird angezeigt, die angibt, dass Sie dem Server erfolgreich Authentifizierungs- und Autorisierungsfunktionen hinzugefügt haben.
Zusammenfassung
In diesem Artikel wurde der komponentenartige Aufbau des Servers behandelt, die bereitgestellten IIS-Features untersucht und erläutert, wie ein benutzerdefinierter Webserver nur mit den Diensten erstellt wird, die ein Benutzer möglicherweise benötigt.
Bevor Sie den Server erneut verwenden, können Sie die Änderungen an der Serverkonfiguration rückgängig machen, die im Rahmen dieser exemplarischen Vorgehensweise ausgeführt wurden. Wenn Sie zuvor eine Sicherung erstellt haben, stellen Sie sie wieder her, indem Sie %windir%\system32\inetsrv\appcmd restore backup initial
über die Befehlszeile ausführen.
Verwandte Links
Weitere Informationen finden Sie unter den folgenden Links:
- Weitere Informationen zur IIS Core-Architektur finden Sie im Core Web Server-Abschnitt von IIS 7.0 und höher zu IIS.NET.
- Weitere Informationen zu IIS-Modulen finden Sie unter IIS 7.0 und höher in der Modulübersicht.
- Weitere Informationen zum Erstellen von Modulen zum Erweitern oder Ersetzen von IIS-Funktionen finden Sie unter Entwickeln eines Moduls mit .NET und Entwickeln eines nativen Moduls (C/C++).