Réseaux sous Docker : isoler les containers

containers

Quand on veut déployer un container docker, rien de plus simple, un docker run suffit à rendre le container disponible.

Mais si vous n’avez pas réfléchi avant à l’architecture réseau, vous faites communiquer vos containers dans le réseau par défaut, ce qui n’est pas forcément une bonne idée d’un point de vue sécurité.

 

Les trois type de réseau par défaut

 

Bridge

 

Par défaut, Docker attache les containers au réseau « bridge » qui a été créé à l’installation de Docker.

Il s’agit donc d’un pont qu’on retrouve côté machine hôte, côté Docker et côté conteneur :

# Côté hôte :
$ ip -4 addr
...
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
 inet 172.17.0.1/16 scope global docker0
 valid_lft forever preferred_lft forever
...

# Côté Docker :
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
7b60ae452056 bridge bridge local 

# Côté container :
root@6f82301ed59b:/# ip -4 a
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link-netnsid 0
 inet 172.17.0.2/16 scope global eth0
 valid_lft forever preferred_lft forever

 

Les hôtes dans ce type de réseau sont attachés à un commutateur virtuel (dockerX) et sont NATés de sorte qu’ils sont dans un réseau IP isolé et joignable de l’extérieur en exposant un port.

 

None

Dans ce cas, le conteneur n’est pas attaché au réseau,  il n’a pas d’autre adresse IP que localhost/127.0.0.1.

 

Host

Le conteneur est dans ce cas directement lié à la carte réseau de l’hôte. Il ne faut jamais utiliser ce genre de configuration en production car il n’y a pas d’isolation réseau.

 

Bonnes pratiques en terme de sécurité :

 

L’architecture des réseaux de conteneurs doit ressembler à celle des réseaux en général :

Séparation logique de tous types de réseau (réseau de dév, réseau de prod, DMZ publiques, privées, …).

Il n’y a pas de limitations dans les réseaux Docker et ils sont NATés par l’hôte donc n’hésitez pas à en créer autant que de besoin.

 

Créer un réseau par pile logicielle, par exemple, un Nextcloud hébergé en Docker pourrait ressembler à ça :

  • Un conteneur PHP-FPM
  • Un conteneur Nginx
  • Un conteneur PostgreSQL
  • Un réseau dédié

docker-network

 

 

Sur le même sujet :