joergkrause.de
Internet Information Services
Grundkurs für Softwareentwickler
Schwerpunkt Webentwicklung (HTTP Service)
Jö...
© joergkrause.de
Wer bin ich?
E-Mail:
joerg@krause.net
Profil:
de.linkedin.com/pub/joerg-krause/b/16a/a15
Twitter:
@joergi...
© joergkrause.de
Agenda
1 2 3 4 5 6
Geschichte
+
Grundlagen
Installation
+
Konfiguration
Fehlersuche
+
Optimierung
Archite...
© joergkrause.de
Anti-Agenda
• Was hier nicht behandelt wird:
– Programmierung von Webanwendungen
– FTP
– SMTP
– PHP-Integ...
© joergkrause.de
Agenda
1 2 3 4 5 6
Geschichte
+
Grundlagen
Installation
+
Konfiguration
Fehlersuche
Optimierung
Architekt...
joergkrause.de
Geschichte
© joergkrause.de
Versionen
• 1.0 NT 3.5.1
• 2.0 NT 4
• 3.0 SP 1 NT 4 (ASP)
• 4.0 Option Pack NT 4
• 5.0 Windows 2000
• 5.1...
© joergkrause.de
Neues…
• 8.0 (Windows Server 2012 / Windows 8)
– Application Initialization
– Initialisierungsschritte (W...
© joergkrause.de
Neues…
• 8.5 (Windows Server 2012 R2 / Windows 8.1)
– Protokollierung in das
Windows-Ereignisprotokoll
– ...
joergkrause.de
Grundlagen
Das Wichtigste kurz zusammengefasst
© joergkrause.de
Gut zu wissen
• ISO OSI
• TCP/IP
• HTTP
• WebSockets
• Server Name Indication (SNI)
© joergkrause.de
ISO OSI-Modell
• International Organization for Standardization (ISO)
• Open Systems Interconnection (OSI...
© joergkrause.de
OSI auf TCP/IP
• Vereinfachtes Modell
• Diverse Protokoll-Stacks
Ebene Name Stack I Stack II Stack III
5 ...
© joergkrause.de
TCP/IP
• IP = Internet Protocol
– Adressierung
– IPv4
– IPv6
• TCP = Transmission Control Protocol
– Über...
© joergkrause.de
IP
• IPv4
• Adressraum 256*256*256*256 = 232
• Einteilung in Klassen
Klasse Erste Bits Präfix-Bits Netzwe...
© joergkrause.de
IP
• Punktschreibweise 0.0.0.0 nur für Menschen
• "0" reserviert für Netzwerke (mehrere Adressen)
• 255.2...
© joergkrause.de
TCP
• Ports dienen der Identifizierung von
Dienstapplikationen
Port Dienst
7 Echo
20/21 FTP
23 Telnet
25 ...
© joergkrause.de
HTTP
• Hypertext Transfer Protocol
Anforderung
(Request)
Antwort
(Response)
HTTP Client
(Browser)
HTTP Se...
© joergkrause.de
Bausteine
• Uniform Resource Locator (URL)
• HTTP
– Die Anforderung
• Verb + URL + Version
• Header
• Dat...
© joergkrause.de
Bausteine
• HTTP – Die Anforderung
GET http://www.iis.net/ HTTP/1.1
Accept: text/html, application/xhtml+...
© joergkrause.de
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 13144
Content-Type: text/html; charset=utf-8
Vary:...
© joergkrause.de
HTTP
• Eine Seite = viele Anforderungen
<html>
<head>
<link href="some.css" />
<link href="more.css" />
<...
© joergkrause.de
HTTP
• Anfragen einer Website
© joergkrause.de
• Wichtige Methoden in Web-Anwendungen
HTTP Methoden (Verben)
Methode Funktion Nutzung
GET Ressource anfo...
© joergkrause.de
HTTP Statuscodes
Codegruppe Bedeutung Erwartete Reaktion
1xx Information Empfangen, Server setzt Vorgang ...
© joergkrause.de
Wichtige Statuscodes
Code Name Einsatz
100 Continue Fortsetzen
101 Update Protokollwechsel
200 OK Anforde...
© joergkrause.de
• Client Fehler, Anforderungsfehler
Wichtige Statuscodes
Code Name Einsatz
400 Bad Request Falsche Anford...
© joergkrause.de
Wichtige Statuscodes
Code Name Einsatz
500 Internal Server Error Fehler / Ausnahme in der Serverapplikati...
© joergkrause.de
Demo
• Website abrufen
• Mit Fiddler untersuchen
• Requests verstehen
• HTTP verstehen
© joergkrause.de
WebSockets
• HTTP ist "Fire and Forget"
• HTTP muss immer vom Client getriggert werden
• Websockets erlau...
© joergkrause.de
WebSockets im Protokollstapel
• WebSockets im vereinfachten Internet-Modell
Ebene Name Stack
5 Anwendung ...
© joergkrause.de
WebSockets
• Anfordern via HTTP
• Bestätigung via StatusCode 101
GET ws://websocket.example.com/ HTTP/1.1...
© joergkrause.de
SNI
• SNI = Server Name Indication
• Ab IIS Version 8.0
• Erweiterung des TLS (Transport Layer Security) ...
© joergkrause.de
Agenda
1 2 3 4 5 6
Geschichte
+
Grundlagen
Installation
+
Konfiguration
Fehlersuche
+
Optimierung
Archite...
joergkrause.de
Architektur & Arbeitsweise
Bausteine und Komponenten
© joergkrause.de
Komponenten
• Protokollempfänger (Listener)
– HTTP.sys
• Dienste (Services)
– W3SVC
– WAS
• Verwaltungswe...
© joergkrause.de
HTTP.sys
• Kernel Mode-Treiber
• HTTP und HTTPS Kommunikation
• Zertifikatsverwaltung
• Queue für den Wor...
© joergkrause.de
HTTP.sys – direkte Konfiguration
• Früher: httpcfg.exe
• Jetzt: netsh http
Kernel Mode
http.sys
User Mode...
© joergkrause.de
HTTP.sys – Zugriffsrechte
• Registrierung
Grand
IS
Administrator
?
User hat
ACL-Rechte
Deny
NEIN
NEIN
JA
...
© joergkrause.de
HTTP.sys
• Fehlerverhalten
– Worker Prozess stoppt/startet neu/ist im Fehlerzustand
– HTTP.sys queued ein...
© joergkrause.de
W3SVC und WAS
• World Wide Web Publishing Service (W3SVC)
• Windows Process Activation Services (WAS)
svc...
© joergkrause.de
Demo
• WAS und W3SVC
– im Taskmanager
– In der Dienstübersicht
© joergkrause.de
• Windows Process Activation Services
• Verwaltung der Konfiguration
– applicationHost.config
– reicht Ei...
© joergkrause.de
WAS
• Weiterreichen zum Worker Prozess
Weiterreichen der Anforderung
Listener
Adapter
WAS W3WP?
Ausführun...
© joergkrause.de
WAS
• Verwaltet die Worker Prozesse
– WAS alleine kontrolliert die Worker Prozesse
– Kommunikation via HT...
© joergkrause.de
Worker Prozess
• Verarbeitet die Anforderung
• w3wp.exe
• Selbststartend (kein Host), lang laufend, User ...
© joergkrause.de
Worker Prozess
• Ein Application Pool konfiguriert einen Worker
Prozess
Application Pool
w3wp.exe
AppDoma...
© joergkrause.de
Application Pool
• Prozessisolation, AppDomain-Isolation
• Ausführendes Konto
© joergkrause.de
Demo
• Application Pool Einstellungen
joergkrause.de
Arbeitsweise bei HTTP
Verarbeitung von Anforderungen
© joergkrause.de
Die Pipeline
• Klassisch (bis IIS 5 exklusiv, danach optional)
• Integriert (ab IIS 6)
© joergkrause.de
Die Pipeline
• Verarbeitung von Anforderungen
• Die Pipeline erzeugt Ereignisse
– Ereignis-Empfänger rufe...
© joergkrause.de
• Erst native Verarbeitung im W3SVC
• Dann Weiterleitung an aspnet_isapi.dll
• Dort wird die verwaltete U...
© joergkrause.de
> IIS 7.x
HTTP-Applikation
Request-
Handler
Request-
Handler
Request-
HandlerWorker Process
w3wp.exe
Inte...
© joergkrause.de
Vorteile der integrierten Pipeline
Request
Response
Authentifizierung
Autorisierung
Verarbeitung
Ausgabe ...
© joergkrause.de
Auf einen Blick
HTTP Protocol Stack (http.sys)
svchost.exe applicationHost.config
WAS
W3SVC
w3wp.exe
App ...
joergkrause.de
ASP.NET Integration
Die HTTP-Verarbeitung
© joergkrause.de
Bausteine der Pipeline
• Module
– Wirken auf jede Anforderung
– Merkmal: Aktiv, wenn konfiguriert
• Handl...
© joergkrause.de
Module
• Authentifizierung
• Autorisierung
• Kompression
• Cache
© joergkrause.de
Handler
• ASPX-Seitenverarbeitung
• Statische Dateien ausliefern
• Extensionless, z.B. für ASP.NET MVC
© joergkrause.de
Bausteine der Pipeline (ASP.NET)
Request Response
Pre Begin Request
Begin Request
Authenticate
Authorize
...
© joergkrause.de
Bausteine der Pipeline (MVC)
Request Response
Pre Begin Request
Begin Request
Authenticate
Authorize
Reso...
© joergkrause.de
Erweiterung der Pipeline (MVC)
Request
Response
IIS Pipeline
UrlRoutingModuleStatische Datei
Datei
gefund...
© joergkrause.de
Die Module
• ca. 30 Standardmodule
• Definition in
– %windir%system32inetsrvconfigapplicationhost.config
...
© joergkrause.de
Demo
• Module und Handler im
IIS Manager
© joergkrause.de
Übersicht Module
HTTP Protocol Support
ValidationRangeModule TraceVerbModule
OptionsVerbModule ProtocolSu...
© joergkrause.de
Agenda
1 2 3 4 5 6
Geschichte
+
Grundlagen
Installation
+
Konfiguration
Fehlersuche
+
Optimierung
Archite...
joergkrause.de
Installation & Konfiguration
joergkrause.de
Installation
© joergkrause.de
Installation
• Server Manager (Windows Server 2012 R2)
© joergkrause.de
Installation
• Add Roles
– Web Server (IIS)
© joergkrause.de
Installation
• Role Services
– Elemente der Installation
joergkrause.de
Installation mit Paket-Manager
© joergkrause.de
Kommandozeile
• Kommandozeile mit angehobenen Rechten
• Neue Kommandozeile mit angehobenen Rechten
Es fol...
© joergkrause.de
Der Paket-Manager
• Automation der
– Installation von Windows-Features
– Installation von Updates / Hotfi...
© joergkrause.de
Optionen des Paket-Managers
• Wichtige Funktionen:
– /ip: Installieren
– /up: Deinstallieren
– /norestart...
© joergkrause.de
Installation mit Paket-Manager
• Beispiel für ein Installationsskript
start /w pkgmgr /ip:IIS-WebServerRo...
joergkrause.de
Installation mit PowerShell
© joergkrause.de
Installation mit der PowerShell
• PowerShell CommandLets:
– Install-WindowsFeature
(Alias: Add-WindowsFea...
© joergkrause.de
Installation mit der PowerShell
• Alternativ auch Paket-Manager via PowerShell:
$packages = "IIS-WebServe...
© joergkrause.de
Vorbereitung der PowerShell
• CommandLets nicht verfügbar?
import-module ServerManager
© joergkrause.de
Installation mit der PowerShell
• Interaktiv via ISE (Integrated Scripting Environment)
Skript-Editor
She...
© joergkrause.de
Informationen abrufen
Get-WindowsFeature -Name web-server | Format-List -Property *
© joergkrause.de
Rollen installieren
Install-WindowsFeature -Name Web-Server
Neustart erforderlich?
Befehl erfolgreich
© joergkrause.de
Features
• Verwaltungswerkzeuge:
Install-WindowsFeature -Name Web-Mgmt-Tools
• Wenn man alle Features hab...
© joergkrause.de
Weitere Installationselemente
• Fernwartung (remote Zugriff auf IIS-Manager)
• Standardpfade der Sites (s...
© joergkrause.de
Beispielskript
#$Policy = "Unrestricted"
$Policy = "RemoteSigned"
If ((get-ExecutionPolicy) -ne $Policy) ...
© joergkrause.de
Demo
• Rollen mit PowerShell
installieren
joergkrause.de
Hinweise zur Installation
© joergkrause.de
Was ist bei der Installation wichtig?
• Sorgfältige Auswahl der Module
• Weniger Module heißt
– weniger A...
© joergkrause.de
Installation
• Module, die explizit installiert werden (können):
– HTTP:
• Default Document
• Directory B...
© joergkrause.de
Installation
• Module, die explizit installiert werden (Fortsg.):
– Performance:
• Static Content Compres...
© joergkrause.de
Installation
• Module, die explizit installiert werden (Fortsg.):
– FTP
– Web Core
– Management Tools
© joergkrause.de
Demo
• IIS-Module nachinstallieren
• Installationsskript exportieren
• Installation überprüfen
joergkrause.de
Konfiguration
© joergkrause.de
WAS Konfiguration
• Global
• Protokoll
• Application Pools
• Sites
© joergkrause.de
Konfiguration
web.config
Virtual Directory
web.config
Sub Directory
web.config
Application
web.config
Sub...
© joergkrause.de
Speicherort der Dateien
• machine.config
• web.config
• applicationHost.config
© joergkrause.de
Konfigurationsschema
• XML basiert
• Delegierbar
• Vererbung steuerbar
• Zugriff über
– Editor
– IIS Mana...
© joergkrause.de
Konfigurationsschema
• Standardmäßig sind…
– …alle IIS Abschnitte gesperrt, außer:
• Default Document
• D...
© joergkrause.de
Konfigurationsschema
• Delegierung heißt:
– Konfiguration sperren, “overrideMode”
– ACLs auf alle Dateien...
© joergkrause.de
Konfigurationsschema
• Elemente sperren
• Beispiel:
lockElements="providers,element1,element2"
lockAllEle...
© joergkrause.de
Konfigurationsschema
• Attribute sperren
lockAttributes="attribute1,attribute2,attribute3"
lockAllAttribu...
© joergkrause.de
Konfigurationsschema
• Oft sind Listen erforderlich (Collections)
• Beispiel: Provider
• Listen haben Ste...
© joergkrause.de
Konfigurationsschema
• Sperren der Elemente zum Entfernen
• Sperren von einzelnen Elementen einer Collect...
© joergkrause.de
Konfigurationsschema
• Schema-Datei (XML Schema, XSD):
• Konfiguration ist Case Sensitive
– Gilt auch für...
© joergkrause.de
Demo
• Konfiguration anschauen:
– machine.config
– web.config
– applicationHost.config
© joergkrause.de
Gemeinsame Konfiguration
• Load Balancer
• Serverfarmen / Fail Over Cluster
• Migrationsszenarien
applica...
© joergkrause.de
Gemeinsame Konfiguration
• Wie kommt die applicationHost.config auf den
gemeinsamen Server?
– Exportfunkt...
© joergkrause.de
Gemeinsame Konfiguration
1. MMC Funktion
2. Pfadeinstellungen
© joergkrause.de
Gemeinsame Konfiguration
• Auswirkung auf die Konfigurationsdatei:
• Mit Domänen-User:
<configSections>
<...
© joergkrause.de
Demo
• Konfiguration verteilen:
– User einrichten (Nicht-Domäne)
– Konfiguration exportieren
– Konfigurat...
joergkrause.de
Administration & Werkzeuge
© joergkrause.de
Agenda
1 2 3 4 5 6
Geschichte
+
Grundlagen
Installation
+
Konfiguration
Fehlersuche
+
Optimierung
Archite...
© joergkrause.de
Allgemeine Hinweise
• Nur installieren, was benötigt wird
– Angriffsfläche reduzieren
– Speicherbedarf ve...
joergkrause.de
Application Pool, Site, Bindung
© joergkrause.de
Application Pool
Allgemein
Leistung
Überwachung
© joergkrause.de
Sites und ihre Bausteine
• Site
– Applikation
– Bindung
– Virtuelle Verzeichnisse
• Container für
– Appli...
© joergkrause.de
Site: Definition
<sites>
<site name="Default Web Site" id="1">
<application path="/">
<virtualDirectory p...
© joergkrause.de
Bindung
• Definiert den physikalischen Endpunkt
• Besteht aus:
– Adresse (Wo?)
– Protokoll (Wie?)
© joergkrause.de
Bindung: Adresse
• Je nach Protokoll
• Bei HTTP / HTTPS:
– IP (oder * zur Bindung an alle physischen Adre...
© joergkrause.de
Besonderheit Host Header
• Typischer HTTP-Request:
• Header "Host" liefert die Host-Information
• DNS bin...
© joergkrause.de
Besonderheit Host Header
• Durchleitung der Anfrage-Informationen
• Spart öffentliche IP-Adressen
• DNS i...
© joergkrause.de
Applikationen
• Gruppe von Dateien, die Inhalte liefern
• Pfad zur Applikation ist Teil des URL der Site
...
© joergkrause.de
Virtuelles Verzeichnis
• Pfad im IIS der einen externen Teil des URL auf
einen physikalischen Pfad auf de...
joergkrause.de
Werkzeuge
Administration der IIS
© joergkrause.de
Übersicht
• IIS Manager (MMC GUI)
• Kommandozeile
– CMD: appcmd.exe
– PS1: IIS CommandLet
• Code
– WMI Sc...
© joergkrause.de
Eigenschaften
• IIS und ASP.NET gemeinsam verwalten
• Eine Datenbasis für alle Werkzeuge
• Administration...
© joergkrause.de
IIS Manager
• Grafische Oberfläche via Management Console
• Fernzugriff auf Server (über HTTP)
• Erweiter...
© joergkrause.de
Globale Konfiguration
• Generischer Editor
• Funktionsdelegation
• Zugriffsrechte auf MMC (nur Site-Ebene...
© joergkrause.de
Remote Zugriff
• Freigabe
• Authentifizierung
• Verbindung
• Verschlüsselung
• Protokollierung
• IP-Besch...
© joergkrause.de
Administrationsskripte
Besser immer mit Skript
© joergkrause.de
Kommandozeile
• Für Batch-Dateien
• appcmd.exe
• Syntax:
– appcmd (cmd) (object) <identifier> < /param:va...
© joergkrause.de
C:> appcmd list sites
SITE "Default Web Site" (id:1,bindings:HTTP/*:80:,state:Started)
SITE "Site1" (id:2...
© joergkrause.de
C:> appcmd list config /section:? | findstr system.webServer
system.webServer/globalModules
system.webSer...
© joergkrause.de
set appcmd=%systemroot%system32inetsrvAPPCMD.EXE
%appcmd% add site /name:MyNewSite /bindings:"http/*:81:"...
© joergkrause.de
Demo
• Batch erstellen:
– Application Pool
– Site
– Einstellungen Protokoll etc.
© joergkrause.de
PowerShell
• Muss als Admin laufen
• Bis IIS7 separate Installation
• Ab IIS 8 Teil des Windows Betriebss...
© joergkrause.de
Demo
• Skript erstellen:
– Application Pool
– Site
– Einstellungen Protokoll etc.
© joergkrause.de
Programmierung
• Verwaltete API für IIS
– Microsoft.Web.Administration
– Typisiert für IIS-Objekte (Pool,...
© joergkrause.de
Programmierung
ServerManager iisManager = new ServerManager();
foreach(WorkerProcess w3wp in iisManager.W...
© joergkrause.de
Demo
• Kommandozeile erstellen:
– Application Pool
– Site
– Einstellungen Protokoll etc.
© joergkrause.de
Agenda
1 2 3 4 5 6
Geschichte
+
Grundlagen
Installation
+
Konfiguration
Fehlersuche
+
Optimierung
Archite...
joergkrause.de
Sicherheit
Absichern einer IIS-Installation
Verschlüsseln von Verbindungen
Beschränken von Verbindungen
Ver...
joergkrause.de
TLS (SSL)
© joergkrause.de
TLS (SSL) Einrichten
• TLS = Transport Layer Security
– (früher SSL = Secure Socket Layer)
– Seit SSL 3.0...
© joergkrause.de
Grundlagen Verschlüsselung
• Der Weg vom Sender zum Empfänger
• Problem:
Wie kommt der Schlüssel zum Empf...
© joergkrause.de
Grundlagen Verschlüsselung
• Lösung: Asymmetrische Kryptografie
Öffentlicher
Schlüssel
Daten
Daten
versch...
© joergkrause.de
Grundlagen Verschlüsselung
• Asymmetrische Verfahren sind aufwändig
– (RSA ca. Faktor 1000 langsamer als ...
© joergkrause.de
Grundlagen Verschlüsselung
• Zertifikat
– digitaler Datensatz mit Eigenschaften
– Standard für Zertifikat...
© joergkrause.de
Grundlagen der Verschlüsselung
• Dateierweiterungen
– .CER – DER- oder Base64-kodiertes Zertifikat
– .CRT...
© joergkrause.de
Grundlagen Verschlüsselung
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm...
© joergkrause.de
Grundlagen Verschlüsselung
• Begriffe (Auswahl):
– PKI = Public Key Infrastructure
• System zum Herausgeb...
© joergkrause.de
-----BEGIN CERTIFICATE-----
MIIDoTCCAwqgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBiTELMAkGA1UEBhMCRkox
DTALBgNVBAgT...
© joergkrause.de
Zertifikat beschaffen
Root CA
Intermediate CA Intermediate CA Intermediate
Issuing CAs Issuing CAs Issuin...
joergkrause.de
SSL in den IIS
Einrichtung und Konfiguration
© joergkrause.de
Vorbereitung
• Wahl des Zertifikats:
– Valid From und Valid To gültig / sinnvoll?
– Common Name (CN) pass...
© joergkrause.de
Testzertifikat
• "Self Signed"
• Test-Root-Zertifikat und Test-Zertifikat mit makecert
• Test-Zertifikat ...
© joergkrause.de
Testzertifikat mit makecert
• Anlegen und Speichern eines Testzertifikats
makecert -r
-pe
-n "CN=www.your...
© joergkrause.de
OID
• Object Identifier
– Baum mit Objektbeschreibungswerten
– Private Knoten (kostenlose Registrierung) ...
© joergkrause.de
OID
• So entsteht die OID
1. ISO
3. Identified Organization
6. dod (US department of defence)
1. Internet...
© joergkrause.de
Aktuelle Konfiguration
• Entscheidend ist http.sys!
netsh http show sslcert
© joergkrause.de
Konfiguration
• SSL optional oder zwingend
© joergkrause.de
Bindungen
• Standard-Port für SSL: 443
• Einstellungen Via IIS Manager / Skript / .NET
• Konfiguration:
<...
© joergkrause.de
Ablauf
• Zwei Plätze:
1. Bindungsinformationen in applicationHost.config
2. Assoziierte SSL-Konfiguration...
© joergkrause.de
Kommandozeile
appcmd.exe
set config -section:system.applicationHost/sites
/siteDefaults.bindings
.[protoc...
© joergkrause.de
.NET-Code
• Ausführung in einer Konsolenapplikation
using (ServerManager serverManager = new ServerManage...
© joergkrause.de
Demo
• Zertifikat erstellen
• Installieren
• Testen
© joergkrause.de
Konfiguration verschlüsseln
© joergkrause.de
Demo
• Konfiguration schützen
© joergkrause.de
Beschränken von Verbindungen
• Authentifizierung
• Autorisierung:
– IP-Beschränkungen
– URL Autorisierung...
© joergkrause.de
Authentifizierung & Autorisierung
1. Authentifizierung
– Wer bist du?
– Diverse Verfahren
2. Autorisierun...
© joergkrause.de
Authentifizierung
Methode Anmeldeverfahren Benutzerdatenbank
Anonymer Zugriff Keines AD, lokales Konto
Ba...
© joergkrause.de
Das "anonyme" Konto
• Keine Operation ohne Identität
• Die anonymen Zugriffe laufen unter IUSR ab
• IUSR ...
© joergkrause.de
IUSR
• IUSR
– Kein Kennwort ("built in")
– Für Gastzugang einfach ACL auf IUSR setzen (Read)
– Kennwort k...
© joergkrause.de
Start
Authentifizierungsablauf
Anonym
?
Start
Impersonate
IUSR
Send 401
Per-
missions
OK?
200 OK
Other
Au...
joergkrause.de
Beschränkungen
Auswahl der wichtigsten
Sicherheitsbeschränkungen
© joergkrause.de
IP-Beschränkungen
• Standard:
– IP oder IP-Bereich
– Explizit erlauben oder explizit verbieten
• Erweiter...
© joergkrause.de
URL-Autorisierung
• Zugriffsbeschränkungen durch URLs
• Ersetzt Beschränkungen durch ACLs
• Funktion "Aut...
© joergkrause.de
URL-Autorisierung
• In der web.config der Anwendung
• Element <location> ist das Elternelement
<location ...
© joergkrause.de
Anforderungsfilter
• Standardbeschränkungen:
– Kritische Dokumente sind ausgefiltert (Configs, DLLs, …)
•...
© joergkrause.de
Anforderungsfilter
• Beispiel Kommandozeile
• Im IIS-Manager (MMC)
appcmd set config /section:requestfilt...
© joergkrause.de
Anforderungsfilter
• Spezifische Fehler bei Verstoß gegen die Regeln
URL Sequenz verboten 404.5
Verb verb...
joergkrause.de
Checklisten zum Härten
Härten einer IIS-Installation
© joergkrause.de
IIS Absichern (Checkliste I)
• Verzeichniszugriff
– Beschränkungen anonym zugreifbarere Verzeichnisse
– I...
© joergkrause.de
IIS Absichern (Checkliste II)
• Konfiguration
– DEBUG OFF in web.config
– TRACE FALSE in web.config
– Nic...
© joergkrause.de
IIS Absichern (Checkliste III)
• Sicherung der Kommunikation
– HTTPS aktiviert
– Zertifikate aktuell, ver...
© joergkrause.de
IIS Absichern (Checkliste IV)
• Protokollierung und Überwachung
– Misslungene Anmeldeversuche regelmäßig ...
© joergkrause.de
IIS Absichern (Checkliste V)
• Konten
– Verwaltete Konten für Application Pools
– IUSR abgeschaltet
– Ano...
© joergkrause.de
IIS Absichern (Checkliste VI)
• ASP.NET
– State Service aus (speziell bei MVC)
• System
– WebDAV aus
– FT...
© joergkrause.de
Hilfreiche Werkzeuge
• Microsoft Security Compliance Manager 3.0
• SQL Server Express benötigt
• Nicht nu...
© joergkrause.de
Security Compliance Manager 3.0
• Liste von Einstellungen über alle Produkte
• Empfehlung und Erklärung z...
© joergkrause.de
Agenda
1 2 3 4 5 6
Geschichte
+
Grundlagen
Installation
+
Konfiguration
Fehlersuche
+
Optimierung
Archite...
joergkrause.de
Fehlersuche
© joergkrause.de
Werkzeuge
• Fiddler (Telerik, Freeware)
• LogParser 2.2
• Microsoft Network Monitor 3.4
• Wireshark
• SSL...
© joergkrause.de
HTTP Diagnose
• Pakete korrekt?
• Bandbreite okay?
• Authentifizierung passt?
• Verschlüsselung aktiv?
• ...
joergkrause.de
Optimierung
© joergkrause.de
Verstehen
• Einfluss auf Performance des Servers:
– Bandbreite
– Anzahl HTTP-Requests
• Einfluss im Brows...
© joergkrause.de
Timeline
DNS
Request
Transfer
Server
Processing
Transfer
Response
Processing
150 ms
50 ms
200 ms
100 ms
5...
© joergkrause.de
Timeline
DNS
Request
Transfer
Server
Processing
Transfer
Response
Processing
150 ms
50 ms
200 ms
100 ms
5...
© joergkrause.de
Tools
• Fiddler (Telerik)
• F12 (IE, Chrome), Firebug (Firefox)
– Profiler
– Netzwerk
– CSS
– HTML
– Java...
© joergkrause.de
IIS/Server-Optimierung
• Pipeline Optimierung
• Prozess Konfiguration Optimierung
• CDN
© joergkrause.de
Pipeline Optimierung
• Ziel:
– Schnellere Verarbeitung
• Vorgehensweise:
– Entfernen nicht benutzter Modu...
© joergkrause.de
Pipeline Optimierung
© joergkrause.de
Prozesskonfiguration
• Ziel:
– Optimale Nutzung von Ressourcen
• Vorgehensweise:
– Anpassen der Prozessko...
© joergkrause.de
Prozesskonfiguration
• maxWorkerThreads: 20 pro Kern (4 Kerne == 80 Threads)
– Höher möglich, wenn wenige...
© joergkrause.de
Verbindungskonfiguration
• Anzahl gleichzeitiger Verbindungen zu einer IP-
Adresse:
– Standard 2
– Höhere...
© joergkrause.de
• Ziel:
– Schnellere Requests
– Weniger Latenz
• Technik:
– CDN nutzen
?
CDN (Content Delivery Network)
© joergkrause.de
• Für allgemeine Dateien, wie jQuery, Knockout etc.
bietet sich Microsoft, Google etc. an
CDN (Content De...
© joergkrause.de
• Für eigene gibt es kostenpflichtige Dienste
– Cachefly (einfach, Upload/Distribute)
– EdgeCast (komplex...
© joergkrause.de
Fragen
www.joergkrause.de
Nächste SlideShare
Wird geladen in …5
×

Internet Information Services (deutsch)

649 Aufrufe

Veröffentlicht am

Eine kompakte Einführung in die aktuellen IIS

Veröffentlicht in: Software
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
649
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
381
Aktionen
Geteilt
0
Downloads
1
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie
  • RFC 2616
  • RFC 2616
  • RFC 2616
  • http://blog.teamtreehouse.com/an-introduction-to-websockets
  • Mit HTTP.sys können sich mehrere Applikation denselben Port teilen!

    HTTP.sys is the protocol listener that listens for HTTP and HTTPS requests.
    HTTP.sys was introduced in IIS 6.0 as an HTTP-specific protocol listener for HTTP requests. In IIS 7.0, HTTP.sys also includes support for Secure Sockets Layer (SSL), which Lsass.exe provided in IIS 6.0.

    HTTP.sys is a kernel-mode device driver for HTTP protocol stack. It is part of the networking subsystem of the Windows operating systems. Beginning with IIS 6.0, this kernel-mode driver replaced Windows Sockets API (Winsock), which was a user-mode component that previous versions of IIS used to receive HTTP requests and send HTTP responses.

    When a client browser requests a Web page from a site on the IIS 7.0 server, HTTP.sys picks up the request on the site binding on the server machine and then passes it to the worker process for processing. After the request has been processed, HTTP.sys returns a response to the client browser.
    Apart from intercepting and returning HTTP requests, HTTP.sys also performs the following tasks:
    Preprocessing and security filtering of the incoming HTTP requests
    Queuing of HTTP requests for the application pools
    Caching of the outgoing HTTP responses
  • http://www.codeproject.com/Articles/437733/Demystify-http-sys-with-HttpSysManager
  • HTTP.sys maintains a request queue for each worker process. It sends the HTTP requests it receives to the request queue for the worker process that serves the application pool where the requested application is located. For each application, HTTP.sys maintains the URI namespace routing table with one entry. The routing table data is used to determine which application pool responds to requests from what parts of the namespace. Each request queue corresponds to one application pool. An application pool corresponds to one request queue within HTTP.sys and one or more worker processes.
    If a faulty application causes a worker process failure, service is not interrupted, and the failure is undetectable by an end user because the kernel queues the requests while the WAS service starts a new worker process for that application pool. When the WAS service identifies an unhealthy worker process, it starts a new worker process if outstanding requests are waiting to be serviced. Although a temporary disruption occurs in user-mode request processing, the user does not experience the failure, because TCP/IP connections are maintained, and requests continue to be queued and processed. Only those requests that are running in the worker process when it fails will result in users seeing an error status. The requests that haven’t been processed yet will be redirected to the new worker process.
    Other than retrieving a stored response from its internal cache, HTTP.sys does not process the requests that it receives. Therefore, no application-specific code is ever loaded into kernel mode but is processed inside the worker process that runs in the user mode. As a result, bugs in application-specific code cannot affect the kernel or lead to system failures.
  • Demo : Taskmanager
  • Vereinfacht!
    Komplette: http://www.dotnet-tricks.com/Content/images/mvc/ASP.NETMVC5Pipeline.png
  • http://www.iis.net/learn/install/installing-iis-85/installing-iis-85-on-windows-server-2012-r2#ModulesinIIS85
  • # -------------------------------------------------------------------- # Checking Execution Policy # -------------------------------------------------------------------- #$Policy = "Unrestricted" $Policy = "RemoteSigned" If ((get-ExecutionPolicy) -ne $Policy) { Write-Host "Script Execution is disabled. Enabling it now" Set-ExecutionPolicy $Policy -Force Write-Host "Please Re-Run this script in a new powershell enviroment" Exit } # -------------------------------------------------------------------- # Define the variables. # -------------------------------------------------------------------- $InetPubRoot = "D:\Inetpub" $InetPubLog = "D:\Inetpub\Log" $InetPubWWWRoot = "D:\Inetpub\WWWRoot" # -------------------------------------------------------------------- # Loading Feature Installation Modules # -------------------------------------------------------------------- Import-Module ServerManager # -------------------------------------------------------------------- # Installing IIS # -------------------------------------------------------------------- Add-WindowsFeature -Name Web-Common-Http,Web-Asp-Net,Web-Net-Ext,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Http-Logging,Web-Request-Monitor,Web-Basic-Auth,Web-Windows-Auth,Web-Filtering,Web-Performance,Web-Mgmt-Console,Web-Mgmt-Compat,RSAT-Web-Server,WAS -IncludeAllSubFeature # -------------------------------------------------------------------- # Loading IIS Modules # -------------------------------------------------------------------- Import-Module WebAdministration # -------------------------------------------------------------------- # Creating IIS Folder Structure # -------------------------------------------------------------------- New-Item -Path $InetPubRoot -type directory -Force -ErrorAction SilentlyContinue New-Item -Path $InetPubLog -type directory -Force -ErrorAction SilentlyContinue New-Item -Path $InetPubWWWRoot -type directory -Force -ErrorAction SilentlyContinue # -------------------------------------------------------------------- # Copying old WWW Root data to new folder # -------------------------------------------------------------------- $InetPubOldLocation = @(get-website)[0].physicalPath.ToString() $InetPubOldLocation = $InetPubOldLocation.Replace("%SystemDrive%",$env:SystemDrive) Copy-Item -Path $InetPubOldLocation -Destination $InetPubRoot -Force -Recurse # -------------------------------------------------------------------- # Setting directory access # -------------------------------------------------------------------- $Command = "icacls $InetPubWWWRoot /grant BUILTIN\IIS_IUSRS:(OI)(CI)(RX) BUILTIN\Users:(OI)(CI)(RX)" cmd.exe /c $Command $Command = "icacls $InetPubLog /grant ""NT SERVICE\TrustedInstaller"":(OI)(CI)(F)" cmd.exe /c $Command # -------------------------------------------------------------------- # Setting IIS Variables # -------------------------------------------------------------------- #Changing Log Location $Command = "%windir%\system32\inetsrv\appcmd set config -section:system.applicationHost/sites -siteDefaults.logfile.directory:$InetPubLog" cmd.exe /c $Command $Command = "%windir%\system32\inetsrv\appcmd set config -section:system.applicationHost/log -centralBinaryLogFile.directory:$InetPubLog" cmd.exe /c $Command $Command = "%windir%\system32\inetsrv\appcmd set config -section:system.applicationHost/log -centralW3CLogFile.directory:$InetPubLog" cmd.exe /c $Command #Changing the Default Website location Set-ItemProperty 'IIS:\Sites\Default Web Site' -name physicalPath -value $InetPubWWWRoot # -------------------------------------------------------------------- # Checking to prevent common errors # -------------------------------------------------------------------- If (!(Test-Path "C:\inetpub\temp\apppools")) { New-Item -Path "C:\inetpub\temp\apppools" -type directory -Force -ErrorAction SilentlyContinue } # -------------------------------------------------------------------- # Deleting Old WWWRoot # -------------------------------------------------------------------- Remove-Item $InetPubOldLocation -Recurse -Force # -------------------------------------------------------------------- # Resetting IIS # -------------------------------------------------------------------- $Command = "IISRESET" Invoke-Expression -Command $Command
  • http://blogs.technet.com/b/bernhard_frank/archive/2011/02/17/iis-f-252-r-einsteiger-teil-1-installation.aspx
  • http://www.iis.net/learn/get-started/planning-for-security/how-to-use-locking-in-iis-configuration
  • http://www.iis.net/learn/manage/managing-your-configuration-settings/shared-configuration_264
  • Ausschnitt applicationHost.config
  • function AppPool-Exists{
    param([parameter(Mandatory=$true)] [String] $AppPoolName)
    # Test is AppPool exists
    if(Test-Path IIS:\AppPools\$AppPoolName) {
    return $true;
    } else {
    return $false;
    }
    }
    function Site-Exists{
    param([parameter(Mandatory=$true)] [String] $SiteName)
    # Test is AppPool exists
    if(Test-Path IIS:\Sites\$SiteName) {
    return $true;
    } else {
    return $false;
    }
    }

    #
    # IIS-Pool erstellen/einrichten
    Clear-Host
    Write-Host "Start IIS Konfiguration"
    # Protokoll
    $logFolder = "Z:\logs"
    # Variable mit Pool Name erstellen
    $IISAppPoolName="ShopPool"
    # Größe Worker Prozess
    $maxMemKB = 500000
    # Variable mit Site Name erstellen
    $Sitename = "ShopSite"
    $ipAddress = "10.74.179.107"
    $port = 30000
    # Variable mit SitePfad erstellen
    $SitePath = "C:\inetpub\wwwroot\shop"
    # Pool User
    $poolUserName = "ShopPoolUser"
    $poolUserPassword = "p@ssw0rd"

    # Modul "webadministration" importieren
    Import-Module webadministration
    # Ins IIS Apppool Verzeichins wechseln
    cd IIS:
    Write-Host "Teste AppPool"
    # Pool erstellen, hier wird mit "New-Item" ein AppPool erstellt da Kontext = IIS-AppPool. Sonst "New-WebAppPool"
    if (AppPool-Exists($IISAppPoolName)) {
    Write-Host "AppPool vorhanden..entfernen"
    Remove-Item ("\Apppools\$IISAppPoolName") -Confirm:$False
    }
    Write-Host "AppPool anlegen"
    $AppPool = New-Item ("\Apppools\$IISAppPoolName") -Force
    # TODO: Username, User-Kennwort, LogfilePfad als Variablen definieren
    # AppPooleigenschaften setzen 32-Bit,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") "enable32BitAppOnWin64" 1
    # AppPooleigenschaften setzen Startmodus,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "startMode" -Value 1
    # AppPooleigenschaften setzen, Runtime Version
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedRuntimeVersion" -Value "v4.0"
    # AppPooleigenschaften setzen Pipeline Modus
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedPipelineMode" -Value "integrated"
    # AppPooleigenschaften setzen Service Account (WindowsAuthentifizierung => IdentityType=3)
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "ProcessModel" -Value @{ UserName=$poolUserName;Password=$poolUserPassword;IdentityType=3}
    # AppPooleigenschaften setzen Prozess Recycling ab 500000KB RAM Verbrauch, memory bei 64 nicht sinnvoll
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.privateMemory -Value $maxMemKB
    # AppPooleigenschaften setzen Prozess Recycling wird nicht automatisch nach Ablauf eines Zeitintervalls (Minuten) erneut gestartet
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.time -value "00:00"
    #
    #
    # IIS-Site erstellen/einrichten
    # VZ fuer AppSite erstellen sollte auf Datenpartition liegen !!!
    Write-Host "Ordner für Site anlegen: $SitePath"
    $siteFolder = New-Item -ItemType Directory -Path $SitePath -Force
    # TODO: TESTEN!!!!! Berechtignung des Siteverzeichnisses anpassen (User wird angezeigt ohne aber Berechtigung auf VZ!)
    Write-Host "Brechtigungen setzen"
    $acl=get-acl $siteFolder.FullName
    $InheritanceFlag = ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit, [System.Security.AccessControl.InheritanceFlags]::ObjectInherit)
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
    $objType =[System.Security.AccessControl.AccessControlType]::Allow
    $aclPermission = New-Object System.Security.AccessControl.FileSystemAccessRule($poolUserName,"FullControl", $InheritanceFlag, $PropagationFlag, $objType)
    $acl.SetAccessRule($aclPermission)
    Set-Acl $SitePath $acl
    Write-Host "Site testen"
    # Site erstellen; Pfad sollte auf Datenpartition liegen !!!
    if (Site-Exists($Sitename)) {
    Write-Host "Site $Sitename vorhanden..entfernen"
    Remove-Item ("\Sites\$Sitename") -Confirm:$False
    }
    Write-Host "Site anlegen"
    $AppSite = new-Website -name $Sitename -Port $port -IPAddress $ipAddress -PhysicalPath $SitePath -Force
    # App Pool der Site zuweisen
    Set-ItemProperty ("\Sites\$Sitename") -Name "applicationPool" -Value $AppPool.name
    # TODO: TESTEN!!!! - Logging in VZ C:\install aktivieren (Fehler bei Ausfuehrung)

    $folder_exist = Test-Path -Path $logFolder
    if ($folder_exist -eq $false)
    {
    Write-Host "Log Ordner erstellen"
    #create it
    New-Item -Path $logFolder -ItemType directory
    } else {
    Write-Host "Log Ordner vorhanden: $logFolder"
    }
    Set-ItemProperty ("\Sites\$Sitename") -Name "logfile" -Value @{logFormat="W3C"; directory=$logFolder }

    Write-Host "Ende IIS Konfiguration"
    cd C:\Windows\System32

  • function AppPool-Exists{
    param([parameter(Mandatory=$true)] [String] $AppPoolName)
    # Test is AppPool exists
    if(Test-Path IIS:\AppPools\$AppPoolName) {
    return $true;
    } else {
    return $false;
    }
    }
    function Site-Exists{
    param([parameter(Mandatory=$true)] [String] $SiteName)
    # Test is AppPool exists
    if(Test-Path IIS:\Sites\$SiteName) {
    return $true;
    } else {
    return $false;
    }
    }

    #
    # IIS-Pool erstellen/einrichten
    Clear-Host
    Write-Host "Start IIS Konfiguration"
    # Protokoll
    $logFolder = "Z:\logs"
    # Variable mit Pool Name erstellen
    $IISAppPoolName="ShopPool"
    # Größe Worker Prozess
    $maxMemKB = 500000
    # Variable mit Site Name erstellen
    $Sitename = "ShopSite"
    $ipAddress = "10.74.179.107"
    $port = 30000
    # Variable mit SitePfad erstellen
    $SitePath = "C:\inetpub\wwwroot\shop"
    # Pool User
    $poolUserName = "ShopPoolUser"
    $poolUserPassword = "p@ssw0rd"

    # Modul "webadministration" importieren
    Import-Module webadministration
    # Ins IIS Apppool Verzeichins wechseln
    cd IIS:
    Write-Host "Teste AppPool"
    # Pool erstellen, hier wird mit "New-Item" ein AppPool erstellt da Kontext = IIS-AppPool. Sonst "New-WebAppPool"
    if (AppPool-Exists($IISAppPoolName)) {
    Write-Host "AppPool vorhanden..entfernen"
    Remove-Item ("\Apppools\$IISAppPoolName") -Confirm:$False
    }
    Write-Host "AppPool anlegen"
    $AppPool = New-Item ("\Apppools\$IISAppPoolName") -Force
    # TODO: Username, User-Kennwort, LogfilePfad als Variablen definieren
    # AppPooleigenschaften setzen 32-Bit,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") "enable32BitAppOnWin64" 1
    # AppPooleigenschaften setzen Startmodus,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "startMode" -Value 1
    # AppPooleigenschaften setzen, Runtime Version
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedRuntimeVersion" -Value "v4.0"
    # AppPooleigenschaften setzen Pipeline Modus
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedPipelineMode" -Value "integrated"
    # AppPooleigenschaften setzen Service Account (WindowsAuthentifizierung => IdentityType=3)
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "ProcessModel" -Value @{ UserName=$poolUserName;Password=$poolUserPassword;IdentityType=3}
    # AppPooleigenschaften setzen Prozess Recycling ab 500000KB RAM Verbrauch, memory bei 64 nicht sinnvoll
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.privateMemory -Value $maxMemKB
    # AppPooleigenschaften setzen Prozess Recycling wird nicht automatisch nach Ablauf eines Zeitintervalls (Minuten) erneut gestartet
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.time -value "00:00"
    #
    #
    # IIS-Site erstellen/einrichten
    # VZ fuer AppSite erstellen sollte auf Datenpartition liegen !!!
    Write-Host "Ordner für Site anlegen: $SitePath"
    $siteFolder = New-Item -ItemType Directory -Path $SitePath -Force
    # TODO: TESTEN!!!!! Berechtignung des Siteverzeichnisses anpassen (User wird angezeigt ohne aber Berechtigung auf VZ!)
    Write-Host "Brechtigungen setzen"
    $acl=get-acl $siteFolder.FullName
    $InheritanceFlag = ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit, [System.Security.AccessControl.InheritanceFlags]::ObjectInherit)
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
    $objType =[System.Security.AccessControl.AccessControlType]::Allow
    $aclPermission = New-Object System.Security.AccessControl.FileSystemAccessRule($poolUserName,"FullControl", $InheritanceFlag, $PropagationFlag, $objType)
    $acl.SetAccessRule($aclPermission)
    Set-Acl $SitePath $acl
    Write-Host "Site testen"
    # Site erstellen; Pfad sollte auf Datenpartition liegen !!!
    if (Site-Exists($Sitename)) {
    Write-Host "Site $Sitename vorhanden..entfernen"
    Remove-Item ("\Sites\$Sitename") -Confirm:$False
    }
    Write-Host "Site anlegen"
    $AppSite = new-Website -name $Sitename -Port $port -IPAddress $ipAddress -PhysicalPath $SitePath -Force
    # App Pool der Site zuweisen
    Set-ItemProperty ("\Sites\$Sitename") -Name "applicationPool" -Value $AppPool.name
    # TODO: TESTEN!!!! - Logging in VZ C:\install aktivieren (Fehler bei Ausfuehrung)

    $folder_exist = Test-Path -Path $logFolder
    if ($folder_exist -eq $false)
    {
    Write-Host "Log Ordner erstellen"
    #create it
    New-Item -Path $logFolder -ItemType directory
    } else {
    Write-Host "Log Ordner vorhanden: $logFolder"
    }
    Set-ItemProperty ("\Sites\$Sitename") -Name "logfile" -Value @{logFormat="W3C"; directory=$logFolder }

    Write-Host "Ende IIS Konfiguration"
    cd C:\Windows\System32

  • function AppPool-Exists{
    param([parameter(Mandatory=$true)] [String] $AppPoolName)
    # Test is AppPool exists
    if(Test-Path IIS:\AppPools\$AppPoolName) {
    return $true;
    } else {
    return $false;
    }
    }
    function Site-Exists{
    param([parameter(Mandatory=$true)] [String] $SiteName)
    # Test is AppPool exists
    if(Test-Path IIS:\Sites\$SiteName) {
    return $true;
    } else {
    return $false;
    }
    }

    #
    # IIS-Pool erstellen/einrichten
    Clear-Host
    Write-Host "Start IIS Konfiguration"
    # Protokoll
    $logFolder = "Z:\logs"
    # Variable mit Pool Name erstellen
    $IISAppPoolName="ShopPool"
    # Größe Worker Prozess
    $maxMemKB = 500000
    # Variable mit Site Name erstellen
    $Sitename = "ShopSite"
    $ipAddress = "10.74.179.107"
    $port = 30000
    # Variable mit SitePfad erstellen
    $SitePath = "C:\inetpub\wwwroot\shop"
    # Pool User
    $poolUserName = "ShopPoolUser"
    $poolUserPassword = "p@ssw0rd"

    # Modul "webadministration" importieren
    Import-Module webadministration
    # Ins IIS Apppool Verzeichins wechseln
    cd IIS:
    Write-Host "Teste AppPool"
    # Pool erstellen, hier wird mit "New-Item" ein AppPool erstellt da Kontext = IIS-AppPool. Sonst "New-WebAppPool"
    if (AppPool-Exists($IISAppPoolName)) {
    Write-Host "AppPool vorhanden..entfernen"
    Remove-Item ("\Apppools\$IISAppPoolName") -Confirm:$False
    }
    Write-Host "AppPool anlegen"
    $AppPool = New-Item ("\Apppools\$IISAppPoolName") -Force
    # TODO: Username, User-Kennwort, LogfilePfad als Variablen definieren
    # AppPooleigenschaften setzen 32-Bit,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") "enable32BitAppOnWin64" 1
    # AppPooleigenschaften setzen Startmodus,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "startMode" -Value 1
    # AppPooleigenschaften setzen, Runtime Version
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedRuntimeVersion" -Value "v4.0"
    # AppPooleigenschaften setzen Pipeline Modus
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedPipelineMode" -Value "integrated"
    # AppPooleigenschaften setzen Service Account (WindowsAuthentifizierung => IdentityType=3)
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "ProcessModel" -Value @{ UserName=$poolUserName;Password=$poolUserPassword;IdentityType=3}
    # AppPooleigenschaften setzen Prozess Recycling ab 500000KB RAM Verbrauch, memory bei 64 nicht sinnvoll
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.privateMemory -Value $maxMemKB
    # AppPooleigenschaften setzen Prozess Recycling wird nicht automatisch nach Ablauf eines Zeitintervalls (Minuten) erneut gestartet
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.time -value "00:00"
    #
    #
    # IIS-Site erstellen/einrichten
    # VZ fuer AppSite erstellen sollte auf Datenpartition liegen !!!
    Write-Host "Ordner für Site anlegen: $SitePath"
    $siteFolder = New-Item -ItemType Directory -Path $SitePath -Force
    # TODO: TESTEN!!!!! Berechtignung des Siteverzeichnisses anpassen (User wird angezeigt ohne aber Berechtigung auf VZ!)
    Write-Host "Brechtigungen setzen"
    $acl=get-acl $siteFolder.FullName
    $InheritanceFlag = ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit, [System.Security.AccessControl.InheritanceFlags]::ObjectInherit)
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
    $objType =[System.Security.AccessControl.AccessControlType]::Allow
    $aclPermission = New-Object System.Security.AccessControl.FileSystemAccessRule($poolUserName,"FullControl", $InheritanceFlag, $PropagationFlag, $objType)
    $acl.SetAccessRule($aclPermission)
    Set-Acl $SitePath $acl
    Write-Host "Site testen"
    # Site erstellen; Pfad sollte auf Datenpartition liegen !!!
    if (Site-Exists($Sitename)) {
    Write-Host "Site $Sitename vorhanden..entfernen"
    Remove-Item ("\Sites\$Sitename") -Confirm:$False
    }
    Write-Host "Site anlegen"
    $AppSite = new-Website -name $Sitename -Port $port -IPAddress $ipAddress -PhysicalPath $SitePath -Force
    # App Pool der Site zuweisen
    Set-ItemProperty ("\Sites\$Sitename") -Name "applicationPool" -Value $AppPool.name
    # TODO: TESTEN!!!! - Logging in VZ C:\install aktivieren (Fehler bei Ausfuehrung)

    $folder_exist = Test-Path -Path $logFolder
    if ($folder_exist -eq $false)
    {
    Write-Host "Log Ordner erstellen"
    #create it
    New-Item -Path $logFolder -ItemType directory
    } else {
    Write-Host "Log Ordner vorhanden: $logFolder"
    }
    Set-ItemProperty ("\Sites\$Sitename") -Name "logfile" -Value @{logFormat="W3C"; directory=$logFolder }

    Write-Host "Ende IIS Konfiguration"
    cd C:\Windows\System32

  • http://de.wikipedia.org/wiki/Transport_Layer_Security
  • http://de.wikipedia.org/wiki/Advanced_Encryption_Standard
  • -sp:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider
    -sy
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types
    -eku
    1.3.6.1.5.5.7.3.1 == PKIX_KP_SERVER_AUTH
  • function AppPool-Exists{
    param([parameter(Mandatory=$true)] [String] $AppPoolName)
    # Test is AppPool exists
    if(Test-Path IIS:\AppPools\$AppPoolName) {
    return $true;
    } else {
    return $false;
    }
    }
    function Site-Exists{
    param([parameter(Mandatory=$true)] [String] $SiteName)
    # Test is AppPool exists
    if(Test-Path IIS:\Sites\$SiteName) {
    return $true;
    } else {
    return $false;
    }
    }

    #
    # IIS-Pool erstellen/einrichten
    Clear-Host
    Write-Host "Start IIS Konfiguration"
    # Protokoll
    $logFolder = "Z:\logs"
    # Variable mit Pool Name erstellen
    $IISAppPoolName="ShopPool"
    # Größe Worker Prozess
    $maxMemKB = 500000
    # Variable mit Site Name erstellen
    $Sitename = "ShopSite"
    $ipAddress = "10.74.179.107"
    $port = 30000
    # Variable mit SitePfad erstellen
    $SitePath = "C:\inetpub\wwwroot\shop"
    # Pool User
    $poolUserName = "ShopPoolUser"
    $poolUserPassword = "p@ssw0rd"

    # Modul "webadministration" importieren
    Import-Module webadministration
    # Ins IIS Apppool Verzeichins wechseln
    cd IIS:
    Write-Host "Teste AppPool"
    # Pool erstellen, hier wird mit "New-Item" ein AppPool erstellt da Kontext = IIS-AppPool. Sonst "New-WebAppPool"
    if (AppPool-Exists($IISAppPoolName)) {
    Write-Host "AppPool vorhanden..entfernen"
    Remove-Item ("\Apppools\$IISAppPoolName") -Confirm:$False
    }
    Write-Host "AppPool anlegen"
    $AppPool = New-Item ("\Apppools\$IISAppPoolName") -Force
    # TODO: Username, User-Kennwort, LogfilePfad als Variablen definieren
    # AppPooleigenschaften setzen 32-Bit,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") "enable32BitAppOnWin64" 1
    # AppPooleigenschaften setzen Startmodus,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "startMode" -Value 1
    # AppPooleigenschaften setzen, Runtime Version
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedRuntimeVersion" -Value "v4.0"
    # AppPooleigenschaften setzen Pipeline Modus
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedPipelineMode" -Value "integrated"
    # AppPooleigenschaften setzen Service Account (WindowsAuthentifizierung => IdentityType=3)
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "ProcessModel" -Value @{ UserName=$poolUserName;Password=$poolUserPassword;IdentityType=3}
    # AppPooleigenschaften setzen Prozess Recycling ab 500000KB RAM Verbrauch, memory bei 64 nicht sinnvoll
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.privateMemory -Value $maxMemKB
    # AppPooleigenschaften setzen Prozess Recycling wird nicht automatisch nach Ablauf eines Zeitintervalls (Minuten) erneut gestartet
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.time -value "00:00"
    #
    #
    # IIS-Site erstellen/einrichten
    # VZ fuer AppSite erstellen sollte auf Datenpartition liegen !!!
    Write-Host "Ordner für Site anlegen: $SitePath"
    $siteFolder = New-Item -ItemType Directory -Path $SitePath -Force
    # TODO: TESTEN!!!!! Berechtignung des Siteverzeichnisses anpassen (User wird angezeigt ohne aber Berechtigung auf VZ!)
    Write-Host "Brechtigungen setzen"
    $acl=get-acl $siteFolder.FullName
    $InheritanceFlag = ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit, [System.Security.AccessControl.InheritanceFlags]::ObjectInherit)
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
    $objType =[System.Security.AccessControl.AccessControlType]::Allow
    $aclPermission = New-Object System.Security.AccessControl.FileSystemAccessRule($poolUserName,"FullControl", $InheritanceFlag, $PropagationFlag, $objType)
    $acl.SetAccessRule($aclPermission)
    Set-Acl $SitePath $acl
    Write-Host "Site testen"
    # Site erstellen; Pfad sollte auf Datenpartition liegen !!!
    if (Site-Exists($Sitename)) {
    Write-Host "Site $Sitename vorhanden..entfernen"
    Remove-Item ("\Sites\$Sitename") -Confirm:$False
    }
    Write-Host "Site anlegen"
    $AppSite = new-Website -name $Sitename -Port $port -IPAddress $ipAddress -PhysicalPath $SitePath -Force
    # App Pool der Site zuweisen
    Set-ItemProperty ("\Sites\$Sitename") -Name "applicationPool" -Value $AppPool.name
    # TODO: TESTEN!!!! - Logging in VZ C:\install aktivieren (Fehler bei Ausfuehrung)

    $folder_exist = Test-Path -Path $logFolder
    if ($folder_exist -eq $false)
    {
    Write-Host "Log Ordner erstellen"
    #create it
    New-Item -Path $logFolder -ItemType directory
    } else {
    Write-Host "Log Ordner vorhanden: $logFolder"
    }
    Set-ItemProperty ("\Sites\$Sitename") -Name "logfile" -Value @{logFormat="W3C"; directory=$logFolder }

    Write-Host "Ende IIS Konfiguration"
    cd C:\Windows\System32

  • http://msdn.microsoft.com/en-us/library/zhhddkxy(v=vs.140).aspx
  • function AppPool-Exists{
    param([parameter(Mandatory=$true)] [String] $AppPoolName)
    # Test is AppPool exists
    if(Test-Path IIS:\AppPools\$AppPoolName) {
    return $true;
    } else {
    return $false;
    }
    }
    function Site-Exists{
    param([parameter(Mandatory=$true)] [String] $SiteName)
    # Test is AppPool exists
    if(Test-Path IIS:\Sites\$SiteName) {
    return $true;
    } else {
    return $false;
    }
    }

    #
    # IIS-Pool erstellen/einrichten
    Clear-Host
    Write-Host "Start IIS Konfiguration"
    # Protokoll
    $logFolder = "Z:\logs"
    # Variable mit Pool Name erstellen
    $IISAppPoolName="ShopPool"
    # Größe Worker Prozess
    $maxMemKB = 500000
    # Variable mit Site Name erstellen
    $Sitename = "ShopSite"
    $ipAddress = "10.74.179.107"
    $port = 30000
    # Variable mit SitePfad erstellen
    $SitePath = "C:\inetpub\wwwroot\shop"
    # Pool User
    $poolUserName = "ShopPoolUser"
    $poolUserPassword = "p@ssw0rd"

    # Modul "webadministration" importieren
    Import-Module webadministration
    # Ins IIS Apppool Verzeichins wechseln
    cd IIS:
    Write-Host "Teste AppPool"
    # Pool erstellen, hier wird mit "New-Item" ein AppPool erstellt da Kontext = IIS-AppPool. Sonst "New-WebAppPool"
    if (AppPool-Exists($IISAppPoolName)) {
    Write-Host "AppPool vorhanden..entfernen"
    Remove-Item ("\Apppools\$IISAppPoolName") -Confirm:$False
    }
    Write-Host "AppPool anlegen"
    $AppPool = New-Item ("\Apppools\$IISAppPoolName") -Force
    # TODO: Username, User-Kennwort, LogfilePfad als Variablen definieren
    # AppPooleigenschaften setzen 32-Bit,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") "enable32BitAppOnWin64" 1
    # AppPooleigenschaften setzen Startmodus,
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "startMode" -Value 1
    # AppPooleigenschaften setzen, Runtime Version
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedRuntimeVersion" -Value "v4.0"
    # AppPooleigenschaften setzen Pipeline Modus
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "managedPipelineMode" -Value "integrated"
    # AppPooleigenschaften setzen Service Account (WindowsAuthentifizierung => IdentityType=3)
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name "ProcessModel" -Value @{ UserName=$poolUserName;Password=$poolUserPassword;IdentityType=3}
    # AppPooleigenschaften setzen Prozess Recycling ab 500000KB RAM Verbrauch, memory bei 64 nicht sinnvoll
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.privateMemory -Value $maxMemKB
    # AppPooleigenschaften setzen Prozess Recycling wird nicht automatisch nach Ablauf eines Zeitintervalls (Minuten) erneut gestartet
    Set-ItemProperty ("\Apppools\$IISAppPoolName") -Name recycling.periodicRestart.time -value "00:00"
    #
    #
    # IIS-Site erstellen/einrichten
    # VZ fuer AppSite erstellen sollte auf Datenpartition liegen !!!
    Write-Host "Ordner für Site anlegen: $SitePath"
    $siteFolder = New-Item -ItemType Directory -Path $SitePath -Force
    # TODO: TESTEN!!!!! Berechtignung des Siteverzeichnisses anpassen (User wird angezeigt ohne aber Berechtigung auf VZ!)
    Write-Host "Brechtigungen setzen"
    $acl=get-acl $siteFolder.FullName
    $InheritanceFlag = ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit, [System.Security.AccessControl.InheritanceFlags]::ObjectInherit)
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
    $objType =[System.Security.AccessControl.AccessControlType]::Allow
    $aclPermission = New-Object System.Security.AccessControl.FileSystemAccessRule($poolUserName,"FullControl", $InheritanceFlag, $PropagationFlag, $objType)
    $acl.SetAccessRule($aclPermission)
    Set-Acl $SitePath $acl
    Write-Host "Site testen"
    # Site erstellen; Pfad sollte auf Datenpartition liegen !!!
    if (Site-Exists($Sitename)) {
    Write-Host "Site $Sitename vorhanden..entfernen"
    Remove-Item ("\Sites\$Sitename") -Confirm:$False
    }
    Write-Host "Site anlegen"
    $AppSite = new-Website -name $Sitename -Port $port -IPAddress $ipAddress -PhysicalPath $SitePath -Force
    # App Pool der Site zuweisen
    Set-ItemProperty ("\Sites\$Sitename") -Name "applicationPool" -Value $AppPool.name
    # TODO: TESTEN!!!! - Logging in VZ C:\install aktivieren (Fehler bei Ausfuehrung)

    $folder_exist = Test-Path -Path $logFolder
    if ($folder_exist -eq $false)
    {
    Write-Host "Log Ordner erstellen"
    #create it
    New-Item -Path $logFolder -ItemType directory
    } else {
    Write-Host "Log Ordner vorhanden: $logFolder"
    }
    Set-ItemProperty ("\Sites\$Sitename") -Name "logfile" -Value @{logFormat="W3C"; directory=$logFolder }

    Write-Host "Ende IIS Konfiguration"
    cd C:\Windows\System32

  • http://blogs.technet.com/b/bernhard_frank/archive/2011/04/08/iis-f-252-r-einsteiger-teil-4-authentifizierung-und-autorisierung-mit-dem-iis.aspx
  • http://www.iis.net/downloads/microsoft/dynamic-ip-restrictions
  • http://www.iis.net/learn/manage/configuring-security/understanding-iis-url-authorization
  • http://www.iis.net/learn/troubleshoot/diagnosing-http-errors
  • http://www.codeproject.com/Articles/23306/10-ASP-NET-Performance-and-Scalability-Secrets
  • Module sind an JEDEM Request beteiligt
  • Internet Information Services (deutsch)

    1. 1. joergkrause.de Internet Information Services Grundkurs für Softwareentwickler Schwerpunkt Webentwicklung (HTTP Service) Jörg Krause Berater, Trainer, Autor
    2. 2. © joergkrause.de Wer bin ich? E-Mail: joerg@krause.net Profil: de.linkedin.com/pub/joerg-krause/b/16a/a15 Twitter: @joergisageek Profilname: www.xing.com/profile/Joerg_Krause6 About.me: joerg.krause Web: www.joergkrause.de www
    3. 3. © joergkrause.de Agenda 1 2 3 4 5 6 Geschichte + Grundlagen Installation + Konfiguration Fehlersuche + Optimierung Architektur + Arbeitsweise Administration + Werkzeuge Sicherheit
    4. 4. © joergkrause.de Anti-Agenda • Was hier nicht behandelt wird: – Programmierung von Webanwendungen – FTP – SMTP – PHP-Integration – Common Gateway Interface, CGI / FastCGI – DNS / DHCP – Windows Server allgemein
    5. 5. © joergkrause.de Agenda 1 2 3 4 5 6 Geschichte + Grundlagen Installation + Konfiguration Fehlersuche Optimierung Architektur + Arbeitsweise Administration + Werkzeuge Sicherheit
    6. 6. joergkrause.de Geschichte
    7. 7. © joergkrause.de Versionen • 1.0 NT 3.5.1 • 2.0 NT 4 • 3.0 SP 1 NT 4 (ASP) • 4.0 Option Pack NT 4 • 5.0 Windows 2000 • 5.1 Windows XP • 6.0 Windows Server 2003, XP Pro 64Bit • 7.0 Windows Server 2008, Vista • 7.5 Windows Server 2008 R2, Windows 7 • 8.0 Windows Server 2012, Windows 8 • 8.5 Windows Server 2012 R2, Windows 8.1 Aktuell Redesign
    8. 8. © joergkrause.de Neues… • 8.0 (Windows Server 2012 / Windows 8) – Application Initialization – Initialisierungsschritte (Warm-up) – Konfiguration für ASP.NET 4.5 angepasst – Mehr Leistungsbegrenzungsoptionen (Throttling) für Sandbox- und Testumgebungen – Dynamische Beschränkung von IP-Adressen – WebSocket-Protokoll – Server Name Indication (SNI) und Multi-Tenant SSL Deployment – Präventation gegen Angriffe auf FTP-Kennwörter (nur FTP-Server)
    9. 9. © joergkrause.de Neues… • 8.5 (Windows Server 2012 R2 / Windows 8.1) – Protokollierung in das Windows-Ereignisprotokoll – Mehr Logging-Optionen, z.B. eigene Felder möglich für: • Request Header – If-Match, Proxy-Authorization, Max-Forwards • Response Header – Last-Modified, ETag • Server Variable – ALL_RAW, REMOTE_HOST, SCRIPT_NAME – Dynamische Site-Aktivierung – Suspend für Worker-Prozess (vorher nur Terminierung) bei Erreichen des Schwellwertes
    10. 10. joergkrause.de Grundlagen Das Wichtigste kurz zusammengefasst
    11. 11. © joergkrause.de Gut zu wissen • ISO OSI • TCP/IP • HTTP • WebSockets • Server Name Indication (SNI)
    12. 12. © joergkrause.de ISO OSI-Modell • International Organization for Standardization (ISO) • Open Systems Interconnection (OSI) Modell Schicht Name Protokolle Einheiten 7 Anwendung HTTP, FTP Daten 6 Darstellung 5 Sitzung 4 Transport TCP, UDP Segmente 3 Vermittlung ICMP, IP Pakete 2 Sicherung Ethernet Frames 1 Bitübertragung Bits
    13. 13. © joergkrause.de OSI auf TCP/IP • Vereinfachtes Modell • Diverse Protokoll-Stacks Ebene Name Stack I Stack II Stack III 5 Anwendung HTTP, FTP DHCP, DNS PING 4 Transport TCP UDP ICMP 3 Internet IP 2 Netzwerk ARP 1 Physikalisch / Link Ethernet
    14. 14. © joergkrause.de TCP/IP • IP = Internet Protocol – Adressierung – IPv4 – IPv6 • TCP = Transmission Control Protocol – Übertragung – Dienst über Port
    15. 15. © joergkrause.de IP • IPv4 • Adressraum 256*256*256*256 = 232 • Einteilung in Klassen Klasse Erste Bits Präfix-Bits Netzwerke Suffix-Bits Hosts/NW A 0xxx 7 128 24 16.777.216 B 10xx 14 16.384 16 65.536 C 110x 21 2.097.152 8 256 D 1110 Multicast E 1111 Reserviert
    16. 16. © joergkrause.de IP • Punktschreibweise 0.0.0.0 nur für Menschen • "0" reserviert für Netzwerke (mehrere Adressen) • 255.255.0.0 ist ein Netzwerk (als Maske) • 123.117.11.76 mit der Maske 255.255.0.0 ist – das Netzwerk 123.117.0.0 – mit dem Host 11.76 (2892)
    17. 17. © joergkrause.de TCP • Ports dienen der Identifizierung von Dienstapplikationen Port Dienst 7 Echo 20/21 FTP 23 Telnet 25 SMTP 53 DNS 80 HTTP Standard 443 HTTPS Standard (SSL)
    18. 18. © joergkrause.de HTTP • Hypertext Transfer Protocol Anforderung (Request) Antwort (Response) HTTP Client (Browser) HTTP Server (IIS)
    19. 19. © joergkrause.de Bausteine • Uniform Resource Locator (URL) • HTTP – Die Anforderung • Verb + URL + Version • Header • Daten – Die Antwort • Version + Statuscode + Statustext • Header • Daten protocol://hostname:port/path-and-file-name
    20. 20. © joergkrause.de Bausteine • HTTP – Die Anforderung GET http://www.iis.net/ HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Accept-Language: de-DE,en-US;q=0.5 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) Accept-Encoding: gzip, deflate Host: www.iis.net DNT: 1 Proxy-Connection: Keep-Alive Cookie: omniID=1418555811742_52c0_810f_7d07_8c863dc10d32; Leerzeile
    21. 21. © joergkrause.de HTTP/1.1 200 OK Cache-Control: private Content-Length: 13144 Content-Type: text/html; charset=utf-8 Vary: Accept-Encoding Server: Microsoft-IIS/8.0 X-Powered-By: ARR/2.5 X-Powered-By: ASP.NET Date: Tue, 30 Dec 2014 11:45:31 GMT <!DOCTYPE HTML> Bausteine • HTTP – Die Antwort Leerzeile
    22. 22. © joergkrause.de HTTP • Eine Seite = viele Anforderungen <html> <head> <link href="some.css" /> <link href="more.css" /> <script src="active.js"> </head> <body> <img src="figure.png" /> </body> </html> Anforderung (Request) Antwort (Response) Anforderung (Request) Antwort (Response) Anforderung (Request) Antwort (Response) Anforderung (Request) Antwort (Response)
    23. 23. © joergkrause.de HTTP • Anfragen einer Website
    24. 24. © joergkrause.de • Wichtige Methoden in Web-Anwendungen HTTP Methoden (Verben) Methode Funktion Nutzung GET Ressource anfordern HTTP, REST HEAD Kopfzeile analog zu GET anfordern HTTP POST Daten zum Webserver senden HTTP, REST PUT Daten auf dem Webserver speichern HTTP, REST DELETE Ressource löschen REST TRACE Diagnosedaten anfordern allgemein OPTIONS Liste der unterstützten Methoden anfordern allgemein CONNECT Verbindung durch Proxy anfordern allgemein
    25. 25. © joergkrause.de HTTP Statuscodes Codegruppe Bedeutung Erwartete Reaktion 1xx Information Empfangen, Server setzt Vorgang fort 2xx Erfolg Empfangen und verarbeitet, verstanden, bedient 3xx Umleitung Der Client wird zu einer Aktion aufgefordert 4xx Client Fehler Anfrage konnte nicht bedient/verstanden werden 5xx Server Fehler Der Server konnte wegen Fehlern nicht antworten • Statusgruppen
    26. 26. © joergkrause.de Wichtige Statuscodes Code Name Einsatz 100 Continue Fortsetzen 101 Update Protokollwechsel 200 OK Anforderung erledigt 301 Moved Permanently Dauerhaft neuer Ort 302 Moved Temporarily Zeitweilig neuer Ort 304 Not Modified Ressource unverändert • Information, Bestätigung, Aufforderung
    27. 27. © joergkrause.de • Client Fehler, Anforderungsfehler Wichtige Statuscodes Code Name Einsatz 400 Bad Request Falsche Anforderung 401 Authentication Required Anmeldung erforderlich 403 Forbidden Geschützt, Anmeldung fehlgeschlagen 404 Not Found Nicht gefunden 405 Method Not Allowed Methode nicht erlaubt 408 Timeout Zeit abgelaufen 414 URI too Large Adresszeile zu lang
    28. 28. © joergkrause.de Wichtige Statuscodes Code Name Einsatz 500 Internal Server Error Fehler / Ausnahme in der Serverapplikation 501 Method Not Implemented Methode unbekannt, z.B. "Get" statt "GET" 502 Bad Gateway Proxy oder Gateway sendet unbekannte Anfrage 503 Service Unavailable Der bedienende Dienst ist nicht verfügbar 504 Gateway Timeout Proxy oder Gateway reagiert nicht • Serverfehler
    29. 29. © joergkrause.de Demo • Website abrufen • Mit Fiddler untersuchen • Requests verstehen • HTTP verstehen
    30. 30. © joergkrause.de WebSockets • HTTP ist "Fire and Forget" • HTTP muss immer vom Client getriggert werden • Websockets erlauben bidirektionale Verbindungen • Websockets Schema: – ws:// – wss:// (Verschlüsselt) • Im IIS ab 8.0 • Im Browser ab IE 10, Chrome, Firefox, Safari
    31. 31. © joergkrause.de WebSockets im Protokollstapel • WebSockets im vereinfachten Internet-Modell Ebene Name Stack 5 Anwendung WebSocket 4 Transport TCP 3 Internet IP 2 Netzwerk ARP 1 Physikalisch / Link Ethernet
    32. 32. © joergkrause.de WebSockets • Anfordern via HTTP • Bestätigung via StatusCode 101 GET ws://websocket.example.com/ HTTP/1.1 Origin: http://example.com Connection: Upgrade Host: websocket.example.com Upgrade: websocket HTTP/1.1 101 WebSocket Protocol Handshake Date: Wed, 16 Oct 2013 10:07:34 GMT Connection: Upgrade Upgrade: WebSocket
    33. 33. © joergkrause.de SNI • SNI = Server Name Indication • Ab IIS Version 8.0 • Erweiterung des TLS (Transport Layer Security) Protokolls • Ablauf einer gesicherten Verbindung: – Browser fordert Zertifikat an – Browser vergleicht URL mit der des Zertifikats – Passt das wird normal weiterverfahren • Mit SNI sendet der Browser die Anforderungsdaten sofort mit  der Server kann das passende Zertifikat auswählen • Spart individuelle IP-Adressen für SSL-Sites • Mehrere Zertifikate auf einer IP-Adresse
    34. 34. © joergkrause.de Agenda 1 2 3 4 5 6 Geschichte + Grundlagen Installation + Konfiguration Fehlersuche + Optimierung Architektur + Arbeitsweise Administration + Werkzeuge Sicherheit
    35. 35. joergkrause.de Architektur & Arbeitsweise Bausteine und Komponenten
    36. 36. © joergkrause.de Komponenten • Protokollempfänger (Listener) – HTTP.sys • Dienste (Services) – W3SVC – WAS • Verwaltungswerkzeuge (MMC, PowerShell, …)
    37. 37. © joergkrause.de HTTP.sys • Kernel Mode-Treiber • HTTP und HTTPS Kommunikation • Zertifikatsverwaltung • Queue für den Worker Prozess • Cache für ausgehende Daten (Response) http.sys Response CacheApp Pool Queue App Pool Queue App Pool Queue
    38. 38. © joergkrause.de HTTP.sys – direkte Konfiguration • Früher: httpcfg.exe • Jetzt: netsh http Kernel Mode http.sys User Mode HTTP Server API httpcfg.exe netsh http IIS Listener
    39. 39. © joergkrause.de HTTP.sys – Zugriffsrechte • Registrierung Grand IS Administrator ? User hat ACL-Rechte Deny NEIN NEIN JA URL Register allowed? Best Match for URL Grand JA
    40. 40. © joergkrause.de HTTP.sys • Fehlerverhalten – Worker Prozess stoppt/startet neu/ist im Fehlerzustand – HTTP.sys queued eingehende Anfragen (Requests) – HTTP.sys bedient Anfragen ggf. mit Fehlercode (500) – HTTP.sys wartet, bis der Worker Prozess wieder aktiv ist Request WP aktiv? Aktion Queue WP aktiv? 500 JA NEIN NEIN JA Warten Response
    41. 41. © joergkrause.de W3SVC und WAS • World Wide Web Publishing Service (W3SVC) • Windows Process Activation Services (WAS) svchost.exe W3SVC WAS Leistungs- überwachung HTTP.sys Verwaltung Prozess- Verwaltung Listener Adapter Interface Konfigurations- verwaltung http:// net.tcp://
    42. 42. © joergkrause.de Demo • WAS und W3SVC – im Taskmanager – In der Dienstübersicht
    43. 43. © joergkrause.de • Windows Process Activation Services • Verwaltung der Konfiguration – applicationHost.config – reicht Einstellungen an den W3SVC weiter – W3SVC konfiguriert den HTTP.sys Weiterreichen der Konfiguration WAS applicationHost.config WAS HTTP.sysW3SVC
    44. 44. © joergkrause.de WAS • Weiterreichen zum Worker Prozess Weiterreichen der Anforderung Listener Adapter WAS W3WP? Ausführung Applikation Ja Nein App Pool Factory http:// net.tcp:// W3SVC HTTP.sys
    45. 45. © joergkrause.de WAS • Verwaltet die Worker Prozesse – WAS alleine kontrolliert die Worker Prozesse – Kommunikation via HTTP wird vom W3SVC an WAS geleitet – Mapping der Application Pools zu Worker Prozessen – Startet neue Worker Prozesse bei Bedarf – Nutzt Listener Adapter für alle Anfragen außer HTTP – Nutzt W3SVC für HTTP, dieser nutzt HTTP.sys intern – WAS kümmert sich um die gesamte Konfiguration
    46. 46. © joergkrause.de Worker Prozess • Verarbeitet die Anforderung • w3wp.exe • Selbststartend (kein Host), lang laufend, User Mode • Kernfunktionen eines Webservers – Anforderung  Verarbeitung  Antwort • Bedient immer einen Application Pool – Der Pool konfiguriert den Worker Prozess – Der Pool gruppiert Worker Prozesse gleicher Konfiguration
    47. 47. © joergkrause.de Worker Prozess • Ein Application Pool konfiguriert einen Worker Prozess Application Pool w3wp.exe AppDomain AppDomain Application Pool w3wp.exe Application Pool w3wp.exe AppDomain AppDomain AppDomain Sonderfall WebGarden AppDomain
    48. 48. © joergkrause.de Application Pool • Prozessisolation, AppDomain-Isolation • Ausführendes Konto
    49. 49. © joergkrause.de Demo • Application Pool Einstellungen
    50. 50. joergkrause.de Arbeitsweise bei HTTP Verarbeitung von Anforderungen
    51. 51. © joergkrause.de Die Pipeline • Klassisch (bis IIS 5 exklusiv, danach optional) • Integriert (ab IIS 6)
    52. 52. © joergkrause.de Die Pipeline • Verarbeitung von Anforderungen • Die Pipeline erzeugt Ereignisse – Ereignis-Empfänger rufen die zugeordneten Module auf – Module erzeugen dann die Antwort • Integriert meint: – ASP.NET und IIS haben ein gemeinsames Event-Modell – Verwaltete Module (.NET) für alle Anforderungen
    53. 53. © joergkrause.de • Erst native Verarbeitung im W3SVC • Dann Weiterleitung an aspnet_isapi.dll • Dort wird die verwaltete Umgebung aufgerufen Nicht verwalteter Code Verwalteter Code > IIS 7.x ISAPI HTTP-Applikation Request- Handler Request- Handler Request- Handler aspnet_isapi.dll Worker Prozess w3wp.exe ISAPI Klassische Pipeline
    54. 54. © joergkrause.de > IIS 7.x HTTP-Applikation Request- Handler Request- Handler Request- HandlerWorker Process w3wp.exe Integrierte Pipeline • Ein Übergang am Anfang • Ein Übergang am Ende
    55. 55. © joergkrause.de Vorteile der integrierten Pipeline Request Response Authentifizierung Autorisierung Verarbeitung Ausgabe Cache Übergänge sind String-Operationen C++: ABCDEF0 .NET: 6ABCDEF Null-Terminiert Anzahl Zeichen Jeder Übergang ist teuer!
    56. 56. © joergkrause.de Auf einen Blick HTTP Protocol Stack (http.sys) svchost.exe applicationHost.config WAS W3SVC w3wp.exe App Module Module Module User Mode Kernel Mode Internet
    57. 57. joergkrause.de ASP.NET Integration Die HTTP-Verarbeitung
    58. 58. © joergkrause.de Bausteine der Pipeline • Module – Wirken auf jede Anforderung – Merkmal: Aktiv, wenn konfiguriert • Handler – Bedienen bestimmte Anforderungen – Merkmal: Aktiv, wenn durch Dateierweiterung erreicht
    59. 59. © joergkrause.de Module • Authentifizierung • Autorisierung • Kompression • Cache
    60. 60. © joergkrause.de Handler • ASPX-Seitenverarbeitung • Statische Dateien ausliefern • Extensionless, z.B. für ASP.NET MVC
    61. 61. © joergkrause.de Bausteine der Pipeline (ASP.NET) Request Response Pre Begin Request Begin Request Authenticate Authorize Resolve Cache Map Handler Aquire State Pre Execute Handler Execute Handler End Request Log Request Update Cache Release State Handler Managed Unmanaged ASPX ASHX FastCGI Static File
    62. 62. © joergkrause.de Bausteine der Pipeline (MVC) Request Response Pre Begin Request Begin Request Authenticate Authorize Resolve Cache Map Handler Aquire State Pre Execute Handler Execute Handler End Request Log Request Update Cache Release State Handler Managed IHttpHandler RoutingModule
    63. 63. © joergkrause.de Erweiterung der Pipeline (MVC) Request Response IIS Pipeline UrlRoutingModuleStatische Datei Datei gefunden? RouteTable.RoutesCustom Route Handler Custom IHttpHandler MvcRouteHandler ControllerFactory Action Method ActionResultKein ViewResult IViewEngine View Engine Direkte Ausgabe Eigene ViewEngine Standard ViewResult Routing Controller Controller Action Execution View Renderer
    64. 64. © joergkrause.de Die Module • ca. 30 Standardmodule • Definition in – %windir%system32inetsrvconfigapplicationhost.config • Teils nativ (unmanaged), teils verwaltet (managed) – nativ  C++ / ISAPI – verwaltet  .NET
    65. 65. © joergkrause.de Demo • Module und Handler im IIS Manager
    66. 66. © joergkrause.de Übersicht Module HTTP Protocol Support ValidationRangeModule TraceVerbModule OptionsVerbModule ProtocolSupportModule Logging and Diagnostics HttpLoggingModule CustomLoggingModule Configuration and Metadata Caches TokenCacheModule UriCacheModule SiteCacheModule FileCacheModule Core Web Server DirectoryListingModule CustomErrorModule DynamicCompressionModule StaticCompressionModule StaticFileModule DefaultDocumentModule HttpCacheModule RequestMonitorModule TracingModule Authent./Author. BasicAuthModule DigestAuthModule WindowsAuthModule CertificateAuthModule AnonymousAuthModule AccessCheckModule UrlAuthorizationModule Extensibility ISAPIModule ISAPIFilterModule CGIModule ServerSideIncludeModule ManagedEngineModule Publishing DavModule RequestForwarderModule HttpRedirectionModule RequestFilteringModule
    67. 67. © joergkrause.de Agenda 1 2 3 4 5 6 Geschichte + Grundlagen Installation + Konfiguration Fehlersuche + Optimierung Architektur + Arbeitsweise Administration + Werkzeuge Sicherheit
    68. 68. joergkrause.de Installation & Konfiguration
    69. 69. joergkrause.de Installation
    70. 70. © joergkrause.de Installation • Server Manager (Windows Server 2012 R2)
    71. 71. © joergkrause.de Installation • Add Roles – Web Server (IIS)
    72. 72. © joergkrause.de Installation • Role Services – Elemente der Installation
    73. 73. joergkrause.de Installation mit Paket-Manager
    74. 74. © joergkrause.de Kommandozeile • Kommandozeile mit angehobenen Rechten • Neue Kommandozeile mit angehobenen Rechten Es folgt die Abfrage des Kennworts! runas /user:Administrator cmd.exe start /w runas /user:Administrator cmd.exe Angemeldeter Benutzer
    75. 75. © joergkrause.de Der Paket-Manager • Automation der – Installation von Windows-Features – Installation von Updates / Hotfixes – Bereitstellung von aktualisierten Sprachpaketen start /w pkgmgr /ip:"Feature1;Feature2" /n:<answer_file> Paket-Manager Auf Beenden warten (/WAIT) Neues Kommandozeilenfenster Liste der Funktionen Ergebnisse in Datei
    76. 76. © joergkrause.de Optionen des Paket-Managers • Wichtige Funktionen: – /ip: Installieren – /up: Deinstallieren – /norestart: Verhindert den automatischen Neustart, falls dieser erforderlich sein sollte
    77. 77. © joergkrause.de Installation mit Paket-Manager • Beispiel für ein Installationsskript start /w pkgmgr /ip:IIS-WebServerRole;IIS-WebServer;IIS- CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS- DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS- ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS- ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS- HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS- RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS- Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS- DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS- IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS- RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS- HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS- WebServerManagementTools;IIS-ManagementConsole;IIS- ManagementScriptingTools;IIS-ManagementService;IIS- IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS- LegacyScripts;IIS-LegacySnapIn;IIS-FTPPublishingService;IIS-FTPServer;IIS- FTPManagement;WAS-WindowsActivationService;WAS-ProcessModel;WAS- NetFxEnvironment;WAS-ConfigurationAPI
    78. 78. joergkrause.de Installation mit PowerShell
    79. 79. © joergkrause.de Installation mit der PowerShell • PowerShell CommandLets: – Install-WindowsFeature (Alias: Add-WindowsFeature) – Get-WindowsFeature – Remove-WindowsFeature • Alternativ auch Paket-Manager via PowerShell
    80. 80. © joergkrause.de Installation mit der PowerShell • Alternativ auch Paket-Manager via PowerShell: $packages = "IIS-WebServerRole;" + "IIS-WebServer;" + "IIS-CommonHttpFeatures;" + "IIS-StaticContent;" + "IIS-DefaultDocument;" + # ... weitere Pakete "IIS-ManagementConsole;" + "IIS-ManagementService;" + "IIS-LegacySnapIn;" + "IIS-FTPManagement;" + "WAS-NetFxEnvironment;" + "WAS-ConfigurationAPI" Start-Process "pkgmgr" "/ip:$packages"
    81. 81. © joergkrause.de Vorbereitung der PowerShell • CommandLets nicht verfügbar? import-module ServerManager
    82. 82. © joergkrause.de Installation mit der PowerShell • Interaktiv via ISE (Integrated Scripting Environment) Skript-Editor Shell (Kommandozeile)
    83. 83. © joergkrause.de Informationen abrufen Get-WindowsFeature -Name web-server | Format-List -Property *
    84. 84. © joergkrause.de Rollen installieren Install-WindowsFeature -Name Web-Server Neustart erforderlich? Befehl erfolgreich
    85. 85. © joergkrause.de Features • Verwaltungswerkzeuge: Install-WindowsFeature -Name Web-Mgmt-Tools • Wenn man alle Features haben will: Add-WindowsFeature -Name Web-Common-Http, Web-Asp-Net,Web-Net-Ext,Web-ISAPI-Ext, Web-ISAPI-Filter,Web-Http-Logging, Web-Request-Monitor,Web-Basic-Auth, Web-Windows-Auth,Web-Filtering, Web-Performance,Web-Mgmt-Console, Web-Mgmt-Compat,RSAT-Web-Server, WAS -IncludeAllSubFeature
    86. 86. © joergkrause.de Weitere Installationselemente • Fernwartung (remote Zugriff auf IIS-Manager) • Standardpfade der Sites (statt c:inetpubwwwroot) • Rechte (ACLs) auf die Standardpfade • Standard-Application Pools
    87. 87. © joergkrause.de Beispielskript #$Policy = "Unrestricted" $Policy = "RemoteSigned" If ((get-ExecutionPolicy) -ne $Policy) { Write-Host "Script Execution is disabled. Enabling it now" Set-ExecutionPolicy $Policy -Force Write-Host "Please Re-Run this script in a new powershell enviroment" Exit } $InetPubRoot = "D:Inetpub" $InetPubLog = "D:InetpubLog" $InetPubWWWRoot = "D:InetpubWWWRoot" Add-WindowsFeature -Name Web-Common-Http,Web-Asp-Net,Web-Net-Ext,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Http-Logging,Web-Request-Monitor,Web-Basic-Auth,Web-Windows- Auth,Web-Filtering,Web-Performance,Web-Mgmt-Console,Web-Mgmt-Compat,RSAT-Web-Server,WAS -IncludeAllSubFeature Import-Module WebAdministration New-Item -Path $InetPubRoot -type directory -Force -ErrorAction SilentlyContinue New-Item -Path $InetPubLog -type directory -Force -ErrorAction SilentlyContinue New-Item -Path $InetPubWWWRoot -type directory -Force -ErrorAction SilentlyContinue $InetPubOldLocation = @(get-website)[0].physicalPath.ToString() $InetPubOldLocation = $InetPubOldLocation.Replace("%SystemDrive%",$env:SystemDrive) Copy-Item -Path $InetPubOldLocation -Destination $InetPubRoot -Force -Recurse $Command = "icacls $InetPubWWWRoot /grant BUILTINIIS_IUSRS:(OI)(CI)(RX) BUILTINUsers:(OI)(CI)(RX)" cmd.exe /c $Command $Command = "icacls $InetPubLog /grant ""NT SERVICETrustedInstaller"":(OI)(CI)(F)" cmd.exe /c $Command #Changing Log Location $Command = "%windir%system32inetsrvappcmd set config -section:system.applicationHost/sites -siteDefaults.logfile.directory:$InetPubLog" cmd.exe /c $Command $Command = "%windir%system32inetsrvappcmd set config -section:system.applicationHost/log -centralBinaryLogFile.directory:$InetPubLog" cmd.exe /c $Command $Command = "%windir%system32inetsrvappcmd set config -section:system.applicationHost/log -centralW3CLogFile.directory:$InetPubLog" cmd.exe /c $Command #Changing the Default Website location Set-ItemProperty 'IIS:SitesDefault Web Site' -name physicalPath -value $InetPubWWWRoot If (!(Test-Path "C:inetpubtempapppools")) { New-Item -Path "C:inetpubtempapppools" -type directory -Force -ErrorAction SilentlyContinue } Remove-Item $InetPubOldLocation -Recurse -Force $Command = "IISRESET" Invoke-Expression -Command $Command
    88. 88. © joergkrause.de Demo • Rollen mit PowerShell installieren
    89. 89. joergkrause.de Hinweise zur Installation
    90. 90. © joergkrause.de Was ist bei der Installation wichtig? • Sorgfältige Auswahl der Module • Weniger Module heißt – weniger Angriffsfläche – bessere Performance – höhere Stabilität – geringere Updatebedarf
    91. 91. © joergkrause.de Installation • Module, die explizit installiert werden (können): – HTTP: • Default Document • Directory Browsing • HTTP Errors • Static Content • HTTP Redirection • WebDAV Publishing – Health & Diagnostics: • Logging, Custom Logging, Logging Tools • Request Monitor • Tracing
    92. 92. © joergkrause.de Installation • Module, die explizit installiert werden (Fortsg.): – Performance: • Static Content Compression • Dynamic Content Compression – Security: • Request Filtering • IP Filtering • Auth Modules: Basic, Digest, Windows • SSL Certificates, Client Mapping • URL Authorization – Development • .NET / ASP.NET / CGI / ISAPI / SSI / WebSockets
    93. 93. © joergkrause.de Installation • Module, die explizit installiert werden (Fortsg.): – FTP – Web Core – Management Tools
    94. 94. © joergkrause.de Demo • IIS-Module nachinstallieren • Installationsskript exportieren • Installation überprüfen
    95. 95. joergkrause.de Konfiguration
    96. 96. © joergkrause.de WAS Konfiguration • Global • Protokoll • Application Pools • Sites
    97. 97. © joergkrause.de Konfiguration web.config Virtual Directory web.config Sub Directory web.config Application web.config Sub Directory web.config Site Abschnitte können geblockt werden Vererbung setzt sich auf Verzeichnisebene fort Virtuelle Vererbung der Einstellungen machine.config .NET Global applicationHost.config IIS Global Global web.config ASP.NET Global
    98. 98. © joergkrause.de Speicherort der Dateien • machine.config • web.config • applicationHost.config
    99. 99. © joergkrause.de Konfigurationsschema • XML basiert • Delegierbar • Vererbung steuerbar • Zugriff über – Editor – IIS Manager (MMC) – Skripte – Programmierung (.NET) – Kommandozeilenwerkzeug – PowerShell
    100. 100. © joergkrause.de Konfigurationsschema • Standardmäßig sind… – …alle IIS Abschnitte gesperrt, außer: • Default Document • Directory Browsing • HTTP Header • HTTP Redirects – …alle .NET-Framework- / ASP.NET-Abschnitte offen
    101. 101. © joergkrause.de Konfigurationsschema • Delegierung heißt: – Konfiguration sperren, “overrideMode” – ACLs auf alle Dateien anwenden <section name="defaultDocument" overrideModeDefault="Allow" /> Allow Deny <location overrideMode="Allow"> <system.webServer> <security> <authentication> </authentication> </security> </system.webServer> </location> Allow Deny
    102. 102. © joergkrause.de Konfigurationsschema • Elemente sperren • Beispiel: lockElements="providers,element1,element2" lockAllElementsExcepts="" <location overrideMode="Allow"> <system.webServer> <security> <authentication> <windowsAuthentication enabled="true" lockElements="providers"> <providers> <add value="Negotiate" /> <add value="NTLM" /> </providers> </windowsAuthentication> </authentication> </security> </system.webServer> </location> Name des Elements
    103. 103. © joergkrause.de Konfigurationsschema • Attribute sperren lockAttributes="attribute1,attribute2,attribute3" lockAllAttributesExcept="" <location overrideMode="Allow"> <system.webServer> <security> <authentication> <windowsAuthentication enabled="true" lockAttributes="enabled"> <providers> <add value="Negotiate" /> <add value="NTLM" /> </providers> </windowsAuthentication> </authentication> </security> </system.webServer> </location> Name des Attributes Beispiel:
    104. 104. © joergkrause.de Konfigurationsschema • Oft sind Listen erforderlich (Collections) • Beispiel: Provider • Listen haben Steuerelemente: – <add> – <remove> – <clear>
    105. 105. © joergkrause.de Konfigurationsschema • Sperren der Elemente zum Entfernen • Sperren von einzelnen Elementen einer Collection: <windowsAuthentication enabled="true" > <providers lockElements="remove,clear"> <add value="Negotiate" /> <add value="NTLM" /> </providers> </windowsAuthentication> <windowsAuthentication enabled="true" > <providers> <add value="Negotiate" /> <add value="NTLM" lockItem="true" /> </providers> </windowsAuthentication>
    106. 106. © joergkrause.de Konfigurationsschema • Schema-Datei (XML Schema, XSD): • Konfiguration ist Case Sensitive – Gilt auch für Anweisungen in Skriptumgebungen – applicationPool ≠ ApplicationPool %windir%system32inetsrvconfigschemaIIS_schema.xml
    107. 107. © joergkrause.de Demo • Konfiguration anschauen: – machine.config – web.config – applicationHost.config
    108. 108. © joergkrause.de Gemeinsame Konfiguration • Load Balancer • Serverfarmen / Fail Over Cluster • Migrationsszenarien applicationHost.config
    109. 109. © joergkrause.de Gemeinsame Konfiguration • Wie kommt die applicationHost.config auf den gemeinsamen Server? – Exportfunktion
    110. 110. © joergkrause.de Gemeinsame Konfiguration 1. MMC Funktion 2. Pfadeinstellungen
    111. 111. © joergkrause.de Gemeinsame Konfiguration • Auswirkung auf die Konfigurationsdatei: • Mit Domänen-User: <configSections> <section name="configurationRedirection" /> </configSections> <configurationRedirection enabled="true" path="machinenamecentralconfig$" userName="LocalUser" password="p@ssw0rd" /> <configurationRedirection enabled="true" path="machinenamecentralconfig$" userName="domainuser" password="p@ssw0rd" />
    112. 112. © joergkrause.de Demo • Konfiguration verteilen: – User einrichten (Nicht-Domäne) – Konfiguration exportieren – Konfiguration kopieren – Konfiguration auf UNC-Pfad
    113. 113. joergkrause.de Administration & Werkzeuge
    114. 114. © joergkrause.de Agenda 1 2 3 4 5 6 Geschichte + Grundlagen Installation + Konfiguration Fehlersuche + Optimierung Architektur + Arbeitsweise Administration + Werkzeuge Sicherheit + Härtung
    115. 115. © joergkrause.de Allgemeine Hinweise • Nur installieren, was benötigt wird – Angriffsfläche reduzieren – Speicherbedarf verringern – Kontrolle erhöhen • Installation identisch auf allen Servern – Vermeide "503 Service Unavailable"
    116. 116. joergkrause.de Application Pool, Site, Bindung
    117. 117. © joergkrause.de Application Pool Allgemein Leistung Überwachung
    118. 118. © joergkrause.de Sites und ihre Bausteine • Site – Applikation – Bindung – Virtuelle Verzeichnisse • Container für – Applikationen und virtuelle Verzeichnisse • Zugriff – erfolgt über eine oder mehrere Bindungen Site Applikation Virtuelles Verzeichnis Virtuelles Verzeichnis Bindung Internet
    119. 119. © joergkrause.de Site: Definition <sites> <site name="Default Web Site" id="1"> <application path="/"> <virtualDirectory path="/" physicalPath="%SystemDrive%inetpubwwwroot" /> </application> <bindings> <binding protocol="http" bindingInformation="*:80:" /> </bindings> </site> <siteDefaults> <logFile logFormat="W3C" directory="%SystemDrive%inetpublogsLogFiles" /> <traceFailedRequestsLogging directory="%SystemDrive%inetpublogsFailedLogs" /> </siteDefaults> <applicationDefaults applicationPool="DefaultAppPool" /> <virtualDirectoryDefaults allowSubDirConfig="true" /> </sites>
    120. 120. © joergkrause.de Bindung • Definiert den physikalischen Endpunkt • Besteht aus: – Adresse (Wo?) – Protokoll (Wie?)
    121. 121. © joergkrause.de Bindung: Adresse • Je nach Protokoll • Bei HTTP / HTTPS: – IP (oder * zur Bindung an alle physischen Adressen) – Port – Host Header (optional) Ein oder mehrere Bindungen pro Site Protokoll IP Port
    122. 122. © joergkrause.de Besonderheit Host Header • Typischer HTTP-Request: • Header "Host" liefert die Host-Information • DNS bindet mehrere Namen an eine IP • "Host Header" löst dies in den IIS wieder auf GET http://www.iis.net/ HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Accept-Language: de-DE,en-US;q=0.5 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) Accept-Encoding: gzip, deflate Host: www.iis.net DNT: 1 Proxy-Connection: Keep-Alive Cookie: s_cc=true; s_sq=%5B%5BB%5D%5D;
    123. 123. © joergkrause.de Besonderheit Host Header • Durchleitung der Anfrage-Informationen • Spart öffentliche IP-Adressen • DNS ist nicht Teil der IIS www.iis.net Auflösung auf 212.17.42.100 www.asp.net www.wcf.net www.iis.net www.asp.net www.wcf.net Browser DNS Applikationen IIS Bindung an 212.17.42.100
    124. 124. © joergkrause.de Applikationen • Gruppe von Dateien, die Inhalte liefern • Pfad zur Applikation ist Teil des URL der Site • Jede Site muss eine Root-Applikation haben • Jede Site kann mehrere Applikationen enthalten • Die Isolation der Applikationen erfolgt über den Application Pool
    125. 125. © joergkrause.de Virtuelles Verzeichnis • Pfad im IIS der einen externen Teil des URL auf einen physikalischen Pfad auf der Festplatte abbildet
    126. 126. joergkrause.de Werkzeuge Administration der IIS
    127. 127. © joergkrause.de Übersicht • IIS Manager (MMC GUI) • Kommandozeile – CMD: appcmd.exe – PS1: IIS CommandLet • Code – WMI Scripting (VBScript auf "rootWebAdministration") – .NET (VB/C# auf Microsoft.Web.Administration)
    128. 128. © joergkrause.de Eigenschaften • IIS und ASP.NET gemeinsam verwalten • Eine Datenbasis für alle Werkzeuge • Administration ist delegierbar Kontrollfluss der Werkzeuge IIS Manager .NET Wrapper Microsoft.Web.Administration appcmd WMI COM API *.config*.config
    129. 129. © joergkrause.de IIS Manager • Grafische Oberfläche via Management Console • Fernzugriff auf Server (über HTTP) • Erweiterbar via .NET/WinForms
    130. 130. © joergkrause.de Globale Konfiguration • Generischer Editor • Funktionsdelegation • Zugriffsrechte auf MMC (nur Site-Ebene) • Benutzer (Nur wenn andere als Windows-Auth) • Entfernte Verwaltungsdienste (Remote Zugriff) • Gemeinsame Konfiguration • Web Plattform Installer
    131. 131. © joergkrause.de Remote Zugriff • Freigabe • Authentifizierung • Verbindung • Verschlüsselung • Protokollierung • IP-Beschränkungen
    132. 132. © joergkrause.de Administrationsskripte Besser immer mit Skript
    133. 133. © joergkrause.de Kommandozeile • Für Batch-Dateien • appcmd.exe • Syntax: – appcmd (cmd) (object) <identifier> < /param:value … >* – cmd = Kommando, z.B. • add, list, delete, set – object = Ziel des Kommandos, muss Kommando kennen • Site, App, VDir, Apppool, Config, Backup, WP, Request, Module, Trace – identifier = Name oder ID – param:value = Parameter, optional, wiederholbar, u.a. • /text, /config, /xml, /commit – /? = Hilfe, (object) /? = Hilfe zu Ziel
    134. 134. © joergkrause.de C:> appcmd list sites SITE "Default Web Site" (id:1,bindings:HTTP/*:80:,state:Started) SITE "Site1" (id:2,bindings:http/*:81:,state:Started) SITE "Site2" (id:3,bindings:http/*:82:,state:Stopped) C:> appcmd list requests REQUEST "fb0000008000000e" (url:GET /wait.aspx?time=10000,time:4276 msec,client:localhost) C:> appcmd list requests /apppool.name:DefaultAppPool C:> appcmd list requests /wp.name:3567 C:> appcmd list requests /site.id:1 Filter nach Application Pool, Worker Process oder Site Anzeigen und Filtern
    135. 135. © joergkrause.de C:> appcmd list config /section:? | findstr system.webServer system.webServer/globalModules system.webServer/serverSideInclude system.webServer/httpTracing ... C:> appcmd list config /section:directoryBrowse <system.webServer> <directoryBrowse enabled="true" /> </system.webServer> C:> appcmd list config /section:directoryBrowse /config:* <system.webServer> <directoryBrowse enabled="true" showFlags="Extension, Size, Time, Date" /> </system.webServer> C:> appcmd list config /section:directoryBrowse /text:* CONFIG CONFIG.SECTION: system.webServer/directoryBrowse path: MACHINE/WEBROOT/APPHOST overrideMode: Inherit [system.webServer/directoryBrowse] enabled:"true" showFlags:"Extension, Size, Time, Date" IIS Abschnitt – ebenso “system.web” und “system.applicationHost” Zeigt nicht explizit gesetzte Attribute an Konfiguration
    136. 136. © joergkrause.de set appcmd=%systemroot%system32inetsrvAPPCMD.EXE %appcmd% add site /name:MyNewSite /bindings:"http/*:81:" /physicalPath:"D:New folder" %appcmd% add apppool /name:MyNewSiteAppPool /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated" %appcmd% set app "MyNewSite/" /applicationPool:"MyNewSiteAppPool" %appcmd% list site /name:MyNewSite pause Sites und Application Pool
    137. 137. © joergkrause.de Demo • Batch erstellen: – Application Pool – Site – Einstellungen Protokoll etc.
    138. 138. © joergkrause.de PowerShell • Muss als Admin laufen • Bis IIS7 separate Installation • Ab IIS 8 Teil des Windows Betriebssystems • Snap-In: – Web-ScriptingTools http://technet.microsoft.com/en-us/library/hh867899.aspx
    139. 139. © joergkrause.de Demo • Skript erstellen: – Application Pool – Site – Einstellungen Protokoll etc.
    140. 140. © joergkrause.de Programmierung • Verwaltete API für IIS – Microsoft.Web.Administration – Typisiert für IIS-Objekte (Pool, Site) – Schwach typisiert für ASP.NET • Verwaltete API für Konfiguration – System.Configuration – Typisiert für .NET und ASP.NET – Eigene Typisierung
    141. 141. © joergkrause.de Programmierung ServerManager iisManager = new ServerManager(); foreach(WorkerProcess w3wp in iisManager.WorkerProcesses) { Console.WriteLine("W3WP ({0})", w3wp.ProcessId); foreach(Request request in w3wp.GetRequests(0)) { Console.WriteLine("{0} - {1},{2},{3}", request.Url, request.ClientIPAddr, request.TimeElapsed, request.TimeInState); } }
    142. 142. © joergkrause.de Demo • Kommandozeile erstellen: – Application Pool – Site – Einstellungen Protokoll etc.
    143. 143. © joergkrause.de Agenda 1 2 3 4 5 6 Geschichte + Grundlagen Installation + Konfiguration Fehlersuche + Optimierung Architektur + Arbeitsweise Administration + Werkzeuge Sicherheit + Härtung
    144. 144. joergkrause.de Sicherheit Absichern einer IIS-Installation Verschlüsseln von Verbindungen Beschränken von Verbindungen Verschlüsselung der Konfiguration
    145. 145. joergkrause.de TLS (SSL)
    146. 146. © joergkrause.de TLS (SSL) Einrichten • TLS = Transport Layer Security – (früher SSL = Secure Socket Layer) – Seit SSL 3.0 nur noch TLS genannt – TLS 1.0 = SSL 3.1 – Einsatz überwiegend mit HTTPS • Zertifikat erstellen / beschaffen • Verwendung konfigurieren • Bindungen einstellen
    147. 147. © joergkrause.de Grundlagen Verschlüsselung • Der Weg vom Sender zum Empfänger • Problem: Wie kommt der Schlüssel zum Empfänger? Schlüssel Daten Daten verschlüsselt Schlüssel Daten
    148. 148. © joergkrause.de Grundlagen Verschlüsselung • Lösung: Asymmetrische Kryptografie Öffentlicher Schlüssel Daten Daten verschlüsselt Privater Schlüssel Daten Empfänger A gibt ein Schlüsselpaar heraus, mit dem der Sender B mittels des öffentlichen Teils die Nachricht verschlüsselt und nur der Empfänger A kann diese wieder entschlüsseln
    149. 149. © joergkrause.de Grundlagen Verschlüsselung • Asymmetrische Verfahren sind aufwändig – (RSA ca. Faktor 1000 langsamer als AES) • Sie werden nur benutzt, um einen symmetrischen Schlüssel sicher auszutauschen • Asymmetrisches Verfahren: – RSA (Rivest Shamir Adleman) • Symmetrische Verfahren sind billiger • Symmetrische Verfahren bei TLS: – DES – Triple DES – AES (auch Rijndael genannt)
    150. 150. © joergkrause.de Grundlagen Verschlüsselung • Zertifikat – digitaler Datensatz mit Eigenschaften – Standard für Zertifikate mit öffentlichem Schlüssel: – X.509 – Aktuell X.509v3 (Version 3) • Bindung an ein "Distinguished Name" oder "Alternative Name" – E-Mail, DNS-Eintrag (URL), IP
    151. 151. © joergkrause.de Grundlagen der Verschlüsselung • Dateierweiterungen – .CER – DER- oder Base64-kodiertes Zertifikat – .CRT – DER- oder Base64-kodiertes Zertifikat – .CSR – Base64-kodierte Zertifizierungsanfrage – .DER – DER-kodiertes Zertifikat – .P12 / .PFX – PKCS#12, kann öffentliche Zertifikate und private Schlüssel (Kennwort-geschützt) enthalten. – .P7C – PKCS#7-signierte Datenstruktur ohne Dateninhalt, nur mit Zertifikaten oder Zertifikatsperrlisten – .PEM – Base64-kodiertes Zertifikat -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- Anfang und Ende, wenn der Inhalt Base64-kodiert ist
    152. 152. © joergkrause.de Grundlagen Verschlüsselung Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=FJ, ST=Fiji, L=Suva, O=SOPAC, OU=ICT, CN=SOPAC Root CA/Email=administrator@sopac.org Validity Not Before: Nov 20 05:47:44 2001 GMT Not After : Nov 20 05:47:44 2002 GMT Subject: C=FJ, ST=Fiji, L=Suva, O=SOPAC, OU=ICT, CN=www.sopac.org/Email=administrator@sopac.org Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:ba:54:2c:ab:88:74:aa:6b:35:a5:a9:c1:d0:5a: 9b:fb:6b:b5:71:bc:ef:d3:ab:15:cc:5b:75:73:36: b8:01:d1:59:3f:c1:88:c0:33:91:04:f1:bf:1a:b4: 7a:c8:39:c2:89:1f:87:0f:91:19:81:09:46:0c:86: 08:d8:75:c4:6f:5a:98:4a:f9:f8:f7:38:24:fc:bd: 94:24:37:ab:f1:1c:d8:91:ee:fb:1b:9f:88:ba:25: da:f6:21:7f:04:32:35:17:3d:36:1c:fb:b7:32:9e: 42:af:77:b6:25:1c:59:69:af:be:00:a1:f8:b0:1a: 6c:14:e2:ae:62:e7:6b:30:e9 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: FE:04:46:ED:A0:15:BE:C1:4B:59:03:F8:2D:0D:ED:2A:E0:ED:F9:2F X509v3 Authority Key Identifier: keyid:E6:12:7C:3D:A1:02:E5:BA:1F:DA:9E:37:BE:E3:45:3E:9B:AE:E5:A6 DirName:/C=FJ/ST=Fiji/L=Suva/O=SOPAC/OU=ICT/CN=SOPAC Root CA/Email=administrator@sopac.org serial:00 -----BEGIN CERTIFICATE----- MIIDoTCCAwqgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBiTELMAkGA1UEBhMCRkox DTALBgNVBAgTBEZpamkxDTALBgNVBAcTBFN1dmExDjAMBgNVBAoTBVNPUEFDMQww CgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVNPUEFDIFJvb3QgQ0ExJjAkBgkqhkiG9w0B CQEWF2FkbWluaXN0cmF0b3JAc29wYWMub3JnMB4XDTAxMTEyMDA1NDc0NFoXDTAy MTEyMDA1NDc0NFowgYkxCzAJBgNVBAYTAkZKMQ0wCwYDVQQIEwRGaWppMQ0wCwYD VQQHEwRTdXZhMQ4wDAYDVQQKEwVTT1BBQzEMMAoGA1UECxMDSUNUMRYwFAYDVQQD Ew13d3cuc29wYWMub3JnMSYwJAYJKoZIhvcNAQkBFhdhZG1pbmlzdHJhdG9yQHNv cGFjLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAulQsq4h0qms1panB 0Fqb+2u1cbzv06sVzFt1cza4AdFZP8GIwDORBPG/GrR6yDnCiR+HD5EZgQlGDIYI 2HXEb1qYSvn49zgk/L2UJDer8RzYke77G5+IuiXa9iF/BDI1Fz02HPu3Mp5Cr3e2 JRxZaa++AKH4sBpsFOKuYudrMOkCAwEAAaOCARUwggERMAkGA1UdEwQCMAAwLAYJ YIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1Ud DgQWBBT+BEbtoBW+wUtZA/gtDe0q4O35LzCBtgYDVR0jBIGuMIGrgBTmEnw9oQLl uh/anje+40U+m67lpqGBj6SBjDCBiTELMAkGA1UEBhMCRkoxDTALBgNVBAgTBEZp amkxDTALBgNVBAcTBFN1dmExDjAMBgNVBAoTBVNPUEFDMQwwCgYDVQQLEwNJQ1Qx FjAUBgNVBAMTDVNPUEFDIFJvb3QgQ0ExJjAkBgkqhkiG9w0BCQEWF2FkbWluaXN0 cmF0b3JAc29wYWMub3JnggEAMA0GCSqGSIb3DQEBBAUAA4GBADSN+2ULhVviRAnw VTE7KSv0/apf27gRGsarM2dZwQTeNN8IVy7GYNz31OLxc5dXI1ACY/x4ljSzysQb xUzIFmm7nEp+ABlIYuJRqzr6/YjN4J3vZ1Da/ksTxQyM/K1ute5A4/00EJ+tNL3b Bu0JPfKmgSJjFtyuMwxw/Qpsr7xa -----END CERTIFICATE-----
    153. 153. © joergkrause.de Grundlagen Verschlüsselung • Begriffe (Auswahl): – PKI = Public Key Infrastructure • System zum Herausgeben digitaler Zertifikate – CA = Certificate Authority • Hierarchisches System von Zertifizierungsstellen – CRL = Certificate Revocation List • Zertifikatssperrliste, Liste ungültiger Zertifikate – RA = Registration Authority • Organisation, wo Zertifikate beantragt werden können – VA = Validation Authority • Dienst, wo Zertifikate geprüft werden können – DS = Directory Service • Durchsuchbares Verzeichnis mit ausgestellten Zertifikaten
    154. 154. © joergkrause.de -----BEGIN CERTIFICATE----- MIIDoTCCAwqgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBiTELMAkGA1UEBhMCRkox DTALBgNVBAgTBEZpamkxDTALBgNVBAcTBFN1dmExDjAMBgNVBAoTBVNPUEFDMQww CgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVNPUEFDIFJvb3QgQ0ExJjAkBgkqhkiG9w0B CQEWF2FkbWluaXN0cmF0b3JAc29wYWMub3JnMB4XDTAxMTEyMDA1NDc0NFoXDTAy MTEyMDA1NDc0NFowgYkxCzAJBgNVBAYTAkZKMQ0wCwYDVQQIEwRGaWppMQ0wCwYD VQQHEwRTdXZhMQ4wDAYDVQQKEwVTT1BBQzEMMAoGA1UECxMDSUNUMRYwFAYDVQQD Ew13d3cuc29wYWMub3JnMSYwJAYJKoZIhvcNAQkBFhdhZG1pbmlzdHJhdG9yQHNv cGFjLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAulQsq4h0qms1panB 0Fqb+2u1cbzv06sVzFt1cza4AdFZP8GIwDORBPG/GrR6yDnCiR+HD5EZgQlGDIYI 2HXEb1qYSvn49zgk/L2UJDer8RzYke77G5+IuiXa9iF/BDI1Fz02HPu3Mp5Cr3e2 JRxZaa++AKH4sBpsFOKuYudrMOkCAwEAAaOCARUwggERMAkGA1UdEwQCMAAwLAYJ YIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1Ud DgQWBBT+BEbtoBW+wUtZA/gtDe0q4O35LzCBtgYDVR0jBIGuMIGrgBTmEnw9oQLl uh/anje+40U+m67lpqGBj6SBjDCBiTELMAkGA1UEBhMCRkoxDTALBgNVBAgTBEZp amkxDTALBgNVBAcTBFN1dmExDjAMBgNVBAoTBVNPUEFDMQwwCgYDVQQLEwNJQ1Qx FjAUBgNVBAMTDVNPUEFDIFJvb3QgQ0ExJjAkBgkqhkiG9w0BCQEWF2FkbWluaXN0 cmF0b3JAc29wYWMub3JnggEAMA0GCSqGSIb3DQEBBAUAA4GBADSN+2ULhVviRAnw VTE7KSv0/apf27gRGsarM2dZwQTeNN8IVy7GYNz31OLxc5dXI1ACY/x4ljSzysQb xUzIFmm7nEp+ABlIYuJRqzr6/YjN4J3vZ1Da/ksTxQyM/K1ute5A4/00EJ+tNL3b Bu0JPfKmgSJjFtyuMwxw/Qpsr7xa -----END CERTIFICATE----- Arbeitsweise der PKI (Nutzersicht) CA VA RA 4. Ausstellung 3. Information 6. Prüfung 5. Authentifizierung Nutzer Shop -----BEGIN CERTIFICATE----- MIIDoTCCAwqgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBiTELMAkGA1UEBhMCRkox DTALBgNVBAgTBEZpamkxDTALBgNVBAcTBFN1dmExDjAMBgNVBAoTBVNPUEFDMQww CgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVNPUEFDIFJvb3QgQ0ExJjAkBgkqhkiG9w0B CQEWF2FkbWluaXN0cmF0b3JAc29wYWMub3JnMB4XDTAxMTEyMDA1NDc0NFoXDTAy MTEyMDA1NDc0NFowgYkxCzAJBgNVBAYTAkZKMQ0wCwYDVQQIEwRGaWppMQ0wCwYD VQQHEwRTdXZhMQ4wDAYDVQQKEwVTT1BBQzEMMAoGA1UECxMDSUNUMRYwFAYDVQQD Ew13d3cuc29wYWMub3JnMSYwJAYJKoZIhvcNAQkBFhdhZG1pbmlzdHJhdG9yQHNv cGFjLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAulQsq4h0qms1panB 0Fqb+2u1cbzv06sVzFt1cza4AdFZP8GIwDORBPG/GrR6yDnCiR+HD5EZgQlGDIYI 2HXEb1qYSvn49zgk/L2UJDer8RzYke77G5+IuiXa9iF/BDI1Fz02HPu3Mp5Cr3e2 JRxZaa++AKH4sBpsFOKuYudrMOkCAwEAAaOCARUwggERMAkGA1UdEwQCMAAwLAYJ YIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1Ud DgQWBBT+BEbtoBW+wUtZA/gtDe0q4O35LzCBtgYDVR0jBIGuMIGrgBTmEnw9oQLl uh/anje+40U+m67lpqGBj6SBjDCBiTELMAkGA1UEBhMCRkoxDTALBgNVBAgTBEZp amkxDTALBgNVBAcTBFN1dmExDjAMBgNVBAoTBVNPUEFDMQwwCgYDVQQLEwNJQ1Qx FjAUBgNVBAMTDVNPUEFDIFJvb3QgQ0ExJjAkBgkqhkiG9w0BCQEWF2FkbWluaXN0 cmF0b3JAc29wYWMub3JnggEAMA0GCSqGSIb3DQEBBAUAA4GBADSN+2ULhVviRAnw VTE7KSv0/apf27gRGsarM2dZwQTeNN8IVy7GYNz31OLxc5dXI1ACY/x4ljSzysQb xUzIFmm7nEp+ABlIYuJRqzr6/YjN4J3vZ1Da/ksTxQyM/K1ute5A4/00EJ+tNL3b Bu0JPfKmgSJjFtyuMwxw/Qpsr7xa -----END CERTIFICATE-----
    155. 155. © joergkrause.de Zertifikat beschaffen Root CA Intermediate CA Intermediate CA Intermediate Issuing CAs Issuing CAs Issuing CAs
    156. 156. joergkrause.de SSL in den IIS Einrichtung und Konfiguration
    157. 157. © joergkrause.de Vorbereitung • Wahl des Zertifikats: – Valid From und Valid To gültig / sinnvoll? – Common Name (CN) passend zur URL der Site? – Issuer (Herausgeber) in der Liste vertrauter Stammzertifikate?
    158. 158. © joergkrause.de Testzertifikat • "Self Signed" • Test-Root-Zertifikat und Test-Zertifikat mit makecert • Test-Zertifikat mit Powershell – New-SelfSignedCertificate
    159. 159. © joergkrause.de Testzertifikat mit makecert • Anlegen und Speichern eines Testzertifikats makecert -r -pe -n "CN=www.yourserver.com" -b 01/01/2015 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "Self-Signed" Privater Schlüssel exportierbar Name nach X.500 Gültig ab (Valid From/begin) Gültig bis (Valid To/end) Store (X.509 store name) Location (currentuser/localmachine) Key Type (exchange/signature) Provider CryptoAPI Provider Type Zertifikatstyp (OID-Format)
    160. 160. © joergkrause.de OID • Object Identifier – Baum mit Objektbeschreibungswerten – Private Knoten (kostenlose Registrierung) möglich – Wurzel: • 0: ITU-T (Telecommunication Standardization Sector) • 1: ISO • 2: ITU-T + ISO Joint • OID ist ein Meta-Standard http://www.oid-info.com/faq.htm http://www.codingfreaks.de/2012/04/02/gultige-oids-in-makecert-exe/
    161. 161. © joergkrause.de OID • So entsteht die OID 1. ISO 3. Identified Organization 6. dod (US department of defence) 1. Internet 5. Security 5. mechanisms 7. pkix (Public Key Infrastructure) 3. kp (Extended Key Purpose) 1 serverAuth Test eines OID: http://oid-info.com/get/1.3.6.1.5.5.7.3.1 "Indicates that a certificate can be used as an SSL server certificate"
    162. 162. © joergkrause.de Aktuelle Konfiguration • Entscheidend ist http.sys! netsh http show sslcert
    163. 163. © joergkrause.de Konfiguration • SSL optional oder zwingend
    164. 164. © joergkrause.de Bindungen • Standard-Port für SSL: 443 • Einstellungen Via IIS Manager / Skript / .NET • Konfiguration: <bindings> <binding bindingInformation="mystore:443:" protocol="https" sslFlags="0"> </bindings> 0: IP/Port, ein Zertifikat pro Kombination 1: Host Name und IP (SNI Verfahren) 2: Zentrales SSL-Zertifikat (kein SNI) 3: Zentrales SSL-Zertifikat mit SNI
    165. 165. © joergkrause.de Ablauf • Zwei Plätze: 1. Bindungsinformationen in applicationHost.config 2. Assoziierte SSL-Konfiguration in http.sys • Beim Start der Site – IIS sendet Bindungsdaten von Konfiguration an http.sys – http.sys beginnt auf dem Port zu lauschen • Beim Verbindungsaufbau: – http.sys schaut in seine Konfiguration nach der IP:Port- Kombination – http.sys sucht Zertifikat anhand Hash & Store
    166. 166. © joergkrause.de Kommandozeile appcmd.exe set config -section:system.applicationHost/sites /siteDefaults.bindings .[protocol='https', bindingInformation='*:443:mysite.de'] .bindingInformation:"127.0.0.1:80:" /commit:apphost
    167. 167. © joergkrause.de .NET-Code • Ausführung in einer Konsolenapplikation using (ServerManager serverManager = new ServerManager()) { var config = serverManager.GetApplicationHostConfiguration(); var sitesSection = config.GetSection("system.applicationHost/sites"); var siteDefaultsElement = sitesSection.GetChildElement("siteDefaults"); var bindingsCollection = siteDefaultsElement.GetCollection("bindings"); var bindingElement = bindingsCollection.CreateElement("binding"); bindingElement["protocol"] = @"http"; bindingElement["bindingInformation"] = @"127.0.0.1:8080:"; bindingsCollection.Add(bindingElement); serverManager.CommitChanges(); }
    168. 168. © joergkrause.de Demo • Zertifikat erstellen • Installieren • Testen
    169. 169. © joergkrause.de Konfiguration verschlüsseln
    170. 170. © joergkrause.de Demo • Konfiguration schützen
    171. 171. © joergkrause.de Beschränken von Verbindungen • Authentifizierung • Autorisierung: – IP-Beschränkungen – URL Autorisierung – ISAPI- und CGI-Beschränkungen – Anforderungsfilter
    172. 172. © joergkrause.de Authentifizierung & Autorisierung 1. Authentifizierung – Wer bist du? – Diverse Verfahren 2. Autorisierung – Was darfst du? – Diverse Stufen
    173. 173. © joergkrause.de Authentifizierung Methode Anmeldeverfahren Benutzerdatenbank Anonymer Zugriff Keines AD, lokales Konto Basic Abfragedialog AD, lokales Konto Client Zertifikat Zertifikatsauswahl AD IIS Zertifikat mit Mapping Zertifikatsauswahl AD, lokales Konto Digest Abfragedialog AD Forms HTML-Formular ASP.NET Membership Windows Abfragedialog AD, lokales Konto
    174. 174. © joergkrause.de Das "anonyme" Konto • Keine Operation ohne Identität • Die anonymen Zugriffe laufen unter IUSR ab • IUSR ist in der Gruppe IIS_IUSRS • Minimale Ausführungsrechte in der ACL: – Read • Für aktive Programme: – Read & Execute – List folder contents
    175. 175. © joergkrause.de IUSR • IUSR – Kein Kennwort ("built in") – Für Gastzugang einfach ACL auf IUSR setzen (Read) – Kennwort kann nicht ablaufen – Kopieren der ACL mit xcopy /o • Identische SID auf allen Windows-Systemen • IIS_USRS – Worker Prozess fügt Token der Pool-Identität dynamisch der Gruppe hinzu – Das Pool-Konto muss deshalb nicht konfiguriert werden <anonymousAuthentication enabled="true" userName="IUSR" defaultLogonDomain="" />
    176. 176. © joergkrause.de Start Authentifizierungsablauf Anonym ? Start Impersonate IUSR Send 401 Per- missions OK? 200 OK Other Auth? config config config Success ? Authenticate Send 403 Impersonate User HTTP Request config Per- missions OK? config Yes No No No Yes Yes Yes No
    177. 177. joergkrause.de Beschränkungen Auswahl der wichtigsten Sicherheitsbeschränkungen
    178. 178. © joergkrause.de IP-Beschränkungen • Standard: – IP oder IP-Bereich – Explizit erlauben oder explizit verbieten • Erweiterung: – Dynamische Beschränkung – Anzahl konkurrierender Anforderungen http://www.iis.net/downloads/microsoft/dynamic-ip-restrictions
    179. 179. © joergkrause.de URL-Autorisierung • Zugriffsbeschränkungen durch URLs • Ersetzt Beschränkungen durch ACLs • Funktion "Authorization Rules" – Ebene Verzeichnis – Ebene Datei
    180. 180. © joergkrause.de URL-Autorisierung • In der web.config der Anwendung • Element <location> ist das Elternelement <location path="bobsSecret.aspx"> <system.webServer> <security> <authorization> <remove users="" roles="BobAndFriends" verbs="" /> <add accessType="Allow" users="Bob" /> </authorization> </security> </system.webServer> </location>
    181. 181. © joergkrause.de Anforderungsfilter • Standardbeschränkungen: – Kritische Dokumente sind ausgefiltert (Configs, DLLs, …) • Beschränkungsfunktionen: – Dateierweiterung – URL-Segmente – Verbs (HTTP-Methoden) – Non-ASCII (z.B. UTF-8) – Doppelt encodete Anfragen – Maximale Länge der Anfrage – Maximale Länge des URL – Maximale Länge des Query Strings
    182. 182. © joergkrause.de Anforderungsfilter • Beispiel Kommandozeile • Im IIS-Manager (MMC) appcmd set config /section:requestfiltering /allowhighbitcharacters:true |
    183. 183. © joergkrause.de Anforderungsfilter • Spezifische Fehler bei Verstoß gegen die Regeln URL Sequenz verboten 404.5 Verb verboten 404.6 Dateierweiterung nicht zugelassen 404.7 Verstecktes Segment (Verzeichnis) erkannt 404.8 Anforderungs-Kopfzeile (Request Header) zu lang 404.10 URL doppelt encodet 404.11 Non-ASCII (high bit) Zeichen 404.12 Inhalt zu lang 404.13 URL zu lang 404.14 Query String zu lang 404.15
    184. 184. joergkrause.de Checklisten zum Härten Härten einer IIS-Installation
    185. 185. © joergkrause.de IIS Absichern (Checkliste I) • Verzeichniszugriff – Beschränkungen anonym zugreifbarere Verzeichnisse – IISAdmin, IISHelp, IISSamples entfernen – PARENT PATH config entfernt – Website Root nicht auf dem Systemlaufwerk – Verzeichnis durchsuchen abgeschaltet – Kein SDK, Visual Studio etc. installiert
    186. 186. © joergkrause.de IIS Absichern (Checkliste II) • Konfiguration – DEBUG OFF in web.config – TRACE FALSE in web.config – Nicht benötigte HTTP-Module entfernt – Nicht benötigte Handler entfernt (z.B. *.hta, *.shtml)
    187. 187. © joergkrause.de IIS Absichern (Checkliste III) • Sicherung der Kommunikation – HTTPS aktiviert – Zertifikate aktuell, vertraut und korrekt – Remote Administration aus oder abgesichert – Standardkommunikation nur Port 80 und 443 – IPSec für alle internen Verbindungen
    188. 188. © joergkrause.de IIS Absichern (Checkliste IV) • Protokollierung und Überwachung – Misslungene Anmeldeversuche regelmäßig prüfen – Protokolle auswerten – Erweitertes Protokollierungsformat benutzen
    189. 189. © joergkrause.de IIS Absichern (Checkliste V) • Konten – Verwaltete Konten für Application Pools – IUSR abgeschaltet – Anonymer Zugriff aus – Remote Login aus (außer Admin, wenn Bedarf) – Lokaler Login aus (außer Admin)
    190. 190. © joergkrause.de IIS Absichern (Checkliste VI) • ASP.NET – State Service aus (speziell bei MVC) • System – WebDAV aus – FTP und SMTP aus – System-Shares aus (C$, D$ usw.) – SMB aus – TELNET aus – IIS nicht auf Domain Controller – DMZ konfiguriert – Updates aktuell (Windows, .NET)?
    191. 191. © joergkrause.de Hilfreiche Werkzeuge • Microsoft Security Compliance Manager 3.0 • SQL Server Express benötigt • Nicht nur IIS, allgemeines Werkzeug
    192. 192. © joergkrause.de Security Compliance Manager 3.0 • Liste von Einstellungen über alle Produkte • Empfehlung und Erklärung zu allen Einstellungen Aktueller Status Empfehlung Erklärungen
    193. 193. © joergkrause.de Agenda 1 2 3 4 5 6 Geschichte + Grundlagen Installation + Konfiguration Fehlersuche + Optimierung Architektur + Arbeitsweise Administration + Werkzeuge Sicherheit + Härtung
    194. 194. joergkrause.de Fehlersuche
    195. 195. © joergkrause.de Werkzeuge • Fiddler (Telerik, Freeware) • LogParser 2.2 • Microsoft Network Monitor 3.4 • Wireshark • SSLDiag • MSConfig.exe • JMeter (Apache, Open Source) • Loadrunner (HP, Freemium)
    196. 196. © joergkrause.de HTTP Diagnose • Pakete korrekt? • Bandbreite okay? • Authentifizierung passt? • Verschlüsselung aktiv? • Angriffe gesehen?
    197. 197. joergkrause.de Optimierung
    198. 198. © joergkrause.de Verstehen • Einfluss auf Performance des Servers: – Bandbreite – Anzahl HTTP-Requests • Einfluss im Browser: – JavaScript – Rendering
    199. 199. © joergkrause.de Timeline DNS Request Transfer Server Processing Transfer Response Processing 150 ms 50 ms 200 ms 100 ms 500 ms 200 ms 50 ms 150 ms S 1.400 ms
    200. 200. © joergkrause.de Timeline DNS Request Transfer Server Processing Transfer Response Processing 150 ms 50 ms 200 ms 100 ms 500 ms 200 ms 50 ms 150 ms S 1.400 ms
    201. 201. © joergkrause.de Tools • Fiddler (Telerik) • F12 (IE, Chrome), Firebug (Firefox) – Profiler – Netzwerk – CSS – HTML – JavaScript Debugger • Vieles auch online, z.B. – Pingdom – Browserstack http://tools.pingdom.com/fpt/ http://www.browserstack.com
    202. 202. © joergkrause.de IIS/Server-Optimierung • Pipeline Optimierung • Prozess Konfiguration Optimierung • CDN
    203. 203. © joergkrause.de Pipeline Optimierung • Ziel: – Schnellere Verarbeitung • Vorgehensweise: – Entfernen nicht benutzter Module in der web.config ?
    204. 204. © joergkrause.de Pipeline Optimierung
    205. 205. © joergkrause.de Prozesskonfiguration • Ziel: – Optimale Nutzung von Ressourcen • Vorgehensweise: – Anpassen der Prozesskonfiguration an die konkreten Hardwarebedingungen ?
    206. 206. © joergkrause.de Prozesskonfiguration • maxWorkerThreads: 20 pro Kern (4 Kerne == 80 Threads) – Höher möglich, wenn wenige CPU-intensive Arbeit (z.B. viel Async, Service Calls), dann sind Werte bis 100 möglich. • maxIOThreads: 20 pro Kern – Für Dateioperationen, Datenbankzugriff, Web Service Calls, interne Requests etc. Bei schneller Hardware, 10 Gbit Netz, SSD etc, sind Werte bis 100 möglich. • minWorkerThreads, minIOThreads: Standard 1 – Steuert Beginn der Request-Warteschlange, mindestens der Wert muss frei sein, damit NICHT gequeued wird. • memoryLimit: Anteil (%) vom Systemspeicher, den der Worker-Prozess belegen darf – Wenn die Anwendung alleine ist, darf der Wert hoch sein, z.B. 80. Bei vielen Lecks oder anderen Anwendungen, vor allem COM, Wert verringern.
    207. 207. © joergkrause.de Verbindungskonfiguration • Anzahl gleichzeitiger Verbindungen zu einer IP- Adresse: – Standard 2 – Höhere Werte heute mehr als sinnvoll
    208. 208. © joergkrause.de • Ziel: – Schnellere Requests – Weniger Latenz • Technik: – CDN nutzen ? CDN (Content Delivery Network)
    209. 209. © joergkrause.de • Für allgemeine Dateien, wie jQuery, Knockout etc. bietet sich Microsoft, Google etc. an CDN (Content Delivery Network)
    210. 210. © joergkrause.de • Für eigene gibt es kostenpflichtige Dienste – Cachefly (einfach, Upload/Distribute) – EdgeCast (komplex, DNS Caching) CDN (Content Delivery Network)
    211. 211. © joergkrause.de Fragen www.joergkrause.de

    ×