Webserver/htaccess/Passwortschutz

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[Bearbeiten] Verzeichnisse und Dateien mit Passwort schützen

.htaccess-Dateien sind verzeichnisspezifisch. Speichern Sie die .htaccess-Datei also in demjenigen Verzeichnis ab, in dem die zu schützenden Daten liegen. Sie können wahlweise das ganze Verzeichnis mit all seinen Unterverzeichnissen oder nur bestimmte Dateien oder Dateitypen schützen. Sie können den Passwortschutz außerdem wahlweise für einzelne Benutzer oder für ganze Benutzergruppen einrichten. Auch Kombinationen beider Formen sind möglich. Damit der Verzeichnisschutz mit Passwort funktioniert, genügt die .htaccess-Datei alleine allerdings nicht. Sie brauchen zusätzlich eine Datei, in der die Benutzernamen und die zugehörigen Passwörter stehen. Falls Sie mit Benutzergruppen arbeiten, benötigen Sie außerdem noch eine Datei, in der die Benutzergruppen definiert werden. Auch diese beiden anderen Dateien werden mit einem beliebigen Texteditor erstellt.

Beispiel: .htaccess-Datei
# .htaccess-Datei für Web-Verzeichnis /service
AuthType Basic
AuthName "Service-Bereich"
AuthUserFile /usr/verwaltung/web/.htusers
AuthGroupFile /usr/verwaltung/web/.htgroups
Require user  Werner Dieter Heidi
Require group Servicetechniker

Die erste Zeile der Beispieldatei ist lediglich ein Kommentar. Solche Kommentarzeilen müssen mit dem Gatterzeichen # eingeleitet werden. Alle anderen Zeilen haben einen einheitlichen Aufbau: Sie beginnen mit Schlüsselwörtern (den eigentlichen Anweisungen), und dahinter folgen, durch ein oder mehrere Leerzeichen getrennt, Angaben dazu. Leerzeilen, die die Lesbarkeit verbessern, sind erlaubt, werden aber vom Webserver ignoriert. Zeilen mit Angaben, die der Webserver nicht interpretieren kann, führen jedoch grundsätzlich zu einem "Internal Server Error" (HTTP-Status-Code 500).

Um einen Passwortschutz einzurichten, brauchen Sie die Anweisungen AuthType, AuthName, AuthUserFile, und wenn Sie mit Benutzergruppen arbeiten, auch AuthGroupFile. Ferner benötigen Sie, wenn Sie den Zugriff auf bestimmte Benutzer oder Gruppen aus diesen Dateien festlegen (also einschränken) wollen, eine oder mehrere Angaben der Anweisung Require.

Mit AuthType wird die Art der Authentifizierung bezeichnet. Die meist gebrauchte Angabe ist Basic für die sogenannte HTTP Basic Authentication (einfache Authentifizierung über HTTP). Dabei stehen die Benutzernamen und die zugehörigen Passwörter in einer noch anzugebenden Datei. Diese Methode verlangt aber, dass das Passwort unverschlüsselt vom Browser an den Webserver übermittelt wird. Sie ist daher nicht wirklich sicher. Die Alternative für den Authentifizierungstyp ist Digest. Dabei werden Passwörter bereits in verschlüsselter Form abgefordert, allerdings beherrschen das nicht alle Browser. Sie müssen daher entscheiden, was für Sie Vorrang hat: höhere Sicherheit oder die Berücksichtigung der Browser und Clients, die nur die einfache Authentifizierung unterstützen.

Mit AuthUserFile wird die Datei angegeben, in der die Namen der autorisierten Benutzer und ihre Passwörter stehen. Es sollte der vollständige absolute Pfadname angegeben werden. Das ist also nicht der Pfad ab dem Wurzelverzeichnis Ihres Web-Projekts. Fragen Sie dazu gegebenenfalls Ihren Webhosting-Provider oder Webmaster. Sie können zwar auch eine Angabe machen, die relativ zum Wurzelverzeichnis des Webservers (das oft /usr/lib/apache/ lautet) interpretiert wird. In der Regel ist das aber ein zentrales Installationsverzeichnis, auf das Sie keinen Zugriff haben.

Im Interesse der Sicherheit ist es günstiger, die Datei mit den Namen der Benutzer und ihren Passwörtern außerhalb des Web-Projekts auf dem Server abzulegen. Aber bei kaum einem Hosting-Angebot können Sie auf Systemverzeichnisse des Server-Rechners außerhalb des eigenen Web-Projekts zugreifen. Wenn nicht ausdrücklich vom Provider bzw. Webmaster anders bestimmt, sollten Sie außerdem für die Datei einen Namen wählen, der mit .ht beginnt, üblicherweise eben .htusers oder .htpasswd. In der Konfiguration des Apache-Servers sind solche Dateinamen als Grundeinstellung vorgegeben und werden, wie oben bereits erläutert, aufgrund des vorangestellten Punktes nicht zur Ansicht freigegeben, bleiben also vor Besuchern verborgen. Das Gleiche gilt für die Gruppendatei, falls Sie mit Benutzergruppen arbeiten. Diese wird mit AuthGroupFile angegeben. Alternativ können Sie aber mit Hilfe des Containers <Files> auch eigene Schutzregeln definieren und eigene Namen für diese Dateien vergeben.

