engineering-design-and-analysis
Mise en œuvre de contenants Docker sécurisés : pratiques exemplaires et stratégies de conception
Table of Contents
Les conteneurs Docker ont révolutionné le déploiement d'applications modernes en fournissant des environnements légers, portables et efficaces pour le fonctionnement des logiciels. Alors que les organisations adoptent de plus en plus la conteneurisation pour rationaliser leurs flux de développement et de déploiement, la sécurité de ces conteneurs est devenue une préoccupation critique. Les conteneurs mal configurés et les images exposées sont parmi les principales causes de ruptures de données en nuage, et bien que Docker simplifie le développement et le déploiement, il élargit également la surface d'attaque.
Comprendre les principes fondamentaux de la sécurité des conteneurs Docker
Docker a ses propres défis de sécurité, et assurer la sécurité des conteneurs Docker n'est pas seulement une question de fortification de l'application, mais implique une approche globale englobant l'ensemble de l'écosystème. Avant de mettre en œuvre des mesures de sécurité spécifiques, il est essentiel de comprendre le modèle de sécurité de Docker et la différence avec les approches de virtualisation traditionnelles.
Architecture de sécurité de Docker
Docker utilise les espaces de noms du noyau pour l'isolement des processus. Les espaces de noms fournissent la première forme d'isolement et la plus simple. Les processus qui s'exécutent dans un conteneur ne peuvent pas voir, et encore moins affecter, les processus qui se déroulent dans un autre conteneur ou dans le système hôte.
Les conteneurs Docker sont légers et portables. Cependant, ils partagent le noyau du système d'exploitation hôte. Cette architecture crée des défis de sécurité uniques. Comprendre ce modèle de noyau partagé est crucial car les vulnérabilités du noyau hôte peuvent affecter tous les conteneurs fonctionnant sur ce système.
Chaque conteneur a également sa propre pile réseau, ce qui signifie qu'un conteneur n'a pas un accès privilégié aux sockets ou aux interfaces d'un autre conteneur. Bien sûr, si le système hôte est configuré en conséquence, les conteneurs peuvent interagir entre eux par l'intermédiaire de leurs interfaces réseau respectives — tout comme ils peuvent interagir avec des hôtes externes.
Le modèle de responsabilité partagée
La sécurité de Docker consiste à offrir des fonctionnalités comme Docker Compose, namespaces et Docker Content Trust (DCT) pour améliorer la sécurité, en utilisant des configurations sécurisées pour l'exécution de conteneurs, les réseaux et le stockage, en balançant régulièrement les images de conteneurs et en s'attaquant aux vulnérabilités connues, en surveillant les activités d'exécution et en mettant en œuvre des contrôles d'accès fondés sur les rôles (RBC) pour limiter l'accès non autorisé.
Les utilisateurs qui ne parviennent pas à durcir leur environnement ou à maintenir leurs composants à jour sont particulièrement exposés au risque d'exploitation. Les organisations doivent comprendre que Docker fournit les outils et la plateforme, mais mettre en œuvre des mesures de sécurité est la responsabilité des équipes de développement et d'exploitation.
Pratiques exemplaires essentielles pour sécuriser les contenants en poudre
La sécurité des conteneurs n'est pas un outil unique ou un audit unique. C'est un ensemble de pratiques superposées sur tout votre pipeline — du Dockerfile que vous écrivez, à l'IC qui le construit, à l'exécution qui l'exécute. La mise en œuvre de la sécurité complète nécessite une attention à plusieurs couches de la pile de conteneurisation.
Utiliser des images de base minimales et fiables
Toujours construire des conteneurs à partir d'images de base vérifiées et minimales. Les images officielles et durcies sont des points de départ plus sûrs. Le choix de l'image de base a un impact significatif sur la posture de sécurité de votre conteneur.
Alpine contient moins de paquets, ce qui réduit les CVE et améliore les résultats de numérisation. Envisagez d'utiliser des images distrolisées ou Alpine Linux comme images de base pour minimiser la surface d'attaque. Les images distroless ne contiennent que votre application et ses dépendances d'exécution, à l'exclusion des gestionnaires de paquets, des shells et d'autres utilitaires qui ne sont pas nécessaires à la production.
L'utilisation d'images officielles Docker est essentielle au maintien de la sécurité, car ces images sont régulièrement mises à jour et corrigées par des entités fiables. Cette approche réduit considérablement le risque de déployer des conteneurs avec des vulnérabilités existantes ou un code malveillant. Vérifiez toujours la source de vos images de base et préférez les images officielles de Docker Hub ou d'autres registres de confiance.
Pins de versions d'images et éviter les derniers mots
Il peut tirer une version mise à jour qui introduit des changements de rupture ou des vulnérabilités sans avertissement. Au lieu d'utiliser la balise last, toujours épingler des versions spécifiques des images de base en utilisant leurs balises de digest ou de version.
Lorsque vous spécifiez une version exacte ou un digest, vous garantissez que vos constructions utiliseront à chaque fois la même image de base, ce qui facilite le suivi des vulnérabilités et la gestion systématique des mises à jour.
# Bad practice
FROM node:latest
# Good practice - pin specific version
FROM node:18.16.0-alpine
# Best practice - use digest for immutability
FROM node:18.16.0-alpine@sha256:a1e4e58...
Exécuter des conteneurs en tant qu'utilisateurs non-routiers
Il est une meilleure pratique Dockerfile pour éviter d'exécuter des conteneurs comme root (UID 0). Il y a très peu de cas d'utilisation où le conteneur doit exécuter comme root, alors n'oubliez pas d'inclure l'instruction de l'USER pour changer l'UID efficace par défaut.
Exécuter comme non-root peut nécessiter quelques étapes supplémentaires dans votre fichier Docker, car maintenant vous devrez vous assurer que l'utilisateur spécifié dans l'instruction USER existe à l'intérieur du conteneur et fournir les autorisations de système de fichiers appropriés dans les endroits où le processus sera en lecture ou en écriture.
FROM alpine:3.18
# Create a non-root user
RUN addgroup -g 1000 appgroup &&
adduser -D -u 1000 -G appgroup appuser
# Set ownership of application directories
RUN chown -R appuser:appgroup /app
# Switch to non-root user
USER appuser
WORKDIR /app
COPY --chown=appuser:appgroup . .
CMD ["./myapp"]
De plus, votre environnement d'exécution peut bloquer les conteneurs fonctionnant comme root par défaut (c'est-à-dire Openshift nécessite des contraintes supplémentaires de contexte de sécurité).
Mettre en œuvre des systèmes de fichiers en lecture seule
Exécutez avec le système de fichiers racine en lecture seule où --read-only rend le système de fichiers conteneur entier en lecture seule et --tmpfs fournit des répertoires en écriture in-memory pour les besoins d'exécution. Cette mesure de sécurité empêche les attaquants de modifier les fichiers dans le conteneur, même s'ils y accèdent.
Ce manifeste fait appliquer la règle du système de fichiers en lecture seule. Rappelez-vous que lorsque vous faites un conteneur en lecture seule, l'application ne peut plus écrire sur le disque. Si votre application doit écrire des fichiers temporaires (comme des journaux ou du cache), vous devez monter un volume temporaire.
docker run -d
--read-only
--tmpfs /tmp:rw,noexec,nosuid,size=64m
--tmpfs /var/run:rw,noexec,nosuid,size=32m
nginx:alpine
Pour les applications nécessitant un stockage persistant, utilisez des volumes nommés pour des répertoires spécifiques tout en conservant le système de fichiers racine en lecture seule. Cette approche fournit l'accès d'écriture nécessaire tout en maintenant les limites de sécurité.
Déposer des capacités Linux inutiles
Les processus (comme les serveurs web) qui doivent simplement se lier sur un port en dessous de 1024 n'ont pas besoin de fonctionner comme root : ils peuvent simplement se voir accorder la capacité net bind service à la place. Et il y a beaucoup d'autres capacités, pour presque toutes les zones spécifiques où les privilèges root sont habituellement nécessaires.
La meilleure pratique pour les utilisateurs serait de supprimer toutes les capacités, sauf celles explicitement requises pour leurs processus. Les capacités Linux sont des permissions à grain fin qui remplacent l'ancien binaire root/non-root. Docker donne aux conteneurs un ensemble par défaut dont la plupart des applications n'ont pas besoin.
docker run -d
--cap-drop=ALL
--cap-add=NET_BIND_SERVICE
--security-opt=no-new-privileges:true
myapp:latest
Le drapeau no-new-privileges empêche les processus d'obtenir des privilèges supplémentaires par l'intermédiaire de binaires setuid ou setgid, ajoutant une autre couche de protection contre les attaques d'escalade de privilèges.
Stratégies avancées de conception de sécurité
Une grande partie de ces frais généraux peuvent être évités en changeant la sécurité de gauche, en s'attaquant aux problèmes potentiels dès que possible dans votre workflow de développement.
Implémenter le balayage d'image du conteneur
Dans un pipeline sécurisé, le balayage de vulnérabilité Docker devrait être une étape obligatoire de votre processus CI/CD et toute image devrait être numérisée et approuvée avant de pouvoir entrer dans l'état « Running » dans les grappes de production.
Plusieurs outils puissants sont disponibles pour la numérisation des images Docker:
- Trivy: Un scanner de vulnérabilité tout-en-un pour les images de conteneurs, les systèmes de fichiers et les dépôts Git. Il est populaire pour sa simplicité, sa vitesse et son étendue de couverture, y compris pour le support de numérisation des modèles d'infrastructure comme code (IaC) et les dépendances des applications.
- Docker Scout: Intégré dans Docker Desktop et l'ICL Docker. Il fournit des informations sur la vulnérabilité, des résumés CVE et des liens directs vers des lignes directrices sur l'assainissement.
- Anchore Engine: Un outil de numérisation d'images Docker open source qui inspecte les images de conteneurs pour détecter les vulnérabilités, les problèmes de configuration et les violations de politiques.
- Snyk Container: Un scanner de vulnérabilité qui s'intègre avec les pipelines CI/CD pour détecter et corriger automatiquement les vulnérabilités.
- Clair: Scanne les images de conteneurs pour les vulnérabilités connues énumérées dans les bases de données comme la base de données sur les vulnérabilités et les expositions communes (CVE).
Avant de pousser les images, vous devriez toujours les scanner pour les vulnérabilités. Des outils comme Trivy rendent cela simple. Trivy signale les vulnérabilités, leur gravité et les corrections recommandées.
# Scan an image with Trivy
trivy image myapp:latest
# Scan and fail on high/critical vulnerabilities
trivy image --severity HIGH,CRITICAL --exit-code 1 myapp:latest
Générer et tenir à jour des factures de matériel logiciel (SBOM)
Un SBOM vous donne un inventaire complet de tout à l'intérieur de votre conteneur. Lorsque le prochain zéro jour tombe, vous pouvez vérifier instantanément si vous êtes affecté. La loi européenne sur la cyberrésilience (septembre 2026) mandatera la génération SBOM pour tous les logiciels vendus sur le marché de l'UE — ce n'est plus une belle chose à avoir.
Image Provenance documente l'origine et l'historique des images de conteneurs pour assurer la traçabilité et l'intégrité. SBOM Generation crée une Bill of Materials (SBOM) logicielle pour chaque image, détaillant tous les composants, bibliothèques et dépendances pour la transparence et la gestion de la vulnérabilité.
Grype prend en charge la numérisation des factures de logiciels de matériaux (SBOMs). Un SBOM fournit une base de données de toutes les métadonnées, composants, bibliothèques et paquets qui composent un conteneur. Des outils comme Syft peuvent générer automatiquement des SBOMs, qui peuvent ensuite être numérisés pour détecter des vulnérabilités.
Activer la confiance en contenu Docker et la signature d'image
Docker Engine peut être configuré pour exécuter uniquement des images signées. La fonction de vérification de signature de Docker Content Trust est intégrée directement dans le binaire dockerd. Cela garantit que les images n'ont pas été altérées et proviennent de sources de confiance.
Cosign v3 (current: v3.0.5) par défaut pour la vérification sans clé via l'autorité de certification et le journal de transparence de Sigstore. Ceci est plus simple et plus sécurisé que la gestion des clés de signature vous-même.
# Enable Docker Content Trust
export DOCKER_CONTENT_TRUST=1
# Sign an image with Cosign
cosign sign myregistry.io/myapp:v1.0.0
# Verify a signed image
cosign verify myregistry.io/myapp:v1.0.0
La signature d'image fournit une preuve cryptographique d'authenticité et d'intégrité, en protégeant contre les attaques de chaîne d'approvisionnement où des acteurs malveillants pourraient injecter des images compromises dans votre registre.
Mettre en œuvre la segmentation et l'isolement des réseaux
La segmentation du réseau est une stratégie de défense critique en profondeur qui limite le rayon de souffle des éventuelles failles de sécurité. En isolant les conteneurs en réseaux séparés en fonction de leur fonction et de leur niveau de confiance, vous pouvez empêcher les mouvements latéraux par les attaquants.
Créer des réseaux Docker personnalisés pour différents niveaux d'application :
# Create isolated networks
docker network create --driver bridge frontend-net
docker network create --driver bridge backend-net
docker network create --driver bridge database-net
# Run containers on specific networks
docker run -d --name web --network frontend-net nginx:alpine
docker run -d --name api --network backend-net myapi:latest
docker run -d --name db --network database-net postgres:14
# Connect API to both frontend and backend networks
docker network connect frontend-net api
Docker Engine 28 a abordé un problème connexe : les ports conteneur non publiés sont maintenant bloqués par défaut à partir de l'accès au réseau local.
Utilisez les politiques réseau dans les environnements Kubernetes pour limiter davantage le trafic entre les pods. Définir des règles d'entrée et d'entrée qui permettent explicitement seulement les chemins de communication nécessaires.
Appliquer les profils de sécurité Runtime
Les profils de sécurité des temps d'exécution offrent des couches supplémentaires de protection en limitant ce que les conteneurs peuvent faire pendant l'exécution.
Profils de Seccomp
Seccomp (Secure Computing Mode) filtre les appels système que les conteneurs peuvent faire au noyau. En limitant les appels système disponibles, vous réduisez significativement la surface d'attaque.
# Run container with custom seccomp profile
docker run --security-opt seccomp=/path/to/seccomp-profile.json myapp:latest
Profils d'AppArmor
Chargez le profil AppArmor et lancez le conteneur avec le profil AppArmor. AppArmor fournit un contrôle d'accès obligatoire en limitant les capacités des programmes avec des profils par programme.
# Load AppArmor profile
sudo apparmor_parser -r /etc/apparmor.d/docker-webapp
# Run container with AppArmor
docker run --security-opt apparmor=docker-webapp myapp:latest
Intégration SELinux
L'intégration SELinux offre une couche de sécurité supplémentaire en imposant des contrôles d'accès obligatoires sur les conteneurs et leurs interactions avec le système hôte. Les étiquettes SELinux offrent un contrôle d'accès à grain fin pour les processus et les ressources des conteneurs.
Secrets de gestion et de protection des données sensibles
Les secrets de codage dur dans les images ou les variables d'environnement est l'une des erreurs les plus courantes des développeurs. Nous devons stocker et injecter des secrets en toute sécurité.
Ne jamais intégrer des secrets dans les images
Les mots de passe, les clés API et les jetons ne doivent jamais être stockés à l'intérieur de l'image, à l'intérieur des variables d'environnement exposées dans les journaux ou dans les dépôts Git. Au lieu de cela, les sécuriser comme des secrets Docker, des secrets Kubernetes ou des voûtes externes (AWS Secrets Manager, HashiCorp Vault) doivent être utilisés.
Erreurs courantes à éviter:
- Codage dur dans Dockerfiles
- Consigner des fichiers .env avec des secrets pour le contrôle de la version
- Passant des secrets comme arguments de construction (ils restent dans l'historique de l'image)
- Exposer des secrets dans les variables d'environnement visibles dans les journaux
Utiliser Docker Secrets pour le mode Swarm
Docker fournit une fonctionnalité de secret intégré pour le stockage chiffré. Docker Swarm comprend la gestion des secrets natifs qui chiffre les secrets au repos et en transit.
# Create a secret
echo "my-db-password" | docker secret create db_password -
# Use secret in service
docker service create
--name myapp
--secret db_password
myapp:latest
Dans le conteneur, les secrets sont montés sous forme de fichiers dans /run/secrets/, les rendant accessibles uniquement au processus du conteneur sans les exposer dans des variables d'environnement ou des journaux.
Intégrer les solutions de gestion des secrets externes
Hashicorp Vault : Un outil centralisé de gestion des secrets qui peut être utilisé pour stocker et gérer en toute sécurité les secrets dans les environnements de conteneurs.
Les options les plus populaires sont les suivantes:
- HashiCorp Vault[: Fournit des secrets dynamiques, le chiffrement comme service et des journaux de vérification détaillés
- AWS Secrets Manager[: Intégration autochtone avec les services AWS et rotation automatique
- Vault clé d'Azure: Gestion centralisée des secrets pour les charges de travail Azure
- Google Secret Manager: Stockage sécurisé des clés, mots de passe et certificats API dans GCP
Bien que Docker Secrets offre généralement un moyen sûr de gérer les données sensibles dans les environnements Docker, cette approche n'est pas recommandée pour Kubernetes, où les secrets sont stockés en texte clair par défaut. Dans Kubernetes, envisager d'utiliser des mesures de sécurité supplémentaires telles que le chiffrement etcd, ou des outils tiers.
Sécurité et maintenance du système hôte
Pour protéger contre les vulnérabilités connues d'évasion des conteneurs comme les vaisseaux leaky, qui se traduisent généralement par l'accès de l'attaquant à la racine de l'hôte, il est essentiel de tenir à jour l'hôte et Docker. Cela inclut la mise à jour régulière du noyau hôte ainsi que le moteur Docker.
Garder les systèmes mis à jour et pliés
Cela est dû au fait que les conteneurs partagent le noyau de l'hôte. Si le noyau de l'hôte est vulnérable, les conteneurs sont également vulnérables. Par exemple, l'exploitation de l'escalade du privilège du noyau, Dirty COW, exécutée à l'intérieur d'un conteneur bien isolé, entraînerait toujours un accès racine sur un hôte vulnérable.
Les moteurs d'exécution de conteneurs tels que Docker mettent fréquemment à jour leur logiciel avec des corrections et des fonctionnalités. Vous pouvez atténuer les vulnérabilités en appliquant les dernières mises à jour.
Lancer un jeu de docker une fois et l'oublier signifie l'expédition d'images avec des vulnérabilités de mois-vie. Automatiser les mises à jour avec la source de données d'image conteneur de Rénover Bot — il crée des PR lorsque les images de base ont des mises à jour, pair avec votre pipeline de balayage CI pour la réhabilitation automatique.
Accès sécurisé et authentification de l'hôte
Toute authentification directement vers le système d'exploitation doit être vérifiée et enregistrée. Vous devez uniquement accorder l'accès aux utilisateurs appropriés et utiliser les clés pour les connexions à distance.
Les meilleures pratiques en matière de sécurité des hôtes sont notamment les suivantes :
- Désactiver l'authentification par mot de passe pour SSH, utiliser uniquement l'authentification par clé
- Mettre en œuvre l'authentification multi-facteurs pour un accès privilégié
- Utiliser des serveurs bastion ou des serveurs saut pour accéder aux systèmes de production
- Activer l'enregistrement des audits pour toutes les actions administratives
- Restriction de l'accès à la prise Docker daemon aux utilisateurs autorisés seulement
Ne jamais exposer le socket Docker Daemon
C'est une mauvaise pratique que vous devriez éviter car un attaquant serait en mesure d'exécuter n'importe quelle commande que le service Docker peut exécuter et potentiellement accéder à l'ensemble du système hôte parce que le service Docker fonctionne comme root.
Monter la prise Docker (/var/run/docker.sock[) à l'intérieur d'un conteneur donne à ce conteneur le contrôle complet sur le démon Docker, accordant effectivement l'accès racine à l'hôte. Si vous devez fournir l'accès Docker aux conteneurs, envisager des solutions de rechange comme:
- Utilisation de Docker-in-Docker (DinD) avec une bonne isolement
- Mise en œuvre du mode Docker sans racine
- Utilisation des API d'exécution de conteneur avec des permissions restreintes
- Tirer parti de Kubernetes CRI au lieu d'un accès direct à Docker
Exécutez Docker en mode sans racine
Docker sans racine permet d'exécuter le démon Docker et les conteneurs en tant qu'utilisateur non root, réduisant ainsi considérablement l'impact des vulnérabilités potentielles de rupture de conteneur. Ce mode élimine le besoin de privilèges root sur le système hôte.
# Install rootless Docker
dockerd-rootless-setuptool.sh install
# Run Docker commands as non-root user
docker run -d nginx:alpine
Bien que le mode sans racine offre une sécurité accrue, il comporte certaines limites, comme des capacités de réseautage restreintes et des considérations de rendement. Évaluer si ces compromis sont acceptables pour votre cas d'utilisation.
Surveillance et détection de la sécurité des temps d'exécution
La sécurité statique des captures de problèmes avant le déploiement. La sécurité des temps d'exécution des captures de ce qui se passe après. Même si les images sont sécurisées, les conteneurs peuvent encore être attaqués à l'exécution.
Déployer les outils de sécurité de l'exécution
Falco 0.43.0 (janvier 2026) — Détecte les appels de fichiers, les connexions de fichiers et les connexions réseau anormales. La nouvelle initiative de drop-enter a supprimé le syscall entrant dans les événements du pipeline, améliorant considérablement les performances.
Falco est un outil de sécurité d'exécution open-source qui utilise eBPF pour surveiller le comportement des conteneurs et détecter les activités suspectes.
- Exécution inattendue du processus
- Modifications de fichiers non autorisées
- Connexions réseau suspectes
- Tentatives d'escalade des privilèges
- Frayère de coquilles dans des conteneurs
# Example Falco rule for detecting shell in container
- rule: Shell Spawned in Container
desc: Detect shell process started in container
condition: >
spawned_process and
container and
proc.name in (bash, sh, zsh)
output: >
Shell spawned in container (user=%user.name container=%container.name
shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)
priority: WARNING
Mettre en oeuvre une exploitation forestière et une surveillance globales
Docker events fournit un flux d'audit natif pour le cycle de vie des conteneurs, Prométheus + cAdvisor suivre l'utilisation des ressources par conteneur. L'exécution inattendue des processus, les connexions réseau ou les modifications de fichiers déclenchent des alertes immédiates.
Établir une stratégie d'exploitation forestière globale qui tient compte des éléments suivants :
- Logs de conteneurs[: Sortie de l'application et messages d'erreur
- Logs de démon de la cuve: Événements du cycle de vie des conteneurs et opérations de démon
- Logs système d'accueil[: Messages de noyau et événements système
- Logs de vérification[: Événements liés à la sécurité et tentatives d'accès
Centraliser les journaux en utilisant des outils comme la pile ELK (Elasticsearch, Logstash, Kibana), Loki avec Grafana, ou des solutions cloud-native comme AWS CloudWatch ou Azure Monitor. Centralized log permet la corrélation des événements sur plusieurs conteneurs et hôtes, ce qui facilite la détection des attaques distribuées.
# Configure Docker to use JSON file logging driver with rotation
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"labels": "production_status",
"env": "os,customer"
}
}
Définir des limites de ressources pour prévenir les attaques DoS
Sans contraintes de ressources appropriées, un conteneur compromis ou mal comportementé pourrait consommer toutes les ressources du système disponibles, affectant d'autres conteneurs et l'hôte.
# Docker Compose with resource limits
version: "3.9"
services:
app:
image: myapp:latest
deploy:
resources:
limits:
cpus: "2.0"
memory: 512M
pids: 100
reservations:
cpus: "0.5"
memory: 256M
ulimits:
nofile:
soft: 65536
hard: 65536
nproc:
soft: 100
hard: 200
Les limites de ressources devraient être établies en fonction des besoins en matière d'application et de planification des capacités, et surveiller l'utilisation des ressources pour les adapter de façon appropriée, en veillant à ce que les conteneurs disposent de ressources suffisantes tout en empêchant les attaques à l'épuisement des ressources.
Intégration de la sûreté des pipelines CI/CD
Les pipelines CI/CD sont une partie essentielle du cycle de vie du développement logiciel et devraient inclure diverses vérifications de sécurité telles que les vérifications de lin, l'analyse de code statique et la numérisation des conteneurs. De nombreux problèmes peuvent être évités en suivant certaines pratiques exemplaires lors de l'écriture du fichier Docker. Cependant, ajouter un linter de sécurité comme étape dans le pipeline de construction peut aller beaucoup plus loin en évitant d'autres maux de tête.
Mettre en œuvre Dockerfile Linting
Dockerfile linters analysez vos fichiers Docker pour les erreurs courantes, les problèmes de sécurité et les violations des meilleures pratiques avant que les images ne soient construites.
# Run Hadolint on Dockerfile
docker run --rm -i hadolint/hadolint < Dockerfile
# Example output showing issues
DL3008: Pin versions in apt get install
DL3009: Delete the apt-get lists after installing
DL3015: Avoid additional packages by specifying --no-install-recommends
Automatiser le balayage de sécurité dans CI/CD
Les outils de numérisation des conteneurs sont particulièrement importants dans le cadre d'une stratégie de sécurité réussie. Ils peuvent détecter les vulnérabilités connues, les secrets et les erreurs de configuration dans les images des conteneurs et fournir un rapport des résultats avec des recommandations sur la façon de les corriger.
L'intégration de Docker Scout dans votre pipeline CI/CD vous permet de vérifier automatiquement que les images construites à partir de Docker Images durcies restent exemptes de vulnérabilités connues pendant le processus de construction. Cette approche proactive assure l'intégrité de sécurité continue de vos images tout au long du cycle de vie du développement.
# GitHub Actions workflow example
name: Container Security Scan
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: myapp:${{ github.sha }}
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
exit-code: '1'
- name: Upload Trivy results to GitHub Security
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: 'trivy-results.sarif'
- name: Push image if scan passes
if: success()
run: |
docker tag myapp:${{ github.sha }} myregistry.io/myapp:latest
docker push myregistry.io/myapp:latest
Mettre en œuvre l'application des politiques
L'application de la politique garantit que seules les images conformes sont déployées sur la production. Des outils comme Open Policy Agent (OPA) et Kyverno peuvent appliquer automatiquement les politiques organisationnelles.
Les politiques communes à mettre en œuvre sont notamment les suivantes:
- Les images doivent être numérisées et ne présentent aucune vulnérabilité critique
- Les images doivent être signées par des autorités de confiance
- Les conteneurs doivent fonctionner comme des utilisateurs non root
- Les conteneurs ne doivent pas utiliser le mode privilégié
- Les limites des ressources doivent être définies
- Les images doivent provenir de registres approuvés.
Kubernetes-Considérations spécifiques de sécurité
La sécurité de Kubernetes devient vitale lors de la gestion des grappes. Les faibles contrôles d'accès basés sur le rôle (RBAC) ou les tableaux de bord exposés augmentent le risque.
Mettre en œuvre les normes de sécurité du pod
Les normes de sécurité Kubernetes Pod définissent trois niveaux de politiques de sécurité : Privilégié, Baseline et Restricted. La politique Restricted applique les exigences de sécurité les plus strictes et devrait être utilisée pour les charges de production chaque fois que possible.
apiVersion: v1
kind: Pod
metadata:
name: secure-app
labels:
app: myapp
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: myapp:latest
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
runAsNonRoot: true
runAsUser: 1000
resources:
limits:
cpu: "1"
memory: "512Mi"
requests:
cpu: "100m"
memory: "128Mi"
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
Configurer les politiques de réseau
Kubernetes Network Policys assure un contrôle fin sur la communication pod-to-pod. Par défaut, tous les pod peuvent communiquer entre eux, ce qui viole le principe du moindre privilège.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-network-policy
namespace: production
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
Utiliser les contrôleurs d'admission
Les contrôleurs d'admission interceptent les requêtes au serveur API Kubernetes avant que les objets ne persistent, vous permettant d'appliquer les politiques et de valider les configurations.
Exemples de politiques à mettre en oeuvre :
- Exiger que toutes les images proviennent de registres approuvés
- Appliquer des limites de ressources à tous les conteneurs
- Empêcher la création de conteneurs privilégiés
- Exiger des étiquettes spécifiques sur toutes les ressources
- Valider les contextes de sécurité répond aux exigences minimales
Considérations en matière de conformité et de réglementation
Les organisations qui exercent leurs activités dans les industries réglementées doivent s'assurer que leurs conteneurs sont déployés conformément à des exigences de conformité précises.
- CIS Docker Benchmark[: Fournit des directives prescriptives pour établir une posture de configuration sécurisée pour Docker
- CIS Kubernetes Benchmark: Recommandations de sécurité pour les déploiements de Kubernetes
- PCI DSS[: Exigences pour les organisations qui traitent les données de cartes de paiement
- HIPAA : Normes pour la protection des renseignements sensibles sur la santé des patients
- SOC 2: Cadre de gestion des données sur les clients fondé sur cinq principes de service de confiance
- RGPD[: Exigences en matière de protection des données et de confidentialité pour les résidents de l'UE
Des outils comme Docker Bench for Security et kube-bench peuvent automatiquement évaluer votre environnement en fonction de ces repères et fournir des conseils en matière d'assainissement.
# Run Docker Bench for Security
docker run --rm --net host --pid host --userns host --cap-add audit_control
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST
-v /var/lib:/var/lib
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/lib/systemd:/usr/lib/systemd
-v /etc:/etc --label docker_bench_security
docker/docker-bench-security
# Run kube-bench for Kubernetes
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml
kubectl logs job/kube-bench
Sécurité du registre des conteneurs
Les registres de conteneurs sont des composants essentiels de la chaîne d'approvisionnement des conteneurs. La sécurisation de vos registres empêche l'accès non autorisé aux images et protège contre les attaques de la chaîne d'approvisionnement.
Utiliser les registres privés
Bien que les registres publics comme Docker Hub soient pratiques, les charges de production devraient être assorties de registres privés avec des contrôles d'accès appropriés.
- Harbor: Registre open-source avec numérisation de vulnérabilité, signature d'image, et RBAC
- AWS ECR: Registre géré intégré aux services AWS
- Registre des conteneurs d'Azur : Registre géré pour les charges de travail Azure
- Registre de conteneurs Google: Registre géré pour GCP
- JFrog Artifactory[: Dépôt universel d'artefacts avec des fonctionnalités de sécurité avancées
Mettre en œuvre les contrôles d'accès au registre
Configurer l'authentification et l'autorisation pour l'accès au registre :
- Utiliser des comptes de service avec des autorisations minimales pour les pipelines CI/CD
- Mettre en œuvre le contrôle d'accès fondé sur le rôle (RBAC) pour différentes équipes
- Activer l'enregistrement des audits pour toutes les opérations de registre
- Utiliser des jetons à courte durée de vie au lieu de lettres de créance à long terme
- Mettre en œuvre la liste blanche IP pour l'accès au registre
Activer le balayage de vulnérabilité automatique
Docker Hub vous permet d'effectuer une analyse de vulnérabilité statique ponctuelle ou toujours à jour de l'image en utilisant Docker Scout. Après avoir activé l'analyse d'image Docker Scout, Docker Scout analyse automatiquement les images de votre dépôt Docker Hub. L'analyse d'image extrait la lettre de matériel logicielle (SBOM) et d'autres métadonnées d'image, et l'évalue par rapport aux données de vulnérabilité des avis de sécurité.
La plupart des registres modernes offrent un balayage intégré de vulnérabilité qui scanne automatiquement les images lorsqu'elles sont poussées. Configurez votre registre pour :
- Scanner automatiquement toutes les images en poussant
- Réscanner en continu des images pour les vulnérabilités nouvellement découvertes
- Déploiement de blocs d'images avec vulnérabilités critiques
- Envoyer des notifications lorsque des vulnérabilités sont détectées
- Fournir des directives sur la remise en état des problèmes identifiés
Réponse à l'incident et rétablissement
Malgré la mise en œuvre de mesures de sécurité globales, des incidents peuvent encore se produire. L'existence d'un plan d'intervention bien défini est essentielle pour minimiser les dommages et se rétablir rapidement.
Élaborer un plan d'intervention en cas d'incident
Votre plan d'intervention en cas d'incident devrait comprendre :
- Détection: Mécanismes permettant de détecter les incidents de sécurité par la surveillance et l'alerte
- Containment: Procédures d'isolement des contenants affectés et de prévention de la propagation
- Enquête[ : Étapes pour analyser l'incident et déterminer la cause profonde
- Éradication: Processus d'élimination des menaces et de fermeture des vulnérabilités
- Recovery: Procédures de restauration des services et de validation de la sécurité
- Examen post-incident[ : Analyse de ce qui s'est passé et comment prévenir la récidive
Mettre en œuvre les capacités de la médecine légale des conteneurs
La médecine légale des conteneurs peut être difficile en raison de la nature éphémère des conteneurs.
- Préserver l'état du conteneur en créant des instantanés avant la fin
- Tenir des registres complets avec des périodes de conservation suffisantes
- Utiliser une infrastructure immuable pour empêcher toute manipulation de preuves
- Mettre en œuvre l'enregistrement des vérifications pour toutes les opérations de conteneurs
- Maintenir la provenance de l'image et construire l'histoire
Pratique de reprise après sinistre
Testez régulièrement vos procédures de reprise après sinistre :
- Effectuer des exercices de simulation d'incidents de sécurité
- Essai de sauvegarde et restauration des procédures de données sur les conteneurs
- Valider que vous pouvez reconstruire des environnements à partir de zéro
- Veiller à ce que la documentation soit à jour et accessible
- Former les membres de l'équipe aux procédures d'intervention en cas d'incident
Liste de contrôle de sécurité pour les déploiements de production
Commencez par les éléments à impact élevé : images minimales, utilisateurs non root, balayage CI, et digest pinning. Couchez-vous dans la surveillance des temps d'exécution, la segmentation du réseau et la gestion des secrets.
Sécurité de l'image
- Utiliser des images de base minimales (alpin, sans distrite)
- Pin des versions d'image spécifiques à l'aide de digests
- Analyser les images pour détecter les vulnérabilités dans le pipeline CI/CD
- Signez des images avec Docker Content Trust ou Cosign
- Générer et maintenir des SBOM pour toutes les images
- Supprimer les paquets et fichiers inutiles
- Utiliser des constructions multi-étapes pour minimiser la taille finale de l'image
- Ne jamais inclure de secrets dans les images
Sécurité du temps de fonctionnement du conteneur
- Exécuter des conteneurs en tant qu'utilisateurs non root
- Utiliser des systèmes de fichiers racine en lecture seule
- Déposer toutes les capacités et ajouter seulement celles requises
- Activer le drapeau sans nouveaux privilèges
- Appliquer les profils seccomp, AppArmor ou SELinux
- Définir les limites des ressources (CPU, mémoire, PID)
- Mettre en œuvre la segmentation du réseau
- Utiliser les réseaux privés pour la communication entre les conteneurs
Sécurité des hôtes et des infrastructures
- Gardez à jour le système d'exploitation et le noyau de l'hôte
- Mettre à jour régulièrement Docker Engine
- Ne jamais exposer Docker daemon socket
- Utiliser le Docker sans racine lorsque possible
- Mettre en place des pare-feu basés sur l'hôte
- Activer l'enregistrement des audits
- Restreindre l'accès SSH avec une authentification par clé
- Utiliser des hôtes bastion pour l'accès à la production
Secrets et gestion de la configuration
- Utiliser les secrets Docker ou les voûtes externes
- Jamais d'identifications de code dur
- Renverser les secrets régulièrement
- Utiliser des jetons et des lettres de créances à courte durée de vie
- Chiffrer les secrets au repos et en transit
- Accès secret aux audits
Surveillance et exploitation forestière
- Mettre en œuvre le contrôle de sécurité des temps d'exécution (Falco)
- Centraliser les grumes de tous les conteneurs
- Activer la logarithme Docker
- Surveiller l'utilisation des ressources
- Mettre en place des alertes pour les activités suspectes
- Maintenir une conservation suffisante du journal
- Mettre en place des pistes de vérification pour assurer la conformité
Sécurité des pipelines CI/CD
- Lint Dockerfiles avec Hadolnt
- Scanner les images dans le pipeline CI
- Échec : mise en place de vulnérabilités critiques
- Mettre en œuvre les politiques d'application
- Utiliser des registres distincts pour dev/staging/prod
- Automatiser les tests de sécurité
- Exiger un examen de code pour les modifications Dockerfile
Kubernetes-Spécific (le cas échéant)
- Mettre en œuvre les normes de sécurité du pod
- Configurer les politiques de réseau
- Utiliser les contrôleurs d'admission pour l'application des politiques
- Activer RBAC avec le moins de privilèges
- Sécuriser le serveur API Kubernetes
- Chiffrer les données etcd au repos
- Exécuter CIS Kubernetes Contrôles de repères
Tendances nouvelles et considérations futures
La sécurité des conteneurs continue d'évoluer avec les nouvelles technologies et approches.
Sécurité de la chaîne d'approvisionnement
Les incidents de 2025 — l'expédition d'images de base rétroportées pendant des mois, des milliers de lettres de créance de production divulguées par Dockerfiles — prouvent que les bases de données restent importantes. Les attaques de la chaîne d'approvisionnement ciblant les écosystèmes de conteneurs sont en augmentation.
Architecture de confiance zéro
Appliquer des principes de confiance zéro aux environnements de conteneurs en supposant une violation et en vérifiant chaque demande. Mettre en œuvre des technologies de maille de service comme Istio ou Linkerd pour fournir une authentification mutuelle TLS, une autorisation à grain fin et une observabilité pour la communication conteneur-container.
Sécurité fondée sur le FPB électronique
La technologie étendue Berkeley Packet Filter (eBPF) permet une surveillance de sécurité de l'exécution puissante avec des frais généraux de performance minimes.
Informatique confidentielle
Les technologies informatiques confidentielles protègent les données utilisées en effectuant des calculs dans des environnements d'exécution de confiance basés sur le matériel (TEEs), ce qui permet de protéger les charges de travail sensibles même des utilisateurs privilégiés et des systèmes d'accueil compromis.
Outils et ressources recommandés
Pour construire un programme complet de sécurité des conteneurs, il faut tirer parti des bons outils. Voici les ressources recommandées organisées par catégorie :
Analyse de vulnérabilité
- Trivy (Open Source): scanner de vulnérabilité rapide et complet
- Docker Scout: Numérisation intégrée avec Docker Desktop et CLI
- Anchore Engine (Open Source): Analyse et conformité fondées sur les politiques
- Snyk Container: Scannage axé sur le développeur avec des recommandations de correction
- Clair (Open Source): Analyse statique des vulnérabilités
Sécurité des temps d'exécution
- Falco (Open Source): Détection de la menace pendant l'exécution à l'aide de eBPF
- Aqua Security[: Plateforme de sécurité complète pour conteneurs
- Sysdig Secure: Sécurité des temps d'exécution et criminalistique
Politique et conformité
- Agent de politique ouvert (Open Source): moteur de politique en tant que code
- Kyverno (Open Source): Kubernetes-gestion des politiques natives
- Champ de contrôle de la sécurité (Source ouverte): Contrôles de contrôle de la qualité de Docker du SIC
- kube-bench (Open Source): CIS Kubernetes Vérifications de repères
Gestion des secrets
- HashiCorp Vault[: Gestion des secrets d'entreprise
- AWS Secrets Manager: Secrets natifs du nuage pour AWS
- Vault de clé d'Azure: Gestion des secrets pour Azure
- Google Secret Manager: Gestion des secrets pour GCP
Ressources supplémentaires
- Documentation sur la sécurité de la police d'assurance
- OWASP Feuille de chaleur de sécurité Docker
- CIS Docker Benchmark
- Kubernetes Documentation de sécurité
- Cadre de l'ESL
Conclusion
La sécurité des conteneurs est un processus continu qui couvre plusieurs aspects, dont la création d'images, la manipulation secrète, le comportement d'exécution et la surveillance continue. La sécurité est un processus continu. Vérifiez régulièrement vos configurations, mettez à jour les images de base et restez informé sur de nouvelles vulnérabilités.
La mise en œuvre de conteneurs Docker sécurisés nécessite une approche globale et en couches qui traite de la sécurité à chaque étape du cycle de vie du conteneur. Du choix d'images de base minimales et de fonctionner en tant qu'utilisateurs non-racines à la mise en œuvre de la surveillance et du maintien de la conformité, chaque mesure de sécurité contribue à une stratégie de défense solide en profondeur.
Les conteneurs Docker fournissent des outils puissants pour le développement moderne, mais nécessitent une surveillance minutieuse pour s'assurer qu'ils demeurent en sécurité. En s'attaquant aux risques associés aux images Docker, aux privilèges de conteneur et aux systèmes hôtes, les organisations peuvent minimiser la probabilité de ruptures et maximiser la fiabilité de leurs environnements conteneurisés.
La clé de la sécurité des conteneurs est de la traiter non pas comme une mise en œuvre ponctuelle, mais comme une pratique permanente intégrée dans votre culture de développement. Automatisez les contrôles de sécurité dans vos pipelines CI/CD, surveillez en permanence le comportement d'exécution, mettez régulièrement à jour les composants et restez informé des nouvelles menaces et des meilleures pratiques.
N'oubliez pas que la sécurité est une responsabilité partagée. Bien que les plateformes d'orchestration Docker et conteneur fournissent les outils et les capacités, il revient aux équipes de développement et d'exploitation de mettre en œuvre et de maintenir les mesures de sécurité de façon uniforme. Investir dans la formation de votre équipe, établir des politiques de sécurité claires et favoriser une culture où la sécurité est la responsabilité de chacun.