Zum Inhalt springen

Verzeichnisschutz mit mod_auth einrichten

Basic Auth über .htaccess und .htpasswd einrichten, Ausnahmen für einzelne Dateien definieren, IP-Freigaben kombinieren - und die Grenzen, die Basic Auth hat.

Zuletzt geprüft: Gedacht für: Staging-Umgebungen und Adminbereiche

Das Wichtigste

  • Basic Auth überträgt Benutzername und Passwort base64-kodiert, nicht verschlüsselt. Ohne HTTPS ist der Schutz wertlos.
  • Die .htpasswd gehört außerhalb des Dokumentwurzelverzeichnisses. Liegt sie im Webroot, ist sie ohne zusätzliche Regel abrufbar.
  • Apache 2.4 nutzt Require. Die alte Kombination aus Order, Allow und Satisfy stammt aus 2.2 und wird nur mit mod_access_compat noch verstanden.
  • Ein geschütztes Verzeichnis blockt auch Crawler, Monitoring und Deploy-Hooks. Ausnahmen gehören explizit definiert.

Ein Verzeichnisschutz ist in zwei Minuten eingerichtet und wird trotzdem regelmäßig falsch gebaut. Die drei häufigsten Fehler: Passwortdatei im Webroot, kein HTTPS, und ein Schutz, der versehentlich auch den Zertifikats-Check blockiert.

Passwortdatei anlegen

# bcrypt statt MD5, Datei neu anlegen
htpasswd -Bc /var/www/secure/.htpasswd redaktion

# weiteren Benutzer ergaenzen (ohne -c, sonst wird die Datei ueberschrieben)
htpasswd -B /var/www/secure/.htpasswd technik

Das -c legt die Datei neu an und löscht dabei den bisherigen Inhalt. Beim zweiten Benutzer weglassen.

Der Ablageort liegt bewusst außerhalb des Webroots. Wenn dein Hoster das nicht zulässt, muss die Datei zusätzlich per Regel gesperrt werden:

<Files ".htpasswd">
  Require all denied
</Files>

Schutz aktivieren

AuthType Basic
AuthName "Interner Bereich"
AuthUserFile /var/www/secure/.htpasswd
Require valid-user

AuthName ist der Text im Browserdialog. Er wird übertragen, also nichts hineinschreiben, was nicht öffentlich sein soll.

Einzelne Dateien freigeben

Ein komplett geschütztes Verzeichnis blockiert auch automatisierte Zugriffe. Der häufigste Stolperstein ist die ACME-Validierung: Let’s Encrypt legt eine Datei unter /.well-known/acme-challenge/ ab und ruft sie ohne Anmeldung ab. Steht davor ein Basic Auth, schlägt jede Zertifikatserneuerung fehl.

<IfModule mod_authz_core.c>
  <Files "webhook.php">
    Require all granted
  </Files>
</IfModule>

<Location "/.well-known/acme-challenge/">
  Require all granted
</Location>

Location ist in einer .htaccess nicht erlaubt. Wenn du keinen Zugriff auf den VirtualHost hast, hilft stattdessen eine eigene .htaccess im Challenge-Verzeichnis mit Require all granted.

IP-Freigabe und Passwort kombinieren

Bürozugriff ohne Passwort, alles andere mit:

AuthType Basic
AuthName "Interner Bereich"
AuthUserFile /var/www/secure/.htpasswd

<RequireAny>
  Require ip 203.0.113.0/24
  Require valid-user
</RequireAny>

RequireAny heißt: eine der Bedingungen genügt. Mit RequireAll müssten beide zutreffen, also Passwort und passende IP. In Apache 2.2 leistete das Satisfy Any; taucht das in einer alten Anleitung auf, ist die Anleitung mindestens zehn Jahre alt.

Was Basic Auth nicht kann

Es gibt keine Sperre nach Fehlversuchen, keine Sitzung und keine Abmeldung im eigentlichen Sinn. Der Browser sendet die Zugangsdaten bei jedem Request erneut mit, base64-kodiert. Base64 ist eine Kodierung, keine Verschlüsselung, das lässt sich in einer Zeile zurücklesen. Ohne HTTPS steht das Passwort damit im Klartext im Netz.

Als Schutz für eine Staging-Umgebung, ein Testsystem oder ein Verzeichnis mit internen Dateien ist Basic Auth genau richtig. Als Zugangskontrolle für eine Anwendung mit echten Benutzerkonten reicht es nicht.

Gegenprüfen

# ohne Zugangsdaten: erwartet 401
curl -sI https://example.com/intern/ | head -1

# mit Zugangsdaten: erwartet 200
curl -sI -u redaktion https://example.com/intern/ | head -1

# Ausnahme muss ohne Login erreichbar bleiben
curl -sI https://example.com/.well-known/acme-challenge/test | head -1

Wichtig ist die dritte Zeile. Ein Verzeichnisschutz, der drei Monate später die Zertifikatserneuerung verhindert, fällt genau dann auf, wenn das Zertifikat abläuft.

Häufige Fragen

Wie erzeuge ich eine .htpasswd ohne Shell-Zugang?

Mit dem Kommando htpasswd lokal auf dem eigenen Rechner und anschliessendem Upload. Die Datei ist reiner Text im Format benutzer:hash. Verwende bcrypt (Option -B), MD5 gilt seit Jahren als überholt.

Kann ich einzelne Dateien vom Schutz ausnehmen?

Ja, mit einem FilesMatch-Block und Require all granted innerhalb des geschützten Bereichs. Typischer Fall sind Webhook-Endpunkte oder die Datei für die Domainvalidierung von Let us Encrypt.

Warum fragt der Browser nach dem Login immer wieder nach?

Meist stimmt der Pfad zur .htpasswd nicht. AuthUserFile erwartet einen absoluten Serverpfad, keinen relativen und keine URL. Der korrekte Pfad steht in der phpinfo unter DOCUMENT_ROOT, das Verzeichnis darüber ist der übliche Ablageort.

Ist Basic Auth für produktive Adminbereiche geeignet?

Als zusätzliche Hürde vor einem Login ja, als alleiniger Schutz nein. Es gibt keine Sperre nach Fehlversuchen, kein zweiter Faktor und keine Sitzungsverwaltung. Für produktive Bereiche gehört eine richtige Authentifizierung in die Anwendung.