Enable zot registry auth + wire CI credentials #237

Merged
eblume merged 7 commits from wire-ci-registry-auth into main 2026-02-21 12:20:29 -08:00

7 commits

Author SHA1 Message Date
281ffb7c0c Update zot API key 1Password path and add rotation docs
- Fix op read path to use Forgejo Secrets item field zot-ci-api
  (was zot-ci-apikey/credential)
- Rewrite zot reference card security model for OIDC + API key auth
- Add API key rotation procedure with impersonation steps and op
  oneliner
- Document 90-day key expiry in wire-ci-registry-auth how-to

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:05:25 -08:00
20564db358 Remove deprecated extensions.apikey from zot config
The apikey extension was deprecated in zot v2.1.13 — API key
management is now configured under http.auth.apikey, which was
already set.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:08:25 -08:00
c66a155390 Map OIDC username to preferred_username claim
Zot defaults to using the email claim as username, but service accounts
in Authentik have no email set. Map to preferred_username instead, which
contains the actual username (e.g. "zot-ci").

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 10:36:24 -08:00
677ad56fed Fix trailing comma in zot config JSON
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 10:07:44 -08:00
5469f833a1 Enable zot apikey extension for key management UI
The auth.apikey flag enables *using* API keys but the extensions.apikey
section is needed for the UI to show login and key generation options.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 10:06:04 -08:00
8caa221bf9 Fix zot OIDC issuer URL: authentik.ops.eblu.me not sso.ops.eblu.me
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 09:48:02 -08:00
d7a10a9b1a Enable zot OIDC auth + accessControl, wire CI registry credentials
Enable authentication on the zot registry with OIDC (via Authentik) and
API key support. Add three-tier accessControl: anonymous read, CI create
(artifact-workloads group), admin full access.

Wire both CI push paths with registry credentials:
- Dagger publish() gains optional registry_password/username params
- Nix/skopeo path adds --dest-creds to skopeo copy

The ZOT_CI_API_KEY secret flows from 1Password through the existing
forgejo_actions_secrets ansible role to both runners.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 09:13:30 -08:00