Sécuriser les conteneurs Docker avec des images chiffrées : guide pratique
Découvrez comment protéger vos images Docker en les signant et en les chiffrant, afin de garantir l’intégrité et la confidentialité de vos déploiements.
Pourquoi chiffrer les images Docker ?
Les conteneurs Docker sont largement utilisés pour déployer des applications, mais leurs images sont, par défaut, stockées en clair dans les registres. Un accès non autorisé à un registre peut révéler le code source, les bibliothèques tierces, voire des secrets intégrés accidentellement. Le chiffrement des images répond à deux exigences essentielles :
- Confidentialité : les couches de l’image sont illisibles sans la clé de déchiffrement.
- Intégrité : la signature numérique garantit que l’image n’a pas été altérée depuis sa création.
En combinant Docker Content Trust (DCT) et un chiffrement au niveau du registre, vous assurez que seules les parties autorisées peuvent télécharger et exécuter vos conteneurs.
Docker Content Trust et Notary : la base de la confiance
Docker Content Trust utilise le projet Notary pour signer les images. Chaque image possède un manifest signé avec une clé privée détenue par le créateur. Lors du docker pull, le client vérifie la signature grâce à la clé publique correspondante.
Activation de Docker Content Trust
# Activer DCT pour la session courante
export DOCKER_CONTENT_TRUST=1
# Désactiver temporairement si besoin
# export DOCKER_CONTENT_TRUST=0
Une fois activé, toutes les opérations push et pull sont soumises à la vérification de signature. Les clés sont stockées dans le répertoire ~/.docker/trust/.
Chiffrement des images au niveau du registre
Le chiffrement proprement dit n’est pas fourni par Docker Engine. Il s’appuie sur le registre qui supporte le encryption-at-rest (ex. Harbor, Quay, ou le registre privé de Docker avec l’option --storage-encryption). Voici comment configurer un registre Docker local avec chiffrement.
Installation du registre avec chiffrement
docker run -d \
--name registry \
-p 5000:5000 \
-e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry \
-e REGISTRY_STORAGE_ENCRYPTION_ENABLED=true \
-e REGISTRY_STORAGE_ENCRYPTION_KEY=YOUR_32_BYTE_KEY \
-v registry-data:/var/lib/registry \
registry:2
REGISTRY_STORAGE_ENCRYPTION_ENABLEDactive le chiffrement des blobs.REGISTRY_STORAGE_ENCRYPTION_KEYdoit être une clé de 32 octets (AES‑256) stockée de façon sécurisée, par ex. dans un gestionnaire de secrets.
Flux complet de création, signature et push
- Construire l’image
cat > Dockerfile <<'EOF' FROM alpine:3.18 RUN addgroup -S app && adduser -S -G app app WORKDIR /app COPY myapp /app/ CMD ["/app/myapp"] EOF docker build -t localhost:5000/mon-app:1.0 . - Signer l’image (Notary gère les clés automatiquement)
Le registre reçoit l’image chiffrée et le manifeste signé.export DOCKER_CONTENT_TRUST=1 docker push localhost:5000/mon-app:1.0 - Vérifier la signature
Vous voyez la clé publique, le digest et la date de signature.docker trust inspect --pretty localhost:5000/mon-app:1.0 - Récupérer l’image
Le client vérifie la signature ; si la clé publique ne correspond pas, le pull échoue.docker pull localhost:5000/mon-app:1.0
Bonnes pratiques pour une chaîne de confiance robuste
- Gestion des clés : stockez les clés privées de Notary et la clé de chiffrement du registre dans un coffre de secrets (ex. HashiCorp Vault ou Azure Key Vault). Limitez l’accès aux seules personnes ou services qui en ont besoin.
- Rotation des clés : planifiez une rotation périodique. Notary supporte la création de nouvelles clés de signature ; le registre permet de changer la clé de chiffrement en re‑exportant les blobs.
- Scannage des images : même si les images sont chiffrées, elles doivent être scannées avant le push pour détecter des vulnérabilités (ex. Trivy, Clair).
- Audit des accès : conservez les logs du registre et de Notary. Un accès non autorisé aux API du registre doit déclencher une alerte.
- Documentation : consignez la procédure de création, de signature et de rotation des clés. Cela facilite la transmission sécurisée aux successeurs ou aux équipes d’audit.
Conclusion
En combinant Docker Content Trust pour la signature et le chiffrement au repos du registre, vous créez une chaîne de confiance qui protège la confidentialité et l’intégrité de vos conteneurs. Cette approche répond aux exigences de confidentialité des données, tout en restant compatible avec les workflows CI/CD habituels. La mise en œuvre repose sur des outils standards (Docker, Notary, registre chiffré) et sur des pratiques de gestion des clés éprouvées ; elle constitue donc une solution fiable pour toute organisation soucieuse de la sécurité de ses déploiements conteneurisés.
Envie d’aller plus loin avec SecretVault ?
Découvrir SecretVault