Une fois authentifié, Vault détermine les permissions via les policies. Chaque policy définit des capabilities (read, write, delete…) sur des paths (secret/data/*, auth/token/…).
Deny by default et modèle d’évaluation
Section intitulée « Deny by default et modèle d’évaluation »Vault applique un modèle deny by default : sans policy explicite, tout accès est refusé. Quand plusieurs règles peuvent correspondre à un path :
- Vault choisit d’abord la règle la plus spécifique (priority matching)
- Si exactement le même pattern est défini dans plusieurs policies attachées au token, les capabilities se cumulent
- La capability
denyreste toujours prioritaire
Prérequis
Section intitulée « Prérequis »- Vault installé et démarré
- Accès root ou admin pour créer des policies
Policies intégrées
Section intitulée « Policies intégrées »Vault inclut deux policies intégrées :
La policy root donne un accès total à Vault. Le token root doit être
réservé à l’initialisation ou aux situations d’urgence.
La policy default est attachée à la plupart des tokens par défaut. Elle
fournit généralement un socle minimal pour que le token puisse se consulter
et gérer certaines opérations de base (cubbyhole, renouvellement…).
Anatomie d’une policy
Section intitulée « Anatomie d’une policy »Une policy est écrite en HCL (HashiCorp Configuration Language) ou JSON :
# Policy pour l'équipe développementpath "secret/data/dev/*" { capabilities = ["create", "read", "update", "delete", "list"]}
path "secret/data/shared/config" { capabilities = ["read"]}
path "secret/metadata/dev/*" { capabilities = ["list", "read", "delete"]}Capabilities disponibles
Section intitulée « Capabilities disponibles »| Capability | Description | Verbes HTTP |
|---|---|---|
create | Créer une nouvelle entrée | POST/PUT |
read | Lire une entrée | GET |
update | Modifier une entrée existante | POST/PUT |
delete | Supprimer une entrée | DELETE |
list | Lister les entrées | LIST |
patch | Modification partielle (si l’endpoint le supporte) | PATCH |
sudo | Accès aux paths protégés (root-protected) | - |
deny | Refuser explicitement (prioritaire sur tout) | - |
Paths pour KV v2
Section intitulée « Paths pour KV v2 »Avec le moteur KV v2, les paths sont structurés ainsi :
| Path | Usage |
|---|---|
secret/data/* | Lecture/écriture des secrets |
secret/metadata/* | Métadonnées, versions, suppression soft |
secret/delete/* | Suppression soft de versions |
secret/undelete/* | Restauration de versions |
secret/destroy/* | Suppression définitive |
Priority matching : comment Vault choisit la règle
Section intitulée « Priority matching : comment Vault choisit la règle »Quand plusieurs patterns peuvent correspondre à un path, Vault applique une logique de priorité pour déterminer lequel utiliser.
Règles de priorité
Section intitulée « Règles de priorité »- Si le premier wildcard (
+ou*) apparaît plus tôt dans le path, la règle est moins prioritaire - Une règle finissant par
*est moins prioritaire qu’une sans wildcard - Plus il y a de segments
+, plus la priorité baisse - Une règle plus courte est moins prioritaire
- En dernier recours : comparaison lexicographique
Exemple de priority matching
Section intitulée « Exemple de priority matching »# Règle générale : lecture sur tout secret/*path "secret/*" { capabilities = ["read"]}
# Règle spécifique : deny sur prodpath "secret/data/prod/*" { capabilities = ["deny"]}Pour le path secret/data/prod/app :
- Les deux patterns matchent
secret/data/prod/*est plus spécifique (wildcard plus tard)- Vault applique
deny→ accès refusé
Union des capabilities (même pattern)
Section intitulée « Union des capabilities (même pattern) »L’union ne se produit que si le même pattern exact existe dans plusieurs policies attachées au token :
# Policy Apath "secret/data/shared/*" { capabilities = ["read"]}
# Policy Bpath "secret/data/shared/*" { capabilities = ["list"]}Si un token a les deux policies, il obtient ["read", "list"] sur ce path.
Wildcards et globs
Section intitulée « Wildcards et globs »| Pattern | Signification |
|---|---|
* | Glob de suffixe — matche tout le reste du path |
+ | Matche un seul segment de chemin |
Exemples
Section intitulée « Exemples »| Pattern | Correspond à | Ne correspond pas à |
|---|---|---|
secret/data/dev/* | secret/data/dev/a, secret/data/dev/a/b/c | secret/data/dev |
secret/data/apps/+ | secret/data/apps/a, secret/data/apps/b | secret/data/apps/a/b |
secret/data/+/config | secret/data/prod/config | secret/data/a/b/config |
Créer une policy
Section intitulée « Créer une policy »Méthode fichier
Section intitulée « Méthode fichier »-
Créer le fichier HCL
Fenêtre de terminal cat > dev-policy.hcl << 'EOF'# Accès complet à secret/dev/*path "secret/data/dev/*" {capabilities = ["create", "read", "update", "delete", "list"]}path "secret/metadata/dev/*" {capabilities = ["list", "read", "delete"]}# Lecture seule sur sharedpath "secret/data/shared/*" {capabilities = ["read", "list"]}EOF -
Charger la policy dans Vault
Fenêtre de terminal vault policy write dev-policy dev-policy.hclSortie :
Success! Uploaded policy: dev-policy -
Vérifier
Fenêtre de terminal vault policy read dev-policy
Méthode inline
Section intitulée « Méthode inline »Pour les policies simples :
vault policy write staging-readonly - << 'EOF'path "secret/data/staging/*" { capabilities = ["read", "list"]}EOFLister et gérer les policies
Section intitulée « Lister et gérer les policies »# Lister toutes les policiesvault policy list
# Lire une policyvault policy read dev-policy
# Supprimer une policyvault policy delete dev-policyAssigner une policy
Section intitulée « Assigner une policy »À un utilisateur userpass
Section intitulée « À un utilisateur userpass »vault write auth/userpass/users/alice policies="dev-policy,staging-readonly"À un rôle AppRole
Section intitulée « À un rôle AppRole »vault write auth/approle/role/ci-app \ policies="ci-deploy-policy" \ secret_id_ttl=10m \ token_ttl=20mÀ un token
Section intitulée « À un token »vault token create -policy="dev-policy" -policy="staging-readonly"Tester une policy
Section intitulée « Tester une policy »Méthode 1 : créer un token et tester
Section intitulée « Méthode 1 : créer un token et tester »# Créer un token avec la policyvault token create -policy="dev-policy" -field=tokenPuis testez avec ce token :
export VAULT_TOKEN="<token>"
# Doit réussir (dev/*)vault kv put secret/dev/myapp password="test"
# Doit échouer (pas de permission)vault kv put secret/prod/myapp password="test"Sortie attendue pour l’échec :
Error writing data to secret/data/prod/myapp: Error making API request.Code: 403. Errors:* 1 error occurred: * permission deniedMéthode 2 : vault token capabilities
Section intitulée « Méthode 2 : vault token capabilities »Vérifiez les capabilities d’un token sur un path :
# Avec le token actuelvault token capabilities secret/data/dev/myapp
# Avec un token spécifiquevault token capabilities <token> secret/data/dev/myappSortie :
create, delete, list, read, updateMéthode 3 : -output-policy
Section intitulée « Méthode 3 : -output-policy »Certaines commandes CLI supportent -output-policy pour afficher les
permissions nécessaires à une opération :
vault kv get -output-policy secret/apps/webappSortie :
path "secret/data/apps/webapp" { capabilities = ["read"]}Utile pour construire vos policies de manière incrémentale.
Templates avec identité
Section intitulée « Templates avec identité »Vault peut utiliser l’identité de l’utilisateur dans les paths grâce aux templated policies :
# Chaque utilisateur accède à son propre espacepath "secret/data/users/{{identity.entity.name}}/*" { capabilities = ["create", "read", "update", "delete", "list"]}L’utilisateur alice pourra accéder à secret/data/users/alice/* mais pas
à secret/data/users/bob/*.
Variables disponibles
Section intitulée « Variables disponibles »| Variable | Description |
|---|---|
{{identity.entity.id}} | ID unique de l’entité |
{{identity.entity.name}} | Nom de l’entité |
{{identity.entity.aliases.<mount>.id}} | ID d’alias pour un auth method |
{{identity.groups.ids.<group_id>.name}} | Nom d’un groupe par ID |
{{identity.groups.names.<group_name>.id}} | ID d’un groupe par nom |
Contrôle fin des paramètres
Section intitulée « Contrôle fin des paramètres »Les policies peuvent restreindre quels paramètres peuvent être envoyés à un endpoint.
allowed_parameters
Section intitulée « allowed_parameters »Autorise uniquement certains paramètres :
path "secret/data/limited/*" { capabilities = ["create", "update"]
# Seuls ces champs peuvent être écrits allowed_parameters = { "data" = { "username" = [] "password" = [] } }}denied_parameters
Section intitulée « denied_parameters »Interdit certains paramètres (prioritaire sur allowed_parameters) :
path "secret/data/apps/*" { capabilities = ["create", "update"]
# Tout est autorisé sauf ces champs denied_parameters = { "data" = { "admin_token" = [] } }}required_parameters
Section intitulée « required_parameters »Exige la présence de certains paramètres :
path "pki/issue/my-role" { capabilities = ["create", "update"]
# Le common_name est obligatoire required_parameters = ["common_name"]}Exemples de policies par rôle
Section intitulée « Exemples de policies par rôle »Policy développeur
Section intitulée « Policy développeur »# dev-policy.hcl - Développeur# Accès complet à l'environnement de devpath "secret/data/dev/*" { capabilities = ["create", "read", "update", "delete", "list"]}
path "secret/metadata/dev/*" { capabilities = ["list", "read"]}
# Lecture seule sur stagingpath "secret/data/staging/*" { capabilities = ["read", "list"]}
# Pas d'accès à prod (deny by default)Policy CI/CD (build)
Section intitulée « Policy CI/CD (build) »Un pipeline de build n’a généralement besoin que de chiffrer :
# ci-build-policy.hcl - Pipeline de build# Chiffrement uniquement (pas de déchiffrement)path "transit/encrypt/ci-key" { capabilities = ["update"]}
# Lecture des configs non sensiblespath "secret/data/build/config" { capabilities = ["read"]}Policy CI/CD (deploy)
Section intitulée « Policy CI/CD (deploy) »Un pipeline de déploiement a besoin de déchiffrer et lire les secrets :
# ci-deploy-policy.hcl - Pipeline de déploiement# Lecture des secrets de déploiementpath "secret/data/deploy/*" { capabilities = ["read"]}
# Déchiffrement (pas de chiffrement)path "transit/decrypt/ci-key" { capabilities = ["update"]}
# Accès aux certificats PKIpath "pki/issue/deploy-role" { capabilities = ["create", "update"]}Policy admin (non-root)
Section intitulée « Policy admin (non-root) »# admin-policy.hcl - Admin sans être root
# Gestion des policiespath "sys/policies/acl/*" { capabilities = ["create", "read", "update", "delete", "list"]}
# Gestion des auth methods (activer/désactiver)path "sys/auth/*" { capabilities = ["create", "read", "update", "delete", "list", "sudo"]}
# Configuration des auth methodspath "auth/*" { capabilities = ["create", "read", "update", "delete", "list"]}
# Gestion des secrets enginespath "sys/mounts/*" { capabilities = ["create", "read", "update", "delete", "list"]}
# Accès à tous les secretspath "secret/*" { capabilities = ["create", "read", "update", "delete", "list"]}Organisation recommandée
Section intitulée « Organisation recommandée »Par équipe
Section intitulée « Par équipe »policies/├── team-backend.hcl├── team-frontend.hcl├── team-devops.hcl└── team-security.hclPar environnement
Section intitulée « Par environnement »policies/├── env-dev.hcl├── env-staging.hcl└── env-prod.hclCombinaison
Section intitulée « Combinaison »Un utilisateur peut avoir plusieurs policies :
vault write auth/userpass/users/alice \ password="..." \ policies="team-backend,env-dev,env-staging"Les capabilities se cumulent pour les mêmes patterns.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
permission denied | Policy manquante ou pattern non couvert | vault token capabilities <path> |
invalid policy | Erreur de syntaxe HCL | Valider avec vault policy write |
| Capabilities inattendues | Priority matching → mauvaise règle sélectionnée | Vérifier les wildcards |
| Wildcard ne marche pas | * pas en fin de path, ou + vs * | Revoir la syntaxe |
| KV v2 access denied | Path sans /data/ | Ajouter /data/ au path |
| Policy modifiée sans effet | Token émis avant modification | Les tokens gardent leurs policies d’émission |
Debug : voir les policies d’un token
Section intitulée « Debug : voir les policies d’un token »# Token actuelvault token lookup
# Token spécifiquevault token lookup <token>Debug : générer une policy depuis une commande
Section intitulée « Debug : générer une policy depuis une commande »vault kv get -output-policy secret/myappÀ retenir
Section intitulée « À retenir »- Deny by default : sans policy explicite, tout est refusé
- Priority matching : la règle la plus spécifique s’applique en premier
- Union conditionnelle : les capabilities se cumulent uniquement sur le même pattern dans plusieurs policies
- KV v2 paths :
secret/data/*,secret/metadata/*, etc. - Wildcards :
*(suffixe uniquement, fin de path),+(un segment) - Templates :
{{identity.entity.id}}— préférez les IDs aux noms denyprioritaire : toujours évalué en dernier, gagne toujours- Moindre privilège : séparez les rôles (build ≠ deploy, dev ≠ prod)