Docker Socket Proxy : Sécuriser l’accès à votre API Docker

Docker Socket Proxy : Sécuriser l’accès à votre API Docker

Docker est un outil puissant pour la conteneurisation, mais l’accès direct au socket Docker présente des risques de sécurité. Exposer le socket Docker sans protection revient à donner un accès root à votre machine. Une solution efficace consiste à utiliser un Docker Socket Proxy. Ce tutoriel vous explique comment améliorer la sécurité Docker en utilisant un proxy qui filtre les requêtes vers l’API Docker.

En bref

Vous souhaitez sécuriser l’accès à votre API Docker ? L’utilisation d’un Docker Socket Proxy est une solution efficace. Ce tutoriel vous guide pas à pas pour installer et configurer un proxy qui filtrera les commandes autorisées, limitant ainsi les risques liés à l’exposition du socket Docker. Vous apprendrez à restreindre les accès et à auditer les opérations, renforçant la sécurité de votre environnement Docker.

Pourquoi utiliser un Docker Socket Proxy ?

docker securiser acces socket proxy

Par défaut, Docker utilise un socket Unix (/var/run/docker.sock) pour communiquer avec le daemon Docker. Donner accès à ce socket à un conteneur permet à ce dernier de contrôler l’ensemble de votre infrastructure Docker. En revanche, un conteneur compromis pourrait alors compromettre l’ensemble de votre système. Un Docker Socket Proxy agit comme un intermédiaire, permettant de filtrer et d’auditer les requêtes vers l’API Docker, limitant ainsi les risques.

L’utilisation d’un tel proxy est particulièrement pertinente dans les environnements de développement et de production où plusieurs conteneurs et utilisateurs interagissent avec l’API Docker.

Prérequis

Avant de commencer, assurez-vous d’avoir les éléments suivants :

  • Un serveur avec Docker installé (version 1.13 ou supérieure).
  • Docker Compose installé (recommandé).
  • Un accès SSH à votre serveur.

Installation et Configuration du Docker Socket Proxy

Nous utiliserons le projet docker-socket-proxy disponible sur GitHub. En pratique, ce projet fournit une image Docker que nous allons configurer.

  1. Clonez le dépôt GitHub :

    Utilisez la commande suivante pour cloner le dépôt :

    docker securiser acces socket proxy
    git clone https://github.com/Tecnativa/docker-socket-proxy
  2. Accédez au répertoire cloné :
    cd docker-socket-proxy
  3. Créez un fichier docker-compose.yml :

    Si vous n’avez pas de fichier docker-compose.yml, créez-en un avec le contenu suivant :

docker securiser acces socket proxy
version: "3.8"
services:
  proxy:
    image: tecnativa/docker-socket-proxy:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - WHITELISTED_ROUTES=containers/json,images/json,networks/json,volumes/json,containers/stats,containers/logs
    ports:
      - "2375:2375"

