秘密鍵とは?解説
秘密鍵は暗号鍵ペアの秘密の半分で、データへの署名やメッセージの復号に使われ、決して共有してはなりません。
秘密鍵は公開鍵暗号において最も機微なものです。あなたのアイデンティティを証明する秘密であり、世界があなたの公開鍵で検証するデータに署名でき、あなた宛てに暗号化されたメッセージを復号できます。秘密鍵が漏れると、それが提供するセキュリティは崩壊します。だからこそ秘密鍵を正しく扱うことは CI セキュリティの中心的な関心事です。
秘密鍵とは何か
秘密鍵は鍵ペアの半分で、公開鍵と数学的に結びついています。所有者によって秘密に保たれます。秘密鍵が署名したものは公開鍵が検証し、公開鍵が暗号化したものは秘密鍵だけが復号できます。そのセキュリティは秘密のままであることに完全に依存します。
秘密鍵がすること
主な仕事は 2 つ、署名と復号です。秘密鍵で署名すると誰もが検証できるデジタル署名が生成され、作者であることが証明されます。秘密鍵で復号すると、対応する公開鍵宛てに暗号化されたメッセージが開かれます。どちらも鍵が所有者の手だけに留まることに依存します。
なぜ決して漏れてはならないか
漏れた秘密鍵は誰でもその所有者になりすますことを許し、不正な artifact への署名、あなたとしての認証、あなたのトラフィックの復号を可能にします。漏れた鍵は最も損害の大きい CI セキュリティインシデントの 1 つであり、だからこそ鍵は secret として保存され、理想的には必要以上の時間ディスクに書き込まれません。
CI における秘密鍵
パイプラインが秘密鍵を使わなければならないとき、たとえばリリースに署名したり GitHub App として認証したりするとき、それはマスクされた secret として存在し、それを必要とするステップのためだけに実体化されます。現代のベストプラクティスは、長命な秘密鍵を完全に避け、代わりに短命な OIDC 資格情報や鍵なし署名を使うことです。
# Use a private key only for the step that needs it
steps:
- run: |
printf "%s" "${{ secrets.SIGNING_KEY }}" > k.pem
cosign sign-blob --key k.pem artifact.tar.gz
rm -f k.pemLatchkey に関する注記
Latchkey runner で使われる秘密鍵はマスクされた secret であり、runner の分離により各 job は後で破棄される新しい環境で実行されます。そのため、ディスクに書き込まれた鍵が後の無関係な job に持ち越されることはありません。
重要なポイント
- 秘密鍵は、データへの署名やメッセージの復号に使われる鍵ペアの秘密の半分です。
- 決して共有してはなりません。漏れた秘密鍵は攻撃者がその所有者になりすますことを許します。
- CI は秘密鍵をマスクされた secret として保存し、必要なときだけ実体化し、可能な限り短命な OIDC を優先します。