Aller au contenu
Sécurité medium

Vault AWS : credentials IAM dynamiques

12 min de lecture

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.

Access keys permanentesAvec Vault AWS
Durée de vie illimitéeTTL 1-12h max
Partagées via secrets/env varsGénérées à la demande
Rotation manuelle rareRotation automatique par TTL
Compromission = accès permanentCompromission = accès limité dans le temps
Audit : “qui a cette clé ?”Audit : “quel workload a demandé quand”
  • 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 :

TypeComment ça marcheTTL typiqueCas d’usage
iam_userVault crée un user IAM + access key∞ (mais lease Vault)Legacy, permissions complexes
assumed_roleVault assume un rôle IAM via STS1-12h (borne AWS)Recommandé - standard
federation_tokenVault génère un token fédéréJusqu’à 36hConsole AWS, accès humain
Fenêtre de terminal
vault secrets enable aws

Vault a besoin de credentials pour appeler les API AWS. Deux options :

Fenêtre de terminal
vault write aws/config/root \
access_key="AKIAIOSFODNN7EXAMPLE" \
secret_key="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
region="eu-west-1"

Après configuration avec access key :

Fenêtre de terminal
vault write -force aws/config/rotate-root

Le rôle Vault référence un rôle IAM existant dans AWS :

Fenêtre de terminal
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"
}
]
}
Fenêtre de terminal
vault read aws/creds/deploy

Sortie (pour assumed_role) :

Key Value
--- -----
lease_id aws/creds/deploy/abcd1234
lease_duration 1h
lease_renewable true
access_key ASIAIOSFODNN7EXAMPLE
secret_key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
security_token FwoGZXIvYXdzEBY...
arn arn:aws:sts::123456789012:assumed-role/DeployRole/vault-token-xyz

Ce qui se passe :

  1. Vault appelle sts:AssumeRole avec le rôle IAM configuré
  2. AWS retourne des credentials STS temporaires
  3. Vault crée un lease et retourne les credentials
  4. L’application utilise ces credentials
  5. À expiration, les credentials STS deviennent invalides (côté AWS)
Fenêtre de terminal
export AWS_ACCESS_KEY_ID="ASIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_SESSION_TOKEN="FwoGZXIvYXdzEBY..."
aws s3 ls

Pour les cas où vous avez besoin d’une access key fixe mais rotée automatiquement :

Fenêtre de terminal
vault write aws/static-roles/ci-user \
name="ci-user" \
username="ci-pipeline-user" \
rotation_period="24h"

Lecture :

Fenêtre de terminal
vault read aws/static-creds/ci-user

Différence avec dynamic :

  • Même user IAM (ci-pipeline-user)
  • Access key rotée tous les 24h
  • Pas de session token
Fenêtre de terminal
vault lease revoke aws/creds/deploy/abcd1234

Ce qui se passe selon le type :

  • iam_user : Vault supprime l’access key et l’user IAM
  • assumed_role : Vault marque le lease comme révoqué (les credentials STS expirent naturellement, pas de révocation AWS)
  • federation_token : idem assumed_role
Fenêtre de terminal
vault lease revoke -prefix aws/creds/deploy
policy-deploy.hcl
# Obtenir des credentials AWS pour le déploiement
path "aws/creds/deploy" {
capabilities = ["read"]
}
# Renouveler ses propres leases
path "sys/leases/renew" {
capabilities = ["update"]
}
Fenêtre de terminal
vault policy write deploy policy-deploy.hcl
name: Deploy to AWS
on:
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-bucket
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-bucket
SymptômeCause probableSolution
permission deniedPolicy Vault manquanteVérifier aws/creds/<role>
AccessDenied côté AWSTrust policy incorrecteVérifier sts:AssumeRole
ExpiredTokenTTL dépasséRenouveler ou obtenir de nouveaux creds
InvalidIdentityTokenHorloge désynchroniséeVérifier NTP sur Vault
User IAM non suppriméPermissions IAM manquantesVérifier iam:DeleteUser, iam:DeleteAccessKey
Fenêtre de terminal
# Vérifier la configuration
vault read aws/config/root
# Lister les rôles
vault list aws/roles
# Vérifier un rôle spécifique
vault read aws/roles/deploy
# Tester une émission
vault read aws/creds/deploy
# Vérifier les leases actifs
vault list sys/leases/lookup/aws/creds/deploy
ResponsabilitéVaultVous
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é AWSN/A (expire naturellement)
Monitorer l’usage AWS✅ (CloudTrail)
  1. assumed_role : mode recommandé, pas de création d’entité IAM
  2. iam_user : Vault crée un user temporaire, plus de cleanup
  3. federation_token : pour la console AWS ou workloads spécifiques
  4. TTL courts : 1-4h, les credentials STS ne sont pas révocables
  5. Trust policy : le rôle IAM doit autoriser Vault à l’assumer
  6. Static role : rotation d’une clé existante (compromis pour legacy)
  7. Audit : Vault trace l’émission, CloudTrail trace l’utilisation

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn