NGinx Proxy Manager
Den Nginx Proxy Manager (NPM) kann man vor Webservices im eigenen Netz schalten. Der Datenverkehr wird dann immer durch den NPM zu den Webservices geleitet. Das kann man z.B. dazu nutzen, Absicherungen wie Virenschutz, Contentfilter oder Ad-Blocker dazwischen zu stellen. Vor allem aber kann man den NPM dazu nutzen, Webservices mit sicheren SSL-Zertifikaten abzusichern und so zum Beispiel per https auf eine Webanwendung zuzugreifen, die eigentlich nur http kann.
Installation
Ich bin auf meinem Server per SSH angemeldet und besitze auch die Sudo-Rechte (siehe hierzu: https://tutorials.kernke.koeln/sicherheit/server-absichern.html). Zunächst ist eine Dockerumgebung zu installieren. Dazu gibt es verschiedene Methoden. Meine habe ich hier: Docker beschrieben. Dann wird ein Verzeichnis namens "npm" erstellt und in selbiges gewechselt. Darin erstellen wir mit nano eine Datei namens "config.json" mit folgendem Inhalt:
{
"database": {
"engine": "mysql",
"host": "db",
"name": "npm",
"user": "npm",
"password": "npm",
"port": 3306
}
}
services:
app:
image: jc21/nginx-proxy-manager:latest
restart: always
ports:
- 80:80
- 81:81
- 443:443
volumes:
- ./config.json:/app/config/production.json
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
environment:
# if you want pretty colors in your docker logs:
- FORCE_COLOR=1
db:
image: mariadb:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: "npm"
MYSQL_DATABASE: "npm"
MYSQL_USER: "npm"
MYSQL_PASSWORD: "npm"
volumes:
- ./data/mysql:/var/lib/mysql
docker compose up -d
Email address: admin@example.com
Password: changeme
Nutzung von Let's encrypt Zertifikaten für Freigaben
Wenn wir einen Dienst im Internet freigeben, dann können wir den NPM dazu nutzen, ihn mit einem SSL-Zertifikat verschlüsselt auszuliefern. Im Folgenden gehe ich daher davon aus, dass es einen intern gehosteten Webdienst gibt und dass eine Portfreigabe auf den NPM im Internet-Router eingerichtet ist. Außerdem gibt es eine (dynamische) Domain, die auf dem Router als DynDNS eingetragen ist. Wie das im Einzelnen geht, hängt vom jeweils verwendeten Internet-Router ab und ist daher nicht Gegenstand dieses Tutorials.
Wir gehen also zunächst auf die Web-GUI des NPM und dort auf "Hosts/Proxy Hosts" und klicken auf den Button "Add Proxy Host". In dem sich nun öffnenden Dialog geben wir den Namen, unter dem der Dienst von außen erreichbar ist, ein und die interne IP-Adresse sowie den Port.
Absicherung von ausschließlich intern erreichbaren Diensten
Wenn wir Webdienste haben, die wir auch intern mit einem vertrauenswürdigen SSL-Zertifikat absichern möchten, dann können wir dazu einen Dienst wie DuckDNS nutzen. Hier besteht die Möglichkeit, ein Let's Encrypt Zertifikat zu beziehen, ohne den Dienst für das Internet freizugeben. Zunächst muss man sich bei DuckDNS unter https://www.duckdns.org registrieren oder einloggen. Hier kann man kostenlos bis zu 5 Subdomains von duckdns.org beziehen. Diese kann man für DynDNS nutzen oder aber - und das machen wir hier - als Pseudo-Domains, die aus dem großen, bösen Internet gar nicht erreichbar sind. Auf der Webseite von Duckdns sucht man sich zunächst eine freie Domain aus. Wenn man sie ausgewählt hat, dann wird unter "current ip" die IP-Adresse angezeigt, mit der man gerade im WWW unterwegs ist. Diese überschreibt man nun einfach mit der internen Adresse des Webdienstes, also z.B. 192.168.47.11. Diese Adresse ist von außen nicht erreichbar.
Im oberen Teil der Webseite wird ein Token angezeigt. Das ist wichtig und muss kopiert werden. Nun loggt man sich auf der Webseite des NPM ein und geht dort auf die Seite "SSL Certificates". Dort klickt man auf "Add SSL Certificate" und "Let's Encrypt". In dem sich öffnenden Dialogfenster gibt man zunächst die Domain(s) ein, die man nutzen möchte. Hier empfiehlt es sich, die soeben registrierte Subdomain mit und ohne vorgestelltes "*." einzugeben. Dann wählt man "Use a DNS Challenge" und den DNS Provider "DuckDNS" aus. Außerdem kopiert man in das Feld "Credentials File Content" das vorher kopierte Token hinein.
sudo nano /etc/hosts
192.168.47.12 *.hanswurst4711.duckdns.org
Let's Encrypt Zertifikate erneuern
Zertifikate sind immer nur eine begrenzte Zeit gültig. Rechtzeitig bevor sie ablaufen, erhalten wir eine freundliche Mail von Let's Encrypt. Ein Zertifikat im NPM zu erneuern, ist so ziemlich das Einfachste, was man sich vorstellen kann. Man geht auf der Web-Oberfläche des NPM auf "SSL Certificates" und klickt auf die drei Punkte neben dem zu erneuernden Zertifikat. Hier kann man einfach auswählen "Renew Now" und das Zertifikat wird erneuert.