0 Votes

docker-socket-proxy

Modifié par john le 2026/09/18 23:42

Proxy filtrant devant l'API Docker. Il permet à un service de lire l'état des conteneurs sans lui donner accès au socket Docker, qui équivaut à un accès root sur l'hôte.

Utilisateurs

ServiceBesoinRequête
n8nNotification des mises à jour de conteneursGET /containers/json

Stack

services:
 dockersocket:
   image: tecnativa/docker-socket-proxy:latest
   container_name: dockersocket
   restart: unless-stopped
   environment:
      - CONTAINERS=1
      - POST=0
   volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
   networks:
      - docker-api

networks:
 docker-api:
   name: docker-api
  • Seule la lecture des conteneurs est ouverte ; toutes les autres sections de l'API sont fermées par défaut.
  • POST=0 interdit toute écriture : création, arrêt ou suppression de conteneurs sont refusés (403).
  • Le proxy est sur un réseau dédié, docker-api. Seuls les services qui en ont besoin y sont ajoutés, en déclarant ce réseau en external dans leur stack.
Warning

Ne jamais mettre ce proxy sur le réseau partagé proxy : CONTAINERS=1 donne aussi accès au détail de chaque conteneur, y compris ses variables d'environnement et donc ses mots de passe. Et ne jamais activer POST=1 avec CONTAINERS=1 : un service compromis pourrait créer un conteneur privilégié et prendre le contrôle de l'hôte.

Vérifier

Depuis un conteneur autorisé, la lecture doit fonctionner et l'écriture être refusée :

docker exec n8n wget -qO- http://dockersocket:2375/containers/json | head -c 80; echo
docker exec n8n wget -qO- --post-data='' http://dockersocket:2375/containers/create 2>&1 | tail -1

Voir quelles requêtes passent réellement par le proxy :

docker logs dockersocket --since 24h 2>&1 | grep -oE '(GET|POST|DELETE|PUT) [^ ]+' | sed -E 's/\?.*//' | sort | uniq -c | sort -rn