feat(vault): getting secret with OIDC auth
This commit is contained in:
@@ -4,26 +4,21 @@ 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
|
||||||
@@ -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 }}
|
||||||
|
|||||||
Reference in New Issue
Block a user