devops
Trois réseaux de conteneurs, pour que la base n'ait qu'un voisin
Trois réseaux de conteneurs, pour que la base n'ait qu'un voisin
Par défaut, Docker Compose met chaque service sur un seul réseau et ils peuvent tous s'atteindre. Pour une poignée de conteneurs, c'est correct. Une fois que la stack est une base, un pooler de connexions, un cache, un service d'images, une API, trois front-ends statiques, un reverse proxy et un client tunnel, « tout peut parler à tout » est une décision que tu as prise en n'en prenant pas une.
La topologie de production ici, c'est trois réseaux bridge :
front— les conteneurs SPA statiques et le reverse proxy. Interne, aucun port d'hôte.edge— le reverse proxy, l'API, le cache, le client tunnel. C'est là qu'atterrit le trafic extérieur et qu'il est routé.data— le pooler de connexions, la base, le service d'images. Interne.
L'API est le seul service à la fois sur edge et data. Rien sur front ne peut adresser la base du tout — il n'y a pas de route. Un conteneur front-end qui exécuterait d'une façon ou d'une autre du code d'attaquant ne peut toujours pas ouvrir un socket vers Postgres, parce qu'ils ne partagent aucun réseau.
Pourquoi s'embêter quand l'authentification au niveau application est déjà là
Parce que la défense en profondeur signifie qu'une seule défaillance n'est pas totale. Si le service d'images a un bug de parsing et se fait compromettre, la question « qu'est-ce qu'il peut maintenant atteindre » devrait avoir une réponse courte et ennuyeuse — et avec lui seul sur data avec le pooler et la base, la réponse est lisible sur le diagramme de topologie au lieu d'exiger un audit des appels sortants de chaque service.
Ça force aussi à être explicite. Mettre le service d'images sur data a impliqué de décider, exprès, que l'API y fait le pont — plutôt qu'il ne dérive sur le même réseau plat que les front-ends publics parce que c'est là que docker compose met les choses par défaut.
Associe ça à des limites de mémoire par conteneur. Un conteneur qui fuit ou est attaqué et qui ne peut pas épuiser la RAM de l'hôte est un service dégradé ; un qui le peut est une panne pour tout le reste sur la machine.