HashiCorp Vault — Lease Management
Every dynamic secret in Vault has a lease — a time contract that controls how long the credentials are valid. Understanding lease management is critical for operating Vault at scale.
Lease Anatomy
Lease Created ──────────── TTL ──────────── Expiry
│ │
│ renewable? ──▶ vault lease renew │
│ │ │
│ Extended TTL │
│ │ │
│ max_ttl ────┼──── Hard limit │
│ │ │
└────────────────────────┘ │
│
Vault revokes credentials
(drops DB user, deletes IAM user, etc.)
Lease Properties
| Property | Description |
|---|---|
lease_id |
Unique identifier (e.g., database/creds/readonly/abc123) |
lease_duration |
How long until expiry |
lease_renewable |
Whether the lease can be renewed |
ttl |
Current time-to-live |
max_ttl |
Absolute maximum lifetime |
Lookup a Lease
vault lease lookup database/creds/pg-readonly/abc123
Expected output:
Key Value
--- -----
expire_time 2024-01-15T18:30:00Z
id database/creds/pg-readonly/abc123
issue_time 2024-01-15T17:30:00Z
last_renewal <nil>
renewable true
ttl 55m30s
Renew a Lease
# Renew with default increment
vault lease renew database/creds/pg-readonly/abc123
# Renew with specific increment
vault lease renew -increment=2h database/creds/pg-readonly/abc123
Rules:
- Can only renew up to
max_ttlfrom the original issue time - Renewal resets the TTL counter
- Once
max_ttlis reached, the credential expires regardless
Issue Time: 10:00
TTL: 1h (expires 11:00)
Max TTL: 4h (hard limit: 14:00)
10:30 → renew -increment=1h → new expiry: 11:30 ✅
11:00 → renew -increment=2h → new expiry: 13:00 ✅
13:00 → renew -increment=2h → new expiry: 14:00 ✅ (capped at max_ttl)
14:00 → renew → DENIED (max_ttl reached, must get new credentials)
Revoke Leases
Revoke a Single Lease
vault lease revoke database/creds/pg-readonly/abc123
This immediately:
- Drops the database user
- Invalidates the credentials
- Removes the lease from Vault
Revoke by Prefix
# Revoke ALL leases for a specific role
vault lease revoke -prefix database/creds/pg-readonly
# Revoke ALL database leases
vault lease revoke -prefix database/creds
# Revoke ALL AWS leases
vault lease revoke -prefix aws/creds
⚠️ Prefix revocation is powerful and immediate. Use with care.
Force Revoke
If normal revocation fails (e.g., database is down):
vault lease revoke -force database/creds/pg-readonly/abc123
Force revoke removes the lease from Vault even if the target system can’t be reached. The credential may still work on the target system until it’s cleaned up manually.
List Active Leases
# List leases for a role
vault list sys/leases/lookup/database/creds/pg-readonly
# Count active leases
vault list -format=json sys/leases/lookup/database/creds/pg-readonly | jq '. | length'
# List all database leases
vault list sys/leases/lookup/database/creds
Lease Management via API
# Lookup
curl -s --header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{"lease_id": "database/creds/pg-readonly/abc123"}' \
"$VAULT_ADDR/v1/sys/leases/lookup" | jq
# Renew
curl -s --header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{"lease_id": "database/creds/pg-readonly/abc123", "increment": 3600}' \
"$VAULT_ADDR/v1/sys/leases/renew" | jq
# Revoke
curl -s --header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{"lease_id": "database/creds/pg-readonly/abc123"}' \
"$VAULT_ADDR/v1/sys/leases/revoke"
Lease Best Practices
| Practice | Reasoning |
|---|---|
| Set short default TTLs (1h) | Minimize exposure if credentials leak |
| Set reasonable max TTLs (8-24h) | Don’t allow indefinite renewals |
| Applications should renew proactively | Renew at 50-75% of TTL |
| Monitor lease counts | High lease counts impact Vault performance |
Use revoke -prefix for incident response |
Immediately invalidate all compromised credentials |
Quick Reference
| Command | Description |
|---|---|
vault lease lookup LEASE_ID |
Inspect a lease |
vault lease renew LEASE_ID |
Renew a lease |
vault lease renew -increment=2h LEASE_ID |
Renew with duration |
vault lease revoke LEASE_ID |
Revoke single lease |
vault lease revoke -prefix PREFIX |
Revoke all matching leases |
vault lease revoke -force LEASE_ID |
Force revoke |
vault list sys/leases/lookup/PREFIX |
List active leases |
Next: Practice Exercises