
Postulat : utilisation de docker

Suite à un changement d’OS, je dois faire tourner des sites en php 5.5 sur un serveur en php7. Je me suis naturellement tourné vers docker pour cela.
La mise en place s’est faite rapidement. J’ai créé une image docker apache/php, en me basant sur les informations présentes ici.
J’ai ensuite lancé un container avec l’option -p 8080:80. Le site est donc accessible via le port 8080. J’ai ensuite mis en place un reverse proxy apache pour diffuser ce site sur le port 80 et 443 en fonction du hostname. La gestion du certificat https se fait par letsencrypt via apache. Je n’ai pas besoin de définir un certificat dans le container, c’est le reverse proxy qui fait tout pour moi.
Sécurité : utilisation de ufw
Pour régler la sécurité du serveur, j’utilise ufw, qui ne laisse passer que les ports ssh, http et https. J’étais donc assez confiant, l’image docker ne devait pas être visible de l’extérieur.
Pour vérifier, un simple ufw verbose me montrait les bonnes informations.
Et pourtant…
Le serveur répond bien à l’extérieur sur le port 8080… malgré les informations affichées par ufw. En fait, avec l’instruction -p, docker ouvre une règle iptable pour autoriser les flux entrants. Cette règle n’étant pas gérée par ufw, elle n’apparaît pas dans la fonction verbose de ufw.
Solution
Si comme moi vos containers doivent rester « privés » et uniquement appelés par un reverse proxy, on peut supprimer l’option de docker pour ajouter une règle iptable automatique.
Sous ubuntu, éditez le fichier /etc/default/docker
DOCKER_OPTS=" --iptables=false"
Et relancez docker :
systemctl restart docker
Une fois votre container relancé, il ne sera plus accessible directement depuis l’extérieur.