SigStoreとCoSignによる簡単な方法
署名のアーティファクトは、コードの整合性や開発者(著者)認証などの多くの明白な利点があります.しかし、それは何度も無視されます.そして、サプライチェーン攻撃のために熟しているソフトウェアをつくります.人々が彼らのコードに署名するのに悩まされることができない理由の1つは、PGPのような既存のツールが非常にユーザーフレンドリーでなくて、広範囲のセキュリティと/または暗号知識を必要とするということです.
SigStoreとそのおかげで、署名ソフトウェアは簡単です
Note :これは私の前の記事の「Handon - on」フォローアップです.
設定
何かに署名する前に、まずSIGHUBのコンポーネントのすべてのCLIツールが必要です
Dockerイメージを使用する場合は、次のようにします.
最後に
我々は、しかし、我々が相互作用するようにCLIをインストールしたいです
難しい道
すべてのツールを準備すると、我々は署名アーティファクトを開始することができます.カバーの下で何が起こっているかについてより良い理解を得るために、我々は最初にそれを行うことを試みます.
最初にアーティファクトが必要になります.このデモでは、“こんにちはWorld”のDocker画像を使用して以下を使用して作成されます
その後、我々は以前使用された秘密鍵を使用して認証するために使用したメールアドレスに署名します.署名の際に秘密鍵を所有していることを証明します.
最後に
また、との相互作用をスキップすることも
次に、レコードを透過ログにアップロードすることができます
残っているのは、コンテナーイメージと一緒に保存するレジストリに署名をアップロードすることです.
簡単な方法
「ハードウェイ」は本当にハードではありませんでしたが、提供されたツールを使うととても楽になります.
また、今のように指摘する価値もある
使用する他の方法もあります
キーレス
簡単な方法よりも簡単には、キーキーを使用している“キーレス”メソッドを使用して、あなた自身のキーを生成し、維持する必要はありません意味:
すべてを確かめる
私たちが可能な限りすべての方法でアーチファクトに署名した今、我々はまた、それを検証しようとする必要があります、さもなければ、何が最初の場所でそれを署名のポイントでしょうか?
最初にイメージダイジェストに署名する出力を「ハードウェイ」としましょう.そのために
次に、確認を使用して
閉鎖思考
この記事では、SigStoreを使ってコンテナイメージに署名するための基本的なユースケースとアプローチの概要と説明を試みました
また、さらに深く掘りたい場合は、チェックアウトすることができます"sigstore the hard way" , スクラッチのためのすべてを設定するガイドです
SigStoreとそのおかげで、署名ソフトウェアは簡単です
cosign
CLI!この記事ではcosign
その他のSIGHIGHTコンポーネントと連携して動作します.fulcio
and rekor
). さらに重要なことに、我々はどのようにコンテナーのイメージに署名するために使用する方法を学び、キーのない、両方の簡単な方法、我々は署名された署名と署名されたソフトウェアの整合性を確認するためにそれを使用する方法も.Note :これは私の前の記事の「Handon - on」フォローアップです.
設定
何かに署名する前に、まずSIGHUBのコンポーネントのすべてのCLIツールが必要です
cosign
, fulcio
and rekor
. 最初にcosign
- 私たちが実際に何かに署名する必要がある、バイナリとして、またはDocker画像としてインストールすることができます.最初のオプションの場合は、適切なバイナリをrelease page そしてどこかにあなたの$PATH
. さらに、セキュリティツールを扱うことを考えて、バイナリの信頼性と整合性を検証することをお勧めします.あなたは、リリースページに示されるコマンドを使用することができます.Dockerイメージを使用する場合は、次のようにします.
skopeo inspect docker://gcr.io/projectsigstore/cosign:v1.0.0
{
"Name": "gcr.io/projectsigstore/cosign",
"Digest": "sha256:5e88d8f6162c04da4fa7d63b032bac34d8c906b48e88057263d67b059ace7de4",
...
}
docker pull gcr.io/projectsigstore/cosign:v1.0.0
docker run --rm gcr.io/projectsigstore/cosign:v1.0.0
USAGE
cosign [flags] <subcommand>
...
2番目のコンポーネントfulcio
- 何かをインストールする必要はありませんfulcio
. 公共サービスは利用可能ですhttps://fulcio.sigstore.dev/api/v1 APIドキュメントが見つかります.here .最後に
rekor
とCLIrekor-cli
. と同じfulcio
, インストールする必要はありませんrekor
として利用可能https://rekor.sigstore.dev Swaggerの定義とともにhere .我々は、しかし、我々が相互作用するようにCLIをインストールしたいです
rekor
サーバ.バイナリはGithubrelease page . Linuxの場合は、次のようにします.wget -O rekor-cli https://github.com/sigstore/rekor/releases/download/v0.3.0/rekor-cli-linux-amd64
chmod +x rekor-cli
# Move it into $PATH directory...
./rekor-cli
Rekor command line interface tool
Usage:
rekor [command]
...
そして再びcosign
, 使用しているバイナリに注意してください.したがって、確認する必要がありますrekor-cli
プロセスを概説しているバイナリhere .難しい道
すべてのツールを準備すると、我々は署名アーティファクトを開始することができます.カバーの下で何が起こっているかについてより良い理解を得るために、我々は最初にそれを行うことを試みます.
最初にアーティファクトが必要になります.このデモでは、“こんにちはWorld”のDocker画像を使用して以下を使用して作成されます
Dockerfile
:FROM alpine:3.14
ENTRYPOINT ["echo", "Hello sigstore"]
しかし、画像自体に署名できません.代わりにダイジェストに署名します.# Generate artifact
docker build -t dockerhub-username/sigstore-hello .
# Generate artifact digest for signing
cosign generate martinheinz/sigstore-hello > artifact
次にダイジェストに署名するために、一時的なキーペアが必要です.私たちはcosign
これのためのコマンドですが、これが「ハードウェイ」であると考えて、使用しましょうopenssl
直接:openssl ecparam -genkey -name prime256v1 > ec_private.pem # Create keypair, same as `cosign generate-key-pair`
openssl ec -in ec_private.pem -pubout > ec_public.pem # Extract public key, same as `cosign public-key`
今、我々はそれに署名する準備ができています、そして、我々がそれにいる間、我々は署名を確かめることもできます:# Sign artifact digest, same as `cosign sign`
openssl dgst -sha256 -sign ec_private.pem artifact > artifact.sig
# Verify using public key
openssl dgst -sha256 -verify ec_public.pem -signature artifact.sig artifact
Verified OK
我々が秘密鍵でアーティファクトにサインした今、我々は我々が本当にそれをしたものであるという証明を持ちたいです.このためにコード署名証明書が必要ですfulcio
. それを得るために、我々はIDトークンを得るためにOIDCプロバイダーで認証しなければなりませんfulcio
.その後、我々は以前使用された秘密鍵を使用して認証するために使用したメールアドレスに署名します.署名の際に秘密鍵を所有していることを証明します.
最後に
fulcio
コード署名証明書には、認証の形式としてIDトークンを与え、署名されたメールアドレスと公開キーを指定します.# ... Get token from OIDC provider
# ... Store ID token in `id_token` file
# Sign email address (to prove possession of private key)
echo "[email protected]" > email
openssl dgst -sha256 -sign ec_private.pem email > email.sig
# Submit token, public key and signed email to fulcio
curl -X POST "https://fulcio.sigstore.dev/api/v1/signingCert" \
-H "Authorization: Bearer $(cat id_token)" \
-H "accept: application/pem-certificate-chain" \
-H "Content-Type: application/json" -d \
{
"publicKey": {
"content": "$(base64 ec_public.pem)",
"algorithm": "ecdsa"
},
"signedEmailAddress": "$(base64 email.sig)"
}
この「ハードウェイ」アプローチの1つの問題は、IDトークンの認証と検索をシミュレートするのが実際に不可能であるということです.したがって、上記のスニペットでは、このステップは省略されます、そして、我々は直接すべてを提出するためにスキップしますfulcio
.また、との相互作用をスキップすることも
fulcio
完全に、代わりに公開鍵を使用します.このアプローチはhttps://github.com/sigstore/rekor/blob/main/types.md#pkixx509 .次に、レコードを透過ログにアップロードすることができます
rekor
). ここでは、我々の公開鍵と署名証明書との両方のオプションを示しますfulcio
. 証明書の使用fulcio
, キーを削除することもできます.# Delete keypair (if using signing certificate from fulcio)
rm -rf ec_private.pem ec_public.pem
rekor-cli upload --artifact artifact --signature artifact.sig --public-key=ec_public.pem --pki-format=x509 # With our public key
...
rekor-cli upload --artifact artifact --signatire artifact.sig --public-key sigingCertChain.pem --pki-format x509 # With cert from fulcio
Created entry at index 33612, available at: https://rekor.sigstore.dev/api/v1/log/entries/2f77b399fd8a162f44c75c596fb0e5917ed2f314348e135874fae9e14eff69e3
# Inspect entry
curl https://rekor.sigstore.dev/api/v1/log/entries/2f77b399fd8a162f44c75c596fb0e5917ed2f314348e135874fae9e14eff69e3 | jq .
...
rekor-cli get --uuid=2f77b399fd8a162f44c75c596fb0e5917ed2f314348e135874fae9e14eff69e3
...
アップロードに加えて、我々はまた、透明性ログでレコードの存在を確認することができます.上記のスニペットは両方を使用するrekor-cli
and curl
パブリックAPIに直接アクセスするには.残っているのは、コンテナーイメージと一緒に保存するレジストリに署名をアップロードすることです.
# Upload to Docker Hub
cosign upload blob -f artifact.sig index.docker.io/martinheinz/sigstore-hello:new-signature.sig
Uploading file from [artifact.sig] to [index.docker.io/martinheinz/sigstore-hello:new-signature.sig] with media type [application/octet-stream]
File [artifact.sig] is available directly at [index.docker.io/v2/martinheinz/sigstore-hello/blobs/sha256:5491a7ff9960236b4f0bc7311fc8dba8e1b9fadfef7f704ec54eddaac1977ecb]
Uploaded image to:
index.docker.io/martinheinz/sigstore-hello@sha256:4c2f015295318a35b6096d6a971e42e5b5afb237dfc4fdf44364502a2e7064a1
それです.我々は我々のイメージに署名して、透明性ログにそれの記録を加えました.このアプローチは動作するでしょうが、誰もおそらく日常的にこれをしたくないので、適切なツールがどのようにこれを簡単にすることができるか見てみましょう.簡単な方法
「ハードウェイ」は本当にハードではありませんでしたが、提供されたツールを使うととても楽になります.
cosign generate-key-pair
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub
# We already uploaded signature in previous step so upload is set to false here
cosign sign -key cosign.key --upload=false martinheinz/sigstore-hello > file.sig
Enter password for private key:
...
# You can later upload the signature
cosign attach signature -signature file.sig martinheinz/sigstore-hello
必要なのは、キーペアを生成し、アーティファクトに署名することです.署名するとcosign
自動的に画像が位置するレジストリに署名をアップロードします.上の例では、署名をアップロードしないで、ファイルに保存しています.我々が後でとにかくそれをアップロードすることに決めたならば、我々はそれをすることができますcosign attach
このように.また、今のように指摘する価値もある
cosign
バージョン1.0
), 上記のスニペットは、データをアップロードしませんrekor
透明性ログは、動作するように、我々は設定する必要がありますCOSIGN_EXPERIMENTAL=1
, 例えばCOSIGN_EXPERIMENTAL=1 cosign sign -key cosign.key ...
.使用する他の方法もあります
cosign
あなたのユースケースとワークフローに応じてアーティファクトに署名する.これらを詳細に説明しますusage page Githubで.キーレス
簡単な方法よりも簡単には、キーキーを使用している“キーレス”メソッドを使用して、あなた自身のキーを生成し、維持する必要はありません意味:
COSIGN_EXPERIMENTAL=1 cosign sign \
-oidc-issuer "https://oauth2.sigstore.dev/auth" \
-fulcio-url "https://fulcio.sigstore.dev" \
-rekor-url "https://rekor.sigstore.dev" \
docker.io/martinheinz/sigstore-hello:latest
Generating ephemeral keys...
Retrieving signed certificate...
Your browser will now be opened to:
https://oauth2.sigstore.dev/auth/auth?access_type=online&client_id=sigstore&code_challenge=...
tlog entry created with index: 33692
Pushing signature to: index.docker.io/martinheinz/sigstore-hello:sha256-af5909c54fe66d03dda41e93ca5db3f277bfc827b9758d8cfa9a5d8d60d85491.sig
私たちがする必要があるのはcosign sign
with COSIGN_EXPERIMENTAL
設定する1
同時に、一方を省略する-key
引数.上記の例ではOIDCプロバイダーのエンドポイントも指定しました.fulcio
サーバとrekor
サーバ-これらはSIGStoreによって提供される公共の良いサービスのデフォルト値です.したがって、それらは省略することができますが、明快のためにここに示されて、どのサービスが使用されているかをハイライトするために示されます.また、ファイアウォールの背後にあるすべてを実行したい場合は、独自のインスタンスで置き換えることができます.すべてを確かめる
私たちが可能な限りすべての方法でアーチファクトに署名した今、我々はまた、それを検証しようとする必要があります、さもなければ、何が最初の場所でそれを署名のポイントでしょうか?
最初にイメージダイジェストに署名する出力を「ハードウェイ」としましょう.そのために
rekor-cli
:rekor-cli verify --artifact artifact --signature artifact.sig --public-key ec_public.pem --pki-format x509
rekor-cli verify --artifact artifact --signature artifact.sig --public-key sigingCertChain.pem --pki-format x509
ここでは2つのケースがあります.一方、我々が署名しているcertを使用するならばfulcio
公開鍵の代わりに使用します.次に、確認を使用して
cosign
キーの基本的な署名に適しています.私たちがする必要があるのはcosign verify
キーと画像のURLを指定するcosign verify -key cosign.pub docker.io/martinheinz/sigstore-hello:latest | jq .
最後に、キーレスメソッドでは、基本的に上記と同じことができますが、実験フラグを追加する必要があります.COSIGN_EXPERIMENTAL=1 cosign verify docker.io/martinheinz/sigstore-hello:latest
Verification for docker.io/martinheinz/sigstore-hello:latest --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- Existence of the claims in the transparency log was verified offline
- Any certificates were verified against the Fulcio roots.
...
閉鎖思考
この記事では、SigStoreを使ってコンテナイメージに署名するための基本的なユースケースとアプローチの概要と説明を試みました
cosign
. しかし、より多くのオプションと機能がありますcosign
ハードウェアトークンや署名を使用して他の種類のアーティファクトとの作業など、あなたに役立つかもしれませんgit
コミットので、私はあなたがツールを混乱させることを奨励し、他のあなたがそれを使用することができます参照してください.これらのオプションの多くは非常によく書かれた使用法ドキュメントで説明されますhere , だからあまりにもチェックアウトしてください.また、さらに深く掘りたい場合は、チェックアウトすることができます"sigstore the hard way" , スクラッチのためのすべてを設定するガイドです
fulcio
CAとrekor
透過ログサーバー.Reference
この問題について(SigStoreとCoSignによる簡単な方法), 我々は、より多くの情報をここで見つけました https://dev.to/martinheinz/signing-software-the-easy-way-with-sigstore-and-cosign-kdeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol