Security

.htaccess-Passwortschutz: Verzeichnis mit einem Passwort sperren

· 3 Min. Lesezeit

Für eine Staging-Umgebung, ein Kundenverzeichnis oder einen Bereich, der noch nicht öffentlich sein soll, ist die Basisauthentifizierung von Apache immer noch der schnellste Weg. Zwei Dateien, keine Software, keine Datenbank.

Wie es funktioniert#

Es sind immer zwei Dateien:

  • .htaccess — sagt Apache, dass hier ein Passwort verlangt wird, und wo die Nutzerliste liegt.
  • .htpasswd — enthält Benutzername und Passwort-Hash, eine Zeile je Nutzer.

Die .htaccess in das zu schützende Verzeichnis:

`` AuthType Basic AuthName "Interner Bereich" AuthUserFile /vollstaendiger/pfad/zu/.htpasswd Require valid-user ``

Vier Zeilen, und eine davon ist die Fehlerquelle: AuthUserFile braucht den absoluten Serverpfad, nicht die Adresse und nicht den relativen Pfad. Also /var/www/vhosts/deinedomain.de/.htpasswd, nicht /.htpasswd. Den Pfad findest du im Hosting-Panel oder über eine PHP-Datei mit echo __DIR__;.

Der Schutz gilt für das Verzeichnis und alle darunter.

Die .htpasswd erzeugen — und woher der Hash kommt#

Der Inhalt sieht so aus:

`` redaktion:$apr1$k3nJ2q9x$8fTv1oQ3nZ5mW0pLd2xYb. ``

Benutzername, Doppelpunkt, Hash. Das Passwort steht dort nie im Klartext.

Auf dem Server, wenn du eine Shell hast:

`` htpasswd -c /pfad/zu/.htpasswd redaktion ``

Das -c legt die Datei neu an und überschreibt eine vorhandene. Für jeden weiteren Nutzer ohne -c.

Ohne Shell, mit PHP — eine Datei anlegen, aufrufen, danach löschen:

``php <?php echo password_hash('DeinPasswort', PASSWORD_BCRYPT); ``

Apache versteht bcrypt seit Version 2.4. Für ältere Server ist crypt oder das Apache-eigene $apr1$ nötig.

Und jetzt der Punkt, um den es hier eigentlich geht: Es gibt Dutzende Webseiten, die dir einen .htpasswd-Hash erzeugen. Sie funktionieren. Aber du tippst dein Passwort in ein fremdes Formular, das es zur Erzeugung im Klartext braucht — und du hast keine Möglichkeit zu prüfen, ob es dort protokolliert wird.

Für ein Wegwerf-Passwort auf einer Testinstallation mag das vertretbar sein. Für alles andere: erzeuge den Hash selbst. Die PHP-Zeile oben ist drei Sekunden Arbeit und verlässt deinen Server nicht.

Die .htpasswd selbst schützen#

Die Datei enthält Hashes, nicht Klartext — aber Hashes lassen sich angreifen, und der Dateiname ist bekannt.

Am besten außerhalb des Web-Wurzelverzeichnisses ablegen. Dann ist sie über den Browser gar nicht erreichbar. Geht das nicht, in die .htaccess:

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

Auf Apache 2.2 hieß das noch Order allow,deny / Deny from all. Wer beide Fassungen mischt, bekommt einen 500er.

Was dieser Schutz taugt — und was nicht#

Er taugt für den Zweck, für den er gedacht ist: einen Bereich vor Zufallsbesuchern und Suchmaschinen verschließen. Eine passwortgeschützte Staging-Umgebung erscheint nicht in der Suche, und das ist der halbe Grund, sie zu schützen — sonst konkurriert sie mit der echten Seite um dieselben Inhalte.

Er taugt nicht als ernsthafte Zugangskontrolle für sensible Daten:

  • Ohne HTTPS gehen Name und Passwort im Klartext über die Leitung. Basisauthentifizierung ist nur mit TLS vertretbar — ob deins sauber sitzt, prüft der Security-Scan.
  • Es gibt keine Sperre nach Fehlversuchen. Wer raten will, kann das beliebig oft tun, es sei denn, davor sitzt etwas, das mitzählt.
  • Der Browser merkt sich die Anmeldung bis zum Schließen; ein Abmelden ist nicht vorgesehen.

Für WordPress-Anmeldeseiten ist das trotzdem eine wirksame zusätzliche Hürde: Ein /wp-login.php hinter Basisauthentifizierung nimmt automatisierten Anmeldeversuchen die Grundlage, bevor PHP überhaupt startet. Das ist einer der Punkte aus WordPress vor Hacking schützen.

Auf nginx gibt es das auch#

Dort heißt es auth_basic und auth_basic_user_file, steht in der zentralen Konfiguration statt in einer Datei im Verzeichnis — und die .htpasswd hat dasselbe Format. Wer eine .htaccess auf einen nginx-Server legt, wundert sich sonst, warum nichts passiert; die Datei wird dort schlicht nicht gelesen. Welcher Server bei dir läuft, sagt der Tech-Stack-Check.