148 lines
6.5 KiB
Markdown
148 lines
6.5 KiB
Markdown
---
|
|
title: Docker Socket Proxy
|
|
created: 2026-06-06
|
|
updated: 2026-06-06
|
|
type: app
|
|
tags: [catalogue, reverse-proxy, docker, security, hardening]
|
|
confidence: high
|
|
contested: false
|
|
sources: [https://selfh.st/apps/?tag=Reverse+Proxy, https://github.com/tecnativa/docker-socket-proxy]
|
|
---
|
|
|
|
# 🔌 Docker Socket Proxy
|
|
|
|
> **Proxy HTTP/HTTPS filtrant l'accès à l'API Docker Socket, écrit en Python**. Réputation : composant de sécurité quasi obligatoire pour toute stack self-hosted qui monte `/var/run/docker.sock` dans des conteneurs tiers.
|
|
|
|
## 📋 Informations Générales
|
|
|
|
| Champ | Valeur |
|
|
| :--- | :--- |
|
|
| **Site web** | [github.com/tecnativa/docker-socket-proxy](https://github.com/tecnativa/docker-socket-proxy) |
|
|
| **GitHub** | [tecnativa/docker-socket-proxy](https://github.com/tecnativa/docker-socket-proxy) |
|
|
| **License** | Apache-2.0 |
|
|
| **Langage** | Python 75.8%, Shell |
|
|
| **Étoiles GitHub** | 2.5k ⭐ |
|
|
| **Dernière MAJ** | 2026-04 |
|
|
| **Catégorie** | [[cat-reverse-proxy\|Sécurité]], Reverse Proxy, Docker |
|
|
|
|
## 📝 Description
|
|
|
|
**Docker Socket Proxy** est un **reverse proxy minimaliste** placé en amont du socket Docker Unix. Son rôle : **appliquer une liste blanche d'API endpoints** autorisés (ex : GET /containers/json) afin qu'un conteneur compromis ne puisse pas escalader ses privilèges et prendre le contrôle du daemon Docker.
|
|
|
|
Le problème qu'il résout est critique : monter `/var/run/docker.sock` dans un conteneur (ce que font **Watchtower**, **Traefik**, **Portainer**, **Dozzle**, etc.) lui donne par défaut **un accès root complet à l'hôte**. Un attaquant qui compromet l'un de ces conteneurs peut alors démarrer de nouveaux conteneurs privilégiés, lire le filesystem hôte, ou exfiltrer des secrets. Docker Socket Proxy **intercepte les requêtes** et **refuse tout endpoint non explicitement autorisé**.
|
|
|
|
L'outil est extrêmement léger (image basée sur Alpine + script Python de ~300 lignes), **zéro configuration** par défaut, et proposé en deux saveurs : l'originale (Tecnativa) et un fork **linuxserver** avec la même philosophie.
|
|
|
|
**Public cible** : **tous les utilisateurs self-hosted** qui montent le socket Docker dans des conteneurs. Devrait être systématique. C'est l'un des **quick wins sécurité** les plus rentables du domaine.
|
|
|
|
## 🚀 Installation
|
|
|
|
### Option 1 : Docker Compose (standard)
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
services:
|
|
docker-socket-proxy:
|
|
image: tecnativa/docker-socket-proxy
|
|
container_name: docker-socket-proxy
|
|
restart: unless-stopped
|
|
environment:
|
|
- CONTAINERS=1 # autoriser GET /containers
|
|
- IMAGES=1 # autoriser les opérations sur les images
|
|
- NETWORKS=1
|
|
- VOLUMES=1
|
|
- POST=0 # bloquer toutes les méthodes POST (lecture seule)
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
networks:
|
|
- socket-proxy
|
|
|
|
networks:
|
|
socket-proxy:
|
|
internal: true
|
|
```
|
|
|
|
> ⚠️ **Réseau `internal: true`** crucial : empêche tout conteneur compromis d'exfiltrer via ce proxy.
|
|
|
|
### Utilisation depuis une app (exemple Traefik)
|
|
|
|
```yaml
|
|
services:
|
|
traefik:
|
|
image: traefik:v3
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro # ❌ NON
|
|
# ✅ Remplacer par :
|
|
# On monte le proxy réseau au lieu du socket direct
|
|
networks:
|
|
- socket-proxy
|
|
|
|
# Portainer, Watchtower, etc. pointent vers http://docker-socket-proxy:2375
|
|
```
|
|
|
|
> ⚠️ **Note** : la plupart des apps qui consomment l'API Docker (Portainer, Traefik) **parlent au socket Unix** — il faut des proxys TCP spéciques ([tecnativa](https://github.com/tecnativa/docker-socket-proxy) ou [socat](https://linux.die.net/man/1/socat)) ou des forks qui supportent HTTP.
|
|
|
|
### Option 2 : Variante Traefik
|
|
|
|
Non applicable — ce n'est pas un reverse proxy HTTP public, c'est un **proxy interne** pour l'API Docker.
|
|
|
|
## ⚙️ Configuration Initiale
|
|
|
|
1. **Choisir les endpoints autorisés** via variables d'environnement (par convention `<ENDPOINT>=1`)
|
|
2. **Méthodes** : `GET`, `POST`, `PUT`, `DELETE`, `HEAD`, `PATCH` (0 = bloqué, 1 = autorisé)
|
|
3. **Endpoints courants** : `CONTAINERS`, `IMAGES`, `NETWORKS`, `VOLUMES`, `SERVICES`, `TASKS`, `NODES`, `SECRETS`, `INFO`, `VERSION`, `EVENTS`
|
|
4. **Posture stricte recommandée** : n'autoriser que ce qui est strictement nécessaire
|
|
|
|
```bash
|
|
# Exemple : lecture seule stricte (Watchtower)
|
|
WATCHTOWER_MONITOR_ONLY=true
|
|
WATCHTOWER_HTTP_API_METRICS=true
|
|
```
|
|
|
|
## 🔀 Alternatives
|
|
|
|
### Open Source
|
|
- **socat TCP→Unix** (sans filtrage, juste pour exposer en TCP)
|
|
- **docker-socket-proxy linuxserver** : fork avec la même philosophie
|
|
- **Tailscale + socket exposure** : exposition via réseau privé uniquement
|
|
- **Rootless Docker** : solution plus radicale (mais incompatible avec beaucoup d'images)
|
|
|
|
### Comparaison des approches
|
|
|
|
| Approche | Filtrage | Complexité | Compatibilité |
|
|
| :--- | :--- | :--- | :--- |
|
|
| **Docker Socket Proxy** | ✅ Granularité fine | Faible | ⚠️ Nécessite proxy HTTP |
|
|
| **Socket via réseau Tailnet** | ❌ Aucun | Moyenne | ✅ Universelle |
|
|
| **Rootless Docker** | ❌ (mais pas root) | Élevée | ⚠️ Limité |
|
|
| **Pas de socket monté** | ✅ Par construction | Variable | ❌ Apps qui en ont besoin KO |
|
|
|
|
### Propriétaires (ce que ça remplace)
|
|
- **Docker EE / Mirantis** : filtrage commercial
|
|
- **Sysdig Secure / Falco** : runtime security (complémentaire, pas remplaçant)
|
|
|
|
## 🔒 Sécurité
|
|
|
|
- ✅ **Liste blanche** par défaut : tout est bloqué sauf ce qui est activé
|
|
- ✅ **Méthodes HTTP** filtrables indépendamment
|
|
- ✅ **Image minimaliste** (Alpine + Python)
|
|
- ✅ **Pas de dépendances** réseau-sortant
|
|
- ✅ **Open source auditable** : ~300 lignes de Python, facile à relire
|
|
- ⚠️ **Ne protège pas contre** : un attaquant qui peut envoyer des requêtes *autorisées* malicieuses (ex : supprimer un conteneur via DELETE /containers/...)
|
|
- ⚠️ **À combiner avec** : [[app-fail2ban]], [[app-crowdsec]], monitoring d'API
|
|
|
|
## 📚 Ressources
|
|
|
|
- [README GitHub](https://github.com/tecnativa/docker-socket-proxy)
|
|
- [Discussion #45 sur la licence](https://github.com/Tecnativa/docker-socket-proxy/discussions/45)
|
|
- [Guide de hardening Docker](https://docs.docker.com/engine/security/)
|
|
- [Wiki selfh.st](https://selfh.st/apps/?tag=Reverse+Proxy)
|
|
|
|
## 🔗 Pages Liées
|
|
|
|
- [[cat-reverse-proxy]] — Catégorie Reverse Proxy
|
|
- [[securisation-home-lab]] — Sécurité
|
|
- [[docker-compose]] — Orchestration de conteneurs
|
|
- [[comparatif-reverse-proxy]] — Comparaison détaillée
|
|
- [[app-traefik]] — Consommateur typique de l'API Docker
|
|
- [[app-portainer]] — Consommateur typique de l'API Docker
|