Files
Kantin-Petit 0f63b3addd feat: socle sécurité — socket-proxy, réseaux, egress (v0.3.0)
Modèle de menace centré prompt-injection + défenses par couche
(surface réduite, socket-proxy obligatoire, scoping tokens, egress
ollama.com only, secrets par référence, lecture seule renforcée, audit).
Documente réseaux interne/egress et filtrage Docker en lecture seule P1.
Normalise les fins de ligne (.gitattributes).

Palier de risque : n/a (doc + conventions).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 01:00:45 +02:00

1.9 KiB

socket-proxy — accès Docker filtré

tecnativa/docker-socket-proxy s'intercale entre le serveur MCP Portainer (et toute brique ayant besoin de l'API Docker) et le socket Docker de l'hôte. Il filtre les endpoints de l'API Docker via des variables d'env (0 = refusé, 1 = autorisé). C'est le seul à monter /var/run/docker.sock (en lecture seule).

Phase 1 — lecture seule

Autoriser uniquement les endpoints de lecture, refuser tout le reste.

Variable Valeur P1 Effet
CONTAINERS 1 lister/inspecter conteneurs
IMAGES 1 lister/inspecter images
NETWORKS 1 lister/inspecter réseaux
VOLUMES 1 lister/inspecter volumes
SERVICES/TASKS/NODES 1 lecture swarm (si applicable)
INFO 1 docker info
VERSION 1 docker version
POST 0 refuse toute mutation (create/start/stop/rm…)
EXEC 0 refuse exec dans un conteneur
AUTH/SECRETS/CONFIGS 0 refuse l'accès aux secrets/configs
BUILD/COMMIT/IMAGES_CREATE 0 refuse build/commit/pull

POST=0 est la barrière clé : la plupart des actions destructrices passent par des requêtes POST. En Phase 1 on ne l'active jamais.

Mise en œuvre

Le service est défini dans infra/docker-compose.yml (service socket-proxy), branché uniquement sur chlova-internal, sans port publié. Le socket hôte est monté en :ro. Le MCP Portainer pointe vers tcp://socket-proxy:2375 au lieu du socket brut.

Rollback / durcissement

  • Pour revenir en arrière : remettre toutes les variables d'écriture à 0 et redéployer. Le passage en Phase 2 (écriture) n'ouvrira que les endpoints strictement nécessaires à la capacité ajoutée, après review (voir docs/security.md, checklist Phase 2).
  • Image épinglée (tag + digest) dans le compose, jamais :latest.