Docker auf Debian / Ubuntu nicht respektiert ufw firewall Einstellungen, die Ports freigeben.
Docker umgeht ufw firewall Einstellungen und stellt Ports der Außenwelt zur Verfügung, ein sehr schwerwiegendes Sicherheitsloch.
Wieder ein unerwartetes Docker Problem. In einem früheren Beitrag habe ich beschrieben, warum und wie Sie Docker zwingen müssen, einen subnet zu verwenden, um plötzliche unerwartete Änderungen im Netzwerk mit Folgen wie nicht mehr funktionierende E-Mails zu verhindern.
In diesem Beitrag geht es um Docker , das die Einstellungen von firewall nicht respektiert, zumindest wenn Debian / Ubuntu und ufw (Uncomplicated Firewall) laufen. Docker sagt dir das nicht und stellt Ports zur Verfügung, so dass dieses Verhalten völlig unerwartet ist.
Auf meinem ISPConfig -Server läuft Debian Stretch. Ich verwende ufw als firewall, unten sind die wichtigsten Einstellungen.
ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
8080/tcp ALLOW IN Anywhere
25 ALLOW IN Anywhere
Wie du sehen kannst, sind alle eingehenden Verbindungen blockiert, mit Ausnahme einiger weniger erlaubter Verbindungen.
Meine Webanwendungen Docker Python verwenden den Gunicorn WSGI HTTP-Server, um die Python Flask App zu bedienen. Nginx läuft auf dem Host und ist für diese Anwendungen als umgekehrtes proxy konfiguriert. Funktioniert wie ein Charme. In der Datei docker-compose.yml werden die Ports aus der .env-Datei geladen:
services:
web:
...
env_file:
- ./.env
ports:
- "${SERVER_PORT_HOST}:${SERVER_PORT_CONTAINER}"
Für eine Anwendung enthält die Datei.env diese Zeilen:
SERVER_PORT_HOST=8001
SERVER_PORT_CONTAINER=8001
Somit ist die verwendete Zeile docker-compose :
ports:
- "8001:8001"
Das Problem: Docker Port 8001 ist dem externen Netzwerk ausgesetzt, auch wenn ufw konfiguriert ist, um eingehende Verbindungen zu blockieren.
Das bedeutet, dass die Applikation/Service Docker auch unter <SERVER-IP>:8001 sichtbar ist. Das ist nicht nur sehr schlecht, sondern auch völlig unerwartet, da ufw konfiguriert wurde, um alle eingehenden Verbindungen zu blockieren.
Lösungen
Es gibt mehrere Lösungen dafür, hier habe ich mich entschieden, den Port an den Hostcomputer zu binden. Die Zeilen docker-compose.yml werden dann zu:
ports:
- "127.0.0.1:8001:8001"
Das funktioniert bei mir.
Andere Möglichkeiten, dies zu lösen, sind, um zu verhindern, dass Docker mit dem firewall verwechselt wird, Regeln zur ufw -Datei /etc/ufw/after.rules hinzufügen, etc. Siehe Links unten.
Zusammenfassung
Einige Leute betrachten dieses Docker Verhalten als Fehler, und ich kann dem nur zustimmen. Ufw ist ein firewall, ein sehr wichtiges Programm zur Kontrolle der Sicherheit. Ufw ist sehr weit verbreitet und wenn ein anderes Programm sein Verhalten umgeht, muss der Benutzer informiert werden. Bis dies behoben ist, sollte mindestens Docker beim Start einer Anwendung eine große Warnmeldung ausgeben.
Links / Impressum
Be careful with Docker ports!
https://dev.to/kovah/be-careful-with-docker-ports-3pih
Docker service exposed publicly though made to expose ports to localhost only
https://stackoverflow.com/questions/50621936/docker-service-exposed-publicly-though-made-to-expose-ports-to-localhost-only
Docker services only available to the local host
https://stackoverflow.com/questions/54261105/docker-services-only-available-to-the-local-host
How to fix the Docker and UFW security flaw
https://www.techrepublic.com/article/how-to-fix-the-docker-and-ufw-security-flaw/
The dangers of UFW + Docker
https://blog.viktorpetersson.com/2014/11/03/the-dangers-of-ufw-docker.html
What is the best practice of docker + ufw under Ubuntu
https://stackoverflow.com/questions/30383845/what-is-the-best-practice-of-docker-ufw-under-ubuntu
Mehr erfahren
Docker
Einen Kommentar hinterlassen
Kommentieren Sie anonym oder melden Sie sich zum Kommentieren an.
Kommentare (1)
Eine Antwort hinterlassen
Antworten Sie anonym oder melden Sie sich an, um zu antworten.
Ein wirklich schweres und immer noch aktuelles Sicherheitsproblem. Danke für die schnelle Lösung für Docker Compose.
Neueste
- Ausblenden der Primärschlüssel der Datenbank UUID Ihrer Webanwendung
- Don't Repeat Yourself (DRY) mit Jinja2
- SQLAlchemy, PostgreSQL, maximale Anzahl von Zeilen pro user
- Anzeige der Werte in den dynamischen Filtern SQLAlchemy
- Sichere Datenübertragung mit Public Key Verschlüsselung und pyNaCl
- rqlite: eine hochverfügbare und distverteilte SQLite -Alternative
Meistgesehen
- Verwendung von Pythons pyOpenSSL zur Überprüfung von SSL-Zertifikaten, die von einem Host heruntergeladen wurden
- Verwendung von UUIDs anstelle von Integer Autoincrement Primary Keys mit SQLAlchemy und MariaDb
- Verbindung zu einem Dienst auf einem Docker -Host von einem Docker -Container aus
- PyInstaller und Cython verwenden, um eine ausführbare Python-Datei zu erstellen
- SQLAlchemy: Verwendung von Cascade Deletes zum Löschen verwandter Objekte
- Flask RESTful API Validierung von Anfrageparametern mit Marshmallow-Schemas