Bei Require geben Sie als zweites Schlüsselwort entweder user oder group an, je nachdem, ob Sie Zugriffsbestimmungen für einzelne Benutzer oder Benutzergruppen festlegen möchten. Hinter diesem Schlüsselwort können ein oder mehrere Namen von Benutzern oder Benutzergruppen folgen. Alternativ können Sie auch das Schlüsselwort valid-user benutzen, um alle Benutzer zuzulassen, falls die Liste sonst zu lang werden würde.

[Bearbeiten] Benutzerdatei

Im obigen Beispiel werden die drei Benutzer Werner Dieter Heidi sowie alle Benutzer der Gruppe Servicetechniker angegeben. Damit der Passwortschutz funktioniert, müssen nun die angegebenen Dateien mit den Benutzernamen und (falls benötigt) den Gruppen angelegt werden.

Beispiel: .htusers-Datei
# BenutzerDatei für Web-Projekt
Werner:$2y$05$MQ7RdCCRrKmBEDD/u4pks.9qAV8RCKy4YCP2pzgmc4lppfli41zC
Dieter:{SHA}i8xKRW2XJbkGN4UbpkXBfVjSKXs=
Heidi:$apr1$.P2k7JQX$dBcOPzzpEcQYcR0ZGw24Q0
  • Der erste Eintrag (Werner) wurde - das setzt einen Apache 2.4 voraus - mit dem Befehl `htpasswd -B .htusers Werner` erzeugt. Als Passwort wurde "hallo" verwendet.
  • Der zweite Eintrag (Dieter) wurde - das setzt einen Apache 2.0 voraus - mit dem Befehl `htpasswd -s .htusers Dieter` erzeugt. Als Passwort wurde "hallo" verwendet.
  • Der dritte Eintrag (Heidi) wurde - mit `htpasswd .htuser Heidi` erzeugt. Als Passwort wurde "hallo" verwendet.
  • Es gibt auch die Möglichkeit, Passwörter im Klartext zu speichern. Das ist aber so falsch, dass wir Ihnen das gar nicht erst zeigen wollen!

Die dritte (es handelt sich um den veralteten MD5-Algorythmus mit einem zusätzlichen 32-Bit-Salt) und die zweite Methode (sha1, ohne Salt) gelten beide unsicher, wobei sha1 die schlechteste der vorgestellten Varianten ist! Wenn Sie mehr über die Hashfunktionen wissen wollen, dann lesen Sie in der Dokumentation des Apache 2.4. oder Apache 2.2. nach. Wenn die Passwörter durch ein PHP-Skript (ab PHP 5.5!) erzeugt werden sollen, dann sehen Sie sich die Funktion password_hash und das Manual an.

Auch sind in diesen Dateien Kommentarzeilen erlaubt, eingeleitet durch #. Ansonsten enthält jede Zeile der Benutzerdatei einen Benutzernamen, und gleich dahinter, durch einen Doppelpunkt getrennt, das "gehashte" (eine Art "Einwegverschlüsselung") Passwort.

[Bearbeiten] Bekannte Beschränkungen für Passwörter und Benutzernamen:

  • Benutzernamen dürfen nicht länger als 255 Bytes sein und weder den Punkt noch den Doppelpunkt als Zeichen enthalten.
  • Da der Apache Webserver Kommentare in den Passwortdateien unterstützt ist es - obwohl mit htpasswd möglich - keine gute Idee, das Raute-Zeichen ("#") im Benutzername zu verwenden. Der Benutzer kann sich dann ganz einfach nicht anmelden.
  • Der MD5-Algorithmus, den htpasswd benutzt, ist speziell für den Apache-Server, er enthält einen 32-Bit-Salt. Passwort-Hashes, die damit erzeugt wurden, funktionieren (voraussichtlich) nicht mit anderen Webservern. Dieses gilt ebenso für den sha1-Hash.
  • Unter Windows werden Passwörter, die länger als 255 Bytes sind auf 255 Bytes gekürzt. Beachten Sie, dass deutsche Umlaute unter UTF-8 zwei Bytes benötigen.

Zusammen mit dem Apache wird ein kleines Hilfsprogramm ausgeliefert, das die Erstellung solcher Passwortdateien vereinfacht. Es heißt htpasswd (unter Windows: htpasswd.exe) und ist über die Konsole (Eingabeaufforderung) zu bedienen. Rufen Sie es einfach mit dem Befehl htpasswd -h auf, um eine kurze Hilfe zu seiner Verwendung zu erhalten. Im einfachsten Fall geben Sie zum Beispiel

htpasswd -c .htusers smuenz 

oder, falls Sie einen Apache 2.4 oder neuer haben, sehr viel besser:

htpasswd -c -B .htusers smuenz

