第3章 ポリシーの作成
Enterprise Contract の ポリシー は、ルールまたはルールセットと、Enterprise Contract 固有のアノテーションです。Enterprise Contract は、いくつかの種類のポリシーチェックを実行できます。これには、Red Hat 製品に必要なポリシールール をすべてチェックすることが含まれます。Enterprise Contract は、Open Policy Agent (OPA) と呼ばれる汎用ポリシーエンジンを使用します。OPA は、Rego と呼ばれる独自の言語でポリシールールを定義します。そのため、Enterprise Contract のポリシーに含まれている OPA のポリシールールも、Rego で定義されています。
手順
次の例のように、新しいポリシールールを定義する Rego ファイルを作成します。
echo 'package zero_to_hero import future.keywords.contains import future.keywords.if import future.keywords.in # METADATA1 # title: Builder ID # description: Verify the SLSA Provenance has the builder.id set to # the expected value. # custom: # short_name: builder_id2 # failure_msg: The builder ID %q is not the expected %q # solution: >- # Ensure the correct build system was used to build the container # image. deny contains result if { some attestation in input.attestations3 attestation.statement.predicateType == "https://slsa.dev/provenance/v0.2" expected := "https://localhost/dummy-id" got := attestation.statement.predicate.builder.id expected != got result := { "code": "zero_to_hero.builder_id", "msg": sprintf("The builder ID %q is not expected, %q", [got, expected]) } } ' > rules.rego- 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.attestationsは、コンテナーイメージ、その署名、およびそのアテステーションに関するすべての情報が含まれる rego オブジェクトです。Enterprise Contract がinput.attestationsの内容をどこでどのように定義するかの詳細は、ポリシー入力 を参照してください。
ヒントinput.attestationsオブジェクトを JSON ファイルに保存すると、新しいポリシールールを指定するときにそのオブジェクトを借用できます。input.attestationsを JSON ファイルとして保存するには、次の例のようなコマンドを実行します。ec validate image --public-key cosign.pub --image "$REPOSITORY:latest" --policy policy.yaml \ --show-successes --info --output yaml次の例のように、新しいポリシールールを使用するポリシー設定を作成します。
echo " --- sources: - policy: - $(pwd)/rules.rego " > policy.yaml次の例のように、新しいポリシーを使用してコンテナーイメージを検証し、成功と違反のレポートに追加情報を表示します。
ec validate image --public-key cosign.pub --image "$REPOSITORY:latest" --policy policy.yaml \ --show-successes --info --output yaml
検証
-
成功と違反のレポートをチェックして、新しいルールが
successesリストに含まれていることを確認します。
3.1. ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
インライン JSON または YAML 文字列を使用して、Enterprise Contract ポリシーを設定できます。このポリシーは、config または contract とも呼ばれ、実行するポリシーを適用するために使用するルールとデータを Enterprise Contract で検索する場所を指定します。1 つのルールや特定のルールパッケージを追加または除外することもできます。
手順
次の例のように、コマンドラインでポリシーを JSON または YAML 文字列として設定します。
ec validate image --policy '{ "configuration": { "include": ["@minimal"] }, "sources": [ { "policy": ["oci::quay.io/enterprise-contract/ec-release-policy:latest"], "data": ["git::https://github.com/enterprise-contract/ec-policies//example/data"] } ] }' ...(オプション) 次の例のように、Enterprise Contract ポリシーから特定のルールパッケージを除外します。
exclude: - attestation_task_bundle - slsa_build_scripted_buildこのコマンドにより、指定したパッケージ内のルールを除く全パッケージの全ルールが追加されます。
(オプション) 次の例のように、1 つのルールを除外します。
exclude: - attestation_task_bundle.unacceptable_task_bundleこのコマンドにより、
unacceptable_task_bundleルールを除くattestation_task_bundleパッケージのすべてのルールが追加されます。(オプション) 次の例のように、特定のパッケージのルールのみを追加します。
include: - test - javaこのコマンドにより、指定したパッケージのルールのみが追加されます。
(オプション) 特定パッケージの一部のルールのみを追加します。つまり、次の例のように、
includeとexcludeの両方を指定して、Enterprise Contract ポリシーに追加するルールのみを選択できます。include: - "*"1 - attestation_task_bundle.unacceptable_task_bundle exclude: - attestation_task_bundle.*- 1
- アスタリスク (*) はワイルドカードとして機能し、すべてのパッケージにマッチします。名前の一部にはマッチしないことに注意してください。たとえば、"s*" を指定して、"s" で始まるすべてのパッケージにマッチさせることはできません。
これらのコマンドにより、
attestation_task_bundleパッケージのunacceptable_task_bundleルール のみ を追加し、そのパッケージ内の他のルールをすべて除外することが指定されます。(オプション) 次の例のように、特定のチェックを除外して、そのチェックが失敗した場合や完了しなかった場合でも、Enterprise Contract がコンテナーイメージを検証できるようにします。
exclude: - test:get-clair-scan - test:clamav-scanこのコマンドによって、特定のチェックのいずれかが失敗した場合や完了しなかった場合でも、Enterprise Contract がコンテナーイメージの検証を完了できるようになります。
(オプション)
config.policy.includeコマンドまたはconfig.policy.excludeコマンドのいずれかを文字列のリストとともに実行して、パッケージ内のルールのデフォルト設定を変更します。文字列のリストには、次のいずれかを含める必要があります。
- "パッケージ名" - Available rule collections リストからパッケージを選択します。
-
"ルール名" - パッケージ名とルールコードをドット (.) で区切って入力し、ルール名を指定します (例:
attestation_type.unknown_att_type)。ルールコードは、こちら の「Attestation type」で確認できます。 - "パッケージ名:項目" - ポリシールールの中には、項目のリストを処理するものもあります。"パッケージ名" 文字列に "項目" を付加すると、そのリストから特定の項目を除外または追加できます。これは "パッケージ名" と同様に機能しますが、その項目にマッチするパッケージ内のポリシールールにのみ適用される点が異なります。たとえば、テストパッケージを実行する場合は、特定のテストケースを無視して、他のすべてのテストケースを追加することができます。
- "ルール名:項目" - これは "パッケージ名:項目" と似ていますが、パッケージに 項目 を追加または除外する代わりに、特定のパッケージの ポリシールール を追加または除外できる点が異なります。
-
"@コレクション名" - 定義済みのルールのコレクションを指定するには、これを文字列に追加します。コレクション名の前に必ず
@記号を付けてください。こちら の利用可能なルールコレクションから選択します。