今すぐコードに署名します – Security Boulevard

ウィリアム・ウッドラフ

Sigstore は 2 週間前に、無料でエコシステムにとらわれないソフトウェア署名サービスの一般提供を発表しました。これにより、開発者はソフトウェア プロジェクトと依存関係に署名、検証、保護することができます。 Trail of Bits はこのプロジェクトに参加できることに非常に興奮しており、最初の SigstoreCon で私たちの仕事について話しました。

Sigstore について話す機会はすばらしいものですが、それだけにとどまりたくありません。 Sigstore は、ソフトウェア サプライ チェーンの管理とセキュリティの重要な要素となっているアクセス可能なソフトウェア署名に向けた重要かつ切望されているステップであると考えています。

ここでは、Trail of Bits が Sigstore エコシステムの全体的な成長に貢献してきた (そして今後も貢献し続ける!) 方法をいくつか紹介します。 ストラップイン!

サインストアとは正確には何ですか?

なじみのない人のために: Sigstore は Linux Foundation プロジェクトであり、大規模なテクノロジー企業や定評のある学術機関からの貢献により、すべての人にコード署名と検証を可能にするという単純な使命に焦点を当てています。

それを行う方法はもう少し複雑です。 Signstore は、次の 2 つのコア サービスで構成されています。

  • Fulcio は、許可された ID に対して有効期間が短い署名証明書を発行し、それらの証明書を Certificate Transparency ログにコミットするパブリック ルート認証局です。
  • Rekor は、署名付きアーティファクトの透明性とタイムスタンプ サービスであり、強力な整合性が保証されています。

Fulcio と Rekor を組み合わせることで、プログラマーは有効期間の短い署名証明書を作成し、それらの証明書を公にコミットし (攻撃者が有効な証明書を密かに取得することを困難にします)、それらの証明書に対してアーティファクトに署名し、結果の署名を公にコミットすることができます (繰り返しますが、密かに攻撃するのが難しくなります)。

この 2 つのサービスは、既存の検証スキームおよび機械と相互運用できるように、標準の形式とプロトコル (x509v3 および CT) を使用します。 このため、Sigstore はすでに既存のワークフローに取り込まれています。現在、gitsign を使用して、変更を加えることなく、Sigstore を使用して git コミットに署名できます。 git 自体!

Signstore が特別な理由は何ですか?

Sigstore は基本的に PKI エコシステムですが、短期間の署名証明書に特化しています。

しかし、Sigstore に特別なソースを与えているのは、 身元: Fulcio はルート CA ですが、 開発者またはマシンの ID. より正確には、Fulcio は証明書署名要求だけを通過させません。要求には、意図した ID を証明する OpenID Connect (OIDC) トークンを添付する必要があります。 その ID は署名証明書に組み込まれ、誰でもその証明書に対してその署名を確認できるようになります。

Fulcio が OIDC トークン (実際には単なる JSON Web トークン) を受け取ると、OIDC の .well-known ルックアップ プロトコル。 現在、少数のサービス (既知の高品質 IdP を使用) がサポートされています。

  • GitHub: ワークフロー アクションのマシン ID と同様に、個々の電子メール ID (GitHub アカウントに対応) を証明できます。
  • グーグルとマイクロソフト: 非サービス アカウントを含め、個々の電子メール ID がサポートされています。 つまり、Google または Microsoft のアカウントを持っている限り、その電子メールが Google または Microsoft によって管理されていなくても、リンクされている電子メールを証明できます。
  • Kubernetes: クラウドベースの Kubernetes インスタンス (例: AWS、Azure、および Google Cloud によって提供されるもの) は、クラスター ID を証明できます。

この ID ファーストのアプローチは、コード署名を一変させます。公開鍵の背後にある ID の信頼を手動で確立するのではなく (これは PGP ベースのコード署名の標準です)、検証者は信頼する公開 ID を取得し、単純に質問します。そのアイデンティティが使用したいアーティファクトに署名したかどうかの公開署名ログ。 最終的な結果: デフォルトで強力な暗号化プリミティブが使用され、脆弱なキー管理がなくなり (どちらの側でも)、壊れた信頼の網がなくなり、すべての署名者を正直に保つ公開アクセス可能な透明性ログが得られます。

このモデル さらに 「キーレス」署名などの強力な誤用防止技術を有効にします。ユーザーは、有効期間の長い署名キーを保持するのではなく、有効期間の短いキーを作成し、Fulcio にその証明書を要求し、すべての署名操作が完了したら破棄できます。 キーがメモリから離れることも、再利用されることもないため、キー盗難の脅威 (および爆発範囲) が大幅に減少します。

