3 Commits
Author SHA1 Message Date
Scooby HuskyandClaude Sonnet 5 bb749b32b9 Fix VPS Vault OIDC login: missing redirect_uri + missing DNS
Two pre-existing gaps (not caused by this session's earlier work),
surfaced when the user started testing the VPS's standby Vault
(infrastructure/vps-standby/vault/) login via Authentik SSO:

1. VPS Vault's own auth/oidc/role/default allowed_redirect_uris only had
   vault.kube.huskypup.net (home) and localhost:8250 - never had
   vault.vps.huskypup.net registered, even though VPS's Vault shares the
   same Authentik OAuth2 provider/client_id as home's. Fixed on both
   sides: the shared blueprint (redirect_uris list) and VPS Vault's own
   role config directly (separate Vault instance/backend, needed its own
   write).

2. auth.kube.huskypup.net (Authentik itself) had NO public DNS record at
   all - it only ever resolved via UniFi's local DNS for home-LAN
   clients. Vault's OIDC backend runs server-side on the VPS and needs to
   fetch Authentik's discovery document directly - it silently returned
   an empty auth_url because it couldn't resolve the hostname at all
   ('missing auth_url' in Vault's UI, root cause only found by checking
   DNS resolution from inside the VPS's own vault pod). Added a public
   Cloudflare A record, same pattern as vault.kube.huskypup.net and
   pg-authentik.ha.huskypup.net earlier - user confirmed before adding,
   given it's Authentik itself. This likely also fixes OIDC for any other
   VPS-hosted app doing SSO against home's Authentik, not just Vault.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 20:33:22 -05:00
Scooby HuskyandClaude Sonnet 5 d9a4c16481 Move all 8 Authentik OIDC client_secrets out of plaintext git
Completes the 'make the repo proper' cleanup from earlier this session -
these were flagged but deliberately not touched in 185e9c2 given the
blast radius (live SSO for 8 apps). User confirmed: fix all 8 now.

infrastructure/authentik/{argocd,gitlab,nextcloud,grafana,n8n,guacamole,
rancher,vault}-blueprint.yaml: converted from plain ConfigMap (client_secret
hardcoded) to ExternalSecret with a templated blueprint body
(client_secret: "{{ .clientSecret }}") pulling from Vault. Chart already
supports mounting blueprints from Secrets (blueprints.secrets, alongside
blueprints.configMaps) - infrastructure/authentik/values.yaml updated to
route these 8 there instead.

For argocd/nextcloud/n8n/guacamole/rancher: Vault already had the matching
value at secret/<app>-oauth (the APP side was already Vault-backed via its
own ExternalSecret) - the blueprint was the only remaining plaintext copy.

For gitlab/grafana/vault: Vault had no copy at all yet - created
secret/{gitlab,grafana,vault}-oauth with the EXISTING live values (not
rotated - these are the actual working credentials right now, rotating
would break login until every consumer is updated in lockstep, which is
out of scope for a cleanup pass). Also fixed the OTHER plaintext copies
that existed for these three specifically:
  - apps/gitlab/manifests/external-secret-oidc.yaml (new): replaces a
    manually kubectl-created, never-git-tracked gitlab-oidc-secret.
  - infrastructure/grafana/manifests/grafana-oauth-secret.yaml: was a
    plain Secret whose own comment said 'hardcoded from blueprint'.
  - infrastructure/vault/manifests/vault-init-{configmap,job}.yaml: this
    one COULDN'T be converted to the same ExternalSecret-from-Vault
    pattern - it's the PostSync Job that grants ESO's own Kubernetes-auth
    role in Vault, so ESO can't yet authenticate to pull anything from
    Vault at the point this script runs (genuinely circular). Sourced
    from a new vault-oidc-bootstrap Secret instead - created once
    manually (kubectl, not git, matching how Vault's own root/unseal
    material is already handled), independent of the ESO pipeline.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 20:04:22 -05:00
Scooby Husky f98c997293 Vault OIDC login via Authentik: hostAlias + blueprint config
Vault's OIDC auth method needs to resolve auth.kube.huskypup.net (the
issuer URL) from inside its own pod - no in-cluster DNS entry exists for
that public hostname, so add a hostAlias pointing at the live
istio-ingressgateway LoadBalancer IP (verified current: 172.28.101.244).

authentik-blueprints-vault (vault-blueprint.yaml) was already applied to
the cluster and referenced by the authentik Deployment for some time -
committing it now so git matches the live, working state instead of
leaving it as an untracked local file.
2026-08-18 18:07:36 -05:00