# Prerequisites – two Kubernetes Secrets must exist in the infra namespace: # # 1. vault-root-token # key: token → the Vault root token (created after `vault operator init`) # # 2. vault-oidc-credentials # key: clientSecret → the Keycloak client secret for the "vault" OIDC client # # This Job runs as an ArgoCD PostSync hook so it fires on every sync of the # raw-resources-infra application. Because selfHeal is enabled, ArgoCD will # re-sync (and re-run this Job) any time the Job resource is removed, which # effectively covers Vault restarts that trigger a pod replacement. # # What the Job configures (all operations are idempotent): # - Enables the OIDC auth method (if not already enabled) # - Writes the OIDC config pointing at Keycloak realm "lab" # - Writes the default OIDC role with groups_claim and redirect URIs # - Creates the "vault-admins" external identity group with the built-in "admin" policy # - Creates the group alias that maps the Keycloak group "vault-admins" # to the Vault external group via the OIDC mount accessor --- apiVersion: batch/v1 kind: Job metadata: name: vault-configure-permissions namespace: infra annotations: argocd.argoproj.io/hook: PostSync argocd.argoproj.io/hook-delete-policy: BeforeHookCreation spec: ttlSecondsAfterFinished: 600 backoffLimit: 5 template: spec: restartPolicy: OnFailure containers: - name: vault-configure image: hashicorp/vault:1.17.0 env: - name: VAULT_ADDR value: "http://vault.infra.svc.cluster.local:8200" - name: VAULT_TOKEN valueFrom: secretKeyRef: name: vault-root-token key: token - name: OIDC_CLIENT_SECRET valueFrom: secretKeyRef: name: vault-oidc-credentials key: clientSecret command: - /bin/sh - -c - | set -e # jq is not bundled in the Vault image – install it from Alpine repos apk add jq -q --no-progress # ── Wait for Vault to be unsealed ────────────────────────────────── echo ">>> Waiting for Vault to be unsealed..." until vault status 2>&1 | grep -q "Sealed.*false"; do echo " not ready yet, retrying in 5s..." sleep 5 done echo ">>> Vault is ready." # ── OIDC auth method ─────────────────────────────────────────────── if vault auth list | grep -q "^oidc/"; then echo ">>> OIDC auth already enabled." else vault auth enable oidc echo ">>> OIDC auth enabled." fi vault write auth/oidc/config \ oidc_discovery_url="https://keycloak.dvirlabs.com/realms/lab" \ oidc_client_id="vault" \ oidc_client_secret="${OIDC_CLIENT_SECRET}" \ default_role="default" echo ">>> OIDC config written." vault write auth/oidc/role/default \ user_claim="sub" \ groups_claim="groups" \ allowed_redirect_uris="https://vault.dvirlabs.com/ui/vault/auth/oidc/oidc/callback" \ allowed_redirect_uris="https://vault.dvirlabs.com/oidc/callback" \ bound_audiences="vault" \ ttl="8h" echo ">>> OIDC role/default written." # ── Resolve OIDC mount accessor ──────────────────────────────────── OIDC_ACCESSOR=$(vault auth list | awk '$1 == "oidc/" {print $3}') echo ">>> OIDC accessor: ${OIDC_ACCESSOR}" # ── vault-admins external group ──────────────────────────────────── if vault read identity/group/name/vault-admins > /dev/null 2>&1; then echo ">>> vault-admins group exists – ensuring policy=admin..." vault write identity/group/name/vault-admins \ type="external" \ policies="admin" else echo ">>> Creating vault-admins external group..." vault write identity/group \ name="vault-admins" \ type="external" \ policies="admin" fi GROUP_ID=$(vault read -field=id identity/group/name/vault-admins) echo ">>> vault-admins group id: ${GROUP_ID}" # ── Group alias: Keycloak "vault-admins" → Vault external group ──── # Walk existing aliases and look for one bound to this group + accessor EXISTING_ALIAS=$(vault list -format=json identity/group-alias/id 2>/dev/null \ | jq -r '.[]' \ | while read ALIAS_ID; do DATA=$(vault read -format=json "identity/group-alias/id/${ALIAS_ID}" 2>/dev/null) CID=$(echo "${DATA}" | jq -r '.data.canonical_id') ACC=$(echo "${DATA}" | jq -r '.data.mount_accessor') if [ "${CID}" = "${GROUP_ID}" ] && [ "${ACC}" = "${OIDC_ACCESSOR}" ]; then echo "${ALIAS_ID}" fi done | head -1) if [ -n "${EXISTING_ALIAS}" ]; then echo ">>> Group alias already exists (id=${EXISTING_ALIAS}), skipping." else vault write identity/group-alias \ name="vault-admins" \ canonical_id="${GROUP_ID}" \ mount_accessor="${OIDC_ACCESSOR}" echo ">>> Group alias created." fi echo "" echo ">>> Vault OIDC and permissions configuration complete."