vault
Configure Vault secret engines, policies, AppRole or Kubernetes authentication, and dynamic credential leases.
SKILL.mdskills/vault/SKILL.md
GitHubHashiCorp Vault Secrets AI Skill Guide (Claude)
Overview & Engine Architecture
Vault centralizes secrets, encryption (Transit), and dynamic credentials (DB, PKI, cloud) behind authentication and ACL policies. Clients authenticate → receive a token with lease TTL → access only allowed paths. HA depends on storage backend and unseal procedures (Shamir or auto-unseal)—agents document patterns but never invent production unseal keys.
┌─────────────────────────────────────────────────────────────┐
│ Vault request path │
│ │
│ Auth (K8s / AppRole / OIDC / cloud) │
│ ↓ token + policies │
│ Secret engines: KV v2, database, PKI, Transit │
│ ↓ leases / versions │
│ Audit devices → immutable log (no secret echo in chat) │
└─────────────────────────────────────────────────────────────┘
When to use / when not to
Use when
- Designing KV v2 path layouts, policies, AppRole for CI, Kubernetes auth for pods.
- Issuing dynamic DB credentials vs long-lived passwords in Git.
- Incident response: revoke leases/tokens after leak.
Do not use when
- Storing TLS certs for public websites only →
@lets-encryptmay suffice; Vault PKI for internal mesh. - Replacing full IAM for humans—Vault complements, rarely replaces cloud SSO for operators.
Operational Capabilities & Agent Directives
- Never paste root tokens, unseal keys, wrapped tokens, or secret payloads into chat/logs.
- KV v2 paths: use
secret/data/...for reads/writes;secret/metadata/...for policies; enable versioning; usecasfor concurrent writers. - Least privilege policies: narrow path prefixes; separate read vs admin; test with non-admin token.
- Dynamic secrets preferred over static KV for databases; always revoke leases on rotation/incident (
vault lease revoke -prefix). - Kubernetes auth gotcha: Vault calls TokenReview API—reviewer JWT needs
system:auth-delegator; short-lived reviewer tokens expiring breaks all logins. - Vault in-cluster: omit
token_reviewer_jwt, use local projected SA token with periodic reload (Vault ≥1.9.3); setdisable_local_ca_jwt=truewhen using client JWT as reviewer per docs. - AppRole: short
token_ttl, bindsecret_iddelivery out-of-band; rotate role IDs on compromise. - Audit devices early; protect audit sink integrity.
Production Example: policy + K8s auth role
Policy api-prod.hcl:
path "secret/data/api/prod" {
capabilities = ["read"]
}
path "secret/metadata/api/prod" {
capabilities = ["read", "list"]
}
path "database/creds/api-readonly" {
capabilities = ["read"]
}
Enable and configure (sketch):
vault secrets enable -path=secret kv-v2
vault policy write api-prod api-prod.hcl
vault auth enable kubernetes
vault write auth/kubernetes/config \
kubernetes_host="https://kubernetes.default.svc:443" \
disable_local_ca_jwt=true
vault write auth/kubernetes/role/api \
bound_service_account_names=api \
bound_service_account_namespaces=api \
token_policies=api-prod \
token_ttl=20m
ClusterRoleBinding for reviewer SA (when external Vault):
# vault-auth SA needs system:auth-delegator to call TokenReview
AppRole for CI (short TTL):
vault auth enable approle
vault write auth/approle/role/ci token_policies="api-prod" token_ttl=15m token_max_ttl=1h
Technical Troubleshooting Matrix
| Signature | Likely cause | Fix |
|---|---|---|
403 tokenreviews forbidden |
Reviewer SA lacks delegator | ClusterRoleBinding system:auth-delegator |
| All K8s logins fail after ~24h | Expired reviewer JWT | In-cluster Vault or rotate long-lived reviewer |
permission denied on path |
Policy typo / wrong mount | vault token capabilities with test token |
| Leaked approle secret_id | Credential theft | Rotate secret_id; revoke accessors |
| Sealed vault | Restart/unseal event | Operator unseal ceremony—agents don’t guess keys |
| DB creds still work after revoke | App cached password | Revoke lease + restart app |
Best Practices
- Namespaces (Enterprise) or strict path prefixes for team isolation in OSS.
- Break-glass root procedure documented offline; no root in Git.
- Prefer Transit for app-level crypto without exporting key material.
- Pair with
@kubernetesCSI/driver or external-secrets for pod injection. - Run rotation drills; measure time-to-revoke.
Limitations
- Vault outage is critical path—design HA, backups, and unseal custody.
- Mis-scoped policies are common; always validate with dedicated test tokens.
- Agents must stop and ask for seal status, namespace, and auth method before destructive revoke.
Related Skills
@kubernetes— service accounts, projected tokens, injectors@terraform— Vault provider resources (if used)@github-actions— AppRole/OIDC for CI secrets@mysql/@postgresql— dynamic DB engines
Agent Operational Directive
MANDATORY: Never output secret values or root/unseal material. Default to dynamic secrets and short TTLs. For Kubernetes auth, verify TokenReview permissions and reviewer JWT lifetime. On leak: revoke token/lease first, then rotate upstream credentials. Test policies with non-admin tokens before declaring least privilege done.