Bernhard Frank's Blog

heiter und wolkig - zu den Themen Windows Server 2012, PowerShell, Private Cloud und Web (IIS)

IIS für Einsteiger Teil 4: Authentifizierung und Autorisierung mit dem IIS

IIS für Einsteiger Teil 4: Authentifizierung und Autorisierung mit dem IIS

  • Comments 9
  • Likes

Warum ist das wichtig?

Jeder IIS Administrator sollte das prinzipiell verstanden haben, da dieses Thema, wenn falsch konfiguriert, immer wieder nette Probleme, Fehlermeldungen, nervenden Passwortabfragen oder Sicherheitslöchern verursacht.

Das eigentliche Anwendungsszenario ist einfach:

Ich möchte meine Websites oder Teile einem eingeschränkten Besucherkreis zugänglich machen – alle anderen sollen ‚draußen' bleiben.

Kurz: Wer darf was auf meiner Website sehen – und wie gehe ich vor.

Nicht authentifiziert - oder wer ist die Anonymous User Identity (IUSR)?

Im IIS ist standardmäßig ist die anonyme Authentifizierung aktiviert. Diese ermöglicht es allen Website Besuchern auf Inhalte zuzugreifen ohne dass eine Abfrage von Benutzername und Passwort im Clientbrowser erfolgt – also quasi anonym. Für das Dateisystem jedoch erfolgt so ein Zugriff unter dem Benutzerkontext der Anonymous User Identity des "IUSR" Accounts. Im Hintergrund impersonifiziert der IIS nämlich anonyme Browseranfragen auf den IUSR Account – da dieser Standardmäßig als Anonymous User Identity eingetragen ist:

Der IUSR (Default Anonymous User Identity) ist ein Benutzerkonto das bei der Installation des IIS7 angelegt wird. Daher sollte der IUSR Benutzer NTFS Berechtigungen auf den Ordner mit den Inhalten für Ihre Website haben z.B. Read / Execute:

Fehlen der Anonymous User Identity (Default: IUSR) die Rechte auf die angeforderte Datei (Seite) wird ein "Access Denied" = http Status 401 zurückgegeben. Der Website Besucher wird dann, je nach Konfiguration des IIS, nach Benutzernamen und Passwort gefragt (Password Prompt (s.u. links)| Login Seite) oder bekommt eine Fehlerseite (s.u. rechts), falls keine alternative Authentifizierungsmethode aktiviert ist:

 

Authentifizierung oder "Wer bin ich?"

Will ich Jedermann Zugriff auf meine Website geben, dann muss ich lediglich dafür sorgen dass die Anonymous Authentication beim IIS aktiviert ist:

und dass die eingetragene Anonymous User Identity (Default: IUSR) Read / Execute NTFS Rechte auf die Inhalte hat.

Möchte ich im Gegenzug nur bestimmte Besucher auf meine Website lassen, dann brauche ich eine Authentifizierung um herauszufinden wer ist der Besucher überhaupt. In der Regel passiert das über eine Benutzername- und Kennwort-Abfrage. Der IIS prüft dann in der Benutzerdatenbank ob dieser Benutzername mit diesem Passwort existiert. Die Benutzerdatenbank kann sein z.B. die lokale Windows Accounts Datenbank, das Active Directory oder z.B. eine ASP.Net Membership DB. Für die Art der Authentifizierung stehen mir im IIS7 diverse Authentifizierungsmethoden zur Verfügung mit unterschiedlichen Vorzügen und Voraussetzungen:

 

Methode 

Wie loggt sich der Besucher ein?

BenutzerDB | Welche Accounts können verwendet werden?

Anmerkungen 

Anonymous Authentication

Kein Login (notwendig)

Active Directory (AD) oder/und lokale Windows Accounts

Default. Um anonyme Benutzer Zugriff auf die öffentlichen Bereiche Ihrer Web- oder FTP-Site zu erlauben ohne Abfrage nach Benutzernamen oder Kennwort.

Basic Authentication

Einfache Benutzer- & Passwort-Abfrage mit Dialog

AD + lokale

Kennwort und Benutzername werden nur leicht verschlüsselt übertragen. Bitte nur mit Verschlüsslung (https/SSL) verwenden! Häufig verwendet für Internet facing Websites – wird von allen gängigen Browsern unterstützt.

