Vault AWS secrets engine génère des credentials IAM temporaires à la demande. Plus d’access keys permanentes dans le code : chaque workload obtient ses propres credentials, valides quelques heures maximum.
Ce guide couvre les trois types de credentials AWS que Vault peut émettre et leur cas d’usage.
Pourquoi des credentials AWS dynamiques
Section intitulée « Pourquoi des credentials AWS dynamiques »| Access keys permanentes | Avec Vault AWS |
|---|---|
| Durée de vie illimitée | TTL 1-12h max |
| Partagées via secrets/env vars | Générées à la demande |
| Rotation manuelle rare | Rotation automatique par TTL |
| Compromission = accès permanent | Compromission = accès limité dans le temps |
| Audit : “qui a cette clé ?” | Audit : “quel workload a demandé quand” |
Prérequis
Section intitulée « Prérequis »- Vault installé et démarré
- Accès admin pour configurer le moteur
- Compte AWS avec permissions IAM pour créer des credentials
Types de credentials : iam_user vs assumed_role vs federation_token
Section intitulée « Types de credentials : iam_user vs assumed_role vs federation_token »Vault peut émettre trois types de credentials AWS :
| Type | Comment ça marche | TTL typique | Cas d’usage |
|---|---|---|---|
iam_user | Vault crée un user IAM + access key | ∞ (mais lease Vault) | Legacy, permissions complexes |
assumed_role | Vault assume un rôle IAM via STS | 1-12h (borne AWS) | Recommandé - standard |
federation_token | Vault génère un token fédéré | Jusqu’à 36h | Console AWS, accès humain |
Étape 1 : activer le moteur AWS
Section intitulée « Étape 1 : activer le moteur AWS »vault secrets enable awsÉtape 2 : configurer les credentials root
Section intitulée « Étape 2 : configurer les credentials root »Vault a besoin de credentials pour appeler les API AWS. Deux options :
vault write aws/config/root \ access_key="AKIAIOSFODNN7EXAMPLE" \ secret_key="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \ region="eu-west-1"Si Vault tourne sur AWS avec un IAM role attaché (instance profile, task role, IRSA), vous pouvez utiliser ce rôle directement :
vault write aws/config/root \ region="eu-west-1" # Pas de credentials : Vault utilise le rôle de l'instanceRotation des credentials root
Section intitulée « Rotation des credentials root »Après configuration avec access key :
vault write -force aws/config/rotate-rootÉtape 3 : créer un rôle
Section intitulée « Étape 3 : créer un rôle »Le rôle Vault référence un rôle IAM existant dans AWS :
vault write aws/roles/deploy \ credential_type="assumed_role" \ role_arns="arn:aws:iam::123456789012:role/DeployRole" \ default_sts_ttl="1h" \ max_sts_ttl="4h"Prérequis AWS : le rôle DeployRole doit avoir une trust policy
permettant à Vault (via son rôle ou user) de l’assumer :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/vault-aws" }, "Action": "sts:AssumeRole" } ]}Vault crée un user IAM temporaire avec une policy inline :
vault write aws/roles/s3-readonly \ credential_type="iam_user" \ policy_document=-<<EOF{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"] } ]}EOFOu avec des policies managées :
vault write aws/roles/ec2-admin \ credential_type="iam_user" \ policy_arns="arn:aws:iam::aws:policy/AmazonEC2FullAccess"Pour l’accès console ou des workloads spécifiques :
vault write aws/roles/console-readonly \ credential_type="federation_token" \ policy_document=-<<EOF{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ec2:Describe*", "s3:List*"], "Resource": "*" } ]}EOFÉtape 4 : émettre des credentials temporaires
Section intitulée « Étape 4 : émettre des credentials temporaires »vault read aws/creds/deploySortie (pour assumed_role) :
Key Value--- -----lease_id aws/creds/deploy/abcd1234lease_duration 1hlease_renewable trueaccess_key ASIAIOSFODNN7EXAMPLEsecret_key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYsecurity_token FwoGZXIvYXdzEBY...arn arn:aws:sts::123456789012:assumed-role/DeployRole/vault-token-xyzCe qui se passe :
- Vault appelle
sts:AssumeRoleavec le rôle IAM configuré - AWS retourne des credentials STS temporaires
- Vault crée un lease et retourne les credentials
- L’application utilise ces credentials
- À expiration, les credentials STS deviennent invalides (côté AWS)
Utiliser les credentials
Section intitulée « Utiliser les credentials »export AWS_ACCESS_KEY_ID="ASIAIOSFODNN7EXAMPLE"export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"export AWS_SESSION_TOKEN="FwoGZXIvYXdzEBY..."
aws s3 lsStatic role : rotation d’une clé IAM existante
Section intitulée « Static role : rotation d’une clé IAM existante »Pour les cas où vous avez besoin d’une access key fixe mais rotée automatiquement :
vault write aws/static-roles/ci-user \ name="ci-user" \ username="ci-pipeline-user" \ rotation_period="24h"Lecture :
vault read aws/static-creds/ci-userDifférence avec dynamic :
- Même user IAM (
ci-pipeline-user) - Access key rotée tous les 24h
- Pas de session token
Révocation
Section intitulée « Révocation »Révoquer un lease
Section intitulée « Révoquer un lease »vault lease revoke aws/creds/deploy/abcd1234Ce qui se passe selon le type :
iam_user: Vault supprime l’access key et l’user IAMassumed_role: Vault marque le lease comme révoqué (les credentials STS expirent naturellement, pas de révocation AWS)federation_token: idem assumed_role
Révoquer tous les credentials d’un rôle
Section intitulée « Révoquer tous les credentials d’un rôle »vault lease revoke -prefix aws/creds/deployPolicy Vault pour l’accès AWS
Section intitulée « Policy Vault pour l’accès AWS »# Obtenir des credentials AWS pour le déploiementpath "aws/creds/deploy" { capabilities = ["read"]}
# Renouveler ses propres leasespath "sys/leases/renew" { capabilities = ["update"]}vault policy write deploy policy-deploy.hclIntégration CI/CD
Section intitulée « Intégration CI/CD »GitHub Actions
Section intitulée « GitHub Actions »name: Deploy to AWSon: push: branches: [main]
jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Import Secrets from Vault uses: hashicorp/vault-action@v2 with: url: https://vault.example.com method: jwt role: github-deploy secrets: | aws/creds/deploy access_key | AWS_ACCESS_KEY_ID ; aws/creds/deploy secret_key | AWS_SECRET_ACCESS_KEY ; aws/creds/deploy security_token | AWS_SESSION_TOKEN
- name: Deploy run: | aws s3 sync ./dist s3://my-app-bucketGitLab CI
Section intitulée « GitLab CI »deploy: stage: deploy script: - export VAULT_ADDR="https://vault.example.com" - export VAULT_TOKEN=$(vault write -field=token auth/jwt/login role=gitlab-deploy jwt=$CI_JOB_JWT) - eval $(vault read -format=json aws/creds/deploy | jq -r '.data | "export AWS_ACCESS_KEY_ID=\(.access_key) AWS_SECRET_ACCESS_KEY=\(.secret_key) AWS_SESSION_TOKEN=\(.security_token)"') - aws s3 sync ./dist s3://my-app-bucketDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
permission denied | Policy Vault manquante | Vérifier aws/creds/<role> |
AccessDenied côté AWS | Trust policy incorrecte | Vérifier sts:AssumeRole |
ExpiredToken | TTL dépassé | Renouveler ou obtenir de nouveaux creds |
InvalidIdentityToken | Horloge désynchronisée | Vérifier NTP sur Vault |
| User IAM non supprimé | Permissions IAM manquantes | Vérifier iam:DeleteUser, iam:DeleteAccessKey |
# Vérifier la configurationvault read aws/config/root
# Lister les rôlesvault list aws/roles
# Vérifier un rôle spécifiquevault read aws/roles/deploy
# Tester une émissionvault read aws/creds/deploy
# Vérifier les leases actifsvault list sys/leases/lookup/aws/creds/deployCe que le moteur AWS ne fait pas
Section intitulée « Ce que le moteur AWS ne fait pas »| Responsabilité | Vault | Vous |
|---|---|---|
| Générer des credentials STS | ✅ | — |
| Gérer les TTL et leases | ✅ | — |
| Créer les rôles IAM cibles | ❌ | ✅ |
| Configurer les trust policies | ❌ | ✅ |
| Révoquer les credentials STS côté AWS | ❌ | N/A (expire naturellement) |
| Monitorer l’usage AWS | ❌ | ✅ (CloudTrail) |
À retenir
Section intitulée « À retenir »- assumed_role : mode recommandé, pas de création d’entité IAM
- iam_user : Vault crée un user temporaire, plus de cleanup
- federation_token : pour la console AWS ou workloads spécifiques
- TTL courts : 1-4h, les credentials STS ne sont pas révocables
- Trust policy : le rôle IAM doit autoriser Vault à l’assumer
- Static role : rotation d’une clé existante (compromis pour legacy)
- Audit : Vault trace l’émission, CloudTrail trace l’utilisation