feat(iam): KeyRotation CRD and controller for credential rotation
Replace the dead secret-rotation scaffold (an Argo app that could not render, a CRD that was never installed, and no controller code) with a working design. One resource describes one credential: spec.provider zitadel-machine-key | zitadel-oidc-client spec.strategy overlap | atomic spec.target Secret to write, consumers to roll, reload hot|restart spec.verify introspection or token exchange The state machine is shared by every provider: Prepare -> Publish -> Verify -> Retire Order is the safety property. Retire runs only for an overlapping provider and only after the new credential obtained a token. A failure before that point leaves the working credential in place, which is exactly what went wrong by hand today when a regenerated Grafana secret was never re-pointed. Machine keys overlap in ZITADEL, so that provider rotates with no gap. Client secrets do not overlap, so that provider is atomic: it publishes, rolls the consumer, verifies, and restores the previous value from a shadow key if the introspection check fails. The controller authenticates with its own machine key, the single bootstrap credential, read from a mounted Secret. Everything else it creates itself, so no credential value needs to live in git. Verified: go build and go vet clean, 12 tests pass covering scheduling, the shadow key rollback path, provider strategies and assertion signing. Not yet wired to Argo CD: the image must be built and pushed first, so the app is not added until a Deployment can actually pull.
This commit was merged in pull request #79.
This commit is contained in:
@@ -1,32 +0,0 @@
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: secret-rotation
|
||||
namespace: argocd
|
||||
labels:
|
||||
app.kubernetes.io/name: secret-rotation
|
||||
spec:
|
||||
project: homelab
|
||||
|
||||
sources:
|
||||
- repoURL: https://forgejo.riotpiao.com/riotpiao-poimen/homelab.git
|
||||
path: k8s/apps/secret-rotation-controller
|
||||
targetRevision: main
|
||||
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: secret-rotation
|
||||
|
||||
syncPolicy:
|
||||
automated:
|
||||
prune: true
|
||||
selfHeal: true
|
||||
syncOptions:
|
||||
- CreateNamespace=true
|
||||
- RespectIgnoreDifferences=true
|
||||
retry:
|
||||
limit: 5
|
||||
backoff:
|
||||
duration: 5s
|
||||
factor: 2
|
||||
maxDuration: 3m
|
||||
Reference in New Issue
Block a user