Forms Authentication

Login via Formularfeld auf Website

ASP.NET Membership

Häufig von Webanwendungen verwendet. Vorteil: hier liegen Benutzer z.B. in einer Datenbank welche auch in der Webanwendung einfach "wiederverwendet" werden können.

Bitte nur mit Verschlüsslung (https/SSL) verwenden, da Kennwörter übertragen werden!

Anm.: Forms Auth. kann nicht mit anderen Auth. Methoden wie z.B: Basic, Windows, Digest kombiniert werden.

Windows Authentication

Für den Benutzer i.d. Regel transparent - Authentifizierung läuft automatisch ab.

Login Dialog nur im Fehlerfall

AD + lokale

Versucht wird den gerade am Browsing-Client angemeldeten Benutzer beim Server zu authentifizieren. Sicherer als Basic Authentication da Benutzername und Passwort nicht übers Netz übertragen werden. Eher für Intranet Szenarien geeignet - Single Sign On.

Digest Authentication

Benutzer- & Passwort-Abfrage

AD 

Sicherer als Basic Authentication da Benutzername und Passwort nicht übers Netz gehen. Gut geeignet für Internet. Wird von vielen Browsern unterstützt.

Client Certificate Mapping authentication

Benutzer wird aufgefordert ein Client-Zertifikat für die Authentifizierung auszuwählen

(=Zertifikatsauswahl-Dialog)

AD 

Ordnet einem Zertifikat einen Benutzer zu. IIS frägt das Active Directory an welchem Benutzer das vorgezeigte Zertifikat zuzuordnen ist, d.h. im AD ist vorher eine Verknüpfung (User:Zertifikat) vorzunehmen. Benutzer muss Clientzertifikat auf seinem Rechner installiert haben.

Setzt eine verschlüsselte Verbindung https/SSL voraus.

IIS Client Certificate Mapping authentication

Zertifikatsauswahl-Dialog

lokale + AD

Benötigt https/SSL. Besucher braucht ein Clientzertifikat welches von einer für den IIS7 vertrauenswürdigen Zertifizierungstelle ausgestellt worden ist.

Der IIS ordnet einem (One-To-One) oder vielen (Many-To-One) Besucher-Zertifikat(en) einen Benutzer-Account zu.

Anm.: Aufgelistet sind Authentifizierungsmethoden welche Microsoft mit dem IIS 7 liefert. Es gibt Dritthersteller-Erweiterungen wie z.B. RSA Authentication Agent 7.0 for Web for Internet Information Services). Alternativ lässt sich der IIS7 einfach erweitern um z.B. eine eigene Authentifizierungsmethoden zu implementieren (siehe Developing a Module Using .NET oder Custom Basic Authentication for IIS )

Wie stelle ich nun Authentifizierung ein?

Um die Auswahl der richtigen Authentifizierungs-Methode(n) etwas zu erleichtern hier mal 2 Beispiele um den Benutzernamen des Website Besuchers zu erfahren.

  1. Basic Authentication einrichten

Meiner Meinung nach die einfachste Variante eine Benutzerauthentifizierung einzurichten und mit https Verschlüsselung auch recht sicher.

  • Erstelle einen Ordner in der myothersite "authentication\basic"
  • Wähle den Ordner aus und klicke auf Authentication.
  • Deaktiviere Anonymous- und aktiviere die Basic Authentication:

Den Sicherheitshinweis nehmen wir ernst und aktiveren noch die SSL Verschlüsselung.

  • Lege ein neues Binding für den Https Port 443 für die myothersite an.
  • Wähle als Serverzertifikat das localhost Testzertifikat

(Praktischerweise hat IIS 7 sich schon selbst ein Zertifikat für Testzwecke erzeugt):

  • Erzwinge SSL für den Pfad in dem authentifiziert wird:

Die myothersite ist nach wie vor über http erreichbar, nur unser "basic" Unterordner erfordert eine verschlüsselte Verbindung, andernfalls wird ein Fehler aufgeworfen. Das bedeutet aber auch dass ich auf die Seite von nun an mit https://localhost/authentication/basic/.... zugreifen muss.

Jeder der jetzt auf die Seite zugreifen will muss sich zuvor authentifizieren:

