container

Die Gefahren von Docker und UFW – Ports richtig schließen

Wer Dienste über Docker anbietet und den Server per UFW (Uncomplicated Firewall) absichert, dem mag möglicherweise aufgefallen sein, dass trotz eines „DENY“, Docker-Dienste weiterhin erreichbar sind.
Docker ändert nämlich die iptables so ab, dass Container sich direkt an einen Port binden können. Die gesetzten UFW-Regeln sind zwar gültig, aber eben nicht für Docker Container. Das stellt natürlich ein Sicherheitsrisiko dar.

Beispiel

An einem anschaulichen Beispiel lässt sich die Situation wohl leichter erkennen:
Server A – Mailserver. Der Zugriff auf POP3 und POP3S soll per UFW unterbunden werden. Der Zugriff über SSH, IMAP und SMTP ist gestattet. Eine Standardkonfiguration könnte so aussehen:

ufw allow ssh
ufw allow imap
ufw allow smtp
ufw default deny incoming
ufw enable 

Wird nun ein Docker Mailserver gestartet, sollten neben SSH nur die Dienste IMAP(s) und SMTP(s)erreichbar sein. Jeder andere Traffic sollte abgewiesen werden.

Der NMAP-Portscan

Wird nun von Server B ein Portscan auf Server A angesetzt, zeigt sich jedoch, dass keinesfalls nur 3 bzw. 5 Dienste erreichbar sind, sondern 7:

 root@b.voiceoverit.de:~#  nmap a.voiceoverit.de
Starting Nmap 7.70 ( https://nmap.org )
Not shown: 991 filtered ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
110/tcp open pop3
143/tcp open imap
465/tcp open smtps
993/tcp open imaps
995/tcp open pop3s

Neben den freigegebenen Diensten sind zudem aber noch POP3 und POP3S erreichbar. Beide bereitgestellt von dem verwendeten Docker Container. Ein Blick in die Konfiguration von UFW auf dem Hostsystem Server A zeigt jedoch eine korrekte Konfiguration. Es sind nur die gewünschten Dienste freigegeben:

root@a.voiceoverit.de:~# ufw status
status: active

To Action From
-- ------ ----
22/tcp ALLOW Anywhere
25/tcp ALLOW Anywhere
143/tcp ALLOW Anywhere
465/tcp ALLOW Anywhere
993/tcp ALLOW Anywhere

Docker und iptables

Wie bereits erwähnt, ändert Docker selbstständig die iptables ab und umgeht somit die von UFW gesetzten Richtlinien. Hier ein Ausschnitt aus der Konsole von Server A:

root@a.voiceoverit.de:~# iptables -L | grep 110
ACCEPT tcp -- anywhere 172.22.1.113 tcp dpt:110

Andererseits ist es natürlich verständlich, dass Docker die iptables verändert, denn die Container müssen schließlich an einen Port gebunden werden.

Docker Config anpassen:

Natürlich ist es möglich dieses Verhalten von Docker zu unterbinden. Hierzu muss in der Docker Konfigurationsdatei /etc/docker/config angepasst werden.
Die Zeile DOCKER_OPTS muss aktiv geschaltet werden, sowie der Zusatz –iptables=false angefügt werden.

Nachdem die Änderungen übernommen wurden, muss der Docker Deamon noch neu gestartet werden:

sudo systemctl restart docker

Wird nun ein Docker Container bereitgestellt und gestartet, sollten die UFW Regeln beachtet werden.


Referenzen:
Docker Container Networking: https://docs.docker.com/network/

Bildquelle:
User „Pixabay“ @ pexles.com