Skip to content

bakito/vault-unsealer

Repository files navigation

vault-unsealer

A kubernetes controller that can auto unseal vault pods.

Labels / Annotations

StatefulSet

Use the label vault-unsealer.bakito.net/stateful-set to unseal a kubernetes vault statefulset in the same namespace

Example:

  labels:
    vault-unsealer.bakito.net/stateful-set: vault

External

Use the label vault-unsealer.bakito.net/external flag a secret for usage to handle external vaults. The value specifies the seal check interval duration

Use the annotation vault-unsealer.bakito.net/external-source to define a vault where the unseal keys are stored

Use the annotation vault-unsealer.bakito.net/external-targets to define the vaults to be unsealed. The value is semicolon separated

  labels:
    vault-unsealer.bakito.net/external: '5m'
  annotations:
    vault-unsealer.bakito.net/external-source: https://vault.bakito.org:8200
    vault-unsealer.bakito.net/external-targets: https://vault-1.bakito.org:8200;https://vault-2.bakito.org:8200

Secrets

Secrets must use one of the labels or annotations described above.

With Keys in Secret

Unseal keys can directly be stored in a secret. The keys must have the prefix unsealKey.

apiVersion: v1
kind: Secret
metadata:
  labels:
    vault-unsealer.bakito.net/stateful-set: vault
  name: vault-unsealer-config
type: Opaque
data:
  unsealKey1: <...>
  unsealKey2: <...>
  unsealKey3: <...>
  unsealKey4: <...>
  unsealKey5: <...>

With Vault userpass

If the unseal keys are stored in vault itself, userpass access can be configured.

Key Description
username The username for vault userpass access.
password The password for vault userpass access.
mountPath The vault mount path. Optional.
secretPath The secret path within vault .
Do NOT add the /data path element as it is required by the vault cli or API.
apiVersion: v1
kind: Secret
metadata:
  labels:
    vault-unsealer.bakito.net/stateful-set: vault
  name: vault-unsealer-config-userpass
type: Opaque
data:
  username: <...>
  password: <...>
  mountPath:  <...>
  secretPath: <...>

Test

# Get Token
vault login -method=userpass username=<username>

# Read the secret (for kv version 2 '/data' must be added to the secret path,
# but only for the cli, not the unsealer secret)
vault read kv/data/unsealer

With Vault kubernetes service account

Another option to access unseal keys stored in vault is to use kubernetes auth, where the service account of the unsealer must be granted access to vault.

Key Description
role The role the kubernetes service account is assigned to.
mountPath The vault mount path. Optional.
secretPath The secret path within vault .
Do NOT add the /data path element as it is required by the vault cli or API.
apiVersion: v1
kind: Secret
metadata:
  labels:
    vault-unsealer.bakito.net/stateful-set: vault
  name: vault-unsealer-config-kubernetes
type: Opaque
data:
  role: <...>
  mountPath:  <...>
  secretPath: <...>

Test

# Get Token
vault write auth/kubernetes/login role=<role> jwt=<k8s-token>

# Login wit received vault token
vault login

# Read the secret (for kv version 2 '/data' must be added to the secret path,
# but only for the cli, not the unsealer secret)
vault read kv/data/unsealer

Required vault policy for userpass and kubernetes auth

# allow access to read the secret
path "path/to/your/unseal/secret" {
  capabilities = ["read"]
}
# allow access to read the mounts (used to check the kv version of the secret engine)
path "sys/mounts" {
  capabilities = ["read"]
}