Docker Swarm und Firewall

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

Go back