Webserver installieren & konfigurieren (mit Apache und Linux) – Teil 2

Und Willkommen Zurück zum zweiten Teil meiner Webserver-Reihe. Nun geht es um ein ziemliches grundsätzliches Thema, nämlich Sicherheit. Aber zuerst mal etwas Background.

Gegen was wollen wir unseren Webserver/Website eigentlich absichern?

Dass Internetverkehr, welcher unverschlüsselt ist, ohne Probleme mitgelesen werden kann, ist kein Geheimnis. Nicht umsonst hat euer Browser im ersten Teil vermutlich gemeckert, dass ihr eine unsichere Website aufrufen wollt. Dies ist der erste Punkt, welchen wir ändern wollen.

Der zweite ist leider nicht ganz so trivial, in dem wollen wir nämlich ein Zertifikat einbinden. Ein Zertifikat dient dazu, sicherzustellen, dass es auch eure Website ist (und keine eines Angreifers, welcher versucht, Passwörter abzugreifen). Normalerweiße wird dies von einer Zertifizierungsstelle (etwa LetsEncrypt) ausgestellt, in unsere Fall machen wir es aber mit einem selbstsignierten Zertifikat. Der Browser wird zwar trotzdem noch eine Fehlermeldung geben, das Prinzip sollte aber klar werden.

Mehr über die technischen Hintergründe der Zertifikate werdet ihr bald in der Rubrik „Security-ABC“ finden, selbstverständlich hier dann auch verlinkt. Wichtig zu Anfang zu wissen ist nur, dass Websites über zwei Protokolle/Ports angesprochen werden können. Das erste ist Protokoll HTTP auf Port 80, welches unverschlüsselt kommuniziert. Möchte man verschlüsselt kommunizieren, muss man HTTPS auf Port 443 nutzen.

Dann let’s go! oder Zertifikat erstellen

Im ersten Schritt erstellen wir das selbstsignierte Zertifikat mithilfe von OpenSSL. OpenSSL ist eine Open-Source-Software, mit denen in der Command Line Verschlüsselungen erstellt bzw. durchgeführt werden können. Standardmäßig ist es in Ubuntu dabei, sodass wir direkt damit loslegen können:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
  • req -x509: Dies bedeutet, dass wir eine „Zertifikatsanfrage“ (certificate request) stellen wollen, welche dem Standard x509 entspricht.
  • – nodes: Damit wird der Passwortschutz des Zertifikats deaktiviert (damit Apache dies auch automatisiert lesen kann)
  • days 356 : Sind die Tage, wie lange ein Zertifikat gültig ist. Diesen Wert könnt ihr selber verändern. „Echte“ Zertifikate sind meist jedoch nur ein paar Monate gültig.
  • – newkey rsa: Damit erstellen wir gleichzeitig ein Zertifikat und einen Schlüssel. Der Schlüssel ist zudem im RSA-Algorithmus mit 2048 Bits.
  • -keyout & out: Gibt die Dateispeicherorte des selbst-signierten Zertifikates und dem Schlüssel an.

Wenn wir diesen Befehl nun in die Maschine geben, bekommen wir eine ganze Reihe von Abfragen.

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:192.168.62.5
Email Address []:

Bei den meisten Sachen könnt ihr eintragen, was ihr möchtet oder den Teil freilassen. Wichtig ist nur der Common Name, in dem die IP-Adresse oder im späteren Verlauf der Domainname drin stehen muss. Wenn diese nämlich nicht übereinstimmen kann es sein, dass das Zertifikat nicht akzeptiert wird.

Das Zertifikat liegt nun also unter /etc/ssl/certs/apache-selfsigned.crt und der private Key unter /etc/ssl/private/apache-selfsigned.key. Wichtig, der Key muss unbedingt geheim bleiben. Sollte dieser Abhanden kommen, könnte ein Angreifer damit Nachrichten in eurem Namen verschlüsseln.

Zertifikat einbinden

Im nächsten Schritt aktivieren wir einmal den SSL-Mod von Apache und starten anschließend den ganzen Dienst neu:

sudo a2enmod ssl
sudo service apache2 restart 

Nun kommen wir zur eigentlichen konfiguration, indem wir unter /etc/apache2/sites-available eine Datei namens ssl.conf erstellen. Diese bekommt folgenden Inhalt:

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
    # Pfad zu den Webinhalten
    DocumentRoot /var/www/html/
</VirtualHost>

Diese sagt eigentlich nur, wenn die Website über den Port 443 (dem verschlüsselten HTTPS-Port) angesprochen wird, aktiviere SSL mit diesem Key und Zertifikat. Wenn ihr nun also eure Website über https://<IP> ansprecht, sollte euer Browser erst eine Warnung anzeigen, die ihr meistens jedoch wegklicken könnt. Dies hat den Grund, welchen ich am Anfang schon erwähnt habe. Mit dem selbst-signierten Zertifikat bescheinigt ihr euch selber, euch selbst zu sein. Für interne Zwecke kann dies aber durchaus ausreichend sein, zudem ist euer Verkehr mit der Website nun verschlüsselt.

Nun müssen wir dem Server aber auch noch sagen, dass er die Seite auch aktivieren soll (leider reicht es an der Stelle nicht aus, dass diese nur im richtigen Ordner liegt). Führt dazu nochmal folgenden Command aus (den ersten könnt ihr dabei ignorieren, solltet ihr bereits im Ordner sein):

cd /etc/apache2/sites-available
sudo a2ensite ssl.conf
systemctl reload apache2

Ungünstig jedoch ist, dass noch beide Seiten (verschlüsselt und unverschlüsselt) gleichermaßen erreichbar sind. So wollen wir noch schnell eine Einrichtung mit der automatischen Weiterleitung auf die verschlüsselte Seite einrichten. Dazu öffnen wir die /etc/apache2/sites-enabled/000-default.conf und fügen folgenden Teil ein (direkt unter <VirtualHost *:80>).

Redirect / https://<eure IP>

Anschließend starten wir den Dienst einmal neu.

sudo service apache2 restart 

Wenn ihr nun versucht, die Seite unter http://<IP> aufzurufen, werdet ihr merken, dass diese automatisch umgeleitet wird und eure Besucher so immer automatisch verschlüsselt surfen.

So, das war’s mit den ersten beiden Teilen zum Thema „Webserver“, in denen vor allen Dingen das Backend behandelt wurde. Natürlich sind noch wesentlich mehr Dinge wichtig, wenn man seinen Webserver sicher und produktiv im Internet betreiben möchte, besonders wenn es um die Übertragung von Passwörtern geht. Aber ich glaube dies ist ein sehr guter Einstieg, den man nach Belieben weiter ausbauen kann. Also, bis zum nächsten Mal! 🙂

Hier gehts zu Teil 1

„Spickzettel“ für diesen Artikel:

https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-16-04

https://wiki.ubuntuusers.de/Apache/mod_ssl/