Christian Seiler: HTTP Digest Authentication mit dem Apache-Webserver

Beitrag lesen

Hallo!

Beim normalen Verfahren liegen die in der ".htaccess" und ".htuser".
Wo wird die Liste mit den Usern beim DAA angegeben?

Im Prinzip genauso, wenn auch der Apache verlangt, dass die Passwörter in einem speziellen Format vorliegen in der .htuser (oder wie Du die Datei auch nennst) liegen - siehe unten.

Folgende Konfiguration für den Apache 1.3 oder 2.0 aktiviert Digest Auth (entsprechendes Modul im Apachen vorausgesetzt):

AuthType Digest  
AuthName "Geheim"  
AuthDigestDomain /pfad/wo/du/bist  
AuthDigestFile /pfad/zu/.htusers  
Require valid-user  
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

Zur Erklärung:

AuthType Digest

Digest statt Basic, sollte einleuchten.

AuthName "Geheim"

Genauso wie bei Basic.

AuthDigestDomain /pfad/wo/du/bist

Das ist etwas komplizierter und hängt mit den Interna des Digest-Auth-Algorithmusses zusammen. Im einfachsten Fall gibst Du da einfach den serverrelativen URI an, unter dem Dein geschützter Bereich zu erreichen ist, d.h. wenn Du unter http://example.com/privat/ den geschützten Bereich erreichen kannst, dann gibst Du AuthDigestDomain /privat an.

AuthDigestFile /pfad/zu/.htusers

Das ist wieder ganz analog zu Basic Auth, nur, dass die Direktive AuthDigestAuth heißt.

Require valid-user

Genauso wie Basic Auth, Du kannst hier selbstverständlich auch sowas machen wie Require user bob oder was weiß ich - das gleiche was auch mit Basic Auth funktioniert.

BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

Das sorgt dafür, dass das auch mit dem IE funktioniert, weil der IE vor Version 7 zu blöd[tm] ist, Digest Auth korrekt umzusetzen.

Der eigentliche Witz ist nun, dass die .htuser oder wie Du die Datei auch nennst anders aussehen muss für Digest Auth. Dafür gibt's (das wird mit dem Apache mitgeliefert) ein Utility namens »htdigest« (ähnlich wie »htpasswd«). Zusätzlich zu Benutzername und Passwort benötigt man bei Digest Auth vorab bereits den Namen, der auch bei AuthName steht. Sprich: Wenn Du bei AuthName "Geheim" angegeben hast, dann benötigst Du dies ebenfalls um die Datei anzulegen.

Auf der Kommandozeile kannst Du nun folgendes eingeben, um zum Beispiel einen User mit dem Namen 'testuser' für den Bereich 'Geheim' anzulegen:

Für den ersten User:

htdigest -c dateiname "Geheim" testuser

Für alle weiteren User:

htdigest dateiname "Geheim" weitereruser

Dort wirst Du dann auch nach dem Passwort gefragt.

Wenn Du die Datei manuell anlegen willst: Das Format ist folgendes:

username:realm:passwort

Wobei username der Benutzername ist, realm der Name des Bereich (also das was bei AuthName steht, nur ohne Anführungszeichen).

Das kodierte Passwort ergibt sich aus MD5(username + ':' + realm + ':' + passwort_im_klartext). Wenn Du also manuell einen User 'hans' mit dem Passwort 'peter' anlegen willst und Deinen geschützen Bereich "Interner Bereich" genannt hast (AuthName), dann ergibt sich folgende Zeile für Deine .htuser:

hans:Interner Bereich:4fdd2d83a738c81bfa575148c78e6c7c

Wobei 4fdd2d83a738c81bfa575148c78e6c7c nichts anderes ist als MD5('hans:Interner Bereich:peter') in Hex-Darstellung.

Für Apache 2.2 brauchst Du (weil sich dort einiges zu Authentifizierung und Authorisierung geändert hat) eine etwas andere Konfiguration - die .htuser-Datei bleibt aber gleich:

AuthType Digest  
AuthName "Geheim"  
AuthDigestDomain /pfad/wo/du/bist  
AuthDigestProvider file  
AuthUserFile /pfad/zu/.htusers  
Require valid-user  
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

Beachte bitte, dass Digest Auth nicht wirklich gut unterstützt wird (MD5-sess wird zum Beispiel weder vom Apache noch von irgend einem mir bekannten Browser korrekt umgesetzt) und dass man zum Beispiel für den IE < 7 eben diesen "Hack" braucht, damit es überhaupt funktioniert.

Als Alternative zu Digest Auth (ich nehme an, Du willst nicht, dass User + Passwort im Klartext über die Leitung wandern) bietet sich übrigens SSL + Basic Auth an, das macht zumindest in den Browsern selbst keine Probleme.

Viele Grüße,
Christian