docs(design): evaluate Authorized Integrations against our static-PAT surface #312
Inga granskare
Etiketter
Inga etiketter
area/backups
area/ci
area/control-panel
area/identity
area/infra
area/observability
area/payments
area/security
area/storage
area/web
blocked
needs-info
needs-triage
ready-for-implementation
type
bug
type
chore
type
docs
type
epic
type
feature
type
task
wontfix
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Inget förfallodatum satt.
Beroenden
Inga beroenden satta
Referens
bitborg/bitborg-infra!312
Läser in…
Hänvisa till i nytt ärende
Ingen beskrivning angiven.
Ta bort grenen "docs/authorized-integrations-eval"
Borttagning av en gren är permanent. Även om den borttagna grenen kan fortsätta existera en kort tid innan den faktiskt tas bort, kan det INTE ångras i de flesta fall. Vill du fortsätta?
Closes #80.
The evaluation note is at
docs/design/authorized-integrations-jwt-eval.md, which is where this repoalready keeps non-ADR technical notes. Per the issue, no ADR was written (and ADRs live in
bitborg-docs anyway).
The issue's premise was wrong, and the note says so
The issue was filed from the v16.0 release announcement and asks whether "non-interactive service
accounts can use it". There is no consent screen and no per-use approval — v16 ships
forgejo admin user create-authorized-integration, the same shape as theforgejo admin user createour role already runs, and the owner declares a trust rule once; anything presenting a matching JWT
then authenticates unattended.
Protocol coverage was verified in the v16.0.1 router wiring rather than taken from prose:
/api/v1,git HTTP, LFS, and the container registry
/v2(where a basic-auth password is permitted specificallybecause
docker logincannot send a bearer). The local issuer works on our instance —/api/actions/.well-known/openid-configurationand/.well-known/keysboth return 200, RS256.Verdict: mostly no
deploy.ymlregistry push asgitborg-ci(write:package)ci.ymlmirror-pull login asgitborg-bot(read:package)The dividing line is not interactivity — that was the question the issue asked, and it turns out to be
the wrong one. It is whether the consumer runs inside Forgejo Actions and therefore gets an OIDC ID token
for free. Everything else is a systemd timer or host container with no issuer, and giving it one (Kanidm,
or our own signer) relocates the static secret rather than removing it, while adding a runtime
dependency to the auth path.
Two automation gaps the release announcement does not mention
token-auditscrape, and deletable only from the owning user's web UI or by SQL. For a no-login botaccount that resurrects the password-reset dance ADR 0024 was glad to be rid of.
Net effect on monitoring is negative: a JWT grant leaves our token-age monitoring entirely (last-used
lives in
authorized_integration.updated_unix, reachable only by SQL). A feature that removes along-lived secret but loses auditability is not automatically an improvement.
Rotation interaction
Proceed with the rotation work unchanged. Adoption would obviate only
REGISTRY_TOKENandREGISTRY_READ_TOKEN. All admin-scoped rotation stays.Four things that could not be determined, each with what would settle it
Stated as open questions rather than guessed: end-to-end registry acceptance of an Actions JWT; whether
the workflow identity claim is
workfloworworkflow_refand its exact value (needed so a claim ruledoes not silently allow more than intended); whether Kanidm can mint a single caller-chosen
aud; andwhether the ID-token signing
kidsurvives a Forgejo restart under our tmpfs config layout.Filed separately
[authorized_integration] ALLOWED_DOMAINS, which is unset and defaults to allowingevery domain — #313. That one is independent of adoption.
write:adminPAT that is invisible totoken-audit.