Files
management/docs/issues/0089-gitops-58-eigene-images-sind-unsigniert-beim-deploy-pru.md
Thore CimbalandClaude Opus 5 a1def8666e feat(issues): adopt the component trackers — one backlog, one numbering (ADR-0019)
ADR-0012 made docs/issues/ canonical for the management scope only and left
gitops, ThreadNet-Web and threadnet-call on GitLab "until the component adopts".
That split produced exactly what it invited: two numbering worlds where
management#20 and gitops#20 are different issues, drift nobody had to answer for
(gitops#61 carried no milestone since 2026-08-11), and component backlogs that
host sessions without lab access cannot read at all.

The 46 open component issues are now files 0056-0101. The file id is the
group-wide identifier; provenance lives in the frontmatter (new field `projekt`
plus gitlab_iid) and in the filename, so "gitops#61" still finds 0091. Bodies are
copied verbatim; comments and history stay on GitLab, as with the 2026-08-11
management import.

Both scripts learned the second dimension: spiegel_issues.py routes each file to
its origin project, reopens issues that are open in the repo but closed on the
board, and writes the new iid back after creating one; gruppenpruefung.py checks
drift across all four trackers instead of management alone. What the mirror
cannot decide stays a finding, not a silent state.

Two things needed a hand, both recorded in the files: gitops#61 had no milestone
(M1 - it is a live account-takeover path) and carried two area labels where the
schema holds one. The Gitea migration footers in the imported bodies point at
decommissioned trackers; their links are removed, the provenance sentence stays.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 12:00:00 +00:00

36 lines
2.2 KiB
Markdown

---
type: issue
id: "0089"
status: open
created: 2026-08-06
milestone: M5
priority: low
projekt: gitops
gitlab_iid: "58"
related: []
---
# Eigene Images sind unsigniert — beim Deploy prüft nichts die Herkunft
> Adoptiert aus [gitops#58](https://git.lab/axion1337.chat/axion1337.chat-gitops/-/issues/58) (2026-08-18, ADR-0019). Kommentare und Verlauf bleiben dort; kanonisch ist ab jetzt diese Datei.
Wir bauen eigene Images (`threadnet-web`, `clamav-http-scanner`, `desktop-build`) und schieben sie in die Gitea-Registry auf rohana. **Beim Deploy prüft nichts, ob das Image wirklich aus unserer CI stammt.** Kein cosign, keine Provenance, keine Admission-Prüfung. Der Tag ist die einzige Zusicherung — und ein Tag lässt sich überschreiben.
## Warum das hier konkreter ist als in vielen Setups
Der Weg ist lang und hat mehrere Stellen, an denen etwas eingeschleust werden könnte: git.lab baut → Push in die Gitea-Registry auf rohana → Flux zieht von dort → K3s startet es. Wer Schreibzugriff auf die Registry hat, kann einen Tag umbiegen, und im Cluster fällt es nicht auf.
Verwandt: gitops#16 (Pod Security Admission) — beides braucht am Ende einen Admission-Controller, das lässt sich in einem Zug denken.
## Was zu tun ist
1. In der CI nach dem Push mit **cosign** signieren (keyless über den GitLab-OIDC-Token, oder Schlüsselpaar als CI-Variable).
2. Im Cluster verifizieren — über einen Policy-Controller (Kyverno oder die Sigstore-Policy-Controller-Variante). Das ist der Teil mit der Arbeit.
3. ⚠️ **Reihenfolge beachten:** erst signieren und eine Weile mitlaufen lassen, dann erzwingen. Wer Verifikation aktiviert, bevor alle Images signiert sind, legt den Cluster still.
4. Fremd-Images (ESS-Chart, Authentik, Traefik) können nicht mit unserem Schlüssel signiert sein — die Richtlinie muss also nach Registry/Repository unterscheiden.
## Ehrliche Einordnung
`priority:low`. Das Risiko ist real, aber der Aufwand ist ein Policy-Controller plus Signaturkette, und der Angreifer bräuchte bereits Schreibzugriff auf unsere Registry. Andere Lücken aus derselben Bestandsaufnahme (Egress, Admin-MFA, Restore) kosten weniger und schützen mehr.
*Gefunden am 2026-08-06 bei einer Bestandsaufnahme der Sicherheitslage.*