使用 Conforma 管理合规性
了解 Conforma 如何使您更好地验证和管理您提升的代码合规性。另外,自定义示例策略以适合您的企业标准。
摘要
前言 复制链接链接已复制到粘贴板!
Conforma 是一个策略驱动的工作流工具,通过定义和执行策略来构建和测试容器镜像来维护软件供应链安全性。安全 CI/CD 工作流应包含工件验证,以尽早检测问题。它是 Conforma 的任务,以验证容器镜像是否已签名并由已知可信的构建系统进行了测试。
第 1 章 RHADS 的 Conforma - SSC 复制链接链接已复制到粘贴板!
软件供应链更复杂的变得复杂,更关键是利用可靠的检查和最佳实践来确保软件构件的完整性,因为镜像容器和源代码依赖。在这里,Conforma 简化 Red Hat Advanced Developer Suite - 软件供应链(RHADS - SSC)构建和部署体验。
Conforma 是一个策略驱动的工作流工具,通过定义和执行策略来构建和测试容器镜像来维护软件供应链安全性。对于在测试时为软件 Artifacts (SLSA)验证创建 Supply-chain Levels (SLSA)的构建系统,如带有 SLSA GitHub Generator 的 Tekton 带有 Tekton 链和 GitHub Actions 的 Tekton,检查签名并确认该签名并确认是否符合验证和维护软件提供链的完整性的关键部分。安全 CI/CD 工作流应包含工件验证,以尽早检测问题。Conforma 验证已知和可信的构建系统是否签名,并测试容器镜像。
验证签名和测试的容器镜像的一般步骤如下:
- 使用 RHADS - SSC 创建或复制容器镜像。
- 使用 Cosign 生成签名密钥。
- 使用 Cosign 为容器镜像签名。
- 使用 Cosign 测试镜像。
- 使用 Conforma CLI 验证您已签名和测试的容器镜像。
与未签名工件相比,签名的软件工件(如容器镜像)会显著降低多个攻击向量的风险。签名容器镜像时,各种加密技术将镜像绑定到特定的实体或机构。结果是一个数字签名,用于验证镜像的真实性,以便您可以将其追踪回其创建者,同时验证镜像是否在签名后没有被更改或篡改。
Conforma 使用行业标准 Sigstore 和 Cosign 作为资源库来验证您的容器镜像。使用 Red Hat Trusted Artifact Signer,红帽支持的 Sigstore 框架版本,您可以使用 Sigstore 服务的内部实例通过 Cosign CLI 签署和测试容器镜像。
与测试过程中的软件构件一样,在没有验证的情况下,它不能发生。经验证的 是有关软件工件的可验证信息,如描述生成工件的位置、时间和方式的容器镜像。attestation 本身是一个经过身份验证的声明,其元数据形式证明工件是完整且可信的。Conforma 使用该 attestation 来加密验证构建是否未被篡改,并根据一组策略(如 SLSA 要求)检查构建。
当您将代码从 RHADS - SSC 开发命名空间推送到 stage 命名空间,或从 stage 命名空间推送到 production 命名空间时,Conforma 会自动运行其验证检查,以确保容器镜像由已知和可信的构建系统进行了签名并测试。当您的镜像通过 Conforma 检查时,您可以合并代码更改,以完成从一个环境到下一个环境的提升。
第 2 章 安装 Conforma 命令行 复制链接链接已复制到粘贴板!
先决条件
- 在 Red Hat OpenShift Container Platform 版本 4.13 或更高版本上安装 Red Hat Trusted Artifact Signer 安装。
-
安装了
cosign和oc二进制文件的工作站。 - 访问 OCP Web 控制台。
流程
从 OCP 集群下载
ec二进制文件。- 登录 OCP Web 控制台。在主页中,单击 ? 图标,选择 Command line tools,转至 ec 下载部分,然后单击您的平台的链接。
在工作站上打开一个终端,并通过运行以下命令来解压缩二进制
.gz文件:gunzip ec-amd64.gz
$ gunzip ec-amd64.gzCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令使二进制文件可执行:
chmod +x ec-amd64
$ 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命令。结果应该是您刚才安装的 Conforma CLI 的版本。
第 3 章 创建策略 复制链接链接已复制到粘贴板!
Conforma 策略是 规则或一组规则和特定 Conforma 的注解。Conforma 可以执行多种策略检查,包括检查红帽产品所需的所有策略规则。Conforma 使用名为 Open Policy Agent (OPA)的一般目的策略引擎。opa 使用 Rego 定义其策略规则。这意味着,在 Conforma 策略中的 OPA 中的策略规则也会在 Rego 中定义。
流程
创建一个 Rego 文件来定义一个新的策略规则,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 元数据
-
代码的前 10 行包含
METADATA注释块,这是如何重新运行规则注解,以便 Conforma 可以在成功和违反报告中包含这些注解详情。 short_name-
这个单一策略规则会验证新策略规则中的
builder.id是否与软件 Artifacts (SLSA)的 Supply-chain Levels 中的builder.id匹配。 input.attestationsinput是一个 Rego 对象,其中包含有关容器镜像、签名及其 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
$ ec 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 yaml
$ ec 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 字符串配置 Conforma 策略。此策略有时称为配置或 合同,指定 Conforma 应在哪里找到用于应用您要实施的策略的规则和数据。您还可以包含或排除单个规则或特定规则软件包。
流程
在命令行中配置您的策略作为 JSON 或 YAML 字符串,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow (可选)从您的 Conforma 策略中排除特定规则软件包,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令包含来自每个软件包的每个规则,但指定软件包中的规则除外。
(可选) Exclude 单个规则,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令包括
attestation_task_bundle软件包中的每个规则,但unacceptable_task_bundle规则除外。(可选)只包括特定软件包的规则,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令仅包含指定软件包中的规则。
(可选)只包括特定软件包中的一些规则。这意味着,您可以指定
include和exclude来仅选择要包含的 Conforma 策略的规则,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow asterisk (*)星号 integrity 充当匹配任何软件包的通配符。它与部分名称不匹配。例如,您无法指定 "s*" 来匹配以"s"开头的每个软件包。
这些命令指定您 只包括
attestationunacceptable_task_bundle 规则,并排除该软件包中的所有其他规则。_task_bundle软件包中的
(可选) Exclude 某些检查,以便 Conforma 可以验证您的容器镜像,即使这些检查失败或没有完成,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令指定,如果任何一个标识的检查失败或未完成,Conforma 仍然可以完成以验证您的容器镜像。
(可选)通过运行 config.policy.
include 命令或命令以及字符串列表来修改软件包中的规则的默认值。config.policy.exclude您的字符串列表应包括以下之一:
- 软件包名称
- 从"Available 规则集合"列表中的软件包中进行选择。
- 规则名称
-
通过输入软件包名称和规则代码(用句点(.)分隔来指定规则名称,如下例所示:attestation
_type.unknown_att_type。您可以在上游 Conforma 文档中找到"Attestation type"下的规则代码。 - package name:term
- 有些策略规则处理项目列表。将 "term" 添加到 "package name" 字符串时,您可以从该列表中排除或包含特定项。这的工作方式与"软件包名称"类似,但它仅适用于与该术语匹配的软件包中的策略规则。例如,如果您运行 test 软件包,您可以选择忽略给定的测试案例,但包含所有测试。
- rule name:term
- 这和 "package name:term" 类似,除了从软件包中包含或排除某个项目外,您可以包含或排除特定的软件包 策略规则。
- @collection 名称
-
将其添加到字符串中以指定预定义的规则集合。使用
@符号为集合名称加上前缀。从可用的规则集合中选择。
第 4 章 签名容器镜像 复制链接链接已复制到粘贴板!
先决条件
- 访问 OpenShift Container Platform (OCP) Web 控制台。
- 在 OpenShift 版本 4.13 或更高版本上运行的 Red Hat Trusted Artifact Signer (RHTAS)安装。
-
安装了
ec、cosign和oc二进制文件的工作站。
流程
运行以下命令登录到您的 OCP 集群:
oc login --token=<TOKEN> --server=<SERVER_URL_AND_PORT>
$ oc login --token=<TOKEN> --server=<SERVER_URL_AND_PORT>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC \ --server=https://example.com:6443
$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC \ --server=https://example.com:6443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意要查找您的命令行登录令牌和 URL,请登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如有提示,再次输入您的用户名和密码,然后单击 显示令牌。
- 登录 RHTAS。
运行以下命令,配置 RHTAS shell 环境以签名和验证容器镜像:
cd sigstore-ocp
$ cd sigstore-ocpCopy to Clipboard Copied! Toggle word wrap Toggle overflow source tas-env-variables.sh
$ 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 运行以下命令,从 OCP 集群注销:
oc logout
$ oc logoutCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确定您要签名的容器镜像和 attest;例如:
IMAGE=quay.io/lucarval/rhtas-test@sha256:6b95efc134c2af3d45472c0a2f88e6085433df058cc210abb2bb061ac4d74359
IMAGE=quay.io/lucarval/rhtas-test@sha256:6b95efc134c2af3d45472c0a2f88e6085433df058cc210abb2bb061ac4d74359Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指明 RHADS - 您要通过 Red Hat Trusted Artifact Signer 而不是公共 Sigstore 部署签名的容器镜像,而不是公共 Sigstore 部署。
cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来为您的容器镜像签名:
cosign sign -y --fulcio-url=$FULCIO_URL \ --rekor-url=$REKOR_URL \ --oidc-issuer=$OIDC_ISSUER_URL $IMAGE
$ cosign sign -y --fulcio-url=$FULCIO_URL \ --rekor-url=$REKOR_URL \ --oidc-issuer=$OIDC_ISSUER_URL $IMAGECopy to Clipboard Copied! Toggle word wrap Toggle overflow - 出现提示时,登录到安装 RHADS - 安装时的 RHADS - SSC 的 Keycloak 实例。因此 Keycloak 可以为您进行身份验证。
后续步骤
您的镜像现已签名。现在,您可以:
- 在测试时创建 SLSA 验证,并将它与容器镜像相关联。
- 使用 Conforma 验证容器镜像。
4.1. 生成签名密钥以签名和测试容器镜像 复制链接链接已复制到粘贴板!
您必须有签名密钥,然后才能签名和测试容器镜像。
先决条件
-
安装了
cosign二进制文件的工作站。
流程
运行以下命令来生成密钥对:
cosign generate-key-pair
$ cosign generate-key-pairCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 出现提示时,输入新密码作为密钥对。确保您的密码是 memorable 且强强。
验证
您现在应当有两个新文件位于工作目录中:cosign
.pub 文件和cosign.key文件。-
cosign.pub文件包含您的公钥。您可以与需要验证容器镜像的任何协作者共享此密钥。 -
cosign.key文件是用于签名内容的私钥。只有负责签名和测试镜像的人员应有权访问cosign.key文件。
-
安装 Red Hat Trusted Artifact Signer (RHTAS)服务时,您可以使用 ec 二进制文件来验证使用 RHTAS 服务的无密钥签名框架的容器镜像的测试和签名。
先决条件
- 在 OpenShift Container Platform (OCP)版本 4.13 或更高版本上运行的可正常工作的 RHTAS 安装。
- 访问 OCP Web 控制台。
-
安装了
cosign和oc二进制文件的工作站。
流程
从 OCP 集群下载
ec二进制文件:- 登陆到 OpenShift Container Platform Web 控制台。在主页中,单击右上角的 ? 图标,然后选择 Command Line Tools。
- 在 ec download 部分中,单击您的平台的链接。
- 打开终端。
运行以下命令来解压缩
.gz文件:gunzip ec-amd64.gz
$ gunzip ec-amd64.gzCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令使
ec二进制文件可执行:chmod +x ec-amd64
$ chmod +x ec-amd64Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
ec二进制文件移到$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 validate image --help命令来查看所有 image 验证命令选项。
为容器镜像签名和验证配置 shell 环境。
运行以下命令来进入
sigstore-ocp目录:cd sigstore-ocp
$ cd sigstore-ocpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
tas-env-variables.sh脚本配置 shell:source tas-env-variables.sh
$ 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
运行以下命令初始化更新框架(TUF)系统:
cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来为您的容器镜像签名:
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 IMAGE_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
cosign sign -y --fulcio-url=$FULCIO_URL \ --rekor-url=$REKOR_URL \ --oidc-issuer=$OIDC_ISSUER_URL example-hello-world@sha256:2788a47fd0ef1ece30898c1e608050ea71036d3329b9772dbb3d1f69313f745c
$ cosign sign -y --fulcio-url=$FULCIO_URL \ --rekor-url=$REKOR_URL \ --oidc-issuer=$OIDC_ISSUER_URL example-hello-world@sha256:2788a47fd0ef1ece30898c1e608050ea71036d3329b9772dbb3d1f69313f745cCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在打开的 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 运行以下命令,验证容器镜像至少有一个至少测试和签名:
cosign tree IMAGE_NAME:TAG
$ cosign tree IMAGE_NAME:TAGCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,使用 Conforma 验证容器镜像:
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 例如:
ec validate image --image example.io/hello-world:latest \ --certificate-identity 'jdoe@example.com' \ --certificate-oidc-issuer 'keycloak-keycloak-system' \ --output yaml --show-successes
$ ec validate image --image example.io/hello-world:latest \ --certificate-identity 'jdoe@example.com' \ --certificate-oidc-issuer 'keycloak-keycloak-system' \ --output yaml --show-successesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用输出来验证容器镜像:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Conforma 生成通过或失败报告,其中包含有关任何安全违反情况的详情。当您添加 the-
info标志时,报告会包括任何违反情况的更多详情和可能的解决方案。
第 5 章 测试和验证容器镜像 复制链接链接已复制到粘贴板!
在 Conforma 可以验证签名的容器镜像前,您必须首先为 Software Artifacts (SLSA)验证创建 Supply-chain Levels,并将其与您的容器镜像关联。经验证的是有关软件工件的可验证信息,包括供应链中给定软件"链接"的位置、时间和方式。
先决条件
- 签名的容器镜像。
- 访问 OpenShift Container Platform Web 控制台。
- 在 OpenShift 版本 4.13 或更高版本上运行的 Red Hat Trusted Artifact Signer 安装。
-
安装了
cosign和oc二进制文件的工作站。
流程
创建 SLSA provenance
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 打开,以便在对容器镜像进行签名时基于您的登录自动验证。
运行以下命令,使用 Conforma 验证签名和测试:
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命令时尽量具体,以便每个签名与预期的身份匹配。
验证
- 当 Conforma 验证容器镜像时,会打开所有 Conforma 验证和签名的详细报告。