Sigstore
ソフトウェアアーティファクトの署名・検証を、長期保管する秘密鍵なしで行えるようにする OpenSSF のプロジェクト群。 #security #supply-chain-attack #signing
解こうとしている問題
従来のコード署名(GPGなど)は、秘密鍵を長期間安全に保管し、公開鍵を利用者に配布し、失効を管理する必要があった。この運用コストの高さが、OSSでの署名普及を阻んできた。Sigstoreの答えは「鍵ではなくアイデンティティに署名を紐づけ、鍵は数分で捨てる」というもの。
構成要素
- Cosign — OCIアーティファクト(コンテナイメージ)やファイルへの署名・検証を行うCLI。署名をレジストリ上にイメージと並べて格納する。
- Fulcio — 短命な証明書を発行する無料のCA。OIDCで認証されたアイデンティティ(GitHub Actionsのワークフロー識別子、Googleアカウントなど)と一時鍵を結びつけた証明書を発行する。有効期限は10分程度。
- Rekor — 署名の透明性ログ。誰がいつ何に署名したかが追記専用のログに記録され、後から監査できる。Certificate Transparencyのソフトウェア署名版と考えるとわかりやすい。
信頼の起点(Fulcioのルート証明書、Rekorの公開鍵)は TUF (The Update Framework) 経由で配布される。
keyless署名の流れ
- 署名者がOIDCで認証する(CIならワークロードアイデンティティ、人間ならブラウザ経由のOIDCフロー)
- その場で鍵ペアを生成し、Fulcioが「このアイデンティティがこの公開鍵を持つ」という短命証明書を発行
- その鍵でアーティファクトに署名し、署名・証明書をRekorに記録
- 秘密鍵を破棄する
秘密鍵の寿命が数分しかないので、盗まれても署名済み証明書の有効期限外では使えない。「その署名がいつ行われたか」の証明はRekorのログエントリが担う。
検証側から見ると
検証時に問うのは「この鍵の署名か」ではなく「このアイデンティティによる署名か」になる。
cosign verify \
--certificate-identity-regexp='https://github\.com/myorg/myrepo/\.github/workflows/.*' \
--certificate-oidc-issuer='https://token.actions.githubusercontent.com' \
ghcr.io/myorg/myimage:v1.0.0
「myorg/myrepo のGitHub Actionsワークフローがビルドしたイメージだけを受け入れる」というポリシーが、鍵を配布せずに書ける。
使われている場所
Chainguardのコンテナイメージ、Kubernetes本体のリリース、npm の provenance、SLSA provenance の署名など。Sigstoreは SLSA Build Level 2以上で要求される「署名されたprovenance」の実装手段としてよく使われる。