Comment démarrer avec l'API Docker Engine
Agence web » Actualités du digital » Comment utiliser Docker avec un pare-feu UFW

Comment utiliser Docker avec un pare-feu UFW

É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

★★★★★