Homeserver 23: Webserver absichern

Der Webserver ist zwar zur Zeit nur von meinem internen Netz erreichbar, das soll sich aber später noch ändern. Aber so, wie er jetzt ist, wäre es fahrlässig, ihn für das Internet zu öffnen. Jeder könnte meine Server-Logs sehen, jeder könnte die Daten für PHP und MySQL finden, die auf meinem Server laufen. Für einen Angreifer sind das wichtige Daten. Also muss ich, bevor ich Zugriff von außen erlaube, den Webserver absichern.

Passwortschutz einrichten

Meine Server-Startseite hat Links zu allen wichtigen Punkten meines Servers. Jeder, der auf die Startseite kommt, kann sich meine Hardware, Systemdetails und Logs angucken. Also muss ich dafür sorgen, dass man dafür einen Benutzernamen und Passwort braucht. Und das ist gar nicht so schwer.

Zunächst müssen wir am Webserver was umkonfigurieren.

sudo nano /etc/apache2/sites-enabled/000-default

Ihr erinnert euch? Das ist die gleiche Datei, in der wir das DocumentRoot, also das Verzeichnis festgelegt haben, wo Apache nach den Website-Daten suchen soll. Hier müssen wir eine kleine Kleinigkeit ändern. Der Abschnitt sieht ursprünglich so aus:

    <Directory /raid1/web/HTML/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

In der Zeile, wo „AllowOverride None“ steht, müssen wir das „None“ durch „all“ ersetzen. Dann sieht die Zeile so aus: „AllowOverride all“.

Dann noch die Datei speichern, und den Webserver neu starten:

sudo service apache2 restart

Nun müssen im Verzeichnis „HTML“ in der Web-Freigabe zwei Dateien erstellt werden. Die erste Datei erstellen wir mit einem Texteditor. Um es einfach zu machen, mache ich das wieder von der SSH-Kommandozeile:

nano /raid1/web/HTML/.htaccess

Das sudo ist hier nicht nötig, weil wir die Datei mit den Rechten des angemeldeten Benutzers, also kamil, anlegen. Und in das leere Editorfenster schreibe ich folgendes rein:

AuthType Basic
AuthName "Passwort eingeben"
AuthUserFile /raid1/web/HTML/.htpasswd
require valid-user
  • AuthType Basic: Das sorgt für die Abfrage von Nutzerdaten.
  • AuthName „Passwort eingeben“: Dieser Text erscheint im Dialogfeld, wenn jemand die Seite aufruft. Hier könnte alles mögliche stehen.
  • AuthUserFile /raid1/web/HTML/.htpasswd: Das ist der Pfad zur Passwort-Datei, dazu komme ich gleich noch.
  • require valid-user: Jeder in der Passwort-Datei eingetragene Nutzer kann sich an der Seite anmelden.

OK, soweit so gut, aber die Passwort-Datei muss noch angelegt werden. Dies machen wir nicht mit einem Editor, weil das Passwort ja verschlüsselt abgelegt werden soll. Wäre ja witzlos, wenn das Passwort im Klartext auf der Platte liegen würde. Also nehmen wir ein Programm dazu, dass der Apache gleich mitgebracht hat:

sudo htpasswd -c /raid1/web/HTML/.htpasswd kamil

Falls noch keine Passwort-Datei existiert, muss sie angelegt werden, das macht der Parameter -c. Falls die Datei bereits existiert, braucht ihr den Parameter später nicht mehr. Dann kommt der Pfad zur Passwort-Datei, und am Ende der Benutzername.

Nun werde ich nach dem Passwort für kamil gefragt, dieses gebe ich zwei mal ein. Fertig, die Datei wurde erstellt und der Nutzer eingetragen.

Wenn ich jetzt entweder mit der IP-Adresse, oder auch mit http://server01 auf die Seite gehen will, öffnet sich ein Dialogfenster, welches mich nach Benutzername und Passwort fragt. Erst dann bin ich auf meiner Startseite und kann die Links anklicken und mir z. B. die Logs angucken.

Zugriff mit SSL erzwingen

