Mittels nginx Anfragen für eine Domain auf die www Subdomain weiterleiten

In diesem Beitrag beschreibe ich wie bei nginx Anfragen für eine Domain automatisch auf eine Subdomain wie www weitergeleitet werden können. Sowohl für HTTP als auch HTTPS Verbindungen.

Um die Weiterleitung für HTTP und HTTPS zu ermöglichen muss die Konfiguration der Website über zwei server Blöcke verfügen. Einen für HTTP (Port 80) und einen für HTTPS Verbindungen (Port 443). Die nachfolgende Konfiguration leitet mittels dem return Parmeter alle Anfragen inklusive der angefragten URI auf eine HTTPS Verbindung der Subdomain www weiter. Dies funktioniert auch für beliebige andere Subdomains.

server  {
        listen          80;
        listen          [xxx:xxx:xxx::42]:80;

        server_name     example.com;
        return          301 https://www.examole.com$request_uri;
}

server  {
        listen          443 ssl;
        listen          [xxx:xxx:xxx::42]:443 ssl;

        server_name     example.com;

        ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
        add_header              Strict-Transport-Security "max-age=63072000; includeSubdomains; ";
        add_header              X-Frame-Options "DENY";

        return          301 https://www.example.com$request_uri;
} 

In dem Artikel nginx unter Ubuntu Linux 16.04 Server mit sicherer SSL Konfiguration, PHP und MariaDB oder MySQL installieren und konfigurieren beschreibe ich meine Standardkonfiguration für neue Seiten. Diese enthält auch eine automatische Weiterleitung von HTTP auf HTTPS Verbindungen.

HTTP Anfragen mittels nginx automatisch auf HTTPS weiterleiten

In diesem Beitrag beschreibe ich wie mittels nginx Anfragen auf Port 80 (HTTP) automatisch auf verschlüsselte Verbindungen auf Port 443 (HTTPS) weiterleiten werden können.

Um die Weiterleitung zu ermöglichen muss die Konfiguration der Website aus zwei server Blöcken bestehen. Einen für HTTP (Port 80) und einen für HTTPS Verbindungen (Port 443). Die nachfolgende Konfiguration leitet mittels dem return Parameter alle Anfragen inklusive der angefragten URI an Port 80 auf die HTTPS Verbindung der Website weiter.

server  {
        listen          80;
        listen          [xxx:xxx:xxx::42]:80;

        server_name     example.com;
        return          301 https://$server_name$request_uri;
}

server  {
        listen          443 ssl;
        listen          [xxx:xxx:xxx::42]:443 ssl;

        server_name     example.com;

[...]

}

In dem Artikel nginx unter Ubuntu Linux 16.04 Server mit sicherer SSL Konfiguration, PHP und MariaDB oder MySQL installieren und konfigurieren beschreibe ich meine Standardkonfiguration für neue Seiten. Diese enthält auch die hier beschriebene automatische Weiterleitung von HTTP auf HTTPS Verbindungen.

Neuer Benutzer in Piwik anlegen

Piwik besitzt ein Rechtemanagement über das die Berechtigungen verschiedener Benutzer verwaltet werden können. In diesem Beitrag beschreibe ich wie neue Benutzer hinzugefügt werden können und ihre Berechtigungen verwaltet werden können.

Um neue Benutzer hinzuzufügen oder Berechtigungen zu verwalten muss im Administrationsbereich von Piwik (1) im linken Menü „Benutzer“ ausgewählt werden (2). Anschließend kann ein neuer Benutzer hinzugefügt werden (3).

Piwik Benutzer -und Rechteverwaltung
Piwik Benutzer -und Rechteverwaltung

Anschließend kann nach der Angabe eines Benutzernamens, Passwortes, einer E-Mail-Adresse und einem Alias ein neuer Benutzer angelegt werden.

Neuer Piwik Benutzer
Neuer Piwik Benutzer

Anschließend können für die verschiedenen Webseiten (1) die Zugriffsrechte gesetzt werden (2). Auch können die Hauptadministratoren verwaltet werden (3).

Piwik Berechtigungen
Piwik Berechtigungen

Eigene Besuche von Piwik ausschließen

Piwik erlaubt es in den Einstellungen die eigenen Besuche von den Statistiken auszuschließen. So wird die Statistik der Webseitenaufrufe nicht durch eigene Aufrufe verfälscht. Die Option um die eigenen Besuche nicht zu erfassen befindet sich im Administrationsbereich von Piwik (1) im linken Navigationsmenü unter dem Punkt „Einstellungen“ der Kategorie „Persönlich“ (2).

Piwik Persönliche Einstellungen
Piwik Persönliche Einstellungen

Am unteren Ende der Seite kann im Punkt „Ihre Besuche von der Erfassung via Cookie ausschließen“ die Erfassung der eigenen Besuche deaktiviert werden.

Piwik mit deaktivierter eigene Besuche ausschließen Option
Piwik mit deaktivierter eigene Besuche ausschließen Option

Falls die Erfassung der eigenen Besuche bereits deaktiviert ist, kann sie an gleicher Stelle wieder aktiviert werden.

Piwik mit aktivierter eigene Besuche ausschließen Option
Piwik mit aktivierter eigene Besuche ausschließen Option

Piwik Besucher Opt-Out in Website einbinden

Piwik bietet es an, dass der Besucher selbst das Tracking aus und wieder anschalten kann. Dazu muss ein iframe in z.B. das Impressum der Website eingebaut werden, wo der Besucher Piwik für sich (de)aktivieren kann. Um an den Code des iframes zu gelangen einfach in Piwik anmelden, den Administrationsbereich aufrufen (1) und im linken Navigationsmenü unter „System“ den Punkt „Privatsphäre“ (2) auswählen.

Piwik Privatsphäre Einstellungen
Piwik Privatsphäre Einstellungen

Am Ende dieser Seite befindet sich der Code für den iframe unter „Piwik-Deaktivierung für Ihre Besucher“.

iframe zur Deaktivierung von Piwik durch die Besucher
iframe zur Deaktivierung von Piwik durch die Besucher

Nachdem der iframe der Website hinzugefügt wurde kann der Besucher das Tracking deaktivieren.

Piwik Deaktivierung durch den Besucher
Piwik Deaktivierung durch den Besucher

Falls das Tracking deaktiviert ist kann der Besucher es über die gleiche Website wieder aktivieren.

Piwik Aktivierung durch den Besucher
Piwik Aktivierung durch den Besucher

Piwik Tracking-Code in WordPress einfügen

Piwik ist eine Open Source alternative zu Google Analytics, welches Webseitenaufrufe statistisch auswertet. Wie Piwik unter Ubuntu 16.04 mit nginx und MariaDB/MySQL installiert werden kann habe ich im Beitrag Piwik unter Ubuntu Linux 16.04 Server mit nginx und MariaDB/MySQL installieren und konfigurieren beschrieben. Um die Webseitenaufrufe zu Tracken muss ein Tracking-Code in die Website eingefügt werden. In diesem Beitrag beschreibe ich wie dies für WordPress erledigt werden kann.

Der Piwik Tracking-Code sollte im Header oder Footer der zu Trackenden Website eingefügt werden. In WordPress kann daher einfach die header.php oder footer.php bearbeitet werden um den Tracking-Code einzubauen. Dies hat aber den Nachteil, dass diese Änderungen nach jedem Update des Themes erneut gemacht werden müssen. Mit einem Child-Theme könnte dies umgangen werden. Jedoch ist einiges an Arbeit nötig um ein Child-Theme zu erstellen. Deshalb habe ich mich entschieden das Plugin WP-Piwik zu verwenden, welches den Tracking-Code automatisch in die Website einbaut. Es kann so konfiguriert werden, dass gewisse Benutzergruppen wie Administratoren von dem Tracking ausgenommen werden. Das Plugin kann außerdem dazu genutzt werden, die Piwik Statistiken direkt im WordPress Dashboard anzuzeigen. Ich gehe hier davon aus, dass in Piwik bereits eine Seite mit der Domain des Blogs estellt wurde. Falls noch keine Seite angelegt wurde kann die Anleitung im Beitrag Bei Piwik eine neue Website hinzufügen verwendet werden.

Installation

Das Plugin WP-Piwik kann einfach  im WordPress Administrationsbereich über die Pluginseite (1) zum Installieren (2) gesucht (3) und anschließend installiert (4) werden (Alternativ kann es von der WordPress.org Plugin-Seite heruntergeladen und manuell installiert werden).

WP-Piwik installieren
WP-Piwik installieren

Anschließend kann es direkt über die gleiche Seite aktiviert werden.

WP-Piwik aktivieren
WP-Piwik aktivieren

Konfiguration

Bevor WP-Piwik konfiguriert werden kann muss der Wert des token_auth herausgefunden werden. Dieser wird von dem Plugin benötigt um sich mit Piwik zu verbinden. Er wird in Piwik im Administrationsbereich (1) unter API (2) angezeigt. Es werden aus Sicherheitsgründen nur die ersten 6 Zeichen angezeigt. Mit einem Klick auf die Zeile (3) werden aber alle Zeichen angezeigt und sie können kopiert werden.

Piwik token_auth beziehen
Piwik token_auth beziehen

In die WP-Piwik Einstellungen gelangt man im WordPress Administrationsbereich über Einstellungen (1) WP-Piwik (2). Dort muss zuerst der Piwik-Modus ausgewählt werden. Dies ist für uns „Selbst-gehostet (HTTP API, Standard). Unter Piwik URL muss die Website unter welcher Piwik erreichbar ist eingegeben werden (am besten direkt mit https). Anschließend muss unter Auth-Token der token_auth, welchen wir uns im letzten Schritt kopiert haben eingefügt werden. Anschließend kann die Verbindung zu Piwik mit einem Klick auf „Änderungen übernehmen“ hergestellt werden.

WP-Piwik Einstellungen - Mit Piwik verbinden
WP-Piwik Einstellungen – Mit Piwik verbinden

Nachdem WP-Piwik mit Piwik verbunden ist kann das Tracking über „Tracking aktivieren“ aktiviert werden (1). Dazu sollte bei Tracking-Code einfügen „Standard-Tracking“ ausgewählt werden (2). Für die Position des JavaScript-Codes sollte der Header (3) ausgewählt werden. Zusätzlich kann ein Tracking-Filter gesetzt werden. Dieser erlaubt es z.B. die Seitenaufrufe von Administratoren nicht zu tracken (4). Abschließend können diese Einstellungen mit einem Klick auf „Änderungen übernehmen“ gespeichert werden.

WP-Piwik Einstellungen - Tracking aktivieren
WP-Piwik Einstellungen – Tracking aktivieren

Abschließend habe ich in der „Experten-Konfiguration“ (1) noch aktiviert, dass immer HTTPS/SSL verwendet werden soll (2). Dies muss auch mit einem Klick auf „Änderungen übernehmen“ (3) gespeichert werden.

WP-Piwik Einstellungen - Experten-Konfiguration
WP-Piwik Einstellungen – Experten-Konfiguration

Nun werden die Aufrufe des Blogs über Piwik unter der Verwendung von HTTPS/SSL getrackt, wobei die Seitenaufrufe der Administratoren ausgenommen sind.

Bei Piwik eine neue Website hinzufügen

Piwik erlaubt es die Besucher auf verschiedenen Webseiten unabhängig voneinander zu tracken. In diesem Beitrag erkläre ich wie in Piwik eine neue zu trackende Website hinzugefügt werden kann. Wie Piwik unter Ubuntu 16.04 mit nginx und MariaDB/MySQL installiert werden kann habe ich im Beitrag Piwik unter Ubuntu Linux 16.04 Server mit nginx und MariaDB/MySQL installieren und konfigurieren beschrieben.

Dazu muss nach dem Login in den Administrationsbereich gewechselt werden (1). Anschließend muss im linken Menü unter „Websites“ der Punkt „Verwalten“ ausgewählt werden (2). Danach muss auf den Button „Eine neue Website hinzufügen“ geklickt werden (3). In dem nun offenen Formular sollte mindestens der Name der Website, dir URLs sowie eine Zeitzone angegeben werden. Anschließend kann die neue Website mit einem Klick auf „Speichern“ (4) erstellt werden.

In Piwik eine neue Website hinzufügen
In Piwik eine neue Website hinzufügen

Um nun an den Tracking-Code zu kommen, der zum Tracken in die Website eingebaut werden muss kann einfach auf den Link „Tracking-Code anzeigen“ der gerade erstellten Website geklickt werden.

Piwik Tracking Code einer Website anzeigen
Piwik Tracking Code einer Website anzeigen

Auf der nun geöffneten Website wird der Tracking-Code angezeigt. Er sollte am Ende des <head>-Tags der zu Trackenden Website eingefügt werden.

Piwik Tracking-Code
Piwik Tracking-Code

nginx unter Ubuntu Linux 16.04 Server mit sicherer SSL Konfiguration, PHP und MariaDB oder MySQL installieren und konfigurieren

In diesem Beitrag beschreibe ich wie unter Ubuntu Linux 16.04 Server ein nginx Webserver mit sicherer SSL Konfiguration, PHP und MariaDB oder MySQL Unterstützung installiert und konfiguriert werden kann.

Installation

nginx

nginx ist in den offiziellen Paketquellen von Ubuntu 16.04 vorhanden und kann somit einfach über apt-get installiert werden.

$ sudo apt-get install nginx

PHP

PHP kann auch einfach über die offiziellen Paketquellen installiert werden.

$ sudo apt-get install php-fpm

MariaDB / MySQL

Wie ein MariaDB bzw. MySQL Server installiert und konfiguriert werden kann habe ich im Beitrag MySQL oder MariaDB unter Ubuntu Linux 16.04 installieren und konfigurieren beschrieben. Hier geht es darum PHP eine Verbindung zur Datenbank zu ermöglichen. Dazu kann einfach das entsprechende Paket aus den offiziellen Paketquellen installiert werden.

$ sudo apt-get install php-mysql

Konfiguration

PHP & MariaDB bzw. MySQL

PHP und MariaDB bzw. MySQL kann einfach zusammen konfiguriert werden. Für PHP muss die Datei /etc/php/7.0/fpm/php.ini angepasst werden. Dabei sollte folgende Zeile auskommentiert und der Wert auf 0 gesetzt werden.

[...]
cgi.fix_pathinfo=0
[...]

Anschließend muss php-fpm noch neu geladen werden – dies aktiviert auch die MySQL Unterstützung.

$ sudo /etc/init.d/php7.0-fpm reload
[ ok ] Reloading php7.0-fpm configuration (via systemctl): php7.0-fpm.service.

Damit sollte PHP mit MariaDB bzw. MySQL Unterstützung funktionieren.

PHP testen

Nun sollte kurz getestet werden das PHP auch tatsächlich funktioniert. Dazu muss zunächst die Konfiguration der nginx Standardseite (/etc/nginx/sites-available/default) angepasst werden. Es müssen vor folgenden Zeilen die Kommentarzeichen entfernt werden.

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

Anschließend muss noch die nginx Konfiguration neu geladen werden, damit die Änderungen wirksam werten. Vorher sollte getestet werden, dass die Konfiguration keine Fehler enthält.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo /etc/init.d/nginx reload
[ ok ] Reloading nginx configuration (via systemctl): nginx.service.

Nun kann einfach eine Datei phpinfo.php mit nachfolgendem Inhalt im Verzeichnis der Standardwebsite (/var/www/html/) angelegt werden.

&amp;lt;?php phpinfo(); ?&amp;gt;

