Gestion des secrets avec HashiCorp Vault dans un pipeline GitLab CI/CD
Découvrez comment sécuriser vos variables sensibles en intégrant HashiCorp Vault à vos pipelines GitLab CI/CD, de l'installation à la mise en production.
Pourquoi externaliser les secrets ?
Dans un pipeline CI/CD, les variables d’environnement (tokens d’API, mots de passe, certificats) sont souvent stockées en clair dans le dépôt ou dans les paramètres de GitLab. Cette pratique expose les secrets à plusieurs risques : fuite via les logs, accès involontaire à des contributeurs externes, et rotation difficile. HashiCorp Vault propose un coffre‑fort dynamique, capable de générer des credentials temporaires et de les révoquer automatiquement.
Installation et configuration de Vault
- Déploiement rapide avec Docker
Le mode dev n’est destiné qu’aux tests ; en production, activez le stockage persistant (Consul, PostgreSQL, etc.) et configurez TLS.docker run -d --name=vault \ -p 8200:8200 \ -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' \ vault:latest - Initialisation
Conservez les clés d’unseal et le token root dans un gestionnaire de secrets interne.export VAULT_ADDR='http://127.0.0.1:8200' vault operator init -key-shares=1 -key-threshold=1 > init.txt - Définir une politique d’accès
# policies/gitlab.hcl path "secret/data/*" { capabilities = ["read"] }
Cette politique autorise la lecture de tous les secrets sousvault policy write gitlab - <<EOF $(cat policies/gitlab.hcl) EOFsecret/data/.
Intégration avec GitLab CI/CD
a. Authentification via AppRole
- Création d’un AppRole
vault auth enable approle vault write auth/approle/role/gitlab-role \ token_policies="gitlab" \ token_ttl=20m \ token_max_ttl=30m - Récupération du RoleID et du SecretID
Stockez levault read auth/approle/role/gitlab-role/role-id vault write -f auth/approle/role/gitlab-role/secret-idROLE_IDet leSECRET_IDdans les variables protégées de GitLab (VAULT_ROLE_ID,VAULT_SECRET_ID).
b. Exemple de .gitlab-ci.yml
stages:
- test
- build
variables:
VAULT_ADDR: "http://vault.example.com:8200"
before_script:
- apk add --no-cache curl jq
# Authentification AppRole
- export VAULT_TOKEN=$(curl -s --request POST \
--data "{\"role_id\": \"$VAULT_ROLE_ID\", \"secret_id\": \"$VAULT_SECRET_ID\"}" \
$VAULT_ADDR/v1/auth/approle/login | jq -r .auth.client_token)
# Récupération du secret
- export DB_PASSWORD=$(curl -s --header "X-Vault-Token: $VAULT_TOKEN" \
$VAULT_ADDR/v1/secret/data/db | jq -r .data.data.password)
unit_tests:
stage: test
script:
- echo "Running tests with DB password from Vault"
- ./run-tests.sh --db-pass $DB_PASSWORD
build_image:
stage: build
script:
- docker build --build-arg DB_PASSWORD=$DB_PASSWORD -t myapp:${CI_COMMIT_SHA} .
Ce pipeline récupère dynamiquement le mot de passe de la base de données depuis Vault, évitant toute persistance locale.
Meilleures pratiques et sécurisation
- Rotation automatique : utilisez les secrets dynamiques (ex. :
database/creds/role) afin que Vault génère des credentials à durée de vie limitée. - Limitation d’accès : créez une politique par projet GitLab, ne donnez que les chemins nécessaires.
- Audit : activez le backend d’audit de Vault (
vault audit enable file file_path=/var/log/vault_audit.log) pour tracer chaque lecture de secret. - TLS obligatoire : en production, forcez HTTPS avec un certificat valide et désactivez le mode dev.
- Sécurisation des variables CI : marquez
VAULT_ROLE_IDetVAULT_SECRET_IDcomme protected et masked dans les paramètres du projet.
Conclusion
Intégrer HashiCorp Vault à un pipeline GitLab CI/CD élimine le stockage statique de secrets et renforce la traçabilité ainsi que la rotation des credentials. En suivant les étapes ci‑dessus—déploiement de Vault, création d’une politique minimaliste, utilisation d’AppRole, et configuration du fichier .gitlab-ci.yml—vous obtenez un flux CI/CD où chaque job ne possède que les secrets dont il a réellement besoin, pendant le temps requis. Cette approche, bien que légèrement plus complexe à mettre en place, devient rapidement un standard de sécurité pour les équipes DevOps soucieuses de la conformité et du moindre risque d’exposition.
Envie d’aller plus loin avec CertifApp ?
Découvrir CertifApp