Website-Bereiche unter NGINX mit Kennwörtern absichern

Ähnlich wie beim Apache Webserver ist es auch mit NGINX mögliche eine ganze Website oder einzelne Bereiche (Unterverzeichnisse) so abzusichern, das man sie nur zu Gesicht bekommt, wenn man sich mit einer Benutzerkennung und einem Kennwort anmeldet.

Die zulässigen Benutzer und ihre Kennwörter werden dabei in einer Datei (htpasswd) gespeichert, die wie folgt aufgebaut ist:

UserID:Password
UserID2:Pasword2:Kommentar
UserID3:Password3

Während die Benutzer IDs im Klartext in der Datei gespeichert sind, werden die Kennwörter verschlüsselt abgelegt. NGINX unterstützt dir Verschlüsselungsmethoden CRYPT, SSHA, SHA (siehe auch Beschreibung von HttpAuthBasicModule.

Kennwort-Datei erstellen

Zum Verschlüsseln der Kennwörter gibt es verschiedene Möglichkeiten:

htpasswd-Tool

Wenn auf dem Rechner zusätzlich zu NGINX noch ein Apache 2-Server installiert ist, so kann man direkt das Tool htpasswd nutzen. Ist kein Apache installiert, so kann es unter Linux (Beispiel: Ubuntu, Debian) einfach nachinstallieren:

sudo apt-get install apache2-utils

Eine neue Datei wird mit folgendem Aufruf angelegt:

htpasswd -c -d <Dateiname> <Benuterkennung> <Kennwort>

Der Parameter -c sorgt dafür, das eine neue Datei angelegt wird. Will man später weitere Benutzer hinzufügen, so lässt man diese Option einfach weg. Durch den Parameter -d erreicht man, dass das Kennwort mit der Methode CRYPT verschlüsselt wird.

Webdienst verwenden

Alternativ zu htpasswd kann man auch einen Webdienst verwenden. Als Beispiel sei nur dieser hier genannt: htpasswd-Generator.

PHP-Script verwenden

Als 3. Alternative kann man auch einfach ein kleines PHP-Script erstellen, das die Verschlüsselung übernimmt (Dateiname: crtpasswed.php):

<?php
if (count($argv) < 3)
{
  echo "No enough parameters passed\n";
  exit;
}
$password = crypt($argv[2], base64_encode($argv[2]));
echo $argv[1].":".$password."\n";
?>

Dieses Script kann man dann z.B. wie folgt aufrufen:

php -f crthtpasswd.php <UserID> <Kennwort>

Die Benutzerkennung und das verschlüsselte Kennwort werden dann einfach auf der Console (stdout) ausgegeben und können in eine Datei umgeleitet werden.

Website konfigurieren

Nachdem man die benötigte Datei erzeugt hat, kann sie in der NGINX-Konfiguration der jeweiligen Website eingetragen werden. Dabei kann man entweder die gesamte Website absichern (und ggf. einzelne Verzeichnisse ausnehmen) oder nur einzelne Verzeichnisse schützen.

Zur Absicherung des Server müssen 2 Einträge im Abschnitt server eingefügt werden:

server {
  ...
  auth_basic "Text";
  auth_basic_user_file /var/www/htpasswd;
  ...
}

Der Dateiname /var/www/htpasswd ist nur ein Beispiel und muss durch den passenden Dateinamen ersetzt werden. Die Datei kann für alle Benutzer schreibgeschützt werden. Nur der Benutzer, unter dem der Server ausgeführt wird (i.d.R. www-data) benötigt eine Leseberechtigung.

Einzelne Locations können dann mit auth_basic off; vom Verzeichnisschutz ausgenommen werden.

Soll nicht die gesamte Website sondern nur einzelne Unterverzeichnisse geschützt werden, so können die Angaben auch bei den gewünschten locations vorgenommen werden. So kann man z.B. den WordPress Admin-Zugang auf diese Art zusätzlich absichern:

server {
   ...
   location /wp-admin {
      auth_basic "Login WordPress Adminbereich";
      auth_basic_user_file /var/www/htpasswd;
}
comments powered by Disqus