第 3 章 创建策略


企业合同 策略是 规则或一组规则以及特定于企业合同的注解。企业合同可以执行多种策略检查,包括检查 红帽产品所需的所有策略规则。企业合同使用名为 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
    Copy to Clipboard Toggle word wrap
    1
    METADATA 注释块 - 代码的前 10 行,它们前面带有 hashtags (")--is 如何重新执行规则注解,以便企业合同可以包括这些注解详情其成功和违反报告。有关 rego 元数据和注解的更多信息,请参阅 元数据。有关企业合同策略规则必须包含的注解的更多信息,请参阅 规则注解
    2
    这个单一策略规则会验证新策略规则中的 builder.id 是否与软件 Artifacts 的 Supply-chain Levels 中的 builder.id 匹配,或 SLSA
    3
    input 是一个 Rego 对象,其中包含有关容器镜像、签名及其 attestations 的所有信息。输入对象的 input.attestations 属性包含与镜像关联的 attestations 列表。有关企业合同定义 input.attestations 内容的位置和方式的更多信息,请参阅 策略输入
    提示

    您可以将 输入 对象保存到 JSON 文件,以查看可用的值,这有助于编写新的策略规则。要将 输入 对象保存为名为 input.json 的 JSON 文件,请运行类似以下示例的命令:

    ec validate image --public-key cosign.pub --image "$REPOSITORY:latest" --policy policy.yaml \
        --output policy-input=input.json
    Copy to Clipboard Toggle word wrap
  2. 创建策略配置以使用您的新策略规则,如下例所示:

    echo "
    ---
    sources:
      - policy:
          - $(pwd)/rules.rego
    " > policy.yaml
    Copy to Clipboard Toggle word wrap
  3. 使用您的新策略验证您的容器镜像,并在成功和违反报告中显示其他信息,如下例所示:

    ec validate image --public-key cosign.pub --image "$REPOSITORY:latest" --policy policy.yaml \
        --show-successes --info --output yaml
    Copy to Clipboard Toggle word wrap

验证

  • 检查 Successes 和 violations 报告,以确保您的新规则位于 successes 列表中。

3.1. 配置策略

您可以使用内联 JSON 或 YAML 字符串配置企业合同策略。此策略有时称为配置或 合同,指定企业合同应在哪里找到用于应用您要实施的策略的规则和数据。您还可以包含或排除单个规则或特定规则软件包。

流程

  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"]}
            }
        ]
    }' ...
    Copy to Clipboard Toggle word wrap
  2. (可选)从您的企业合同策略中排除特定规则软件包,如下例所示:

    {
      "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"
            ]
          }
        }
      ]
    }
    Copy to Clipboard Toggle word wrap

    此命令包含来自每个软件包的每个规则,但指定软件包中的规则除外。

  3. (可选) Exclude 单个规则,如下例所示:

    {
      "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"
            ]
          }
        }
      ]
    }
    Copy to Clipboard Toggle word wrap

    此命令包括 attestation_task_bundle 软件包中的每个规则,但 unacceptable_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"
            ]
          }
        }
      ]
    }
    Copy to Clipboard Toggle word wrap

    此命令仅包含指定软件包中的规则。

  5. (可选)只包括特定软件包中的一些规则。这意味着,您可以指定 includeexclude 来仅选择要包含企业合同策略的规则,如下例所示:

    {
      "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.*"
            ]
          }
        }
      ]
    }
    Copy to Clipboard Toggle word wrap
    1
    星号 integrity 充当匹配任何软件包的通配符。请注意,它不匹配部分名称,这意味着您无法指定 "s*" 以匹配以"s"开头的每个软件包。

    这些命令指定您 只包括 attestation _task_bundle 软件包中的 unacceptable_task_bundle 规则,并排除该软件包中的所有其他规则。

  6. (可选) Exclude 某些检查,以便企业合同可以验证您的容器镜像,即使这些检查失败或未完成,如下例所示:

    {
      "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"
            ]
          }
        }
      ]
    }
    Copy to Clipboard Toggle word wrap

    此命令指定,如果已确定的检查失败或未完成,企业合同仍然可以完成以验证您的容器镜像。

  7. (可选)通过运行 config.policy. include 命令或 config.policy.exclude 命令以及字符串列表来修改软件包中的规则的默认值。

    您的字符串列表应包括以下之一:

    • "package name" - 从可用 规则集合列表中的软件包 中进行选择。
    • "rule name" - 输入软件包名称和规则代码(用点分隔)来指定规则名称,如下例所示:attestation _type.unknown_att_type。您可以在此处找到"Attestation type"下的规则代码。https://enterprisecontract.dev/docs/ec-policies/release_policy.html#attestation_type_package
    • "package name:term" - 某些策略规则处理项目列表。将 "term" 添加到 "package name" 字符串时,您可以从该列表中排除或包含特定项。这的工作方式与"软件包名称"类似,但它仅适用于与该术语匹配的软件包中的策略规则。例如,如果您运行 test 软件包,您可以选择忽略给定的测试案例,但包含所有测试。
    • "rule name:term" - 这与 "package name:term" 类似,除了从软件包中包含或排除某个项目外,您可以包括 ot 排除特定的软件包 策略规则
    • "@collection name" - 将其添加到字符串中,以指定预定义的规则集合。TMake 请确定您使用 @ 符号为集合名称添加前缀。从此处 提供的规则集合中选择。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat