navigation Navigation


Webmin (Contabo) - SSL & Domain


Bei Contabo-Servern wird Webmin, wenn das Paket mitgebucht ist, standardmäßig auf einer automatisch generierten Domain ohne SSL-Verschlüsselung bereitgestellt. Dies stellt ein Sicherheitsrisiko dar, da die Anmeldedaten unverschlüsselt übertragen werden. In dieser Anleitung zeige ich, wie du Webmin mit einem kostenlosen Let’s Encrypt SSL-Zertifikat absicherst und auf deine eigene Domain umstellst. So erhältst du eine sichere HTTPS-Verbindung und eine professionelle, leichter zu merkende URL für dein Webmin-Interface.

Inhaltsverzeichnis

    Vorbereitung

    Ich gehe an dieser Stelle davon aus, dass folgende Punkte bereits erledigt bzw. eingerichtet (installiert) sind.

    • VPS: Du hast dein VPS bereits erhalten und hast Zugriff drauf
    • Webmin: Du hast Webmin als Option bei Contabo mitbestellt oder eigenständig installiert
    • Nginx: Nginx ist installiert und einsatzbereit
    • Let's Encrypt: Let’s Encrypt ist installiert
    • Domain: Du hast eine Domain welche du mitbestellt oder eingebunden hast. Sprich, dein Server würde auf diese Domain antworten.

    Betriebssystem: Außerdem gehe ich davon aus, dass ein Linux in Verwendung ist.

    Sprich, in diesem Zustand solltest du einen VPS-Server haben, welcher zumindest über die IP oder die Standard-Domain des Providers (Contabo in diesem Beispiel) erreichbar ist.

    Dein Webmin ist standardmäßig unter folgender Domain (als Schema) erreichbar. Das SSL-Zertifikat (beim Aufruf über https://…) ist in der Regel nicht valide.

    https://vmd<kunden-kennung>.contaboserver.net:10000/

    Hinweis: Wenn du Firewall einsetzen möchtest, achte darauf, dass der Port 10000 ebenfalls offen ist, falls du dein Webmin erreichen möchtest.

    DNS-Eintrag

    In diesem Szenario setzen wir uns als Ziel, dass unser Webmin unter webmin.mydomain.com (also Domain bitte natürlich deine Domain setzen) erreichbar ist.

    Dafür soll sichergestellt werden, dass die DNS-Einträge bei der Domain korrekt eingerichtet sind und auf diesen Server zeigen. Vor allem ist der A-Record wichtig.

    Beispiel DNS-Konfiguration

    TypNameValue/ZielTTL
    Awebmin100.200.300.4003600
    CNAMEwwwmydomain.com3600
    A@webmin.mydomain.com3600
    A@100.200.300.4003600
    MX@mail.mydomain.com3600
    TXT@v=spf1 ip4:100.200.300.400 ~all3600

    Hinweis: Ersetze “100.200.300.400” mit der tatsächlichen IP-Adresse deines VPS-Servers. Der wichtigste Eintrag für Webmin ist der A-Record für “webmin”, der auf die IP-Adresse deines Servers zeigt.

    Nach der Einrichtung des DNS-Eintrags kann es je nach TTL-Einstellungen und DNS-Propagation einige Minuten bis Stunden dauern, bis die Änderungen weltweit wirksam werden.

    Hosts Eintrag

    Damit der Server auf unsere Sub-Domain webmin.mydomain.com reagiert, sollte ein Eintrag in der Datei /etc/hosts vorgenommen werden.

    Im Falle eines VPS bei Contabo könnte die hosts Datei wie folgt aussehen. Die IP-Adresse sollte natürlich die sein, die deinem VPS vergeben wurde.

    VPS - Hosts Eintrag - Subdomain

    Certbot Installation

    Hier zeige ich kurz, wie man Certbot unter einem Ubuntu-Server installieren kann.

    1 - System Aktualisieren

    sudo apt update && sudo apt upgrade

    2 - Certbot installieren

    Certbot kann für Apache und für Nginx installiert werden, indem man dazugehörige, begleitende Paket installiert.

    Für Apache
    sudo apt install certbot python3-certbot-apache -y
    Für Nginx
    sudo apt install certbot python3-certbot-nginx -y

    Man kann auch alternativ Certbot manuell installieren und die Konfiguration manuell vornehmen. Ich habe in meinem Fall Certbot für Nginx installiert.


    3 - Zertifikat erstellen

    Nun werden wir mit dem Certbot ein Zertifikat für eine Domain anfordern. Normalerweise benötigt Certbot eine erreichbare URL, welche man über sites-availbale und sites-enabled bereitstellt, mit einer minimalen Konfiguration. Es muss lediglich auf Port 80 hören.

    In unserem Fall werden wir keinen VirtualHost Eintrag bein Nginx erzeugen, da Webmin einen eigenen Web-Server mitbringt und nicht Nginx oder Apache verwendet.

    sudo certbot certonly --standalone -d webmin.mydomain.com

    Damit wird Certbot die Zertifikatsdateien erstellen, welche im folgenden Verzeichnis zu finden sein werden.

    /etc/letsencrypt/live/webmin.mydomain.com/fullchain.pem
    /etc/letsencrypt/live/webmin.mydomain.com/privkey.pem

    4 - Möglicher Fehler (Port 80)

    Es kann unter Umständen passieren, dass Certbot beim Versuch ein standalone Zertifikat zu erstellen einen Fehler wirft, der ungefähr so aussieht.

    Could not bind TCP port 80 because it is already
    in use by another process on this system (such as a web server). 
    Please stop the program in question and then try again.

    Es bedeutet, dass der Port 80 bereits durch einen Dienst belegt ist und nicht durch Certbot in Anspruch genommen werden kann.

    Hier könnte es helfen Apache oder Nginx anzuhalten, den Befehl zum Erstellen des Zertifikats auführen und den Web-Server wieder starten.

    sudo systemctl stop nginx
    # oder
    sudo systemctl stop apache2

    Webmin Konfiguration (Part 1)

    Im nächsten Schritt müssen wir die Webmin Konfiguration anpassen.

    Die Konfigurationsdatei für Webmin liegt unter diesem Pfad: /etc/webmin/miniserv.conf.

    Folgende Einträge sollte man setzen bzw. hinzufügen, falls es sie nicht gibt. In meinem Fall war der Eintrag certfile nicht vorhanden.

    /etc/webmin/miniserv.conf
    ssl=1
    keyfile=/etc/letsencrypt/live/webmin.mydomain.com/privkey.pem
    certfile=/etc/letsencrypt/live/webmin.mydomain.com/fullchain.pem

    Nach diesen Änderungen muss man Webmin neustarten. Das erfolgt mit folgender Anweisung.

    sudo systemctl restart webmin

    Später werden wir nochmals zu dieser Konfiguration aufgrund einer Angelegenheit zurückkommen.

    Nginx Konfiguration

    Wie oben bereits kurz angesprochen, verwendet Webmin kein Nginx oder Apache Server. Es hat einen eigenen Server. Da aber unser Server über die Ports 80 und 443 und die Protokolle HTTP und HTTPS mit der Außenwelt kommuniziert, müssen wir es irgendwie hinkriegen, dass der unser Server nicht nur auf webmin.mydomain.com reagiert, sondern auch noch eben unseren Webmin-Dienst anspricht.

    Das erfolgt über den sogenannten Reverse Proxy. Der Hintergedanke ist hierbei eine eingehende Anfrage auf webmin.mydomain.com auf einen bestimmten Dienst intern umzuleiten.

    Für diesen Zweck erstellen wir eine Nginx-Konfigurationsdatei. Dazu öffnen wir mit Admin-Rechten die Datei /etc/nginx/sites-available/webmin.mydomain.com und platzieren folgende Konfiguration.

    server {
        listen 80;
        server_name webmin.mydomain.com;
    
        # Redirect HTTP auf HTTPS
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        server_name webmin.mydomain.com;
    
        ssl_certificate /etc/letsencrypt/live/webmin.mydomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/webmin.mydomain.com/privkey.pem;
    
        # Sicherheitsheader optional
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
        location / {
            proxy_pass https://127.0.0.1:10000/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    
            # Webmin benutzt Self-Signed Zertifikate, deshalb:
            proxy_ssl_verify off;
        }
    }

    Webmin Konfiguration (Part 2)

    Nun müssen wird abschließende Konfiguration bei Webmin vornehmen. Dafür öffnen wir erneut die Datei /etc/webmin/miniserv.conf und werden folgende Optionen setzen.

    bind=127.0.0.1
    port=443

    Da wir nun über Reverse Proxy arbeiten, wird unser Nginx das Einfallstor von außen sein und leitet die Anfragen intern weiter.

    Der Port muss deswegen angepasst werden, weil wir sonst nach einer erfolgreichen Anmeldung auf webmin.mydomain.com:10000 umgeleitet werden. Und da unser Nginx keine Konfiguration kennt, die auf diesen Port hört, erhalten wir hier keine Website, sondern einen Fehler, dass die Website nicht geöffnet werden kann.

    Nach diesen Änderungen soll Webmin nochmals neugestartet werden.

    sudo systemctl restart webmin

    Nun müsste unsere Webmin-Instanz unter https://webmin.mydomain.com erreichbar sein.