Docker op Debian / Ubuntu niet in overeenstemming met ufw firewall instellingen voor het blootstellen van de havens.
Docker omzeilt ufw firewall instellingen en stelt poorten bloot aan de buitenwereld, een zeer ernstig veiligheidslek.
Weer een andere onverwachte Docker kwestie. In een vorige post beschreef ik waarom en hoe je Docker moet dwingen om een subnet te gebruiken, om plotselinge onverwachte veranderingen in het netwerk te voorkomen, met als gevolg dat mail niet meer werkt.
Dit bericht gaat over Docker die firewall niet respecteert, althans wanneer Debian / Ubuntu en ufw (Uncomplicated Firewall) wordt uitgevoerd. Docker vertelt je dit niet, en legt de poorten bloot, dus dit gedrag is totaal onverwacht.
Mijn ISPConfig server draait Debian Stretch. Ik gebruik ufw als firewall, hieronder staan de belangrijkste instellingen.
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
Zoals u kunt zien, zijn alle inkomende verbindingen geblokkeerd, op enkele uitzonderingen na.
Mijn Docker Q4_TNEMECALPER_4Q webapplicaties gebruiken de Gunicorn WSGI HTTP-server om de Python Flask -applicatie te bedienen. Nginx draait op de host en is voor deze toepassingen geconfigureerd als een omgekeerde proxy . Werkt als een charme. In het docker-compose.yml bestand worden de poorten geladen vanuit het .env bestand:
services:
web:
...
env_file:
- ./.env
ports:
- "${SERVER_PORT_HOST}:${SERVER_PORT_CONTAINER}"
Voor één toepassing bevat het .env-bestand deze regels:
SERVER_PORT_HOST=8001
SERVER_PORT_CONTAINER=8001
De gebruikte regel docker-compose is dus in feite de regel docker-compose :
ports:
- "8001:8001"
Het probleem: Docker -poort 8001 wordt blootgesteld aan het externe netwerk, zelfs als ufw is geconfigureerd om inkomende verbindingen te blokkeren.
Dit betekent dat de Docker applicatie/dienst ook zichtbaar is bij <SERVER-IP>:8001. Dit is niet alleen erg slecht, het is ook totaal onverwacht omdat ufw is geconfigureerd om alle inkomende verbindingen te blokkeren.
Oplossingen
Er zijn verschillende oplossingen hiervoor, hier heb ik ervoor gekozen om de poort aan de hostmachine te binden. De docker-compose.yml lijnen worden dan:
ports:
- "127.0.0.1:8001:8001"
Dit werkt voor mij.
Andere manieren om dit op te lossen zijn het voorkomen van Docker geknoei met firewall, regels toevoegen aan het ufw -bestand /etc/ufw/after.rules, enz. Zie onderstaande links.
Samenvatting
Sommige mensen beschouwen dit Docker gedrag als een bug, en ik kan hier alleen maar mee instemmen. Ufw is een firewall, een zeer belangrijk programma om de veiligheid te controleren. Ufw wordt op grote schaal gebruikt en als een ander programma zijn gedrag omzeilt, moet de gebruiker worden geïnformeerd. Totdat dit vaststaat, moet minimaal Docker een groot waarschuwingsbericht afgeven bij het starten van een toepassing.
Links / credits
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
Lees meer
Docker
Laat een reactie achter
Reageer anoniem of log in om commentaar te geven.
Opmerkingen (1)
Laat een antwoord achter
Antwoord anoniem of log in om te antwoorden.
Ein wirklich schweres und immer noch aktuelles Sicherheitsproblem. Danke für die schnelle Lösung für Docker Compose.
Recent
- Database UUID primaire sleutels van je webapplicatie verbergen
- Don't Repeat Yourself (DRY) met Jinja2
- SQLAlchemy, PostgreSQL, maximum aantal rijen per user
- Toon de waarden in SQLAlchemy dynamische filters
- Veilige gegevensoverdracht met Public Key versleuteling en pyNaCl
- rqlite: een alternatief voor SQLite met hoge beschikbaarheid en distributed
Meest bekeken
- Met behulp van Python's pyOpenSSL om SSL-certificaten die van een host zijn gedownload te controleren
- Gebruik van UUIDs in plaats van Integer Autoincrement Primary Keys met SQLAlchemy en MariaDb
- PyInstaller en Cython gebruiken om een Python executable te maken
- Maak verbinding met een dienst op een Docker host vanaf een Docker container
- SQLAlchemy: Gebruik van Cascade Deletes om verwante objecten te verwijderen
- Flask RESTful API verzoekparametervalidatie met Marshmallow-schema's