Hat man seinen HTTP-Dienst endlich erfolgreich als Docker Container laufen, ist der nächste Schritt die unsichere HTTP-Verbindung mit einem SSL-Zertifikat und HTTPS nachzurüsten. Das geht kompliziert über Anpassungen am Docker Image, oder extrem einfach mit Stunnel.
Was ist Stunnel?
Stunnel ist eine Proxy-Lösung, die SSL/TLS-Verschlüsselung zu bestehenden Clients und Servern hinzufügt, ohne dass Änderungen an den Programmcode erforderlich sind.
Die Architektur von Stunnel basiert auf OpenSSL und ist optimiert für Sicherheit, Portabilität sowie Skalierbarkeit (einschließlich Lastenausgleich), was diese Lösung skalierbar macht.
Stunnel ist auf allen gängigen Plattformen verfügbar und arbeitet unabhängig vom verwendeten Protokoll. So lassen sich neben HTTP auch FTP, POP3, SMTP etc. absichern.
Docker Container mit SSL
Im folgenden Szenario lauft in unserem Docker-Container ein HTTP-Dienst auf Port 8080. Um diesen mit Stunnel abzusichern benötigen wir
- Stunnel selbst.
Details zur Installation von Stunnel findest Du hier. - Ein in der Regel selbst signiertes SSL-Zertifikat.
Solltest Du mit einem DynIP-Anbieter arbeiten kann auch ein ein Zertifikat für eine DynIP-Domain verwendet werden.
Nach der Installation von Stunnel legen wir folgende Konfiguration in der Datei stunnel.conf ab:
1 2 3 4 5 |
[https-docker] accept = 8081 connect = 8080 cert = stunnel.pem verifyChain = no |
Die Stunnel-Konfiguration erklärt:
- Die 1. Zeile ist der Name des Config-Section, hier https-docker. Dieser Name ist frei wählbar.
- accept: Der Port, auf dem Stunnel die verschlüsselte Verbindung erwartet, hier 8081.
- connect: Der Port über den sich Stunnel mit dem Dienst im Container verbindet, hier 8080.
- cert: Der Pfad zum SSL-Zertifikat. Solltest Du Stunnel nicht aus dem Ordner starten, in dem das Zertifikat liegt, muss hier der absolute Pfad ergänzt werden.
- verifyChain: Steht dieser Parameter auf “no”, erlaubt Stunnel selbst signierte SSL-Zertifikate.
Das ist auch schon alles. Wir starten Stunnel mit
1 |
./stunnel stunnel.conf |
Dann rufen unseren Docker-Dienst über Port 8081 über eine gesicherte SSL-Verbindung im Browser auf:
1 |
https://127.0.0.1:8081 |
Port 8080 sollte auf dem Host unseres Docker-Containers in dessen Firewall blockiert werden. Port 8081 hingegen wird freigegeben. So ist sichergestellt, daß nach außen nur SSL-Verbindungen genutzt werden: