第3章 ポリシーの作成


Enterprise Contract の ポリシー は、ルールまたはルールセットと、Enterprise Contract 固有のアノテーションです。Enterprise Contract は、いくつかの種類のポリシーチェックを実行できます。これには、Red Hat 製品に必要なポリシールール をすべてチェックすることが含まれます。Enterprise Contract は、Open Policy Agent (OPA) と呼ばれる汎用ポリシーエンジンを使用します。OPA は、Rego と呼ばれる独自の言語でポリシールールを定義します。そのため、Enterprise Contract のポリシーに含まれている OPA のポリシールールも、Rego で定義されています。

手順

  1. 次の例のように、新しいポリシールールを定義する 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
  2. 次の例のように、新しいポリシールールを使用するポリシー設定を作成します。

    echo "
    ---
    sources:
      - policy:
          - $(pwd)/rules.rego
    " > policy.yaml
  3. 次の例のように、新しいポリシーを使用してコンテナーイメージを検証し、成功と違反のレポートに追加情報を表示します。

    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 つのルールや特定のルールパッケージを追加または除外することもできます。

手順

  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"]}
            }
        ]
    }' ...
  2. (オプション) 次の例のように、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"
            ]
          }
        }
      ]
    }

    このコマンドにより、指定したパッケージ内のルールを除く全パッケージの全ルールが追加されます。

  3. (オプション) 次の例のように、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 パッケージのすべてのルールが追加されます。

  4. (オプション) 次の例のように、特定のパッケージのルールのみを追加します。

    {
      "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"
            ]
          }
        }
      ]
    }

    このコマンドにより、指定したパッケージのルールのみが追加されます。

  5. (オプション) 特定パッケージの一部のルールのみを追加します。つまり、次の例のように、includeexclude の両方を指定して、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 ルール のみ を追加し、そのパッケージ内の他のルールをすべて除外することが指定されます。

  6. (オプション) 次の例のように、特定のチェックを除外して、そのチェックが失敗した場合や完了しなかった場合でも、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 がコンテナーイメージの検証を完了できるようになります。

  7. (オプション) config.policy.include コマンドまたは config.policy.exclude コマンドのいずれかを文字列のリストとともに実行して、パッケージ内のルールのデフォルト設定を変更します。

    文字列のリストには、次のいずれかを含める必要があります。

    • "パッケージ名" - Available rule collections リストからパッケージを選択します。
    • "ルール名" - パッケージ名とルールコードをドット (.) で区切って入力し、ルール名を指定します (例: attestation_type.unknown_att_type)。ルールコードは、こちら の「Attestation type」で確認できます。
    • "パッケージ名:項目" - ポリシールールの中には、項目のリストを処理するものもあります。"パッケージ名" 文字列に "項目" を付加すると、そのリストから特定の項目を除外または追加できます。これは "パッケージ名" と同様に機能しますが、その項目にマッチするパッケージ内のポリシールールにのみ適用される点が異なります。たとえば、テストパッケージを実行する場合は、特定のテストケースを無視して、他のすべてのテストケースを追加することができます。
    • "ルール名:項目" - これは "パッケージ名:項目" と似ていますが、パッケージに 項目 を追加または除外する代わりに、特定のパッケージの ポリシールール を追加または除外できる点が異なります。
    • "@コレクション名" - 定義済みのルールのコレクションを指定するには、これを文字列に追加します。コレクション名の前に必ず @ 記号を付けてください。こちら の利用可能なルールコレクションから選択します。

関連情報

リリースポリシーの詳細の包括的なリストは、Release Policy を参照してください。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.