Anm.: Der IE beschwert sich über das Testzertifikat, das sich der IIS selbst ausgestellt hat aber normalerweise von einer vertrauenswürdigen Zertifizierungsstelle (Verisign, Thawte, o.ä.) kommen sollte. Der Verschlüsselung tut das keinen Abbruch.

Nach erfolgreicher Anmeldung kann ich auf die Inhalte zugreifen. Die Benutzerinformationen können auch von einer z.B. in ASP.NET geschriebenen Seite ("Auth_User.aspx") ausgelesen werden:

Wichtig ist lediglich noch, dass der Benutzer mit dem ich mich anmelde NTFS Rechte auf die im Ordner "basic" liegenden Dateien hat.

 

  1. Windows Authentication einrichten

Die Windows Authentication Methode ist auch ohne SSL Verschlüsselung sicher zu verwenden und erfordert weniger Mouseklicks in der Konfiguration. Diese Methode ist sehr gut geeignet für Intranet Szenarien, bringt allerdings ein paar Tücken mit wenn man diese Methode auch für die Authentifizierung von Websites im Internet einsetzen möchte (siehe HTTP Error 401.1 – Unauthorized bei Verwendung von Windows Authentication). Hier kurz die Vorgehensweise:

  • Erstelle einen Unterordner "windows" im Ordner "authentication"
  • Wähle diesen aus und aktiviere unter Authentication nur die Windows Authentication:

Was ist der Unterschied?

Die Windows Authentication erfolgt normalerweise ohne Benutzer und Kennwort-Abfrage, es wird versucht den am Browsing-Client angemeldeten Benutzer (In meinem Fall ein Domänen Benutzer) beim IIS zu authentifizieren. Dies geschieht für den Benutzer transparent. Bei dieser Autentifizierungs-Methode wird das Kennwort nicht übertragen, der IIS bekommt kein Passwort, kann dieses nicht in den Server-Variablen ablegen und deshalb zeigt die obige Seite auch nur einen leeren String an.

 

Der authentifizierte Benutzer braucht NTFS Berechtigungen auf die Datei | Ordner ("windows") damit der IIS diese ausliefert.

Autorisierung oder "Was darf ich?"

Nach erfolgreicher Authentifizierung erfolgt die Autorisierung. Hierbei bestimmen die Autorisierungs-Einstellungen den Zugriff des Besuchers auf die verschiedenen Bereiche einer Website.

Ich habe 2 Möglichkeiten um festzulegen worauf ein Benutzer zugreifen darf:

  1. Autorisierung mittels Ordner & Datei-Rechte

Hierzu werden einfach mittels NTFS Berechtigungen auf Basis der Benutzer-Accounts | Gruppen der Zugriff auf Dateien | Ordner erlaubt.

Beispiel: Wir erlauben nur Benutzer einer bestimmten Gruppe Zugriff auf ein Verzeichnis

  • Erstelle lokale Benutzergruppe "myothersite authenticated visitors" und füge erlaubte Benutzer hinzu.
  • Erstelle Ordner "authenticated-visitors" in myothersite.
  • Aktiviere Windows Authentication.
  • Rechter Mousklick auf "authenticated-visitors" -> Edit Permissions -> Entfernen der Anonymous User Identity und hinzufügen der "myothersite authenticated visitors" Gruppe:

Jeder Besucher der auf diesen Ordner zugreifen will muss sich authentifizieren und Mitglied der Gruppe "myothersite..." sein.

Wenn ich sehen möchte wer den Zugriff gemacht hat, dann kann ich das z.B. mittels

  • der IIS Log Datei:

#Software: Microsoft Internet Information Services 7.5

#Version: 1.0

#Date: 2011-04-07 07:36:04

#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username ...

2011-04-07 07:36:04 ::1 GET /authenticated-visitors/ - 8080 EUROPE\bfrank ...

  • dem Failed Request Tracing Log:

tun.

 

  1. Autorisierung mittels URL

Wem das editieren von NTFS-Rechten zu mühsam ist hat eine 2te Alternative die Zugriffsrechte festzulegen, die IIS 7 URL Authorization. Diese Variante ist einfach zu bedienen und Einstellungen lassen sich leicht von einer Maschine zur anderen kopieren. Die Einstellungen "Wer worauf zugreifen darf" stehen in der web.config Datei. Somit ist diese Variante ideal, wenn man z.B. auf einer gehosteten Website nur Zugriff auf die Webinhalte hat nicht aber auf die UI um NTFS Rechte zu ändern. Ein weiterer Vorteil der URL Autorisierung: Sie funktioniert auch für Nicht-Windows Benutzer-Accounts (also Accounts die z.B. in einer ASP.NET Membership DB liegen)

Kurz: Autorisierungsregeln werden auf Basis des URL Pfads und Benutzers anstelle der zugrunde liegenden Dateisystemressource gesetzt.

Diese Variante setzt voraus, dass die "URL Authorization" Option für den IIS installiert wurde.

("Internet Information Services" –>" World Wide Web Services" –> "Security")

Beispiel: Wir erlauben nur Benutzer einer bestimmten Gruppe Zugriff auf einen URL-Pfad

  • Erstelle einen Ordner "secure" in myothersite.
  • Wähle eine Authentifizierungs-Methode für "secure" z.B. Windows Authentication
  • In Authorization Rules:
    • "Allow All Users" löschen.
    • Allow Regel für Gruppe "myothersite authenticated visitors" anlegen.

Die Authentifizierung läuft wie gehabt. Anschließend stell das URL Authorization Modul sicher, dass der Benutzer Zugriffsrechte auf die URL http://localhost:8080/secure/... hat.

Ich würde diese URL Autorisierungsmethode derjenigen mit NTFS Rechten vorziehen, da man die Zugriffsrechte über die IIS Konsole verwalten kann und die Vergabe der Zugriffsrechte auf URL Pfad einfacher nachzuvollziehen ist, als über NTFS Rechte – gerade dann wenn mit virtuellen Verzeichnissen gearbeitet wird (d.h. die Ordner in der URL anders heißen als der Ordner auf dem Laufwerk).

 

Anm.: NTFS Rechte muss der authentifizierte Benutzer dennoch haben um auf Inhalte zuzugreifen, allerdings kann man diese getrost ‚grob' halten weil ja die URL Autorisierung vorgeschaltet ist und eine granularere Zugriffsverwaltung ermöglicht.

 

Was passiert wenn mehrere Authentifizierungsmethoden aktiviert sind?

Werden dem Browser mehrere Authentifizierungsmethoden angeboten kann er entscheiden. Der IE wählt z.B. immer die sicherste Option (also Windows vor Basic Auth) macht aber auch keinen Fallback auf die nächstunsicherere sollte bei der Ersten die Authentifizierung fehlschlagen.

Deshalb macht es meiner Meinung nach keinen Sinn z.B. Basic Authentication und Windows Authentication gleichzeitig zu aktivieren. Denkbar wäre eher die Kombination aus Anonymous Authentication und einer anderen Authentication Methode: Dadurch könnten alle Benutzer auf Inhalte zugreifen auf die die Anonymous User Identity NTFS-Rechte hat und für die Inhalte wo der Anonymous User Identity die Rechte fehlen würde dann eine Authentifizierung gemacht – der Ablauf sieht vereinfacht etwa so aus:

 

Eine Authentifizierung und Autorisierung wie hier beschrieben ist nur eine Facette aus dem Bereich Webserver Sicherheit, deshalb empfehle ich Interessierten noch folgende Links:

 

Links:

