HashiCorp Vault — Namespaces

2 minute read

Namespaces provide multi-tenancy in Vault Enterprise, giving each team or application an isolated Vault environment within a shared cluster.


Why Namespaces?

Without Namespaces With Namespaces
One flat path space Isolated path trees per tenant
Shared policies (naming conflicts) Per-namespace policies
Shared auth methods Per-namespace auth methods
Single admin manages all Delegated admin per namespace
Path-based isolation only True multi-tenancy

Namespace Architecture

root (/)
├── engineering/
│   ├── secret/           (KV for engineering)
│   ├── auth/approle/     (Engineering AppRoles)
│   ├── policies/         (Engineering policies)
│   ├── frontend/
│   │   ├── secret/       (Frontend team's secrets)
│   │   └── auth/         (Frontend auth)
│   └── backend/
│       ├── secret/       (Backend team's secrets)
│       └── auth/         (Backend auth)
├── finance/
│   ├── secret/
│   └── auth/ldap/        (Finance uses LDAP)
└── operations/
    ├── secret/
    └── pki/              (Ops manages certificates)

Manage Namespaces

# Create namespaces
vault namespace create engineering
vault namespace create engineering/frontend
vault namespace create engineering/backend
vault namespace create finance
vault namespace create operations

# List namespaces
vault namespace list

# Target a namespace
export VAULT_NAMESPACE=engineering
vault kv put secret/myapp key=value

# Or use the -namespace flag
vault kv put -namespace=engineering secret/myapp key=value

# Or use the header
curl -H "X-Vault-Namespace: engineering" \
    -H "X-Vault-Token: $VAULT_TOKEN" \
    "$VAULT_ADDR/v1/secret/data/myapp"

Per-Namespace Configuration

# Switch to engineering namespace
export VAULT_NAMESPACE=engineering

# Enable auth methods (isolated to this namespace)
vault auth enable approle
vault auth enable userpass

# Enable secrets engines
vault secrets enable -path=secret kv-v2
vault secrets enable database

# Create policies (namespace-scoped)
vault policy write dev - <<EOF
path "secret/data/*" {
  capabilities = ["read"]
}
EOF

Cross-Namespace Access

Root namespace admins can access child namespaces:

# From root namespace, read a child namespace secret
vault kv get -namespace=engineering secret/myapp

# Create a policy in root that grants cross-namespace access
vault policy write engineering-admin - <<EOF
path "engineering/*" {
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
EOF

Delegate Administration

# Create a namespace admin policy
vault policy write -namespace=engineering ns-admin - <<EOF
path "sys/*" {
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
path "auth/*" {
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
path "secret/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}
EOF

# Create an admin token for the namespace
vault token create -namespace=engineering \
    -policy=ns-admin -ttl=8h

Quick Reference

Command Description
vault namespace create NAME Create a namespace
vault namespace list List child namespaces
vault namespace delete NAME Delete a namespace
export VAULT_NAMESPACE=NAME Target a namespace
-namespace=NAME flag Per-command namespace

Note: Namespaces are a Vault Enterprise feature.


Next: Control Groups & MFA