titan-iac/services/vault/scripts/vault_oidc_configure.sh

111 lines
3.6 KiB
Bash
Raw Normal View History

2026-01-14 02:28:38 -03:00
#!/usr/bin/env sh
set -eu
2026-01-14 01:07:47 -03:00
log() { echo "[vault-oidc] $*"; }
status_json="$(vault status -format=json || true)"
2026-01-14 02:28:38 -03:00
if [ -z "${status_json}" ]; then
2026-01-14 01:07:47 -03:00
log "vault status failed; check VAULT_ADDR and VAULT_TOKEN"
exit 1
fi
2026-01-14 02:28:38 -03:00
if ! printf '%s' "${status_json}" | grep -q '"initialized":[[:space:]]*true'; then
2026-01-14 01:07:47 -03:00
log "vault not initialized; skipping"
exit 0
fi
2026-01-14 02:28:38 -03:00
if printf '%s' "${status_json}" | grep -q '"sealed":[[:space:]]*true'; then
2026-01-14 01:07:47 -03:00
log "vault sealed; skipping"
exit 0
fi
: "${VAULT_OIDC_DISCOVERY_URL:?set VAULT_OIDC_DISCOVERY_URL}"
: "${VAULT_OIDC_CLIENT_ID:?set VAULT_OIDC_CLIENT_ID}"
: "${VAULT_OIDC_CLIENT_SECRET:?set VAULT_OIDC_CLIENT_SECRET}"
2026-01-14 02:24:32 -03:00
default_role="${VAULT_OIDC_DEFAULT_ROLE:-admin}"
2026-01-14 01:07:47 -03:00
scopes="${VAULT_OIDC_SCOPES:-openid profile email groups}"
user_claim="${VAULT_OIDC_USER_CLAIM:-preferred_username}"
groups_claim="${VAULT_OIDC_GROUPS_CLAIM:-groups}"
redirect_uris="${VAULT_OIDC_REDIRECT_URIS:-https://secret.bstein.dev/ui/vault/auth/oidc/oidc/callback}"
bound_audiences="${VAULT_OIDC_BOUND_AUDIENCES:-${VAULT_OIDC_CLIENT_ID}}"
2026-01-14 02:24:32 -03:00
bound_claims_type="${VAULT_OIDC_BOUND_CLAIMS_TYPE:-string}"
admin_group="${VAULT_OIDC_ADMIN_GROUP:-admin}"
admin_policies="${VAULT_OIDC_ADMIN_POLICIES:-default,vault-admin}"
dev_group="${VAULT_OIDC_DEV_GROUP:-dev}"
dev_policies="${VAULT_OIDC_DEV_POLICIES:-default,dev-kv}"
user_group="${VAULT_OIDC_USER_GROUP:-${dev_group}}"
user_policies="${VAULT_OIDC_USER_POLICIES:-${VAULT_OIDC_TOKEN_POLICIES:-${dev_policies}}}"
2026-01-14 01:07:47 -03:00
if ! vault auth list -format=json | grep -q '"oidc/"'; then
log "enabling oidc auth method"
vault auth enable oidc
fi
log "configuring oidc auth"
vault write auth/oidc/config \
oidc_discovery_url="${VAULT_OIDC_DISCOVERY_URL}" \
oidc_client_id="${VAULT_OIDC_CLIENT_ID}" \
oidc_client_secret="${VAULT_OIDC_CLIENT_SECRET}" \
2026-01-14 02:24:32 -03:00
default_role="${default_role}"
2026-01-14 01:07:47 -03:00
vault auth tune -listing-visibility=unauth oidc >/dev/null
2026-01-14 02:24:32 -03:00
build_bound_claims() {
2026-01-14 02:28:38 -03:00
claim="$1"
groups="$2"
2026-01-14 02:24:32 -03:00
json="{\"${claim}\":["
2026-01-14 02:28:38 -03:00
first=1
old_ifs=$IFS
IFS=,
for item in $groups; do
item="$(printf '%s' "$item" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
if [ -z "${item}" ]; then
2026-01-14 02:24:32 -03:00
continue
fi
2026-01-14 02:28:38 -03:00
if [ "${first}" -eq 0 ]; then
json="${json},"
2026-01-14 02:24:32 -03:00
fi
2026-01-14 02:28:38 -03:00
json="${json}\"${item}\""
2026-01-14 02:24:32 -03:00
first=0
done
2026-01-14 02:28:38 -03:00
IFS=$old_ifs
json="${json}]}"
2026-01-14 02:24:32 -03:00
printf '%s' "${json}"
}
2026-01-14 01:07:47 -03:00
2026-01-14 02:24:32 -03:00
configure_role() {
2026-01-14 02:28:38 -03:00
role_name="$1"
role_groups="$2"
role_policies="$3"
if [ -z "${role_name}" ] || [ -z "${role_groups}" ] || [ -z "${role_policies}" ]; then
2026-01-14 02:24:32 -03:00
log "skipping role ${role_name} (missing groups or policies)"
return
fi
claims="$(build_bound_claims "${groups_claim}" "${role_groups}")"
2026-01-14 02:56:29 -03:00
claims_file="$(mktemp)"
printf '%s' "${claims}" > "${claims_file}"
2026-01-14 02:52:51 -03:00
scopes_csv="$(printf '%s' "${scopes}" | tr ' ' ',' | tr -s ',' | sed 's/^,//;s/,$//')"
2026-01-14 02:56:29 -03:00
role_args="user_claim=${user_claim} oidc_scopes=${scopes_csv} token_policies=${role_policies} bound_audiences=${bound_audiences} bound_claims=@${claims_file} bound_claims_type=${bound_claims_type}"
2026-01-14 02:28:38 -03:00
if [ -n "${groups_claim}" ]; then
role_args="${role_args} groups_claim=${groups_claim}"
2026-01-14 01:07:47 -03:00
fi
2026-01-14 02:28:38 -03:00
old_ifs=$IFS
IFS=,
for uri in $redirect_uris; do
trimmed="$(printf '%s' "$uri" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
if [ -n "${trimmed}" ]; then
role_args="${role_args} allowed_redirect_uris=${trimmed}"
2026-01-14 02:24:32 -03:00
fi
done
2026-01-14 02:28:38 -03:00
IFS=$old_ifs
2026-01-14 02:24:32 -03:00
log "configuring oidc role ${role_name}"
2026-01-14 02:28:38 -03:00
vault write "auth/oidc/role/${role_name}" ${role_args}
2026-01-14 02:56:29 -03:00
rm -f "${claims_file}"
2026-01-14 02:24:32 -03:00
}
2026-01-14 01:07:47 -03:00
2026-01-14 02:24:32 -03:00
configure_role "admin" "${admin_group}" "${admin_policies}"
configure_role "dev" "${dev_group}" "${dev_policies}"
configure_role "user" "${user_group}" "${user_policies}"