第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 # METADATA 1 # title: Builder ID # description: Verify the SLSA Provenance has the builder.id set to # the expected value. # custom: # short_name: builder_id 2 # 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.attestations 3 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
は、コンテナーイメージ、その署名、およびそのアテステーションに関するすべての情報が含まれる 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.json
次の例のように、新しいポリシールールを使用するポリシー設定を作成します。
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
リストに含まれていることを確認します。
関連情報
- Enterprise Contract の便利なポリシールールのセットは、ec-policies GitHub リポジトリーを参照してください。
- OPA と Rego の詳細は、OPA の Policy Language コンテンツを参照してください。
- SLSA の来歴の詳細は、SLSA Provenance を参照してください。
3.1. ポリシーの設定
インライン JSON または YAML 文字列を使用して、Enterprise Contract ポリシーを設定できます。このポリシーは、config または contract とも呼ばれ、実行するポリシーを適用するために使用するルールとデータを Enterprise Contract で検索する場所を指定します。1 つのルールや特定のルールパッケージを追加または除外することもできます。
手順
次の例のように、コマンドラインでポリシーを JSON または YAML 文字列として設定します。
ec validate image --policy '{ "sources": [ { "policy": ["oci::quay.io/enterprise-contract/ec-release-policy:latest"], "data": ["git::https://github.com/enterprise-contract/ec-policies//example/data"], "config": {"include": ["@minimal"]} } ] }' ...
(オプション) 次の例のように、Enterprise Contract ポリシーから特定のルールパッケージを除外します。
{ "sources": [ { "policy": [ "oci::quay.io/enterprise-contract/ec-release-policy:latest" ], "data": [ "git::https://github.com/enterprise-contract/ec-policies//example/data" ], "config": { "exclude": [ "attestation_task_bundle", "slsa_build_scripted_build" ] } } ] }
このコマンドにより、指定したパッケージ内のルールを除く全パッケージの全ルールが追加されます。
(オプション) 次の例のように、1 つのルールを除外します。
{ "sources": [ { "policy": [ "oci::quay.io/enterprise-contract/ec-release-policy:latest" ], "data": [ "git::https://github.com/enterprise-contract/ec-policies//example/data" ], "config": { "exclude": [ "attestation_task_bundle.unacceptable_task_bundle" ] } } ] }
このコマンドにより、
unacceptable_task_bundle
ルールを除くattestation_task_bundle
パッケージのすべてのルールが追加されます。(オプション) 次の例のように、特定のパッケージのルールのみを追加します。
{ "sources": [ { "policy": [ "oci::quay.io/enterprise-contract/ec-release-policy:latest" ], "data": [ "git::https://github.com/enterprise-contract/ec-policies//example/data" ], "config": { "include": [ "test", "java" ] } } ] }
このコマンドにより、指定したパッケージのルールのみが追加されます。
(オプション) 特定パッケージの一部のルールのみを追加します。つまり、次の例のように、
include
とexclude
の両方を指定して、Enterprise Contract ポリシーに追加するルールのみを選択できます。{ "sources": [ { "policy": [ "oci::quay.io/enterprise-contract/ec-release-policy:latest" ], "data": [ "git::https://github.com/enterprise-contract/ec-policies//example/data" ], "config": { "include": [ ""*"", 1 "attestation_task_bundle.unacceptable_task_bundle" ], "exclude": [ "attestation_task_bundle.*" ] } } ] }
- 1
- アスタリスク (*) はワイルドカードとして機能し、すべてのパッケージにマッチします。名前の一部にはマッチしないことに注意してください。たとえば、"s*" を指定して、"s" で始まるすべてのパッケージにマッチさせることはできません。
これらのコマンドにより、
attestation_task_bundle
パッケージのunacceptable_task_bundle
ルール のみ を追加し、そのパッケージ内の他のルールをすべて除外することが指定されます。(オプション) 次の例のように、特定のチェックを除外して、そのチェックが失敗した場合や完了しなかった場合でも、Enterprise Contract がコンテナーイメージを検証できるようにします。
{ "sources": [ { "policy": [ "oci::quay.io/enterprise-contract/ec-release-policy:latest" ], "data": [ "git::https://github.com/enterprise-contract/ec-policies//example/data" ], "config": { "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」で確認できます。 - "パッケージ名:項目" - ポリシールールの中には、項目のリストを処理するものもあります。"パッケージ名" 文字列に "項目" を付加すると、そのリストから特定の項目を除外または追加できます。これは "パッケージ名" と同様に機能しますが、その項目にマッチするパッケージ内のポリシールールにのみ適用される点が異なります。たとえば、テストパッケージを実行する場合は、特定のテストケースを無視して、他のすべてのテストケースを追加することができます。
- "ルール名:項目" - これは "パッケージ名:項目" と似ていますが、パッケージに 項目 を追加または除外する代わりに、特定のパッケージの ポリシールール を追加または除外できる点が異なります。
-
"@コレクション名" - 定義済みのルールのコレクションを指定するには、これを文字列に追加します。コレクション名の前に必ず
@
記号を付けてください。こちら の利用可能なルールコレクションから選択します。
関連情報
リリースポリシーの詳細の包括的なリストは、Release Policy を参照してください。