feat(vault): getting secret with OIDC auth

This commit is contained in:
Masaki Yatsu
2025-08-15 14:34:00 +09:00
parent c2a0908453
commit 7f65f05b17

View File

@@ -4,28 +4,23 @@ export K8S_VAULT_NAMESPACE := env("K8S_VAULT_NAMESPACE", "vault")
export VAULT_CHART_VERSION := env("VAULT_CHART_VERSION", "0.29.1") export VAULT_CHART_VERSION := env("VAULT_CHART_VERSION", "0.29.1")
export VAULT_HOST := env("VAULT_HOST", "") export VAULT_HOST := env("VAULT_HOST", "")
export VAULT_ADDR := "https://" + VAULT_HOST export VAULT_ADDR := "https://" + VAULT_HOST
export VAULT_DEBUG := env("VAULT_DEBUG", "false")
SECRET_PATH := "secret" SECRET_PATH := "secret"
# Common vault environment setup script # Vault environment setup scripts
[private] [private]
_vault_env_setup := ''' _vault_root_env_setup := '''
if [ -z "${VAULT_ADDR:-}" ]; then
if [ -z "${VAULT_HOST:-}" ]; then
VAULT_HOST=$(gum input --prompt="Vault host: " --placeholder="vault.example.com" --width=100)
fi
export VAULT_ADDR="https://${VAULT_HOST}"
fi
if [ -z "${VAULT_TOKEN:-}" ]; then if [ -z "${VAULT_TOKEN:-}" ]; then
echo "" >&2 echo "" >&2
echo "💡 To avoid entering Vault token repeatedly:" >&2 echo "💡 To avoid entering Vault root token repeatedly:" >&2
echo " • Set environment variable: export VAULT_TOKEN=your_token" >&2 echo " • Set environment variable: export VAULT_TOKEN=your_root_token" >&2
echo " • or write it in .env.local file: VAULT_TOKEN=your_token" >&2 echo " • or write it in .env.local file: VAULT_TOKEN=your_root_token" >&2
echo " • Use 1Password reference: VAULT_TOKEN=op://vault/admin/token" >&2 echo " • Use 1Password reference: VAULT_TOKEN=op://vault/root/token" >&2
echo "" >&2 echo "" >&2
VAULT_TOKEN=$(gum input --prompt="Vault token: " --password --width=100) VAULT_TOKEN=$(gum input --prompt="Vault root token: " --password --width=100)
elif [[ "${VAULT_TOKEN}" == op://* ]]; then elif [[ "${VAULT_TOKEN}" == op://* ]]; then
if ! command -v op &> /dev/null; then if ! command -v op &>/dev/null; then
echo "Error: 1Password CLI (op) is not installed." >&2 echo "Error: 1Password CLI (op) is not installed." >&2
echo "" >&2 echo "" >&2
echo "To use 1Password secret references (op://...), please install the 1Password CLI:" >&2 echo "To use 1Password secret references (op://...), please install the 1Password CLI:" >&2
@@ -37,6 +32,22 @@ _vault_env_setup := '''
export VAULT_TOKEN export VAULT_TOKEN
''' '''
[private]
_vault_oidc_env_setup := '''
if [ -z "${VAULT_TOKEN:-}" ]; then
if [ "${VAULT_DEBUG}" = "true" ]; then
echo "" >&2
echo "💡 Authenticating with OIDC..." >&2
echo " • Browser will open for authentication" >&2
echo " • After login, token will be automatically set" >&2
echo "" >&2
fi
vault login -method=oidc &>/dev/null
VAULT_TOKEN=$(vault print token)
fi
export VAULT_TOKEN
'''
[private] [private]
default: default:
@just --list --unsorted --list-submodules @just --list --unsorted --list-submodules
@@ -177,17 +188,11 @@ setup-kubernetes-auth root_token='':
setup-oidc-auth: setup-oidc-auth:
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
{{ _vault_env_setup }} {{ _vault_root_env_setup }}
echo "Creating Keycloak client for Vault..." echo "Creating Keycloak client for Vault..."
# Delete existing client first to ensure clean state
echo "Removing existing 'vault' client if it exists..."
just keycloak::delete-client "${KEYCLOAK_REALM}" "vault" || true just keycloak::delete-client "${KEYCLOAK_REALM}" "vault" || true
oidc_client_secret=$(just utils::random-password)
# Use a fixed client secret
oidc_client_secret="vault-secret-$(date +%Y%m%d)"
redirect_urls="https://${VAULT_HOST}/ui/vault/auth/oidc/oidc/callback,http://localhost:8250/oidc/callback,http://localhost:8200/ui/vault/auth/oidc/oidc/callback" redirect_urls="https://${VAULT_HOST}/ui/vault/auth/oidc/oidc/callback,http://localhost:8250/oidc/callback,http://localhost:8200/ui/vault/auth/oidc/oidc/callback"
just keycloak::create-client "${KEYCLOAK_REALM}" "vault" "${redirect_urls}" "${oidc_client_secret}" just keycloak::create-client "${KEYCLOAK_REALM}" "vault" "${redirect_urls}" "${oidc_client_secret}"
echo "Using client secret: ${oidc_client_secret}" echo "Using client secret: ${oidc_client_secret}"
@@ -205,6 +210,15 @@ setup-oidc-auth:
oidc_client_id="vault" \ oidc_client_id="vault" \
oidc_client_secret="${oidc_client_secret}" \ oidc_client_secret="${oidc_client_secret}" \
default_role="default" default_role="default"
# Create default policy for secret access
vault policy write default - <<EOF
path "secret/data/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "secret/metadata/*" {
capabilities = ["list"]
}
EOF
# Create default role for all authenticated users # Create default role for all authenticated users
vault write auth/oidc/role/default \ vault write auth/oidc/role/default \
bound_audiences="vault" \ bound_audiences="vault" \
@@ -235,41 +249,35 @@ setup-oidc-auth:
disable-oidc-auth: disable-oidc-auth:
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
{{ _vault_env_setup }} {{ _vault_root_env_setup }}
vault auth disable oidc vault auth disable oidc
# Get key value # Get key value
get path field: get path field:
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
# Only run interactive setup if both VAULT_ADDR and VAULT_TOKEN are missing {{ _vault_oidc_env_setup }}
if [ -z "${VAULT_ADDR:-}" ] || [ -z "${VAULT_TOKEN:-}" ]; then
{{ _vault_env_setup }}
fi
vault kv get -mount=secret -field={{ field }} {{ path }} vault kv get -mount=secret -field={{ field }} {{ path }}
# Put key value # Put key value
put path *args: put path *args:
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
{{ _vault_env_setup }} {{ _vault_oidc_env_setup }}
vault kv put -mount=secret {{ path }} {{ args }} vault kv put -mount=secret {{ path }} {{ args }}
# Delete key value # Delete key value
delete path: delete path:
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
{{ _vault_env_setup }} {{ _vault_oidc_env_setup }}
vault kv delete -mount=secret {{ path }} vault kv delete -mount=secret {{ path }}
# Check if key exists (non-interactive if VAULT_ADDR and VAULT_TOKEN are set) # Check if key exists (non-interactive if VAULT_ADDR and VAULT_TOKEN are set)
exist path: exist path:
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
# Only run interactive setup if both VAULT_ADDR and VAULT_TOKEN are missing {{ _vault_oidc_env_setup }}
if [ -z "${VAULT_ADDR:-}" ] || [ -z "${VAULT_TOKEN:-}" ]; then
{{ _vault_env_setup }}
fi
vault kv get -mount=secret {{ path }} &>/dev/null vault kv get -mount=secret {{ path }} &>/dev/null
# Check the environment # Check the environment
@@ -286,8 +294,14 @@ check-env:
just env::set VAULT_HOST "${VAULT_HOST}" just env::set VAULT_HOST "${VAULT_HOST}"
fi fi
# Setup vault environment variables (for use by other justfiles) # Setup vault environment with root token (for initial configuration)
setup-env: setup-root-token:
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
{{ _vault_env_setup }} {{ _vault_root_env_setup }}
# Setup vault environment with OIDC token (for regular usage)
setup-token:
#!/bin/bash
set -euo pipefail
{{ _vault_oidc_env_setup }}