La gestion des secrets dans Docker est un problème de sécurité critique pour toute entreprise. Lors de l’utilisation de conteneurs Docker, il est essentiel de sécuriser les données sensibles, telles que les mots de passe, les clés API et autres informations d’identification.
Cet article abordera certaines des meilleures pratiques de gestion des secrets dans Docker, y compris la façon de les stocker en toute sécurité et de minimiser leur exposition. Nous explorerons plusieurs solutions : utiliser Docker Secrets avec Docker Swarm, Docker Compose ou Mozilla SOPS. N’hésitez pas à choisir ce qui convient le mieux à votre cas d’utilisation. Mais le plus important est de se rappeler de ne jamais coder en dur vos secrets Docker en texte brut dans votre Dockerfile !
Le respect de ces directives garantit la sécurité des informations sensibles de votre organisation, même lors de l’exécution de services conteneurisés.
4 façons de stocker et de gérer les secrets dans Docker
1. Utiliser Docker Secrets et Docker Swarm
Docker Secrets et Docker Swarm sont deux outils officiels et complémentaires permettant de gérer en toute sécurité les secrets lors de l’exécution de services conteneurisés.
Docker Secrets fournit un mécanisme sécurisé pour stocker et récupérer des secrets du système sans les exposer en texte brut. Il permet aux utilisateurs de protéger leurs informations d’identification en cryptant les données avec une clé unique avant de les transmettre au système.
Docker Swarm est un outil puissant de gestion des clusters de nœuds pour les applications distribuées. Il fournit un moyen efficace de déployer des applications conteneurisées à grande échelle. Avec cet outil, vous pouvez facilement gérer plusieurs nœuds au sein d’un cluster et répartir automatiquement les charges de travail entre eux. Cela permet de garantir que votre application dispose de suffisamment de ressources disponibles à tout moment, même pendant les périodes de pointe d’utilisation ou les pics de trafic inattendus.
Ensemble, ces deux outils offrent un moyen efficace de garantir la sécurité des informations sensibles de votre organisation malgré l’évolution constante des besoins de sécurité. Voyons comment créer et gérer un exemple de secret.
Création d’un secret
Pour créer un secret, nous devons d’abord initialiser Docker Swarm. Vous pouvez le faire en utilisant la commande suivante :
Une fois le service initialisé, nous pouvons utiliser le docker secret create
commande pour créer le secret :
ssh-keygen -t rsa -b 4096 -N "" -f mykey
docker secret create my_key mykey
rm mykey
Dans ces commandes, nous créons d’abord une clé SSH en utilisant le ssh-keygen
commande et écrivez-la à mykey
. Ensuite, nous utilisons la commande Docker secret pour générer le secret. Assurez-vous de supprimer le mykey
fichier pour éviter tout risque de sécurité.
Vous pouvez utiliser la commande suivante pour confirmer que le secret a bien été créé :
Nous pouvons maintenant utiliser ce secret dans nos conteneurs Docker. Une façon est de passer ce secret avec –secret
flag lors de la création d’un service :
docker service create --name mongodb --secret my_mongodb_secret redis:latest
Nous pouvons également transmettre ce secret au docker-compose.yml
déposer. Prenons un exemple de fichier :
version: '3.7'
services:
myapp:
image: mydummyapp:latest
secrets:
- my_secret
volumes:
- type: bind
source: my_secret_key
target: /run/secrets/my_secret
read_only: true
secrets:
my_secret:
external: true
Dans l’exemple de fichier de composition, la section secrets définit un secret nommé my_secret_key
(discuté plus tôt). Le myapp
la définition de service spécifie qu’elle nécessite my_secret_key
et le monte en tant que fichier à /run/secrets/my_secret
dans le conteneur.
2. Utilisation de Docker Compose
Docker Compose est un outil puissant pour définir et exécuter des applications multi-conteneurs avec Docker. Une pile est définie par un docker-compose
fichier vous permettant de définir et de configurer les services qui composent votre application, y compris leurs variables d’environnement, réseaux, ports et volumes. Avec Docker Compose, il est facile de configurer une application dans un seul fichier de configuration et de la déployer rapidement et de manière cohérente dans plusieurs environnements.
Docker Compose fournit une solution efficace de gestion des secrets pour les organisations manipulant des données sensibles telles que les mots de passe ou les clés API. Vous pouvez lire vos secrets à partir d’un fichier externe (comme un fichier TXT). Mais attention à ne pas commiter ce fichier avec votre code :
version: '3.7'
services:
myapp:
image: myapp:latest
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
3. Utiliser un conteneur side-car
Une stratégie typique pour maintenir et stocker des secrets dans un environnement Docker consiste à utiliser des conteneurs side-car. Les secrets peuvent être envoyés au conteneur d’application principal via le conteneur sidecar, qui peut également exploiter un gestionnaire de secrets ou un autre service sécurisé.
Comprenons cela en utilisant un side-car Hashicorp Vault pour un conteneur MongoDB :
- Tout d’abord, créez un Docker Compose (
docker-compose.yml
) fichier avec deux services :mongo
etsecrets
. - Dans le
secrets
service, utilisez une image contenant l’outil de gestion des secrets de votre choix, tel qu’un coffre-fort. - Montez un volume du conteneur de secrets au
mongo
conteneur de sorte que lemongo
conteneur peut accéder aux secrets stockés dans le conteneur de secrets. - Dans le
mongo
service, utilisez des variables d’environnement pour définir les informations d’identification de la base de données MongoDB et référencez les secrets stockés dans le volume monté.
Voici l’exemple de fichier de composition :
version: '3.7'
services:
mongo:
image: mongo
volumes:
- secrets:/run/secrets
environment:
MONGO_INITDB_ROOT_USERNAME_FILE: /run/secrets/mongo-root-username
MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongo-root-password
secrets:
image: vault
volumes:
- ./secrets:/secrets
command: ["vault", "server", "-dev", "-dev-root-token-id=myroot"]
ports:
- "8200:8200"
volumes:
secrets:
4. Utilisation de Mozilla SOPS
Mozilla SOPS (Secrets Ops) est une plate-forme open source qui fournit aux organisations un moyen sécurisé et automatisé de gérer les secrets chiffrés dans les fichiers. Il offre une gamme de fonctionnalités conçues pour aider les équipes à partager des secrets dans le code de manière sûre et pratique. Ce qui suit suppose que vous êtes déjà familiarisé avec les SOPS, si ce n’est pas le cas, commencez ici.
Voici un exemple d’utilisation de SOPS avec docker-compose.yml
:
version: '3.7'
services:
myapp:
image: myapp:latest
environment:
API_KEY: ${API_KEY}
secrets:
- mysecrets
sops:
image: mozilla/sops:latest
command: ["sops", "--config", "/secrets/sops.yaml", "--decrypt", "/secrets/mysecrets.enc.yaml"]
volumes:
- ./secrets:/secrets
environment:
# Optional: specify the path to your PGP private key if you encrypted the file with PGP
SOPS_PGP_PRIVATE_KEY: /secrets/myprivatekey.asc
secrets:
mysecrets:
external: true
Dans ce qui précède, le myapp
service nécessite un secret appelé API_KEY
. Le secrets
section utilise un secret appelé mysecrets
qui devrait être stocké dans un magasin clé/valeur externe, tel que les secrets Docker Swarm ou HashiCorp Vault.
Le sops
utilise l’image officielle SOPS Docker pour déchiffrer le mysecrets.enc.yaml
fichier, qui est stocké dans le local ./secrets
annuaire. Les secrets déchiffrés sont montés sur le myapp
service en tant que variables d’environnement.
Note: Assurez-vous de créer le répertoire des secrets et d’ajouter les mysecrets.enc.yaml
dossier et le sops.yaml
fichier de configuration (avec configuration SOPS) dans ce répertoire.
Rechercher des secrets dans vos images Docker
Les secrets de codage en dur dans Docker constituent un risque de sécurité important, ce qui les rend vulnérables aux attaquants. Nous avons vu différentes bonnes pratiques pour éviter de coder en dur des secrets en texte brut dans vos images Docker, mais la sécurité ne s’arrête pas là.
Vous devriez également scanner vos images pour les secrets
Tous les Dockerfiles commencent par un FROM
directive qui définit l’image de base. Il est important de comprendre que lorsque vous utilisez une image de base, en particulier à partir d’un registre public comme Docker Hub, vous extrayez du code externe qui peut contenir des secrets codés en dur. Plus d’informations sont exposées que visibles dans votre Dockerfile unique. En effet, il est possible de récupérer un secret en clair codé en dur dans une couche précédente à partir de votre image.
De fait, de nombreuses images Docker publiques sont concernées : en 2021, on estimait que **7% de la Hub Docker les images contenaient au moins un secret.**
Heureusement, vous pouvez facilement les détecter avec ggshield
(CLI GitGuardian). Par exemple:
ggshield secret scan docker ubuntu:22.04
Conclusion
La gestion des secrets dans Docker est un élément crucial pour préserver la sécurité de vos applications conteneurisées. Docker comprend plusieurs outils intégrés pour conserver les secrets, tels que les fichiers Docker Secrets et Docker Compose.
De plus, les organisations peuvent utiliser des solutions tierces, telles que HashiCorp Vault et Mozilla SOPS, pour gérer les secrets dans Docker. Ces technologies offrent des fonctionnalités supplémentaires, telles que le contrôle d’accès, le chiffrement et la journalisation d’audit, pour renforcer la sécurité de votre gestion des secrets.
Enfin, trouver et limiter l’exposition accidentelle ou involontaire d’informations sensibles est crucial pour gérer les secrets dans Docker. Les entreprises sont invitées à utiliser des outils d’analyse secrets, tels que GitGuardian, pour analyser les images Docker intégrées dans leurs pipelines CI/CD afin de prévenir les attaques de la chaîne d’approvisionnement.
Si vous souhaitez en savoir plus sur la sécurité Docker, nous avons également résumé certaines des meilleures pratiques dans une feuille de triche.