Skip to content
Latchkey

秘密鍵とは?解説

秘密鍵は暗号鍵ペアの秘密の半分で、データへの署名やメッセージの復号に使われ、決して共有してはなりません。

秘密鍵は公開鍵暗号において最も機微なものです。あなたのアイデンティティを証明する秘密であり、世界があなたの公開鍵で検証するデータに署名でき、あなた宛てに暗号化されたメッセージを復号できます。秘密鍵が漏れると、それが提供するセキュリティは崩壊します。だからこそ秘密鍵を正しく扱うことは CI セキュリティの中心的な関心事です。

秘密鍵とは何か

秘密鍵は鍵ペアの半分で、公開鍵と数学的に結びついています。所有者によって秘密に保たれます。秘密鍵が署名したものは公開鍵が検証し、公開鍵が暗号化したものは秘密鍵だけが復号できます。そのセキュリティは秘密のままであることに完全に依存します。

秘密鍵がすること

主な仕事は 2 つ、署名と復号です。秘密鍵で署名すると誰もが検証できるデジタル署名が生成され、作者であることが証明されます。秘密鍵で復号すると、対応する公開鍵宛てに暗号化されたメッセージが開かれます。どちらも鍵が所有者の手だけに留まることに依存します。

なぜ決して漏れてはならないか

漏れた秘密鍵は誰でもその所有者になりすますことを許し、不正な artifact への署名、あなたとしての認証、あなたのトラフィックの復号を可能にします。漏れた鍵は最も損害の大きい CI セキュリティインシデントの 1 つであり、だからこそ鍵は secret として保存され、理想的には必要以上の時間ディスクに書き込まれません。

CI における秘密鍵

パイプラインが秘密鍵を使わなければならないとき、たとえばリリースに署名したり GitHub App として認証したりするとき、それはマスクされた secret として存在し、それを必要とするステップのためだけに実体化されます。現代のベストプラクティスは、長命な秘密鍵を完全に避け、代わりに短命な OIDC 資格情報や鍵なし署名を使うことです。

Scoping a private key to one step
# 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.pem

Latchkey に関する注記

Latchkey runner で使われる秘密鍵はマスクされた secret であり、runner の分離により各 job は後で破棄される新しい環境で実行されます。そのため、ディスクに書き込まれた鍵が後の無関係な job に持ち越されることはありません。

重要なポイント

  • 秘密鍵は、データへの署名やメッセージの復号に使われる鍵ペアの秘密の半分です。
  • 決して共有してはなりません。漏れた秘密鍵は攻撃者がその所有者になりすますことを許します。
  • CI は秘密鍵をマスクされた secret として保存し、必要なときだけ実体化し、可能な限り短命な OIDC を優先します。

関連ガイド