Apache/09 Zugriff/Digest-Authentifizierung
9.3 Digest-Authentifizierung
Eine Schwachstelle der Basic-Authentifizierung ist ganz klar die Tatsache, dass die Anmeldedaten im Klartext über das Internet geschickt werden. Genauer gesagt, werden sie base64-codiert übertragen, damit das Passwort beliebige Sonderzeichen enthalten kann - ein Beispiel, wie dies hinter den Kulissen aussieht, finden Sie in Kapitel 2, Funktionsweise von Webservern.
Erheblich sicherer ist die Digest-Authentifizierung: Bei dieser Variante werden keine Klartextinformationen übertragen, sondern ein MD5-Hash, der aus den Anmeldedaten erzeugt wird. Genauer gesagt, sendet der Server eine genau einmal gültige Zeichenfolge namens Nonce an den Client. Dieser verschlüsselt die Anmeldedaten damit und sendet das Ergebnis zurück. Die Originaldaten lassen sich daraus nicht mehr ermitteln, sodass man von einer sicheren Authentifizierungsmethode sprechen kann. Das einzige Problem besteht darin, dass nicht nur der Webserver, sondern auch der Client diese Methode unterstützen muss. Das ist leider noch immer nicht bei allen Browsern der Fall, aber zumindest aktuelle Versionen der folgenden Browser können mit der Digest-Authentifizierung umgehen:
- Mozilla Firefox
- Google Chrome
- Microsoft Internet Explorer
- Opera
- Apple Safari
Der Internet Explorer kommt nur dann mit der Digest-Authentifizierung zurecht, wenn die URL einer GET-Anfrage keinen Query-String (Formulardaten nach einem Fragezeichen) enthält. Für echte Webformulare besteht die einfachste Lösungsmöglichkeit in der Verwendung der Versandmethode POST. Falls Sie dagegen in einer Webanwendung auf das manuelle Erstellen eines Query-Strings in Zusammenhang mit der Digest-Authentifizierung angewiesen sind, können Sie seit Apache 2.0.51 die spezielle Umgebungsvariable AuthDigestEnableQueryStringHack setzen:
BrowserMatchNoCase "msie" AuthDigestEnableQueryStringHack=On
BrowserMatchNoCase vergleicht den Wert des Anfrage-Headers User-Agent, also die Selbstidentifikation des Client-Browsers, ohne Berücksichtigung von Großund Kleinschreibung mit dem angegebenen String-Wert. Falls dieser in dem Header vorkommt, erfolgt die als Nächstes angegebene Variablendefinition. Näheres über diese und andere Konfigurationsdirektiven für Umgebungsvariablen erfahren Sie in Kapitel 14, CGI.
Für die Digest-Authentifizierung wird eine spezielle Datei mit Benutzernamen und Passwörtern verwendet. Sie wird - je nach eingestelltem Provider - mithilfe der bereits behandelten Direktive AuthUserFile oder mittels AuthDBMUserFile
Digest-Authentifizierung 9.3
(siehe Abschnitt 9.4, Benutzer- und Passwortverwaltung in DBM-Dateien) eingebunden.
9.3.1 Das Tool htdigest
Zum Lieferumfang von Apache 2 gehört ein Programm namens htdigest, das zur Erzeugung von Textdateien mit Digest-Benutzerdaten dient. Es funktioniert ähnlich wie htpasswd und erzeugt ebenfalls Textdateien, in denen die Anmeldeinformationen gespeichert werden. In einer solchen Datei hat jede Zeile das folgende Format:
Username:Realm:Passwort
In htdigest gibt es erheblich weniger Optionen als bei htpasswd, weil es keine unterschiedlichen Arten der Verschlüsselung gibt, in denen die Daten gespeichert werden könnten. Die Syntax des Befehls ist daher folgende:
- htdigest [-c] Benutzerdatei Realm Benutzername
- -c: Wenn Sie diese zusätzliche Option angeben, wird die Datei neu erstellt.
Falls sie bereits existiert, werden ihre bisherigen Inhalte vernichtet.
- Benutzerdatei: Das ist der Pfad der Datei, in der die Anmeldedaten gespeichert werden. Wenn Sie einen relativen Pfad angeben, wird er zur ServerRoot
in Beziehung gesetzt. Es sollte noch einmal betont werden, dass auch diese Datei nichts innerhalb der DocumentRoot verloren hat.
- Realm: Der Authentifizierungsbereich (Realm) muss mit angegeben werden, weil er in die Digest-Berechnung mit einbezogen wird. Soll sich ein Benutzer
in verschiedenen Realms anmelden können, müssen Sie mehrere Einträge für ihn erzeugen.
- Benutzername: Hier wird wie üblich der Benutzername angegeben. Falls die
verwendete Kombination aus Benutzernamen und Realm bereits existiert, wird sie überschrieben. Andernfalls wird ein neuer Eintrag erzeugt.
Das folgende Beispiel zeigt zwei Aufrufe von htdigest. Bei der ersten Ausführung wird die Datei .htdigest neu angelegt, beim zweiten Mal wird ein weiterer Benutzer darin gespeichert:
- htdigest -c /usr/local/apache2/misc/.htdigest \
"Top Secret" htadmin Adding password for htadmin in realm Top Secret. New password: ****** Re-type new password: ******
- htdigest /usr/local/apache2/misc/.htdigest \
"Top Secret" htmaster Adding password for htmaster in realm Top Secret. New password: ****** Re-type new password: ******
Die entsprechende Datei sieht nach der Ausführung der beiden Befehle etwa so aus:
htadmin:Top Secret: 146715483de2df7c16642ab140c040ebee1222268245e7 htmaster:Top Secret:d6ee3dc100c555835c4c8b3b09f7d3b9
Auch für die Digest-Authentifizierung können Sie übrigens Gruppendateien erstellen. Diese werden mit AuthGroupFile (oder, je nach Provider-Modul, auch mit anderen Direktiven) eingebunden.
9.3.2 Direktiven zur Digest-Authentifizierung
In diesem Abschnitt werden die Konfigurationsdirektiven des Moduls mod_auth_ digest beschrieben.
AuthDigestProvider Provider-Modul für die Datenquelle der Digest-Authentifizierung
Seit Version 2.1-beta Modul mod_auth_digest Kontext <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax AuthDigestProvider Provider [Provider ...] Standardwert file
Diese Direktive wählt das Provider-Modul aus, das die Vergleichsdaten für die Überprüfung der Digest-Authentifizierung liefern soll. Syntax und Funktionalität entsprechen der weiter oben behandelten Direktive für die Basic-Authentifizierung. Als Digest-Provider kommen nur drei der zum Lieferumfang gehörenden Provider-Module infrage:
- mod_authn_file - aktiviert durch den Wert file (Standard)
- mod_authn_dbm - Die zugehörige Provider-Angabe lautet dbm.
- mod_authn_dbd - mit dem Providernamen dbd
Die Dateien mit Benutzerinformationen werden entsprechend mittels AuthUserFile beziehungsweise der in Abschnitt 9.4, Benutzer- und Passwort
Digest-Authentifizierung 9.3
verwaltung in DBM-Dateien, behandelten Direktive AuthDBMUserFile angegeben.
Das folgende Gesamtbeispiel verwendet die weiter oben mittels htdigest erzeugte Textdatei:
<Directory /usr/local/apache2/htdocs/topsecret> AuthType Digest AuthDigestProvider file AuthName "Top Secrect" AuthUserFile /usr/local/apache2/misc/.htdigest Require user htadmin htmaster </Directory>
AuthDigestAlgorithm Zu verwendender Algorithmus für Digest-Authentifizierung
Modul mod_auth_digest Kontext <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax AuthDigestAlgorithm MD5 | MD5-sess Standardwert MD5
Diese Direktive gibt das Verfahren an, nach dem die Digest-Werte für die HTTPAnfragen und -Antworten berechnet werden. Der in Entwicklung befindliche MD5-sess-Algorithmus arbeitet Session-basiert - die Werte aufeinanderfolgender HTTP-Transaktionen beeinflussen einander gegenseitig. Zurzeit müssen Sie noch die Voreinstellung MD5 beibehalten, da es noch keine korrekt arbeitende MD5sess-Implementierung gibt; das geht durch schlichtes Weglassen der Direktive am einfachsten.
AuthDigestDomain Legt einen gemeinsamen Digest-Authentifizierungsbereich fest.
Modul mod_auth_digest Kontext <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax AuthDigestDomain URI [URI ...] Standardwert nicht gesetzt
Sie können eine oder mehrere URIs beziehungsweise vollständige URLs angeben, für die dieselben Anmeldedaten (Benutzername und Realm) gelten sollen.
Es ist empfehlenswert, diese Angabe selbst dann zu machen, wenn alle URLs, für die die entsprechenden Authentifizierungsinformationen gelten, unter einer gemeinsamen Verzeichniswurzel liegen. Dies hindert den Client nämlich daran, die Daten auch dann zu berechnen und mitzuschicken, wenn ungeschützte Ressourcen auf demselben Server aufgerufen werden.
Umgekehrt können Sie als Argumente für AuthDigestDomain sogar URLs angeben, die auf unterschiedlichen Hosts liegen - manche Browser unterstützen dies und fragen bei einem Wechsel auf einen anderen der angegebenen Server nicht erneut nach Benutzername und Passwort. Beispiele:
AuthDigestDomain /topsecret AuthDigestDomain /topsecret /info/topsecret AuthDigestDomain https://www.mynet.de/secret \ https://order.mynet.de/private
Im Gesamtzusammenhang sieht die Verwendung dieser Direktive beispielsweise so aus:
<Directory /usr/local/apache2/htdocs/topsecret> AuthType Digest AuthDigestProvider file AuthName "Top Secrect" AuthDigestDomain /topsecret AuthUserFile /usr/local/apache2/misc/.htdigest Require user htadmin htmaster </Directory>
AuthDigestNonceLifetime Geltungsdauer des Nonce-Werts
Modul mod_auth_digest Kontext <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax AuthDigestNonceLifetime Sekunden Standardwert 300
Diese Direktive legt fest, wie lange der vom Server gesendete Nonce-Wert gültig bleibt. Wenn die Anmeldung des Clients erst nach Ablauf dieser Zeit eintrifft, akzeptiert der Server sie nicht mehr und sendet erneut eine Meldung mit dem Statuscode 401 Authorization Required. Ein kleinerer Wert verbessert zwar die Sicherheit, kann aber gleichzeitig dazu führen, dass die Anmeldedaten nicht rechtzeitig eintreffen. Deshalb sollten Sie in der Regel keinen kleineren Wert als 10 Sekunden angeben. Ein negativer Wert bedeutet übrigens, dass der Nonce keine maximale Lebensdauer besitzen soll.
Digest-Authentifizierung 9.3
AuthDigestShmemSize Größe des Shared-Memory-Bereichs für Digest-Authentifizierung
Modul mod_auth_digest Kontext Server Syntax AuthDigestShmemSize Größe Standardwert 1000
mod_auth_digest verwendet ein Shared-Memory-Segment, um Informationen über einen Client über mehrere Anfragen hinweg zu speichern. Mit der Direktive AuthDigestShmemSize, die im Server-Kontext stehen muss und somit für sämtliche Einstellungen zur Digest-Authentifizierung insgesamt gilt, wird die Größe dieses Speicherbereichs angegeben. Wenn Sie eine einfache Zahl verwenden, wird sie als Byte-Wert interpretiert. Alternativ können Sie einen der Buchstaben K oder M hinter die Zahl schreiben, damit sie als Kilobyte beziehungsweise Megabyte gilt. Beispiele:
AuthDigestShmemSize 10000 AuthDigestShmemSize 128K AuthDigestShmemSize 4M
Um herauszufinden, wie groß der Wert auf Ihrem System sein muss, können Sie ihn auf 0 setzen und Apache neu starten - der Start schlägt fehl, aber eine Fehlermeldung gibt die erforderliche Größe für einen Client an.
AuthDigestQop Quality-of-Protection bei der Digest-Authentifizierung
Modul mod_auth_digest Kontext <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax AuthDigestQop none | auth | auth-int [auth | auth-int] Standardwert auth
Diese Direktive sorgt dafür, dass Sie die Wahl zwischen verschiedenen konkreten Digest-Authentifizierungsverfahren haben: auth überprüft nur die Anmeldedaten, während auth-int zusätzlich einen MD5-Hash des Body-Inhalts berechnet, um dessen Integrität zu prüfen. Wenn beide Werte angegeben werden, wird die Auswahl dem Browser überlassen. Für ältere, inkompatible Clients gibt es auch noch den Wert none, der für eine Digest-Authentifizierung gemäß RFC 2069 sorgt. Beachten Sie, dass auth-int zurzeit noch nicht implementiert ist.
AuthDigestNcCheck Legt fest, ob der Nonce-Zähler des Servers überprüft wird.
Modul mod_auth_digest Kontext Server Syntax AuthDigestNcCheck On|Off Standardwert Off
Diese Direktive ist vorgesehen, aber noch nicht implementiert. Sie soll in Zukunft dafür sorgen, dass überprüft wird, ob der Nonce bereits für einen Anmeldeversuch verwendet wurde. Dies schließt aus, dass ein Cracker versuchen könnte, sich mit gestohlenen Anmeldedaten Zugang zu verschaffen.
AuthDigestNonceFormat Bestimmt, wie der Nonce-Count berechnet wird.
Modul mod_auth_digest Kontext <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax AuthDigestNonceFormat Format Standardwert nicht gesetzt
Auch diese Direktive ist noch nicht implementiert. Da RFC 2617 nicht vorschreibt, welches Format der Nonce haben soll, soll sie in Zukunft die Auswahl eines gewünschten Formats ermöglichen.