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
Meest bekeken:
- Flask site penetration tests: security headers en de session cookie
- Flask meertalige verwerking, overschakeling en de 404 pagina Niet gevonden uitzondering
- Flask + SQLAlchemy + MariaDB profilering
- Hoe de tijdzone in te stellen bij gebruik van de Python Alpine Docker image
- Python Flask app aan Docker in ISPConfig3 met Nginx - deel 1: Minimale app
- SQLAlchemy datetime berekeningen aan de serverzijde