Étonnamment, Docker ne fonctionne pas immédiatement avec le « pare-feu universel » ou UFW de Linux. Ils modifient tous les deux la même configuration iptables, ce qui peut entraîner des erreurs de configuration exposant des conteneurs qui n’étaient pas censés être publics. Voici comment y remédier.
Pourquoi Docker ne fonctionne-t-il pas avec UFW ?
UFW est destiné à être un pare-feu très simple. Le problème est que UFW et Docker tentent de modifier les mêmes règles de pare-feu sous-jacentes, et ce conflit nécessite une configuration supplémentaire pour déterminer si vous souhaitez exécuter UFW et Docker ensemble.
Si vous configurez un pare-feu UFW de base pour refuser par défaut et autoriser HTTP et SSH, cela semblera sécurisé, mais cela n’empêchera pas Docker de démarrer des conteneurs liés à d’autres ports. Ce problème peut être difficile à détecter, car UFW et Docker sont des systèmes distincts. UFW vous ment sans le savoir et n’affichera pas les ports ouverts des conteneurs Docker.
Cela peut être un problème majeur si vous ne l’attrapez pas. Par exemple, vous vouliez peut-être exécuter un panneau d’administration interne sur le port 8000 et le mettre en liste blanche avec votre propre adresse IP. Bien que ce ne soit pas la configuration la plus sécurisée pour commencer, tout va bien, surtout si le panneau dispose d’une authentification supplémentaire.
Cependant, UFW affichera la règle de pare-feu comme correctement sur liste blanche, et elle vous sera bien sûr visible depuis votre emplacement sur liste blanche. Mais, s’il est exécuté via Docker, il sera visible sur le port 8000 de n’importe où par défaut.
Correction de la configuration de Docker
Il existe une solution fournie par Docker, en éditant /etc/default/docker
ou /etc/docker/daemon.json
et simplement désactiver Docker iptables
fonctionnalité au total :
DOCKER_OPTS="--iptables=false"
Cela fonctionne, cependant, ce n’est qu’une demi-solution. Cela désactive la capacité de Docker à gérer son propre réseau et peut empêcher les conteneurs d’accéder à Internet du tout hors de la boîte. Cela peut toujours fonctionner, mais vous devrez maintenir manuellement iptables
règles pour les conteneurs Docker et les réseaux personnalisés, ce qui est compliqué, ennuyeux et va à l’encontre de la simplicité d’UFW.
La vraie solution est compliquée, mais heureusement, elle est assez courante pour qu’il existe un référentiel Github utile détaillant le problème et les étapes pour le résoudre. Essentiellement, vous devez modifier la configuration d’UFW à /etc/ufw/after.rules
pour ajouter le bloc suivant à la fin :
# BEGIN UFW AND DOCKER *filter :ufw-user-forward - [0:0] :ufw-docker-logging-deny - [0:0] :DOCKER-USER - [0:0] -A DOCKER-USER -j ufw-user-forward -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-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16 -A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8 -A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12 -A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16 -A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8 -A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12 -A DOCKER-USER -j RETURN -A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] " -A ufw-docker-logging-deny -j DROP COMMIT # END UFW AND DOCKER
Vous pouvez le faire manuellement, mais il existe également un utilitaire sympa fourni dans ce référentiel qui l’automatisera et fournira des commandes utiles pour vérifier l’état réel du pare-feu. Vous pouvez le télécharger à partir de ce dépôt :
sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker sudo chmod +x /usr/local/bin/ufw-docker
Ensuite, installez la configuration et redémarrez UFW.
ufw-docker install sudo systemctl restart ufw
Une fois redémarrées, les modifications devraient s’appliquer automatiquement, mais si ce n’est pas le cas, vous devrez peut-être redémarrer Docker ou votre machine en général. Une fois activé, les ports doivent tous être correctement bloqués.
Liste blanche des ports de conteneurs Docker avec UFW
Cette solution vous oblige à configurer le port un peu différemment. La ufw-docker
L’utilitaire a une commande qui mettra sélectivement en liste blanche les ports vers des conteneurs Docker spécifiques.
ufw-docker allow httpd 80
Toutefois, si vous souhaitez utiliser une règle plus avancée, telle que la liste blanche basée sur l’adresse IP, vous devrez utiliser ufw route allow
ufw route allow proto tcp from 1.2.3.4 to any port 9443