de.comp.lang.php.* FAQ

12.6. Apache: Wie kann ich ein Verzeichnis mit einem Passwort schützen?

Antwort von Kristian Köhntopp

Die Konfiguration des Webservers ist auch noch einmal ausführlich im Handbuch zum Apache Webserver beschrieben. Philipp Imhof hat auf seinem Webserver ein Script installiert, dass eine an den jeweiligen Beispielfall angepasste Anleitung erstellt.

Im einfachsten Fall verwendet man HTTP Basic Authentication. Dazu ist mit dem Apache-Programm htpasswd eine Passwortdatei anzulegen, die die Benutzernamen und Passworte enthält. Optional kann man auch eine Gruppendatei anlegen, die pro Zeile den Namen einer Benutzergruppe und, durch einen Doppelpunkt getrennt, die Benutzer in dieser Gruppe enthält.

kris@valiant:~/www/kris.koehntopp.de > htpasswd -c etc/htpasswd kris
New password: test
Re-type new password: test
Adding password for user kris
kris@valiant:~/www/kris.koehntopp.de > htpasswd etc/htpasswd marit
New password: test
Re-type new password: test
Adding password for user marit
kris@valiant:~/www/kris.koehntopp.de > echo "users: kris marit" >>
etc/htgroup

Die Option -c steht dabei für create; die Passwortdatei wird neu angelegt. Ohne die Option werden Benutzer zu einer existierenden Passwortdatei zugefügt bzw. die Passworte existierender Benutzer werden geändert. Im Beispiel wird weiterhin eine Gruppe users angelegt, der die Benutzer kris und marit angehören.

Ein Verzeichnis kann man nun durch das Anlegen einer .htaccess-Datei schützen (dazu muss AllowOverride AuthConfig in der httpd.conf für dieses Verzeichnis gesetzt sein) oder indem man die entsprechenden Konfigurationsanweisungen direkt in einen <Directory>-Block für dieses Verzeichnis in die httpd.conf einsetzt. Im einfachsten Fall sind dies die Anweisungen:

AuthType Basic
AuthName MyRealm
AuthUserFile /home/www/servers/www.koehntopp.de/etc/htpasswd
AuthGroupFile /home/www/servers/www.koehntopp.de/etc/htgroup

require valid-user

Die Anweisung AuthType legt fest, auf welche Weise der Browser das Passwort übermittelt - bei der sehr unsicheren Basic-Authentication wird es nahezu im Klartext übertragen. Für den zu schützenden Bereich muss mit AuthName ein Name festgelegt werden. Die Direktiven AuthUserFile/ und AuthGroupFile legen die Datenquellen für die Authentisierung fest.

Damit ein Anwender den geschützten Bereich betreten kann, muss er die in der require-Anweisung geforderten Bedingungen erfüllen. Im einfachsten Fall muss er einfach nur in der htpasswd-Datei stehen und das passende Passwort wissen. Dies ist der Fall bei require valid-user. Mit komplizierteren Anweisungen kann man den Zutritt auch noch auf bestimmte Gruppen (require group users) oder auf bestimmte Benutzer (require user kris) einschränken.

In CGI PHP hat man in einem auf diese Weise geschützten Bereich Zugriff auf den Benutzernamen in der Variablen $_SERVER["REMOTE_USER"] und die verwendete Authentisierungsmethode in $_SERVER["AUTH_TYPE"].

<?php
echo "AUTH_TYPE = ", $_SERVER['AUTH_TYPE'], "<br />\n";
echo "REMOTE_USER = ", $_SERVER['REMOTE_USER'], "<br />\n";
?>

Im Apache-Modul hat man in einem geschützten Bereich außerdem Zugriff auf die vollen Authentisierungsdaten.

<?php
echo "AUTH_TYPE = ", $_SERVER['AUTH_TYPE'], "<br />\n";
echo "REMOTE_USER = ", $_SERVER['$REMOTE_USER'], "<br />\n";
$a = getallheaders();
$au = split(" ", $a["Authorization"], 2);
list($u, $p) = split(":", base64_decode($au[1]));
echo "Decodiert zu User $u, Password $p<br />\n";

Valid HTML 4.01! Valid CSS!

12.6. Apache: Wie kann ich ein Verzeichnis mit einem Passwort schützen?
http://www.php-faq.de/q/q-apache-passwort.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team