Das ist erst mal die halbe Miete, die andere Hälfte ist die Absicherung mit einem SSL-Zertifikat. Wenn ihr in einem unverschlüsselten WLAN seit, dürft ihr auf gar keinen Fall auf den Server zugreifen, wenn die Verbindung nicht mit SSL abgesichert ist. Jeder, der wollte, könnte mitlesen. Wenn aber der Zugriff über SSL erfolgt, sind eure Daten sicher. Daher richte ich jetzt den Server so ein, dass er alles nur noch über SSL macht.

SSL-Zertifikate sind teuer, wenn man sie sich von einer offiziellen CA-Stelle ausstellen lässt. Die Browser kennen die CAs, (Certificate Authorities), und vertrauen den SSL-Zertifikaten. Ich hingegen will für meinen Homeserver jetzt nicht so viel Geld ausgeben, daher erstelle ich selbst ein Zertifikat und beglaubige es auch selbst. Nachteil, die Browser kennen das Zertifikat nicht und wollen, dass man es selbst bestätigt. Auch muss dieses Zertifikat dann manuell in die liste vertrauenswürdiger Zertifikate aufgenommen werden. Aber für einen Privatserver ist das OK. Wenn ich bei meinem Mailanbieter oder bei der Bank auf solch ein Zertifikat stoßen würde, würden bei mir alle Alarmglocken Sturm läuten.

Zunächst müssen wir am Apache-Webserver die SSL-Unterstützung einschalten. Dazu müssen Module geladen werden.

sudo a2enmod ssl
sudo a2ensite default-ssl

So, nun noch selbstsignierte SSL-Zertifikate erstellen:

sudo make-ssl-cert generate-default-snakeoil --force-overwrite

Damit nun alle Zugriffe auf den Webserver verschlüsselt passieren, müssen alle HTTP-Anfragen in HTTPS-Anfragen umgeleitet werden. Dies kann Apache, aber dazu muss erst wieder ein Modul aktiviert werden:

sudo a2enmod rewrite

Nun muss noch die Regel erstellt werden, die dafür sorgt, dass die Anfragen jeweils umgeleitet werden. Dies ändert man wieder in der 000-default-Datei:

sudo nano /etc/apache2/sites-enabled/000-default

Unter die Zeile, die mit „ServerAdmin“ beginnt, füge ich folgende Zeilen hinzu:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Diese Datei speichern wir noch und müssen noch eine Datei editieren. Die default-ssl-Datei zeigt noch auf die falschen Verzeichnisse.

sudo nano /etc/apache2/sites-enabled/default-ssl

Hier müssen wieder genau die gleichen Zeilen angepasst werden, damit Apache die Webseite findet und auch die Passwortabfrage funktioniert.

Die Zeile „DocumentRoot“ muss geändert werden, damit da wieder /raid1/web/HTML steht.

Die Zeile <directory /var/www></directory> muss in <directory /raid1/web/HTML></directory> geändert werden.

Die Zeile „AllowOverride None“ muss zu „AllowOverride all“ geändert werden.

Die Datei noch speichern, und nachdem wir all diese Änderungen gemacht haben, den Webserver noch mal neu starten:

sudo service apache2 restart

Wenn ich an meinem Windows-Rechner mit Firefox nun auf die Seite http://server01 gehe, passiert folgendes: Es erscheint eine Meldung, dass dieser Verbindung nicht vertraut wird. Diese Meldung ignoriere ich, und wähle ganz unten den Schalter „Ich kenne das Risiko“. Hierauf erscheint noch mehr Text, welcher einen warnt, und normalerweise würde ich diese Warnungen auch sehr ernst nehmen. Ich weiß aber, dass es mein Server und mein Zertifikat ist, daher gehe ich ganz unten auf die Schaltfläche „Ausnahmen hinzufügen“. In dem nun folgenden Dialog aktiviere ich die Checkbox, „Diese Ausnahme dauerhaft speichern“ und klicke auf die Schaltfläche „Sicherheits-Ausnahmeregel bestätigen“.

Fertig!

Von nun an kann ich, ob nun innerhalb meines Heimnetzes oder von außen, auf meinen Server per SSL-Verbindung zugreifen. Falls ich also mal im Zug, im Hotel oder in einem anderen öffentlichen WLAN auf meinen Server will, kann jedenfalls so ohne weiteres keiner mitlesen.