ein. Sie müssen für den neuen Benutzer smuenz ein Passwort angeben und bestätigen. Diese Passwortdatei können Sie dann in das vorgesehene Verzeichnis verschieben oder hochladen.

Bitte beachten Sie hinsichtlich der Option "-c": Es wird eine neue Passwortdatei angelegt! Wenn Sie das nicht wollen, weil das bestehende Einträge löscht, dann lassen Sie das "-c" weg, die Einträge werden dann angehangen oder ersetzt.)

[Bearbeiten] Gruppendatei

Gruppendateien bestehen aus Einträgen, bei denen zunächst ein Gruppenname notiert wird und dahinter, nach einem Doppelpunkt, die Namen von Benutzern, die zu dieser Gruppe gehören. Es müssen Benutzernamen sein, für die in der Benutzerdatei ein Eintrag angelegt wurde. Die Gruppendatei wird im Beispiel nur benötigt, weil in der .htaccess-Datei eine Benutzergruppe angegeben wurde; die Gruppendatei wird ausschließlich dann erforderlich, wenn Sie Gruppennamen benutzen. In einem Intranet ist auch eine Benutzerdatei nicht zwingend erforderlich, da Sie Zugriffserlaubnisse und -verbote über die Zulassung bzw. den Ausschluss der internen IP-Adresse regeln können. Effekt:

Alle Besucher des Web-Projekts, die nun versuchen, auf das Verzeichnis mit der .htaccess-Datei zuzugreifen, bekommen von ihrem Browser einen Dialog angeboten, in dem sie Benutzernamen und Passwort eingeben müssen. Nur Besucher, die sich mit einer gültigen Kombination aus Benutzernamen und Passwort anmelden, haben Zugriff auf das Verzeichnis. Erweiterte Möglichkeiten:

So wie im obigen Beispiel gezeigt, gilt der Zugangsschutz für das Verzeichnis, in dem die .htaccess-Datei liegt, und für alle Verzeichnisse unterhalb davon. Sie können den Schutz aber auch auf bestimmte Dateien, Dateitypen oder Zugriffsmethoden einschränken.

Beispiel: .htaccess-Datei für Web-Verzeichnis
# .htaccess-Datei für Web-Verzeichnis /service
 
AuthType Basic
AuthName "Service-Bereich"
AuthUserFile /usr/verwaltung/web/.htusers
AuthGroupFile /usr/verwaltung/web/.htgroups
 
<Files *.htm>
Require user  Werner Dieter Heidi
Require group Servicetechniker
</Files>

Um den Schutz einzuschränken, benutzen Sie ähnlich wie in HTML oder XML Tags mit spitzen Klammern. Im einleitenden Tag kann hinter der öffnenden spitzen Klammer entweder Files stehen, wie im obigen Beispiel. Dahinter können Sie genau eine einschränkende Angabe machen. Mit *.htm wie im Beispiel beschränken Sie den Schutz auf HTML-Dateien. Mit einer Angabe wie geheim.htm würde nur diese eine Datei geschützt. Anstelle von Files können Sie auch FilesMatch einsetzen. Dann sind Reguläre Ausdrücke möglich. Beispielsweise würden Sie mit <FilesMatch "\.(htm|php)$"> alle HTML-Dokumente und alle PHP-Scripts erfassen.

Eine weitere Möglichkeit besteht darin, anstelle von Files die Anweisung Limit, oder besser noch LimitExcept anzuwenden. Diese Anweisung steht aber erst seit der Apache-Version 2.0.20 zur Verfügung. Sie hat Auswirkungen auf HTTP-Methoden wie GET, POST, PUT, DELETE, CONNECT, OPTIONS usw. Mit <LimitExcept GET> können Sie für alle Zugriffsmethoden Bedingungen formulieren, mit Ausnahme von GET - und mit Mit <LimitExcept POST> würden Sie für alle Zugriffsmethoden mit Ausnahme von POST Zugriffsbedingungen formulieren können, falls der Webserver mindestens ein Apache 2.0.20 oder neuer ist.

Beachten Sie: Falls es bei Ihnen einfach nicht mit dem Schützen von Verzeichnissen klappen will, dann könnte der Grund darin liegen, dass in der zentralen Konfiguration des Apache Webservers beim Eintrag AllowOverride der Wert None gewählt wurde.
Beispiel: .htgroups-Datei
# GruppenDatei für Web-Projekt
Servicetechniker: Andreas Karin Janine
Schutzmechanismen, die Sie mit Hilfe von .htaccess-Dateien erstellen, sind auf HTTP-Ebene wesentlich sicherer als solche, die mit Hilfe von CGI-Scripts oder gar mit Hilfe von JavaScript erstellt werden. Dennoch sollten Sie beachten, dass .htaccess keinen Generalschutz bietet. Der Schutz gilt nur, wenn Web-Browser oder andere Web-Clients über den Webserver geschützte Daten anfordern. Er gilt nicht, wenn der Zugriff z.B. mit einem anderen Internet-Protokoll wie FTP erfolgt.
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Übersicht
Index
Mitmachen
Werkzeuge
Spenden
SELFHTML