Abschließend kann die Datei einfach über den Webbrowser aufgerufen werden (z.B. über http://example.com/phpinfo.php). Die Ausgabe sollte folgendermaßen aussehen.

Beispielhafte Ausgabe von phpinfo()
Beispielhafte Ausgabe von phpinfo()

nginx

Nach der Installation muss nginx noch konfiguriert werden. Dies ist etwas aufwendiger als für PHP oder MySQL. Die Hauptkonfigurationsdatei ist /etc/nginx/nginx.conf. Die Konfiguration der einzelnen Seiten befindet sich im Verzeichnis /etc/nginx/sites-available/ und die Konfiguration der aktuell aktivierten Seiten im Verzeichnis /etc/nginx/sites-enabled/.

/etc/nginx/nginx.conf

Schauen wir uns zuerst die Hauptkonfigurationsdatei genauer an.

Zu Beginn werden generelle Parameter festgelegt.

  • user definiert den Linux Benutzer unter dem nginx laufen soll. www-data ist der Standardnutzer unter dem Webserver unter Debian/Ubuntu laufen.
  • worker_processes ist die Anzahl der nginx Prozesse. auto versucht den besten Wert automatisch zu finden.
  • pid ist zur Kommunikation mit dem Betriebssystem und sollte auch bei dem Standardwert (\run\nginx.pid) belassen werden.
  • woker_connections innerhalb von events definiert die maximale Anzahl von Verbindungen pro nginx Prozess (768 ist der Standardwert).
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {

worker_connections 768;
# multi_accept on;
}

[...]

Der nächste Block (http) definiert die Parameter für die eigentlichen Verbindungen.

  • Basiseinstellungen
    • sendfile, tcp_nopush und tcp_nodelay erhöhen die Performance von nginx
    • keepalive_timeout definiert die Zeit in Sekunden zu welcher eine Verbindung vom Webserver geschlossen wird. Danach muss eine neue TCP und TLS Verbindung aufgebaut werden.
    • types_hash_max_size beschleunigt hashtable lookups
    • server_tokens gibt an ob nginx seine Version als Antwort mitsenden soll oder nicht
    • include /etc/nginx/mime.types lädt die mime Typen
    • defaul_type setzt den zu verwendenden Standardtyp
  • SSL (Die hier verwendeten Parameter orientieren sich an dem Beitrag Strong SSL Security on nginx)
    • ssl_protocols erlaubt nur TLS in Version 1.0, 1.1 oder 1.2.
    • ssl_ciphers erlaubt nur Algorithmen mit Perfect Forward Security. Das bedeutet, dass auch wenn später der Private Key kompromittiert wurde die alten Verbindungen nicht entschlüsselt werden können.
    • ssl_prefer_server_ciphers sagt das die Algorithmenpreferenz des Servers und nicht des Clients verwendet werden soll.
    • ssl_session_cache definiert, dass es einen 10 MB Cache gibt in welchem Verbindungsinformationen zwischengespeichert werden. Dies erlaubt es bei Wiederaufnahme einer Verbindung einige Schritte im Verbindungsaufbau zu sparen.
    • ssl_dhparam verweist auf selbst generierte EECDH/EDH Parameter welche verwendet werden sollen. Sie sind länger als die Standardmäßig verwendeten Parameter. Wie diese generiert werden beschreibe ich weiter unten.
    • ssl_stapling und ssl_stapling_verify sagt das der Server Informationen über die Gültigkeit des Zertifikates überprüfen und beim Verbindungsaufbau an den Client schicken soll.
    • ssl_ecdh_curve spezifiziert die Kurve welche für ECDHE verwendet werden soll. Die hier angegebene Kurve verwendet längere Schlüssel als die standardmäßig verwendete.
    • ssl_session_tickets deaktiviert Session Tickets, da diese Forward Security aushebeln können.
  • Header
    • add_header X-Content-Type-Options verbietet mime-sniff in Chrome und Internet Explorer
    • add_header X-Frame-Options verbietet es die Website auf einer anderen Domain in einem frame oder iframe zu laden.
  • Logging
    • access_log legt fest in welcher Datei alle Zugriffe geloggt werden sollen
    • error_log legt fest in welcher Datei alle Fehlermeldungen geloggt werden sollen
  • Gzip
    • gzip setzt ob gzip aktiviert werden soll oder nicht. Da all meine Webseiten nur per TLS erreichbar sind und gzip mit TLS ein Sicherheitsrisiko darstellt habe ich es deaktiviert.
  • Vitual Host Konfigurationen
    • Lädt zusätzliche Konfigurationsdateien aus dem Unterordner conf.d sowie die aktiven Seiten im Unterordner sites-enabled.
[...]

http {

##
# Basic Settings
##

sendfile                on;
tcp_nopush              on;
tcp_nodelay             on;
keepalive_timeout       65;
types_hash_max_size     2048;
server_tokens           off;

include         /etc/nginx/mime.types;
default_type    application/octet-stream;

##
# SSL Settings
##

ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers                     'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers       on;
ssl_session_cache               shared:SSL:10m;
ssl_dhparam                     /etc/ssl/certs/dhparam.pem;
ssl_stapling                    on;
ssl_stapling_verify             on;
ssl_ecdh_curve                  secp384r1;
ssl_session_tickets             off;

##
# Header
##

add_header X-Content-Type-Options       nosniff;
add_header X-Frame-Options              "SAMEORIGIN";

##
# Logging Settings
##

access_log      /var/log/nginx/access.log;
error_log       /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip    off;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

dhparam generieren

Da ich längere Parameter verwenden möchte als die Standardkonfiguration müssen die dhparam selber generiert werden. Dies kann wie nachfolgend beschrieben im Terminal erledigt werden – es kann einige Minuten dauern bis der Befehl zum Generieren erfolgreich ausgeführt wurde.

$ cd /etc/ssl/certs
$ sudo openssl dhparam -out dhparam.pem 4096

Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
 ......................................................................+.................................................................................................................................................................................................................................................................................................................+.......................................................................................+........................+............................................................................................+........................+........................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.........................................................................................................................................+..............................................................+....................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...............................................................................................................................................+....

[...]

Konfiguration für eine neue Seite erstellen

Die Konfigurationsdateien der einzelnen Seiten befinden sich im Verzeichnis /etc/nginx/sites-available/. Ich verwende immer nachfolgendes Template als Basis für meine PHP-Seiten. Die Konfiguration leitet HTTP Verbindungen automatisch auf verschlüsselte HTTPS Verbindungen um. Parameter wie der Domainname, Pfad zum SSL-Zertifikat und das Verzeichnis müssen natürlich für jede Website angepasst werden.

Die Konfiguration besteht aus zwei server Blöcken. Einer für Port 80 (HTTP) und einer für Port 443 (HTTPS).

Die Konfiguration des ersten server Blocks (HTTP)

  • listen gibt an auf welchen IP-Adressen und Ports die Website reagieren soll. 80 sagt aus, dass über alle verfügbaren IPv4 Adressen Verbindungen auf Port 80 akzeptiert werden sollen. [xxx:xxx:xxx::42]:80 sagt aus, dass die Website via IPv6 nur über die IP-Adresse xxx:xxx:xxx::42 und Port 80 erreichbar ist. Falls die Konfiguration als Standard verwendet werden soll, falls keine andere zur Anfrage passt, muss jeweils hinter der 80 noch default_server ergänzt werden.
  • server_name gibt die Domain an, für welche die Konfiguration gilt.
  • return leitet auf eine andere Website weiter. In diesem Fall mittels 301 (Dauerhaft Verschoben) auf die verschlüsselte Verbindung (HTTPS).

Die Konfiguration des zweiten Blocks (HTTPS). Die Pfade zum SSL Zertifikat bzw. dem zugehörigen privaten Schlüssel entsprechen denen, wenn Let’s Encrypt mit certbot verwendet wird. Wie dies Konfiguriert wird habe ich im Beitrag Let’s Encrypt SSL Zertifikate unter Ubuntu Linux 16.04 Server mittels nginx und webroot Plugin beziehen beschrieben.

  • listen ist identisch wie für den ersten Block außer das der Block auf Port 443 hört und nicht 80.
  • server_name gibt wie beim ersten Block die Domain an, für welche die Konfiguration gilt.
  • ssl_certificate gibt den Pfad zum SSL Zertifikat der Website an.
  • ssl_certificate_key gibt den Pfad zum Privaten Schlüssel des SSL Zertifikats der Website an.
  • add_header Strict-Transport-Security sagt dem Client, dass er die Website nur über HTTPS aufrufen soll und dies auch für alle Subdomains gilt. An dieser Stelle muss man vorsichtig sein und prüfen ob dies auch wirklich für alle Subdomains gilt. Außerdem sagt max-age für wie lange diese Einstellung gilt. Innerhalb dieser Zeit leitet der Browser den Besucher automatisch auf HTTPS weiter. Das heißt es ist nicht einfach möglich HTTPS abzuschalten, sondern benötigt eine Vorlaufzeit. Der Wert 63072000 entspricht 2 Jahren. Zum Testen sollte ein niedriger Wert wie z.B. 300 (5 Minuten) verwendet werden, welcher langsam erhöht wird. Es kann auch beantragt werden diese Einstellung fest in die gängigsten Browser aufzunehmen. Details dazu gibt es auf der Website der HTST Preload List.
  • root gibt das Verzeichnis an, in dem die Website liegt.
  • index gibt den Dateinamen der Datei an, welche angezeigt werden soll, falls ein Verzeichnis als URL angegeben wurde. Damit dies geschieht muss eine Datei mit diesem Namen in dem angefragten Verzeichnis vorhanden sein.
  • location \ sagt, dass zuerst nach einer Datei mit dem angefragten Namen gesucht werden soll, anschließend ob ein Verzeichnis mit dem Namen existiert. Falls beides nicht existiert wird ein 404 Fehler zurückgegeben.
  • location ~ \.php$ leitet PHP-Dateien an den Interpreter weiter.
  • include snippets/certbot-webroot.conf lädt die Konfigurationsparameter zur Aktualisierung der Let’s Encrypt Zertifikate wie im Beitrag Let’s Encrypt SSL Zertifikate unter Ubuntu Linux 16.04 Server mittels nginx und webroot Plugin beziehen beschrieben.
server  {
listen          80;
listen          [xxx:xxx:xxx::42]:80;

server_name     example.com;
return          301 https://$server_name$request_uri;
}

server  {
listen          443 ssl;
listen          [xxx:xxx:xxx::42]:443 ssl;

server_name     example.com;

ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
add_header              Strict-Transport-Security "max-age=63072000; includeSubdomains;";

root    /var/www/com.example;

index   index.php;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# pass the PHP scripts to FastCGI server
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

# snippet for updating letsencrypt certificates
include snippets/certbot-webroot.conf;
}

Nun muss noch das Verzeichnis für die Webseitendaten erstellt werden.

$ sudo mkdir -p /var/www/com.example

Neue Seite aktivieren

Um die Konfiguration einer Seite im Verzeichnis /etc/nginx/sites-available/ zu aktivieren muss ein Symmetrischer Link zu dieser Datei im Verzeichnis /etc/nginx/sites-enabled angelegt werden.

$ sudo ln -s /etc/nginx/sites-available/com.example /etc/nginx/sites-enabled/

Konfiguration übernehmen

Nachdem die Konfiguration wie oben beschrieben geändert wurde muss sie nur noch von nginx neu geladen werden. Bevor sie geladen wird sollte allerdings noch geprüft werden, ob sie Fehler enthält.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo /etc/init.d/nginx reload
[ ok ] Restarting nginx (via systemctl): nginx.service.

Nun kann noch die Seite des Qually Labs SSL Tests aufgerufen werden, welches die verwendete Sicherheitsverfahren und Algorithmen von Webservern prüft und bewertet. Wenn alles wie oben beschrieben konfiguriert wurde sollte die Bewertung A+ sein, was der Best möglichen Bewertung entspricht.

Ergebnis des Qualys SSL Labs SSL Server Test
Ergebnis des Qualys SSL Labs SSL Server Test

Let’s Encrypt SSL Zertifikate unter Ubuntu Linux 16.04 Server mittels nginx und webroot Plugin beziehen

Let’s Encrypt stellt kostenfreie SSL Zertifikate aus, welche von den gängigen Betriebssystemen und Browsern akzeptiert werden. Diese sind jeweils nur 90 Tage gültig und müssen daher regelmäßig erneuert werden. Damit dies nicht immer manuell geschehen muss gibt es Tools welche diesen Vorgang automatisieren. Das offizielle Tool dafür ist certbot. In diesem Beitrag beschreibe ich wie unter Ubuntu Linux 16.04 Server mit nginx, certbot und dem webroot Plugin Zertifikate für Webseiten angefragt und automatisch erneuert werden können.

Weiterlesen