Enterprise Contract によるコンプライアンス管理
Enterprise Contract では、プロモートするコードのコンプライアンスをより適切に確認し、管理する方法を学ぶまた、会社の基準に合わせてサンプルポリシーをカスタマイズする。
概要
はじめに リンクのコピーリンクがクリップボードにコピーされました!
Enterprise Contract は、コンテナーイメージのビルドとテストに関するポリシーを定義および適用し、ソフトウェアサプライチェーンのセキュリティーを維持するためのポリシー駆動型ワークフローツールです。セキュアな CI/CD ワークフローを実現するには、問題を早期に検出するためのアーティファクト検証を組み込む必要があります。Enterprise Contract の役割は、コンテナーイメージが既知の信頼できるビルドシステムによって署名およびアテストされていることを検証することです。
第1章 Red Hat Trusted Application Pipeline の Enterprise Contract リンクのコピーリンクがクリップボードにコピーされました!
ソフトウェアサプライチェーンが複雑になるほど、ソフトウェアアーティファクトの整合性とソースコードの信頼性を保証するために、信頼性の高いチェックとベストプラクティスを採用することが重要になります。アーティファクトとは、たとえばイメージコンテナーです。このような背景から、Red Hat Trusted Application Pipeline のビルドおよびデプロイエクスペリエンスに、Red Hat Enterprise Contract が組み込まれました。
Enterprise Contract は、コンテナーイメージのビルドとテストに関するポリシーを定義および適用し、ソフトウェアサプライチェーンのセキュリティーを維持するためのポリシー駆動型ワークフローツールです。Supply-chain Levels for Software Artifacts (SLSA) の来歴アテステーションを作成するビルドシステム (Tekton Chains を使用した Tekton や SLSA GitHub Generator を使用した GitHub Actions など) では、署名をチェックし、アテステーションの内容が実際に期待どおりに一致することを確認することは、ソフトウェアサプライチェーンのインテグリティーを検証および維持する上で非常に重要です。セキュアな CI/CD ワークフローを実現するには、問題を早期に検出するためのアーティファクト検証を組み込む必要があります。Enterprise Contract の役割は、コンテナーイメージが既知の信頼できるビルドシステムによって署名およびアテストされていることを検証することです。
署名およびアテストされたコンテナーイメージを検証するための一般的な手順は次のとおりです。
- Red Hat Trusted Application Pipeline を使用してコンテナーイメージを作成またはコピーします。
- Cosign を使用して署名鍵を生成します。
- Cosign を使用してコンテナーイメージに署名します。
- Cosign を使用してイメージをアテストします。
- Enterprise Contract CLI を使用して、署名およびアテストしたコンテナーイメージを検証します。
しかし、コンテナーイメージのようなソフトウェアアーティファクトに 署名 して その来歴をアテスト するとは、どういうことでしょうか。ここでは、その理由と方法を説明します。
コンテナーイメージなどの署名済みのソフトウェアアーティファクトは、未署名のアーティファクトよりも、いくつかの攻撃ベクトルのリスクが大幅に低くなります。コンテナーイメージが署名されると、さまざまな暗号化技術によってイメージが特定のエンティティーまたは組織にバインドされます。その結果、イメージの信頼性を検証するデジタル署名が作成されるため、イメージの作成者 (エンティティーまたは組織) まで追跡できるようになります。また、署名後にイメージが変更または改ざんされていないことも検証できます。ソフトウェアサプライチェーンの脅威の詳細は、Supply chain threats を参照してください。
Enterprise Contract は、コンテナーイメージを検証するためのリソースライブラリーとして、業界標準の Sigstore Cosign を使用します。Red Hat Trusted Artifact Signer (Red Hat によってサポートされるバージョンの Sigstore フレームワーク) を使用すると、Sigstore サービスの独自のオンプレミスインスタンスを使用して、Cosign CLI でコンテナーイメージに署名およびアテストできます。RHTAS の詳細は、Red Hat Trusted Artifact Signer を参照してください。
ソフトウェアアーティファクトの アテステーション は、来歴がなければ実現できません。来歴 とは、コンテナーイメージなどのソフトウェアアーティファクトに関する検証可能な情報であり、そのアーティファクトがどこで、いつ、どのように作成されたかを説明したものです。アテステーション自体は、メタデータ形式の認証済みステートメントであり、アーティファクトが元のままであり信頼できることを証明するものです。Enterprise Contract は、そのようなアテステーションを使用して、ビルドが改ざんされていないことを暗号的に検証し、SLSA 要件などのポリシーセットに照らしてビルドをチェックします。SLSA の詳細は、About SLSA を参照してください。
ユーザーが RHTAP の開発名前空間からステージ名前空間に、またはステージ名前空間から実稼働名前空間にコードをプッシュすると、Enterprise Contract は検証チェックを自動的に実行し、コンテナーイメージが既知の信頼できるビルドシステムによって署名およびアテストされていることを確認します。イメージが Enterprise Contract チェックに合格すると、コードの変更をマージして、ある環境から次の環境へのプロモートを完了できます。アプリケーションを別の名前空間にデプロイする方法の詳細は、Trusted Application Pipeline Software Template を参照してください。RHTAP がデプロイメントマニフェストを保存する場所の詳細は、RHTAP GitOps リポジトリー とその YAML ファイルを参照してください。
第2章 Enterprise Contract コマンドラインのインストール リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- バージョン 4.13 以降の Red Hat OpenShift Container Platform 上で動作している Red Hat Trusted Artifact Signer インストール。
-
cosignおよびocバイナリーファイルがインストールされたワークステーション。 - OpenShift Web コンソールへのアクセス。
手順
OpenShift クラスターから
ecバイナリーファイルをダウンロードします。- OpenShift Web コンソールにログインします。ホームページから ? アイコンをクリックし、Command line tools を選択して、ec ダウンロードセクションに移動してから、お使いのプラットフォームへのリンクをクリックします。
ワークステーションでターミナルを開き、バイナリー
.gzファイルを展開して、実行ビットを設定します。例
gunzip ec-amd64.gz chmod +x ec-amd64
gunzip ec-amd64.gz chmod +x ec-amd64Copy to Clipboard Copied! Toggle word wrap Toggle overflow
バイナリーを
$PATH環境内の場所に移動し、名前を変更します。例
sudo mv ec-amd64 /usr/local/bin/ec
sudo mv ec-amd64 /usr/local/bin/ecCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
-
ec versionコマンドを実行します。実行すると、インストールした Enterprise Contract CLI のバージョンが表示されるはずです。
第3章 ポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
Enterprise Contract の ポリシー は、ルールまたはルールセットと、Enterprise Contract 固有のアノテーションです。Enterprise Contract は、いくつかの種類のポリシーチェックを実行できます。これには、Red Hat 製品に必要なポリシールール をすべてチェックすることが含まれます。Enterprise Contract は、Open Policy Agent (OPA) と呼ばれる汎用ポリシーエンジンを使用します。OPA は、Rego と呼ばれる独自の言語でポリシールールを定義します。そのため、Enterprise Contract のポリシーに含まれている OPA のポリシールールも、Rego で定義されています。
手順
次の例のように、新しいポリシールールを定義する Rego ファイルを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
METADATAコメントブロック (先頭にハッシュタグ (#) が付く最初の 10 行のコード) は、rego がルールアノテーションを指定する方法です。これにより、Enterprise Contract はこれらのアノテーションの詳細を成功と違反のレポートに含めることができます。rego のメタデータとアノテーションの詳細は、Metadata を参照してください。Enterprise Contract のポリシールールに含める必要があるアノテーションの詳細は、Rule annotations を参照してください。- 2
- この 1 つのポリシールールは、新しいポリシールールの
builder.idが、Supply-chain Levels for Software Artifacts (SLSA) の来歴のbuilder.idと一致することを確認します。 - 3
inputは、コンテナーイメージ、その署名、およびそのアテステーションに関するすべての情報が含まれる Rego オブジェクトです。inputオブジェクトのinput.attestations属性には、イメージに関連付けられたアテステーションのリストが含まれます。Enterprise Contract がinput.attestationsコンテンツを定義する場所と方法に関する詳細は、Policy Input を参照してください。
ヒントinputオブジェクトを JSON ファイルに保存して使用可能な値を表示できます。これは、新しいポリシールールを記述する際に役立ちます。inputオブジェクトをinput.jsonという名前の JSON ファイルとして保存するには、次の例のようなコマンドを実行します。ec validate image --public-key cosign.pub --image "$REPOSITORY:latest" --policy policy.yaml \ --output policy-input=input.jsonec validate image --public-key cosign.pub --image "$REPOSITORY:latest" --policy policy.yaml \ --output policy-input=input.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例のように、新しいポリシールールを使用するポリシー設定を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例のように、新しいポリシーを使用してコンテナーイメージを検証し、成功と違反のレポートに追加情報を表示します。
ec validate image --public-key cosign.pub --image "$REPOSITORY:latest" --policy policy.yaml \ --show-successes --info --output yamlec validate image --public-key cosign.pub --image "$REPOSITORY:latest" --policy policy.yaml \ --show-successes --info --output yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
-
成功と違反のレポートをチェックして、新しいルールが
successesリストに含まれていることを確認します。
3.1. ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
インライン JSON または YAML 文字列を使用して、Enterprise Contract ポリシーを設定できます。このポリシーは、config または contract とも呼ばれ、実行するポリシーを適用するために使用するルールとデータを Enterprise Contract で検索する場所を指定します。1 つのルールや特定のルールパッケージを追加または除外することもできます。
手順
次の例のように、コマンドラインでポリシーを JSON または YAML 文字列として設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow (オプション) 次の例のように、Enterprise Contract ポリシーから特定のルールパッケージを除外します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、指定したパッケージ内のルールを除く全パッケージの全ルールが追加されます。
(オプション) 次の例のように、1 つのルールを除外します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、
unacceptable_task_bundleルールを除くattestation_task_bundleパッケージのすべてのルールが追加されます。(オプション) 次の例のように、特定のパッケージのルールのみを追加します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、指定したパッケージのルールのみが追加されます。
(オプション) 特定パッケージの一部のルールのみを追加します。つまり、次の例のように、
includeとexcludeの両方を指定して、Enterprise Contract ポリシーに追加するルールのみを選択できます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- アスタリスク (*) はワイルドカードとして機能し、すべてのパッケージにマッチします。名前の一部にはマッチしないことに注意してください。たとえば、"s*" を指定して、"s" で始まるすべてのパッケージにマッチさせることはできません。
これらのコマンドにより、
attestation_task_bundleパッケージのunacceptable_task_bundleルール のみ を追加し、そのパッケージ内の他のルールをすべて除外することが指定されます。(オプション) 次の例のように、特定のチェックを除外して、そのチェックが失敗した場合や完了しなかった場合でも、Enterprise Contract がコンテナーイメージを検証できるようにします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドによって、特定のチェックのいずれかが失敗した場合や完了しなかった場合でも、Enterprise Contract がコンテナーイメージの検証を完了できるようになります。
(オプション)
config.policy.includeコマンドまたはconfig.policy.excludeコマンドのいずれかを文字列のリストとともに実行して、パッケージ内のルールのデフォルト設定を変更します。文字列のリストには、次のいずれかを含める必要があります。
- "パッケージ名" - Available rule collections リストからパッケージを選択します。
-
"ルール名" - パッケージ名とルールコードをドット (.) で区切って入力し、ルール名を指定します (例:
attestation_type.unknown_att_type)。ルールコードは、こちら の「Attestation type」で確認できます。 - "パッケージ名:項目" - ポリシールールの中には、項目のリストを処理するものもあります。"パッケージ名" 文字列に "項目" を付加すると、そのリストから特定の項目を除外または追加できます。これは "パッケージ名" と同様に機能しますが、その項目にマッチするパッケージ内のポリシールールにのみ適用される点が異なります。たとえば、テストパッケージを実行する場合は、特定のテストケースを無視して、他のすべてのテストケースを追加することができます。
- "ルール名:項目" - これは "パッケージ名:項目" と似ていますが、パッケージに 項目 を追加または除外する代わりに、特定のパッケージの ポリシールール を追加または除外できる点が異なります。
-
"@コレクション名" - 定義済みのルールのコレクションを指定するには、これを文字列に追加します。コレクション名の前に必ず
@記号を付けてください。こちら の利用可能なルールコレクションから選択します。
第4章 コンテナーイメージへの署名 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- OpenShift Web コンソールへのアクセス。
- バージョン 4.13 以降の OpenShift 上で実行中の動作している Red Hat Trusted Artifact Signer (RHTAS) インストール。
-
ec、cosign、ocバイナリーファイルがインストールされたワークステーション。
手順
OpenShift クラスターにログインします。
構文
oc login --token=TOKEN --server=SERVER_URL_AND_PORT例
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443注記コマンドラインログイントークンと URL を確認するには、OpenShift Web コンソール にログインします。ユーザー名をクリックし、Copy login command をクリックします。プロンプトが表示されたら、ユーザー名とパスワードを再度入力し、Display Token をクリックします。
RHTAS にログインします。コンテナーイメージに署名して検証するには、RHTAS シェル環境を必ず設定してください。以下に例を示します。
cd sigstore-ocp source tas-env-variables.sh
cd sigstore-ocp source tas-env-variables.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 環境変数を手動で設定する方法もあります。以下に例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例
source ./tas-env-vars.sh
$ source ./tas-env-vars.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
oc logoutコマンドを実行して、OpenShift クラスターからログアウトします。 -
署名およびアテストするコンテナーイメージを特定します (例:
IMAGE=quay.io/lucarval/rhtas-test@sha256:6b95efc134c2af3d45472c0a2f88e6085433df058cc210abb2bb061ac4d74359)。 -
パブリックの Sigstore デプロイメントではなく、Red Hat Trusted Artifact Signer を使用してコンテナーイメージに署名およびアテストすることを RHTAP に指定します。
cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.jsonコマンドを入力します。 次のコマンドを使用してコンテナーイメージに署名します。
cosign sign -y --fulcio-url=$FULCIO_URL --rekor-url=$REKOR_URL \ --oidc-issuer=$OIDC_ISSUER_URL $IMAGEcosign sign -y --fulcio-url=$FULCIO_URL --rekor-url=$REKOR_URL \ --oidc-issuer=$OIDC_ISSUER_URL $IMAGECopy to Clipboard Copied! Toggle word wrap Toggle overflow - プロンプトが表示されたら、RHTAS をインストールしたときに RHTAP によってインストールされた Keycloak インスタンスにログインします。これは、Keycloak がユーザーを認証できるようにするためです。
次のステップ
これでイメージが署名されました。これで、以下が可能になります。
- SLSA の来歴アテステーションを作成し、コンテナーイメージに関連付けます。
- Red Hat Enterprise Contract でコンテナーイメージを検証します。
4.1. コンテナーイメージに署名してアテストするための署名鍵の生成 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーイメージに署名してアテストするには、署名鍵が必要です。
前提条件
-
cosignバイナリーファイルがインストールされたワークステーション。
手順
-
CLI で、
cosign generate-key-pairコマンドを実行します。 - プロンプトが表示されたら、キーペアの新しいパスワードを入力します。パスワードは覚えやすく強力なものにしてください。
検証
これで、作業ディレクトリーに
cosign.pubとcosign.keyという 2 つの新しいファイルが作成されます。-
cosign.pubファイルには、公開署名鍵が含まれています。この鍵は、コンテナーイメージの検証が必要なコラボレーターと共有できます。 -
cosign.keyファイルは、コンテンツに署名するための秘密鍵です。イメージの署名およびアテステーションの責任者だけがcosign.keyファイルにアクセスできるようにしてください。
-
4.2. Enterprise Contract と Red Hat Trusted Artifact Signer によるコンテナーイメージ署名の検証 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Trusted Artifact Signer (RHTAS) サービスをインストールすると、ec バイナリーファイルを使用して、RHTAS サービスのキーレス署名フレームワークを使用するコンテナーイメージのアテステーションと署名を検証できます。RHTAS のインストールに関する詳細は、Operator Lifecycle Manager を使用した Red Hat Trusted Artifact Signer のインストール を参照してください。
前提条件
- バージョン 4.13 以降の OpenShift 上で実行中の動作している RHTAS インストール。
- OpenShift Web コンソールへのアクセス。
-
cosignおよびocバイナリーファイルがインストールされたワークステーション。
手順
OpenShift クラスターから
ecバイナリーファイルをダウンロードします。- OpenShift Web コンソール にログインします。ホームページから、右上の ? アイコンをクリックし、Command Line Tools を選択します。
- ec download セクションから、プラットフォームのリンクをクリックします。
ターミナルを開き、
.gzファイルを展開し、ecバイナリーファイルに実行ビットを設定します。Linux および macOS の例
-
$ gunzip ec-amd64.gz -
$ chmod +x ec-amd64
-
ecバイナリーファイルを$PATH環境内のディレクトリーに移動します。例
$ sudo mv ec-amd64 /usr/local/bin/ec
他のイメージ検証コマンドオプションをすべて確認するには、ec validate image --help コマンドを実行します。
コンテナーイメージの署名および検証用にシェル環境を設定します。
ターミナルを開き、
sigstore-ocpディレクトリーからtas-env-variables.shスクリプトを実行します。例
cd sigstore-ocp source tas-env-variables.sh
cd sigstore-ocp source tas-env-variables.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow (オプション) 環境変数を手動で設定します。
例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例
$ source ./tas-env-vars.sh
The Update Framework (TUF) システムを初期化します。
例
cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.jsonコンテナーイメージに署名します。
構文
cosign sign -y --fulcio-url=$FULCIO_URL --rekor-url=$REKOR_URL --oidc-issuer=$OIDC_ISSUER_URL IMAGE_NAME例
cosign sign -y --fulcio-url=$FULCIO_URL --rekor-url=$REKOR_URL --oidc-issuer=$OIDC_ISSUER_URL example-hello-world@sha256:2788a47fd0ef1ece30898c1e608050ea71036d3329b9772dbb3d1f69313f745c表示される Web ブラウザーで、メールアドレスを使用してコンテナーイメージに署名します。
predicate.jsonファイルを作成します。例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow predicate.jsonファイルをコンテナーイメージに関連付けます。構文
cosign attest -y --predicate ./predicate.json \ --type slsaprovenance IMAGE_NAME:TAG
cosign attest -y --predicate ./predicate.json \ --type slsaprovenance IMAGE_NAME:TAGCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例
cosign attest -y --predicate ./predicate.json \ --type slsaprovenance example.io/hello-world:latest
$ cosign attest -y --predicate ./predicate.json \ --type slsaprovenance example.io/hello-world:latestCopy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーイメージにアテステーションと署名が 1 つ以上含まれていることを確認します。
構文
cosign tree IMAGE_NAME:TAG例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Enterprise Contract でコンテナーイメージを検証します。
構文
ec validate image --image IMAGE_NAME:TAG \ --certificate-identity-regexp 'SIGNER_EMAIL_ADDR' \ --certificate-oidc-issuer-regexp 'keycloak-keycloak-system' \ --output yaml --show-successes
ec validate image --image IMAGE_NAME:TAG \ --certificate-identity-regexp 'SIGNER_EMAIL_ADDR' \ --certificate-oidc-issuer-regexp 'keycloak-keycloak-system' \ --output yaml --show-successesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Enterprise Contract は、セキュリティー違反の詳細を含む合格/不合格レポートを生成します。
--infoフラグを追加すると、違反に関する詳細と考えられる解決策がレポートに追加されます。
第5章 コンテナーイメージのアテストと検証 リンクのコピーリンクがクリップボードにコピーされました!
Enterprise Contract によって署名済みコンテナーイメージを検証する前に、まず SLSA 来歴を作成し、それをコンテナーイメージに関連付ける必要があります。来歴とは、サプライチェーン内の特定のソフトウェア "リンク" がどこで、いつ、どのように作成されたかなど、ソフトウェアアーティファクトに関する検証可能な情報です。Supply-chain Levels for Software Artifacts (SLSA) の来歴の詳細は、SLSA Provenance を参照してください。
前提条件
- 署名済みのコンテナーイメージ。
- OpenShift Web コンソールへのアクセス。
- バージョン 4.13 以降の OpenShift 上で実行中の動作している Red Hat Trusted Artifact Signer インストール。
-
cosignおよびocバイナリーファイルがインストールされたワークステーション。
手順
SLSA 来歴ファイル
predicate.jsonを作成します。以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 作成した
predicate.jsonファイルに署名してアテストします。以下に例を示します。cosign attest -y --fulcio-url=$FULCIO_URL \ --rekor-url=$REKOR_URL \ --oidc-issuer=$OIDC_ISSUER_URL \ --predicate predicate.json \ --type slsaprovenance $IMAGE
cosign attest -y --fulcio-url=$FULCIO_URL \ --rekor-url=$REKOR_URL \ --oidc-issuer=$OIDC_ISSUER_URL \ --predicate predicate.json \ --type slsaprovenance $IMAGECopy to Clipboard Copied! Toggle word wrap Toggle overflow Keycloak が開き、コンテナーイメージに署名したときのログインに基づいて自動的に認証されます。
Enterprise Contract を使用して署名とアテステーションを検証します。以下に例を示します。
ec validate image --image $IMAGE \ --certificate-identity-regexp '.*' \ --certificate-oidc-issuer-regexp '.*' \ --output yaml --show-successes
ec validate image --image $IMAGE \ --certificate-identity-regexp '.*' \ --certificate-oidc-issuer-regexp '.*' \ --output yaml --show-successesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
ec validate image コマンドを実行するときは、各署名が期待される identity と一致するように、できるだけ詳細に指定してください。
検証
- Enterprise Contract によってコンテナーイメージが検証され、Enterprise Contract のすべての検証と署名に関する詳細なレポートが開きます。