シグストアの使い方を教えてください。

要約すると、Sigstore の「ID ファースト」モデルは少し気が遠くなる可能性があります。 使用方法の例を次に示します。

まず、インストールします sigstore-python、Sigstore の公式 (および Trail of Bits が維持されています!) の Python 実装:

$ python -m pip install sigstore

インストールしたら、それを使用してローカル ファイルに署名できます (任意の言語の Python パッケージやディストリビューションなど、何にでも署名できます!)。

$ python -m sigstore sign README.md
Waiting for browser interaction...
Using ephemeral certificate:
-----BEGIN CERTIFICATE-----
MIICwTCCAkegAwIBAgIUZr4/MflYaUb/SSw0CgNj+qLZDhMwCgYIKoZIzj0EAwMw
NzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl
cm1lZGlhdGUwHhcNMjIxMDI4MTYzMjQzWhcNMjIxMDI4MTY0MjQzWjAAMHYwEAYH
KoZIzj0CAQYFK4EEACIDYgAEVBG9SWAO0pkbhrsKtDUN4Il5OK115yp+Ai5GiDYW
V1obpF1Ih+/NrtTDN+tdkop0T6Z8eotVjpnyrFpc4TbA6okIZ2eo6oFwRD3tn/mG
4BFPgm4O4Nvgih+f75M845c1o4IBSTCCAUUwDgYDVR0PAQH/BAQDAgeAMBMGA1Ud
JQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBRE3hH5uBNf4l/EDxedz0aNNAZX+zAf
BgNVHSMEGDAWgBTf0+nPViQRlvmo2OkoVaLGLhhkPzAjBgNVHREBAf8EGTAXgRV3
aWxsaWFtQHlvc3Nhcmlhbi5uZXQwLAYKKwYBBAGDvzABAQQeaHR0cHM6Ly9naXRo
dWIuY29tL2xvZ2luL29hdXRoMIGKBgorBgEEAdZ5AgQCBHwEegB4AHYACGCS8ChS
/2hF0dFrJ4ScRWcYrBY9wzjSbea8IgY2b3IAAAGEH3BI7gAABAMARzBFAiEAnrGB
RDQMHW26GT4H/nCvTBQ7RzBI3ix8rRewG6Bii10CIBnjNsSYBhNB77nNmAheoxxj
XQWJuQ4n2iQu9FB4AGeKMAoGCCqGSM49BAMDA2gAMGUCMQDaV/a8myBO5yKDBTvS
fM9ziqC1zOiDrXXg+k4lVg02idTHeukbUZTKsROzOsPSRfUCMCsp30CTXrJPBUfN
dCxmp44zCE7/yGkNCu+5waxPhOI7mXrfQ7FqzmZ0Z5cs9H/CiA==
-----END CERTIFICATE-----

Transparency log entry created at index: 6052228
Signature written to file README.md.sig
Certificate written to file README.md.crt

これはうまくいきます™. 舞台裏では、Signstore は次のとおりです。

    1. 新しいローカル一時キーペアの作成;

    2. インタラクティブな OAuth2 フローまたはアンビエント クレデンシャル検出を介して、OIDC ID トークンを取得します。

    3. Fulcio に証明書署名要求を送信し、OIDC トークンと一時キーペアの秘密半分の所有証明を組み合わせます。

    4. Fulcio から SCT、証明書、および中間チェーンを受け取り、3 つすべてを検証します。

    5. 秘密鍵を使用して、実際に入力に署名します。

    6. 署名、入力のハッシュ、および署名証明書を Rekor に発行します。

    7. 後で配布および検証するために、必要なすべての検証資料をローカルに保存します。

最終結果: 入力の場合 README.md、sigstore-python は README.md.crt (PEM エンコードされた) x509 署名証明書、および README.md.sig (base64 でエンコードされた) 署名を含みます。

