Docker Swarm und Firewall
Nach etlichen unerklärbaren Abuse-Lettern meines Hosting-Anbieters, trotz sorgfältiger Firewall-Konfiguration, über offene Ports und ungesicherte Datenbanken
Nach etlichen unerklärbaren Abuse-Lettern meines Hosting-Anbieters, trotz sorgfältiger Firewall-Konfiguration, über offene Ports und ungesicherte Datenbanken. Kam ich nach langer Suche auf die Ursache des Problems. Aber erstmal von vorne. Docker Swarm ist eine gute Alternative zu Kubernetes, wenn man die Komplexität nicht unnötig erhöhen will. Docker Swarm bietet neben der Container Orchestrierung auch eingebaute Netzwerke, sowie Konfigurations und Secret verwaltung. Ein Sicherheitsproblem stellt das nutzen von Docker Swarm auf Ubuntu und der eingebauten ufw
Firewall dar. Schauen wir uns das mal genauer an.
Das Problem
Wir möchten auf unserem Ubuntu Server eine MEAN Stack Anwendung betreiben.
Firewall einrichten
$ ufw allow https && ufw allow http && ufw allow ssh && ufw enable
Das Komando setzt in ufw Regeln für http(s) und ssh und schaltet die Firewall an.
docker swarm initialisieren
Wir installieren Docker und startet Docker Swarm mit einem einzelnen Knoten.
$ docker swarm init
MongoDB als Swarm Service
$ docker service create --name mongo --publish mode=host,target=27017,published=27017 mongo:3.4
Wir starten einenen MongoDB Service und öffnen den Standard MongoDB Port 27017
. Dieser ist in unserer Firewall nicht geöffnet und sollte nur lokal erreichbar sein.
Der Versuch
Wenn man sich jetzt einen Mongo-Client nimmt und einen Verbindungsversuch von Außen unternimmt - geht es erschreckender weise.
Das Erklärt dann natürlich auch die Abuse-Letter.
Erklärung
Docker Swarm setzt sich vor UFW in die IP-Tables. Somit sind die Regeln bereits gesetzt bevor ufw überhaupt aktiv wird.
Lösung
Nach langer suche habe ich das gefunden.
Manuell muss man das /etc/ufw/after.rules
File editieren und am ende folgende Regeln anhängen:
# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16
-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN
-A DOCKER-USER -j ufw-user-forward
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A DOCKER-USER -j RETURN
COMMIT
# END UFW AND DOCKER
Danach mit sudo systemctl restart ufw
oder sudo ufw reload
ufw durchstarten.
Um danach Zufriffe z.B. auf Port 80
zu zulassen muss man mit
ufw route allow proto tcp from any to any port 80
die Ports wieder öffnen.
TL;DR
Docker Swarm setzt sich vor die Firewall Regeln von UFW. Hier gibt es einen Container der es FIXT