Ce fichier définit un service proxy qui utilise l’image tecnativa/docker-socket-proxy. Il monte le socket Docker en lecture seule et définit les routes autorisées via la variable d’environnement WHITELISTED_ROUTES. Le port 2375 est exposé pour accéder au proxy.

  • Démarrez le proxy avec Docker Compose :

    Exécutez la commande suivante :

    docker-compose up -d

    Cela va télécharger l’image et démarrer le conteneur en arrière-plan.

  • Configuration Avancée : Personnalisation des Routes Autorisées

    La variable d’environnement WHITELISTED_ROUTES est cruciale pour la sécurité. Elle définit les routes de l’API Docker qui sont autorisées à être utilisées via le proxy. Toutefois, il est important de bien comprendre les implications de chaque route avant de l’autoriser.

    Voici quelques exemples de routes courantes :

    • containers/json : Liste les conteneurs.
    • images/json : Liste les images Docker.
    • networks/json : Liste les réseaux Docker.
    • volumes/json : Liste les volumes Docker.
    • containers/{id}/start : Démarre un conteneur spécifique (remplacez {id} par l’ID du conteneur).
    • containers/{id}/stop : Arrête un conteneur spécifique.
    • containers/{id}/logs : Récupère les logs d’un conteneur spécifique.

    Adaptez la liste WHITELISTED_ROUTES à vos besoins spécifiques. Ne donnez accès qu’aux routes strictement nécessaires pour les applications qui utilisent le proxy.

    Tester le Docker Socket Proxy

    Une fois le proxy configuré, vous pouvez le tester en utilisant curl ou un client Docker.

    1. Utilisez curl pour lister les conteneurs :

      Exécutez la commande suivante, en remplaçant [adresse_ip_serveur] par l’adresse IP de votre serveur :

      curl http://[adresse_ip_serveur]:2375/containers/json

      Si le proxy est correctement configuré, vous devriez voir une liste de vos conteneurs Docker.

    2. Configurez votre client Docker pour utiliser le proxy :

      Définissez la variable d’environnement DOCKER_HOST :

      export DOCKER_HOST=tcp://[adresse_ip_serveur]:2375

      Vous pouvez maintenant utiliser les commandes Docker comme d’habitude, elles passeront par le proxy.

    Sécurisation Supplémentaire : Authentification

    Bien que le Docker Socket Proxy filtre les routes, il ne fournit pas d’authentification. Pour une sécurité accrue, vous pouvez ajouter une couche d’authentification en utilisant un proxy inverse comme Nginx ou Traefik. En outre, vous pouvez configurer ces proxies pour exiger une authentification avant d’autoriser l’accès au Docker Socket Proxy.

    Dépannage

    Voici quelques problèmes courants et leurs solutions :

    • Erreur de connexion refusée :

      Vérifiez que le conteneur du proxy est bien démarré et que le port 2375 est accessible. Assurez-vous que le pare-feu de votre serveur autorise les connexions sur ce port.

    • Commande Docker bloquée par le proxy :

      Vérifiez que la route correspondante est bien ajoutée à la variable WHITELISTED_ROUTES.

    • Problèmes de résolution DNS :

      Assurez-vous que le serveur DNS est correctement configuré pour le conteneur proxy.

    Bonnes Pratiques de Sécurité Docker

    L’utilisation d’un Docker Socket Proxy est une excellente première étape pour sécuriser votre environnement Docker. Cependant, il est important de suivre également ces bonnes pratiques :

    • Mettez à jour régulièrement Docker :

      Les nouvelles versions de Docker contiennent souvent des correctifs de sécurité importants.

    • Utilisez des images Docker officielles :

      Évitez d’utiliser des images provenant de sources non fiables.

    • Scannez vos images pour détecter les vulnérabilités :

      Utilisez des outils comme Clair ou Trivy pour identifier les failles de sécurité dans vos images.

    • Limitez les privilèges des conteneurs :

      N’accordez aux conteneurs que les privilèges dont ils ont strictement besoin.

    • Utilisez des secrets management :

      Ne stockez jamais les mots de passe ou autres informations sensibles directement dans vos images ou fichiers de configuration. Utilisez un outil de gestion des secrets comme HashiCorp Vault.

    Questions frequentes

    Comment sécuriser l’accès à l’API Docker avec un Docker Socket Proxy ?

    Un Docker Socket Proxy agit comme un intermédiaire entre les conteneurs et le socket Docker. Il permet de filtrer les requêtes vers l’API Docker, limitant ainsi les risques de sécurité liés à l’accès direct au socket. En définissant des routes autorisées, vous contrôlez les actions que les conteneurs peuvent effectuer.

    Quelles sont les alternatives à un Docker Socket Proxy pour la sécurité Docker ?

    Bien que le Docker Socket Proxy soit une solution efficace, vous pouvez également utiliser d’autres méthodes comme l’authentification TLS, les politiques d’accès RBAC (Role-Based Access Control) avec Docker Enterprise Edition, ou des outils de sécurité tiers qui analysent le trafic et détectent les anomalies.

    Comment tester la configuration de mon Docker Socket Proxy ?

    Vous pouvez utiliser la commande curl pour envoyer des requêtes à l’API Docker via le proxy et vérifier que seules les routes autorisées fonctionnent. Vous pouvez également configurer votre client Docker pour utiliser le proxy et tester les commandes Docker courantes.