その後、通常の x509 検査ツールを使用できます ( openssl x509) 証明書を検査し、その拡張機能に、署名した ID の Sigstore 固有のエントリが含まれていることを確認します。 証明書の拡張子のみに省略されます。

        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                Code Signing
            X509v3 Subject Key Identifier:
                96:96:0F:0F:FB:19:76:15:15:D8:82:BB:8A:04:07:14:E8:85:EA:DA
            X509v3 Authority Key Identifier:
                DF:D3:E9:CF:56:24:11:96:F9:A8:D8:E9:28:55:A2:C6:2E:18:64:3F
            X509v3 Subject Alternative Name: critical
                email:[email protected]
            1.3.6.1.4.1.57264.1.1:
                https://accounts.google.com
            CT Precertificate SCTs:
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 08:60:92:F0:28:52:FF:68:45:D1:D1:6B:27:84:9C:45:
                                67:18:AC:16:3D:C3:38:D2:6D:E6:BC:22:06:36:6F:72
                    Timestamp : Oct 28 16:44:57.279 2022 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:44:02:20:1E:FB:5C:97:4D:BB:EC:A2:51:14:9A:A7:
                                FC:EB:59:9B:10:AA:37:5F:13:E0:D0:D3:ED:4D:3D:36:
                                18:E1:53:38:02:20:5C:67:61:F4:2E:15:3D:25:14:79:
                                7F:94:F7:5F:A2:9D:2F:15:71:B9:15:29:AF:7A:9F:3D:
                                09:77:3B:C1:5E:68

もちろん、それは単なる人間の検査です。 に 実際に 署名アーティファクトに対してファイルを検証するには、sigstore verify を使用できます。

# this automatically discovers README.md.crt and README.md.sig
$ python -m sigstore verify 
    --cert-email [email protected] 
    --cert-oidc-issuer https://accounts.google.com 
    README.md
OK: README.md

繰り返しますが、これはうまくいきます™:

    1. 署名証明書 (README.md.crt) は Sigstore 証明書チェーンによって署名され、Fulcio ルート証明書にリンクされます。

    2. 証明書の SAN と発行者の拡張機能が、想定される ID (Google の IdP によって証明された私のメール アドレス) に対応していることを確認します。

    3. 署名 (README.md.sig) 署名証明書によって証明された公開鍵から生成された;

    4. 現在の検証資料と一致するレコードを Rekor で確認し、結果のレコードの Merkle 包含証明と Signed Entry Timestamp 署名を確認します。

    5. 最後に、証明書が有効な時点で署名が Rekor に統合されたことを確認します。

最後の 2 つの Rekor ステップは、Chainguard の優れた Rekor Web インターフェイスを介してより視覚化できます。

まとめると、これらのチェックは、私の電子メール ID を制御できる誰か (つまり、私) が特定の時間にアーティファクトに署名したという強力な証拠を提供します。 検証者は鍵素材を直接管理する必要があります!

輝かしい現在と未来

Sigstore が一般公開されたので、現在強力なコード署名モデルが不足しているエコシステムに Sigstore を統合する計画を加速できます。 これについては、すでに次のような進歩を遂げています。

  • CPython 自体は、独自の sigstore-python を使用して作成された Sigstore 署名付きでリリースされました。 まったく同じものを使用して、今日それらを確認できます sigstore verify 上のコマンド!
  • アーティファクトに署名し、リリースに署名を自動的に添付するための GitHub アクション。すべて GitHub アクションの組み込み OIDC プロバイダーを使用します!

とはいえ、やらなければならない作業はたくさんあります。

  • sigstore-python 1.0 の安定版リリースに到達するには、インポート可能な Python API の安定化に向けた作業を含め、多くの作業が必要です。
  • ユーザーが確実に理解できるようにするには、UX に関する重要な作業が必要です。 身元の署名を検証するときとまったく同じです。
  • 可用性と回復力に対する Sigstore プロジェクトの全体的なコミットメントの一環として、Sigstore のすべての独立したクライアント実装が合格することが期待される適合テスト スイートに取り組んでいます。 今後数か月で各実装に取り​​組み、CI システムへの統合を支援します。
  • Sigstore はすでに多くのエコシステムで成功裏に使用されていますが、私たち Trail of Bits は 特に PyPI での使用と、最終的には pip のようなパッケージ インストーラーでの使用に関心があります。 PyPI に Sigstore のサポートを提供するために、Python パッケージ コミュニティと積極的に協力しています。

全体として、Sigstore には信じられないほど明るい未来があると考えており、その一部であることを嬉しく思います。 私たちと同じように Sigstore に興奮している方は、ぜひご連絡ください。

*** これは、Trail of Bits によって作成された Trail of Bits ブログの Security Bloggers Network シンジケート ブログです。 元の投稿を読む: https://blog.trailofbits.com/2022/11/08/sigstore-code-signing-verification-software-supply-chain/

Leave a Comment

Your email address will not be published. Required fields are marked *