Docker permet aux développeurs de logiciels et aux ingénieurs DevOps de conditionner rapidement des applications pour la production. Les conteneurs Docker fonctionnent en grande partie indépendamment de leur hôte, mais ne sont pas insensibles aux menaces de sécurité. Voici comment auditer votre installation Docker Engine afin d'assurer une sécurité maximale pour votre hôte et vos charges de travail.
Comprendre l'architecture de Docker
La première étape pour évaluer les risques Docker consiste à comprendre comment la technologie fonctionne réellement. Docker est alimenté par trois composants distincts :
- Démon Docker Engine – Le service d'arrière-plan qui gère les opérations en coulisse avec des conteneurs et des images.
- API REST – Docker Engine fournit une API REST qui envoie des commandes au démon Docker. L'API est généralement fournie via un socket REST, mais peut également être exposée via HTTP.
- Client de ligne de commande Docker – La CLI Docker s'exécute lorsque vous utilisez
docker
dans une borne. Il envoie des commandes au démon Docker. Les commandes sont traitées pour déterminer l'action à entreprendre.
Un attaquant compromettant l'un de ces composants pourrait accéder à votre environnement. Grâce à une configuration appropriée, vous pouvez protéger vos charges de travail et augmenter sécurité par rapport à l'exécution d'applications directement sur l'hôte.
La surface d'attaque
Le démon Docker présente la plus grande surface d'attaque. Prendre le contrôle du démon donne accès à l'hôte et à tous vos conteneurs. Le démon s'exécute généralement en tant que root
, ainsi une infiltration réussie peut accorder un accès illimité à votre machine physique.
Vous devez vous assurer que le socket du démon Docker (/var/run/docker.sock
) n'est accessible à personne d'autre que la root
utilisateur. Étant donné que le démon peut accéder à l'hôte, l'accès au socket libère efficacement le contrôle de votre machine.
Le démon de Docker prend en charge un socket TCP qui permet le contrôle à distance sur le réseau. Si vous activez cette fonctionnalité, une communication non chiffrée sera proposée sans aucune authentification.
Évitez d'utiliser des connexions TCP, sauf si vous êtes dans un environnement réseau que vous avez spécifiquement configuré pour être sûr. Vous devez configurer TLS et vous assurer que seuls les clients autorisés sont autorisés à se connecter.
Certaines images Docker peuvent nécessiter que vous montiez le socket Docker dans le conteneur. Ceci est souvent utilisé par les outils de gestion Docker qui fournissent une interface aux conteneurs exécutés sur votre hôte. En montant la prise de cette manière, tout ce qui se trouve à l'intérieur du conteneur pourrait prendre le contrôle de votre système. Les conteneurs ne doivent jamais recevoir de socket Docker à moins que vous ne soyez sûr que la charge de travail en nécessite un.
Mode sans racine
Docker prend désormais en charge un mode sans racine qui vous permet d'exécuter Docker sans root
accéder. Cela contribue à améliorer la sécurité, mais s'accompagne d'une complexité supplémentaire au moment de la configuration.
L'utilisation du mode sans racine exécute Docker et vos conteneurs dans un espace de noms d'utilisateur. La plupart des fonctionnalités de Docker fonctionneront, bien qu'il existe certaines limitations.
Tous les pilotes de stockage ne sont pas disponibles, les réseaux superposés ne sont pas pris en charge et les réseaux de conteneurs sont entièrement nommés. Cela signifie que vous ne pouvez pas accéder directement aux adresses IP du conteneur depuis l'hôte sans entrer d'abord dans l'espace de noms de réseau dédié.
L'utilisation du mode sans racine peut être utile dans les environnements à haute sécurité où l'intégrité de l'hôte est primordiale. Cela permet de réduire l'impact d'une attaque réussie en limitant les possibilités de falsification du système dans son ensemble.
Sécurité de l'API REST
L'API Docker REST est généralement accessible via un socket UNIX. Les vérifications d'autorisation sont effectuées à l'aide de mécanismes UNIX standard.
Vous pouvez exposer l'API sur un socket TCP, permettant l'accès via HTTP. Cela augmente le risque de compromis. Vous devez vous assurer que vos contrôles d'accès au réseau sont définis de sorte que le trafic ne puisse provenir que d'hôtes approuvés.
Vous devez auditer vos politiques de pare-feu afin de ne pas négliger un appareil qui pourrait interagir avec l'API Docker. N'oubliez pas que limiter les connexions à localhost
n'est pas suffisant - cela permettrait toujours l'accès depuis les conteneurs Docker exécutés sur votre machine, ce qui pourrait potentiellement permettre une élévation involontaire des privilèges.
Limiter la communication entre conteneurs
Docker permet à tous les conteneurs de communiquer entre eux via le docker0
par défaut réseau ponté. Un conteneur compromis pourrait espionner ce réseau pour en savoir plus sur son environnement. Il pourrait utiliser le réseau de pont comme point de vue pour commencer une infiltration plus large de vos charges de travail.
La désactivation de la communication inter-conteneurs améliore votre posture de sécurité en améliorant l'isolation des conteneurs. Vous devrez lier explicitement les conteneurs ensemble en utilisant le --link=ContainerName
flag ou votre propre réseau Docker.
Exécutez le démon Docker avec le --icc=false
drapeau pour désactiver la communication sur le docker0
pont.
Restreindre les capacités des conteneurs
Les capacités du noyau Linux définissent les actions disponibles pour les utilisateurs avec root
accéder. Les capacités aident à verrouiller les processus qui s'exécutent en tant que root
, tels que les conteneurs Docker. Chaque processus doit recevoir l'ensemble minimum de fonctionnalités dont il a besoin.
Docker exécute automatiquement des conteneurs avec une sélection limitée de fonctionnalités. Même cette liste est souvent excessive pour une simple charge de travail telle qu'un serveur Web. Vous pouvez le restreindre davantage en spécifiant votre propre liste de fonctionnalités disponibles pour un conteneur.
docker run --cap-drop all --cap-add SYSLOG example-image:latest
La commande ci-dessus exécutera un conteneur avec uniquement le SYSLOG
aptitude. Le --cap-drop
flag ne tient pas compte de la liste de capacités par défaut. Les capacités sont ensuite rajoutées avec --cap-add
, créant une liste blanche.
Cela vaut la peine d'évaluer votre conteneur par rapport à la liste des capacités du noyau. Supprimez toutes les fonctionnalités inutilisées des conteneurs exécutés en production. Cela permet de limiter les dommages qu'un conteneur compromis peut causer.
Activer les fonctionnalités intégrées du noyau
Ne négligez pas les fonctionnalités de sécurité intégrées à votre noyau. Docker fonctionne avec les technologies existantes telles que AppArmor et SELinux.
Certaines distributions, telles que RedHat Linux, sont livrées avec des politiques système SELinux prédéfinies qui augmentent la sécurité de Docker. Vous pouvez ajouter manuellement la prise en charge de SELinux en exécutant le démon Docker avec le --selinux-enabled
drapeau. Cela active une politique Docker pour définir des étiquettes SELinux sur vos conteneurs. SELinux offre une meilleure isolation des processus de conteneur des processus hôtes, améliorant ainsi votre posture de sécurité.
Les bases
Il est facile de se focaliser sur les aspects compliqués de la sécurité Docker :mode sans racine, accès aux démons et communications avec les conteneurs. Cependant, ne négligez pas les bases :les pratiques de sécurité standard s'appliquent toujours.
Gardez toujours Docker Engine à jour afin de disposer des dernières corrections de bogues. Vous devez également vous assurer que le noyau de votre hôte est entièrement corrigé. Comme les conteneurs partagent le même noyau que votre hôte, toute vulnérabilité pourrait être exploitée par vos applications conteneurisées.
Il est recommandé de dédier une machine physique ou une machine virtuelle spécifique à l'exécution de Docker. N'exécutez aucun autre service directement sur l'hôte. Vous pouvez les exécuter en tant que conteneurs à la place, ce qui réduit l'impact d'une compromission réussie de l'hôte.
Lorsqu'il est configuré correctement, Docker augmente la sécurité en isolant les applications. Prendre le temps d'évaluer votre position vous aide à identifier les risques potentiels et à comprendre comment les attaques pourraient commencer. Verrouiller les privilèges des conteneurs, protéger le démon Docker et maintenir votre hôte à jour vous aidera à renforcer vos conteneurs.