Attachment: Auth_User.zip
Comments
  • ich kann nur sagen, Vielen Dank für IIS für Einsteiger Series. Einfach klasse und fantastic. Ich bin nicht deutsch, aber du hast so einfach und klar geschrieben dass ich ohne probleme verstanden.

    Bitte mach weiter.

    Thanks again

    best regards

  • Vielen Dank, der Artikel war meine Rettung!

  • Gute Erklärung.

    Habe vorher viele Seiten gelesen, aber es blieben Fragen offen. Du hast es erhellender erklärt.

    Danke.

  • Es war einfach klasse. Vielen dank

  • Hallo Bernhard,

    vielen Dank für die tollen und anschaulichen Artikel auf diesem Blog. Dennoch eine Frage: Wo bekommt der IUSR seine NTFS Rechte her, wenn er nicht in der Berechtigungsliste eingetragen ist? Wenn ich (ohne AD) in einer IIS 7 Standardinstallation als Rootfolder einer Site  irgendein dafür erstelltes Verzeichnis auf c:\ angebe, welches nur Standardberechtigungen enthält, (Benutzer usw) bekomme ich trotzdem einen anonymen Zugriff. Der Zugriff wird erst gesperrt, wenn ich die lokale Gruppe "Benutzer" aus der Berechtigungsliste lösche. In den lokalen Benutzern kann ich jedoch nur die "Authentifizierten Benutzer" und die "Interaktiv" Gruppe finden. Mir erschließt sich der Zusammenhang nicht. Wo kommt der Zugriff her?

    Hier hatte im IIS Forum jemand bereits vor zwei Jahren die gleiche Frage, welche im Sande verlief:

    forums.iis.net/.../1939873.aspx

    Könntest Du mir vielleicht auf die Sprünge helfen?

    Danke! Gruß, Rainer

    ----

    Hi Rainer,

    ich versuchs mal:-):

    In der Tat ist der IUSR Mitglied der Authenticated Users Gruppe, oder anders gesagt solange sich ein User am System erfolgreich angemeldet hat
    wird er dieser Gruppe automatisch zugeschrieben. Und den IUSR meldet der IIS für Anonyme browsing user an (Dafür verwendet er wahrscheinlich die Methode "LogonUser").

    kuck mal hier rein:
    http://technet.microsoft.com/en-us/magazine/dd637754.aspx
    http://forums.iis.net/t/1147103.aspx

    damit deckt sich das was Du gesehen hast mit dem wie es sein sollte.
    Grüße,
    Bernhard

     

  • Hallo,

    Ich habe noch eine Frage: Kann man gleichzeitig die Basic Auth. und die zertifikatsbasierte Auth. verwenden?

    Beispiel: ActiveSync. In der Migrationsphase soll ein Teil der User mit Basic arbeiten und nach und nach die Benutzer auf Zertifikate umgestellt werden.

    Grüße

    Oliver

     

    ---------------------

    Hallo Oliver,

    (sorry - leider zu spät gesehen)

    hmmm. Client Zertifikatsbasiertes Mapping (http://technet.microsoft.com/en-us/library/cc732996(v=ws.10).aspx) und Basic Auth einzuschalten zu mischen hab ich noch nie gemacht - und wär jetzt nicht meine bevorzugte Variante ;-)

    Erstmal ist das Einrichten von client zert mapping nicht so intuitiv.

    Dann greift das mapping out-of-the-box nur auf site level (siehe: http://blogs.msdn.com/b/saurabh_singh/archive/2009/06/13/avoid-this-confusion-around-client-certificate-mapping-in-iis-6-0-7-0.aspx)

    wenn man unbedingt möchte dann würde ich 2 websites aufsetzen (die auf den gleichen inhalt verweise) aber auf der einen Basic und auf der anderen Client Cert based mapping machen + evtl. noch eine Redirect rule eintragen (auf beiden websites) die die Clients auf die richtige website verteilt.

    schwierigeres Thema.

    hth,

    Bernhard

     

     

  • Super Blog. Eine Stunde bei YouTube gesucht, aber nichts gefunden. Der Blog hat mir wirklich geholfen

  • Besten Dank für den ausführlichen Einstieg in das Thema!

  • Hallo, Ich habe auch eine Frage: Ich habe eine Datei (www.name.com/datei/name.exe) Ein Link auf www.name.com/index.php zeigt auf diese Textdatei. Wie kann ich nun verhindern, dass User die Datei lesen können, ohne von der index.php gekommen zu sein (zb. durch ein lesezeichen) Die Seite soll aber unter anonymer Authentifizierung laufen. Danke für deine/eure Hilfe!

    ----

    Hi,

    wenn ich das richtig verstanden habe, dann soll eine Datei / URL nur dann aufgerufen werden können wenn ich vorher auf der index.php war?

    Das sollte mit dem URL Rewrite Modul gehen da kann man Regeln für URLs eintragen die auswerten können woher der Browser (der schickt das nämlich normalerweise mit "http referer") vorher kam. So wird z.B. auch gerne verhindert dass Betreiber anderer Websites einfach Ressourcen anderer Websites verlinken ("Image Hotlinking"). Siehe dazu:

    http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/  -> Tipp 6

    http://forums.iis.net/t/1189057.aspx

    hth,

    Bernhard

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment