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.
Das Wichtigste
- Basic Auth überträgt Benutzername und Passwort base64-kodiert, nicht verschlüsselt. Ohne HTTPS ist der Schutz wertlos.
- Die
.htpasswdgehört außerhalb des Dokumentwurzelverzeichnisses. Liegt sie im Webroot, ist sie ohne zusätzliche Regel abrufbar. - Apache 2.4 nutzt
Require. Die alte Kombination ausOrder,AllowundSatisfystammt aus 2.2 und wird nur mitmod_access_compatnoch 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.
Weiterlesen
- .htaccess: Der vollständige Praxisleitfaden
Aufbau, Reihenfolge der Direktiven, Rewrite-Engine, Fehlerseiten, Zugriffsschutz und Caching - mit den Fallen, die erst live auffallen.
- SSL-Zertifikat einrichten und automatisch erneuern
Let's Encrypt per ACME, Wildcard-Zertifikate, HSTS und die typischen Mixed-Content-Reste nach der Umstellung.
- 301-Weiterleitungen richtig schreiben
Redirect, RedirectMatch und RewriteRule im Vergleich, Endlosschleifen vermeiden, Query-Strings erhalten, Domainwechsel sauber abbilden.
- RegEx-Grundlagen für Apache-Regeln
Anker, Zeichenklassen, Gruppen und Backreferences - genau der Ausschnitt, den RewriteRule und RedirectMatch tatsächlich brauchen.