部署指南
为红帽平台安装和配置 Trusted Artifact Signer 服务
摘要
前言
欢迎使用 Red Hat Trusted Artifact Signer Deployment Guide。
这些步骤可帮助您部署完整的 Trusted Artifact Signer (RHTAS)软件堆栈,并验证部署。安装平台组织的内容:
您可以在此处查看官方 RHTAS 发行注记。https://docs.redhat.com/en/documentation/red_hat_trusted_artifact_signer/1.2.1/html/release_notes/
第 1 章 Red Hat OpenShift Container Platform
1.1. 在 OpenShift 中部署的资源建议
在 Red Hat OpenShift 上部署 Red Hat Trusted Artifact Signer (RHTAS)之前,了解如何调整基础架构资源的大小非常重要。需要考虑的关键基础架构数量是 Trillian 数据库可用的 CPU 数和内存。随着签名和验证请求数量的增加,这会增加对 CPU 的负载,并增加 Trillian 数据库的内存用量。
您有两个选项可用于实现与 RHTAS 一起使用的 Trillian 数据库:专用数据库或受管数据库。红帽建议为生产工作负载创建一个专用的数据库,以及用于非生产工作负载的托管数据库。以下是您可以开始使用的基准 CPU 和内存资源:
Dedicated
- 2 个 CPU 内核
- 1 GB RAM
- 5 GB 存储
受管
- 4 个 CPU 内核
- 2 GB RAM
- 10 GB 存储
1.2. 使用 Operator Lifecycle Manager 安装 Trusted Artifact Signer
您可以安装 Red Hat Trusted Artifact Signer (RHTAS) operator,并使用 OpenShift 的 Operator Lifecycle Manager (OLM)部署 RHTAS 服务。此部署为您提供选择 OpenID Connect (OIDC)供应商的基本签名框架。您必须至少配置以下 OIDC 供应商之一: Red Hat Single Sign-on (SSO)、Google、Amazon Secure Token Service (STS)或 GitHub。如果您不想使用默认值,您还可以选择自定义数据库解决方案。
先决条件
- Red Hat OpenShift Container Platform 4.15 或更高版本。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 -
安装了
oc
二进制文件的工作站。
流程
-
使用具有
cluster-admin
角色的用户登录 OpenShift Web 控制台。 - 从 Administrator 视角中,展开 Operators 导航菜单,然后点 OperatorHub。
- 在搜索字段中,键入 trusted,然后单击 Red Hat Trusted Artifact Signer 标题。
- 单击 Install 按钮,以显示 Operator 详情。
接受默认值,点 Install Operator 页面中的 Install,并等待安装完成。
重要安装完成后,会自动为您创建一个新项目。新项目名称是
trusted-artifact-signer
。注意Trusted Artifact Signer operator 安装到
openshift-operators
命名空间中,所有依赖项都会被自动安装。- 可选。您可以为 Trusted Artifact Signer 服务使用替代数据库,而不是默认的数据库供应商。如果要使用 Amazon 的关系数据库服务(RDS) 或 OpenShift 上的自我管理的数据库,请在继续安装前按照其中一个流程进行操作。配置其中一个其他数据库提供程序后,您可以继续这个过程的下一步。
以部署 Trusted Artifact Signer 服务。
- 在 OpenShift Web 控制台中,从导航菜单中展开 Operators,点 Installed Operators。
-
从项目下拉列表中,选择
trusted-artifact-signer
。 - 点 Red Hat Trusted Artifact Signer。
- 单击 Securesign 选项卡,然后单击 Create Securesign 按钮。
- 在 Create Securesign 页面上,选择 YAML 视图。
您可以在部署期间配置不同的 OIDC 供应商,如 Google OAuth、Amazon STS、红帽 SSO、Microsoft 的 Entra ID 或 GitHub OAuth 作为此部署期间的初始 OIDC 供应商。在
spec.fulcio.config.OIDCIssuers
部分下,使用 OIDC 供应商 URL 编辑以下三行,并相应地设置ClientID
。Example
... OIDCIssuers: - Issuer: 'OIDC_ISSUER_URL': ClientID: CLIENT_ID IssuerURL: 'OIDC_ISSUER_URL' Type: email ...
... OIDCIssuers: - Issuer: 'OIDC_ISSUER_URL': ClientID: CLIENT_ID IssuerURL: 'OIDC_ISSUER_URL' Type: email ...
Copy to Clipboard Copied! 注意如果红帽的 SSO 已作为 OIDC 供应商实施,请运行以下命令查找签发者 URL:
echo https://$(oc get route keycloak -n keycloak-system | tail -n 1 | awk '{print $2}')/auth/realms/trusted-artifact-signer
echo https://$(oc get route keycloak -n keycloak-system | tail -n 1 | awk '{print $2}')/auth/realms/trusted-artifact-signer
Copy to Clipboard Copied! 将
ClientID
设置为trusted-artifact-signer
。重要您可以在同一配置中定义多个不同的 OIDC 供应商。
可选。如果您选择使用非默认数据库,那么在
spec.trillian
部分下,将create
设置为false
,并为数据库 secret 对象指定名称。Example
... trillian: database: create: false databaseSecretRef: name: trillian-mysql ...
... trillian: database: create: false databaseSecretRef: name: trillian-mysql ...
Copy to Clipboard Copied! - 点 Create 按钮。
点 All instances 选项卡观察部署状态,直到 CTlog、Fulcio、Rekor、Trillian 和 TUF 实例就绪。
注意Securesign 实例不提供状态。
- 您可以在 OpenShift 控制台中使用 Prometheus 检查新的 Trusted Artifact Signer 服务的健康状态。在导航菜单中,展开 Observe,然后点 Dashboards。
- 通过签署容器镜像 或 Git 提交 来验证安装。https://docs.redhat.com/en/documentation/red_hat_trusted_artifact_signer/1/html/deployment_guide/verify_the_trusted_artifact_signer_service_installation#signing-and-verifying-containers-by-using-cosign-from-the-command-line-interface_deploy
1.3. 验证 Trusted Artifact Signer 安装
作为系统管理员,您可以验证在 Red Hat OpenShift Container Platform 上运行的 Red Hat Trusted Artifact Signer (RHTAS)的部署是否成功。
您可以签署测试容器镜像,并验证该签名的真实性,以验证您环境中的 RHTAS 部署。
可以通过两种方式从代码管道验证构建工件。您可以使用 cosign
和 gitsign
签署和验证,但只能使用企业合同进行验证。
1.3.1. 使用命令行界面使用 Cosign 签名和验证容器
通过 cosign
工具,您可以使用红帽的Trusted Artifact Signer (RHTAS)服务签名和验证开放容器项目(OCI)容器镜像以及其他构建工件。
对于 RHTAS,您必须使用 cosign
版本 2.2 或更高版本。
先决条件
- 在 Red Hat OpenShift Container Platform 4.15 或更高版本上安装 RHTAS。
- 访问 OpenShift Web 控制台。
-
安装了
oc
、podman
二进制文件的工作站。
流程
将
cosign
二进制文件从 OpenShift 集群下载到您的工作站。- 登录到 OpenShift Web 控制台。在主页中,单击 ? 图标,单击 Command line tools,前往 cosign download 部分,然后单击您的平台的链接。
在工作站上打开一个终端,解压缩二进制
.gz
文件,并设置执行位:Example
gunzip cosign-amd64.gz chmod +x cosign-amd64
gunzip cosign-amd64.gz chmod +x cosign-amd64
Copy to Clipboard Copied! 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv cosign-amd64 /usr/local/bin/cosign
sudo mv cosign-amd64 /usr/local/bin/cosign
Copy to Clipboard Copied!
登录到 OpenShift 集群:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台查找要在命令行中使用的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
切换到 RHTAS 项目:
语法
oc project PROJECT_NAME
oc project PROJECT_NAME
Copy to Clipboard Copied! Example
oc project trusted-artifact-signer
oc project trusted-artifact-signer
Copy to Clipboard Copied! 注意使用 RHTAS 安装的项目名称。
配置 shell 环境,以执行容器镜像签名和验证。
Example
export TUF_URL="https://tuf.${BASE_HOSTNAME}" export OIDC_ISSUER_URL=https://$(oc get route keycloak -n keycloak-system | tail -n 1 | awk '{print $2}')/auth/realms/trusted-artifact-signer export COSIGN_FULCIO_URL=$(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
export TUF_URL="https://tuf.${BASE_HOSTNAME}" export OIDC_ISSUER_URL=https://$(oc get route keycloak -n keycloak-system | tail -n 1 | awk '{print $2}')/auth/realms/trusted-artifact-signer export COSIGN_FULCIO_URL=$(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
Copy to Clipboard Copied! 初始化更新框架(TUF)系统:
Example
cosign initialize
cosign initialize
Copy to Clipboard Copied! 为测试容器镜像签名。
创建一个空容器镜像:
Example
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 将空容器镜像推送到
ttl.sh
临时 registry:Example
podman push ttl.sh/rhtas/test-image:1h
podman push ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 为容器镜像签名:
语法
cosign sign -y IMAGE_NAME:TAG
cosign sign -y IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign sign -y ttl.sh/rhtas/test-image:1h
cosign sign -y ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。
删除临时 Docker 文件:
Example
rm ./tmp.Dockerfile
rm ./tmp.Dockerfile
Copy to Clipboard Copied!
使用证书身份和签发者验证签名的容器镜像:
语法
cosign verify --certificate-identity=SIGNING_EMAIL_ADDR IMAGE_NAME:TAG
cosign verify --certificate-identity=SIGNING_EMAIL_ADDR IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign verify --certificate-identity=jdoe@redhat.com ttl.sh/rhtas/test-image:1h
cosign verify --certificate-identity=jdoe@redhat.com ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 注意您还可以使用
cosign
命令--certificate-identity-regexp
和--certificate-oidc-issuer-regexp
的以下选项对证书身份和签发者使用正则表达式。将 OpenShift 集群中的
rekor-cli
二进制文件下载到您的工作站。- 登录到 OpenShift Web 控制台。在主页中,单击 ? 图标,单击 Command line tools,转至 rekor-cli 下载部分,然后单击您的平台的链接。
在工作站上打开一个终端,解压缩二进制
.gz
文件,并设置执行位:Example
gunzip rekor-cli-amd64.gz chmod +x rekor-cli-amd64
gunzip rekor-cli-amd64.gz chmod +x rekor-cli-amd64
Copy to Clipboard Copied! 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv rekor-cli-amd64 /usr/local/bin/rekor-cli
sudo mv rekor-cli-amd64 /usr/local/bin/rekor-cli
Copy to Clipboard Copied!
使用 Rekor 命令行界面查询透明日志。
根据日志索引进行搜索:
Example
rekor-cli get --log-index 0 --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli get --log-index 0 --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied! 搜索电子邮件地址以获取通用唯一标识符(UUID):
语法
rekor-cli search --email SIGNING_EMAIL_ADDR --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli search --email SIGNING_EMAIL_ADDR --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied! Example
rekor-cli search --email jdoe@redhat.com --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli search --email jdoe@redhat.com --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied! 此命令返回用于下一步的 UUID。
使用 UUID 获取事务详情:
语法
rekor-cli get --uuid UUID --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli get --uuid UUID --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied! Example
rekor-cli get --uuid 24296fb24b8ad77a71b9c1374e207537bafdd75b4f591dcee10f3f697f150d7cc5d0b725eea641e7 --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli get --uuid 24296fb24b8ad77a71b9c1374e207537bafdd75b4f591dcee10f3f697f150d7cc5d0b725eea641e7 --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied!
1.3.2. 使用命令行界面使用 Gitsign 签名和验证提交
gitsign
工具可让您使用红帽的 Trusted Artifact Signer (RHTAS)服务签名和验证 Git 存储库提交。
先决条件
- 在 Red Hat OpenShift Container Platform 4.15 或更高版本上安装 RHTAS。
- 访问 OpenShift Web 控制台。
安装了
oc
、git
和cosign
二进制文件的工作站。-
您必须使用
cosign
版本 2.2 或更高版本。
-
您必须使用
流程
将
gitsign
二进制文件从 OpenShift 集群下载到您的工作站。- 登录到 OpenShift Web 控制台。在主页中,单击 ? 图标,单击 Command line tools,前往 gitsign 下载部分,然后单击您的平台的链接。
在工作站上打开一个终端,解压缩 .gz 文件,并设置执行位:
Example
gunzip gitsign-amd64.gz chmod +x gitsign-amd64
gunzip gitsign-amd64.gz chmod +x gitsign-amd64
Copy to Clipboard Copied! 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv gitsign-amd64 /usr/local/bin/gitsign
sudo mv gitsign-amd64 /usr/local/bin/gitsign
Copy to Clipboard Copied!
登录到 OpenShift 集群:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台查找要在命令行中使用的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
切换到 RHTAS 项目:
语法
oc project PROJECT_NAME
oc project PROJECT_NAME
Copy to Clipboard Copied! Example
oc project trusted-artifact-signer
oc project trusted-artifact-signer
Copy to Clipboard Copied! 注意使用 RHTAS 安装的项目名称。
配置 shell 环境以进行提交签名和验证:
Example
export TUF_URL=$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export OIDC_ISSUER_URL=https://$(oc get route keycloak -n keycloak-system | tail -n 1 | awk '{print $2}')/auth/realms/trusted-artifact-signer export COSIGN_FULCIO_URL=$(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
export TUF_URL=$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export OIDC_ISSUER_URL=https://$(oc get route keycloak -n keycloak-system | tail -n 1 | awk '{print $2}')/auth/realms/trusted-artifact-signer export COSIGN_FULCIO_URL=$(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
Copy to Clipboard Copied! 使用 RHTAS 服务配置本地存储库配置以签署您的提交:
Example
git config --local commit.gpgsign true git config --local tag.gpgsign true git config --local gpg.x509.program gitsign git config --local gpg.format x509 git config --local gitsign.fulcio $SIGSTORE_FULCIO_URL git config --local gitsign.rekor $SIGSTORE_REKOR_URL git config --local gitsign.issuer $SIGSTORE_OIDC_ISSUER git config --local gitsign.clientID trusted-artifact-signer
git config --local commit.gpgsign true git config --local tag.gpgsign true git config --local gpg.x509.program gitsign git config --local gpg.format x509 git config --local gitsign.fulcio $SIGSTORE_FULCIO_URL git config --local gitsign.rekor $SIGSTORE_REKOR_URL git config --local gitsign.issuer $SIGSTORE_OIDC_ISSUER git config --local gitsign.clientID trusted-artifact-signer
Copy to Clipboard Copied! 将提交提交到本地存储库:
Example
git commit --allow-empty -S -m “Test of a signed commit”
git commit --allow-empty -S -m “Test of a signed commit”
Copy to Clipboard Copied! 此时会打开一个 Web 浏览器,允许您使用电子邮件地址为提交签名。
初始化更新框架(TUF)系统:
Example
cosign initialize
cosign initialize
Copy to Clipboard Copied! 验证提交:
语法
gitsign verify --certificate-identity=SIGNING_EMAIL --certificate-oidc-issuer=$SIGSTORE_OIDC_ISSUER HEAD
gitsign verify --certificate-identity=SIGNING_EMAIL --certificate-oidc-issuer=$SIGSTORE_OIDC_ISSUER HEAD
Copy to Clipboard Copied! Example
gitsign verify --certificate-identity=jdoe@redhat.com --certificate-oidc-issuer=$SIGSTORE_OIDC_ISSUER HEAD
gitsign verify --certificate-identity=jdoe@redhat.com --certificate-oidc-issuer=$SIGSTORE_OIDC_ISSUER HEAD
Copy to Clipboard Copied!
1.3.3. 使用企业合同验证容器镜像上的签名
企业合同(EC)是维护软件供应链安全性的工具,您可以使用它来定义和执行容器镜像的策略。您可以使用 ec
二进制文件来验证使用红帽的 Trusted Artifact Signer (RHTAS)签名框架的容器镜像的待测试和签名。
先决条件
- 在 Red Hat OpenShift Container Platform 4.15 或更高版本上安装 RHTAS。
- 访问 OpenShift Web 控制台。
安装了
oc
、cosign
和podman
二进制文件的工作站。-
您必须使用
cosign
版本 2.2 或更高版本。
-
您必须使用
流程
从 OpenShift 集群下载
ec
二进制文件。- 登录 OpenShift Web 控制台。在主页中,单击 ? 图标,单击 Command line tools,前往 ec download 部分,然后单击您的平台的链接。
在工作站上打开一个终端,解压缩二进制 .gz 文件,并设置执行位:
Example
gunzip ec-amd64.gz chmod +x ec-amd64
gunzip ec-amd64.gz chmod +x ec-amd64
Copy to Clipboard Copied! 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv ec-amd64 /usr/local/bin/ec
sudo mv ec-amd64 /usr/local/bin/ec
Copy to Clipboard Copied!
登录到 OpenShift 集群:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! 示例
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台查找要在命令行中使用的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
切换到 RHTAS 项目:
语法
oc project PROJECT_NAME
oc project PROJECT_NAME
Copy to Clipboard Copied! Example
oc project trusted-artifact-signer
oc project trusted-artifact-signer
Copy to Clipboard Copied! 注意使用 RHTAS 安装的项目名称。
配置 shell 环境,以执行容器镜像签名和验证。
Example
export TUF_URL=$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export OIDC_ISSUER_URL=https://$(oc get route keycloak -n keycloak-system | tail -n 1 | awk '{print $2}')/auth/realms/trusted-artifact-signer export COSIGN_FULCIO_URL=$(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
export TUF_URL=$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export OIDC_ISSUER_URL=https://$(oc get route keycloak -n keycloak-system | tail -n 1 | awk '{print $2}')/auth/realms/trusted-artifact-signer export COSIGN_FULCIO_URL=$(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
Copy to Clipboard Copied! 初始化更新框架(TUF)系统:
Example
cosign initialize
cosign initialize
Copy to Clipboard Copied! 为测试容器镜像签名。
创建一个空容器镜像:
Example
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 将空容器镜像推送到
ttl.sh
临时 registry:Example
podman push ttl.sh/rhtas/test-image:1h
podman push ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 为容器镜像签名:
语法
cosign sign -y IMAGE_NAME:TAG
cosign sign -y IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign sign -y ttl.sh/rhtas/test-image:1h
cosign sign -y ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。
删除临时 Docker 文件:
Example
rm ./tmp.Dockerfile
rm ./tmp.Dockerfile
Copy to Clipboard Copied!
创建
predicate.json
文件:Example
{ "builder": { "id": "https://localhost/dummy-id" }, "buildType": "https://example.com/tekton-pipeline", "invocation": {}, "buildConfig": {}, "metadata": { "completeness": { "parameters": false, "environment": false, "materials": false }, "reproducible": false }, "materials": [] }
{ "builder": { "id": "https://localhost/dummy-id" }, "buildType": "https://example.com/tekton-pipeline", "invocation": {}, "buildConfig": {}, "metadata": { "completeness": { "parameters": false, "environment": false, "materials": false }, "reproducible": false }, "materials": [] }
Copy to Clipboard Copied! 如需有关 schema 布局的更多信息,请参阅 SLSA provenance predicate 规格。
将
predicate.json
文件与容器镜像关联:语法
cosign attest -y --predicate ./predicate.json --type slsaprovenance IMAGE_NAME:TAG
cosign attest -y --predicate ./predicate.json --type slsaprovenance IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign attest -y --predicate ./predicate.json --type slsaprovenance ttl.sh/rhtas/test-image:1h
cosign attest -y --predicate ./predicate.json --type slsaprovenance ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 验证容器镜像是否至少有一个测试和签名:
语法
cosign tree IMAGE_NAME:TAG
cosign tree IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign tree ttl.sh/rhtas/test-image:1h 📦 Supply Chain Security Related artifacts for an image: ttl.sh/rhtas/test-image@sha256:7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35 └── 💾 Attestations for an image tag: ttl.sh/rhtas/test-image:sha256-7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35.att └── 🍒 sha256:40d94d96a6d3ab3d94b429881e1b470ae9a3cac55a3ec874051bdecd9da06c2e └── 🔐 Signatures for an image tag: ttl.sh/rhtas/test-image:sha256-7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35.sig └── 🍒 sha256:f32171250715d4538aec33adc40fac2343f5092631d4fc2457e2116a489387b7
cosign tree ttl.sh/rhtas/test-image:1h 📦 Supply Chain Security Related artifacts for an image: ttl.sh/rhtas/test-image@sha256:7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35 └── 💾 Attestations for an image tag: ttl.sh/rhtas/test-image:sha256-7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35.att └── 🍒 sha256:40d94d96a6d3ab3d94b429881e1b470ae9a3cac55a3ec874051bdecd9da06c2e └── 🔐 Signatures for an image tag: ttl.sh/rhtas/test-image:sha256-7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35.sig └── 🍒 sha256:f32171250715d4538aec33adc40fac2343f5092631d4fc2457e2116a489387b7
Copy to Clipboard Copied! 使用企业联系人验证容器镜像:
语法
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-successes
Copy to Clipboard Copied! Example
ec validate image --image ttl.sh/rhtas/test-image:1h --certificate-identity-regexp 'jdoe@example.com' --certificate-oidc-issuer-regexp 'keycloak-keycloak-system' --output yaml --show-successes success: true successes: - metadata: code: builtin.attestation.signature_check msg: Pass - metadata: code: builtin.attestation.syntax_check msg: Pass - metadata: code: builtin.image.signature_check msg: Pass ec-version: v0.1.2427-499ef12 effective-time: "2024-01-21T19:57:51.338191Z" key: "" policy: {} success: true
ec validate image --image ttl.sh/rhtas/test-image:1h --certificate-identity-regexp 'jdoe@example.com' --certificate-oidc-issuer-regexp 'keycloak-keycloak-system' --output yaml --show-successes success: true successes: - metadata: code: builtin.attestation.signature_check msg: Pass - metadata: code: builtin.attestation.syntax_check msg: Pass - metadata: code: builtin.image.signature_check msg: Pass ec-version: v0.1.2427-499ef12 effective-time: "2024-01-21T19:57:51.338191Z" key: "" policy: {} success: true
Copy to Clipboard Copied! 企业合同生成 pass-fail 报告,其中包含有关任何安全违反情况的详细信息。添加
--info
标志时,报告包括所有找到违反情况的详情和可能的解决方案。
其它资源
- 如需更多信息,请参阅企业合同 网站。
1.4. 配置额外的 OpenID Connect 供应商
作为系统管理员,您可以配置许多不同的 OpenID Connect (OIDC)供应商,以用于红帽的 Trusted Artifact Signer 服务。您可以配置以下 OIDC 供应商来验证用户:
- 红帽构建的 Keycloak
- Red Hat Single Sign-on (SSO)
- Amazon 安全令牌服务(STS)
- Microsoft Entra ID
- GitHub
1.4.1. 将 Google 配置为 Trusted Artifact Signer 的 OpenID Connect 供应商
您可以将 Google OAuth 2.0 用作 Red Hat Trusted Artifact Signer (RHTAS)服务的 OpenID Connect (OIDC)供应商。您可以决定在RHAS 部署期间或稍后配置 Google OAuth。
您可以在同一配置中定义多个不同的 OIDC 供应商。
先决条件
- Red Hat OpenShift Container Platform 4.15 或更高版本。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 -
安装了
oc
、podman
二进制文件的工作站。 在 Google Cloud Console 中,使用以下设置创建一个 OAuth 客户端 ID:
- 将应用程序类型设置为 "Web Application"。
- 授权重定向 URI 必须包含: http://localhost/auth/callback。
流程
在工作站上打开一个终端,并登录到 OpenShift:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! 示例
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
更新 RHTAS 配置。
打开以编辑
Securesign
资源:语法
oc edit Securesign NAME -n NAMESPACE
oc edit Securesign NAME -n NAMESPACE
Copy to Clipboard Copied! Example
oc edit Securesign securesign-sample -n trusted-artifact-signer
oc edit Securesign securesign-sample -n trusted-artifact-signer
Copy to Clipboard Copied! 注意您必须使用为 RHTAS 安装创建的项目名称作为命名空间。
在
OIDCIssuers
部分下,使用 Google 客户端标识符、签发者的 URL 添加新子,并将Type
值设置为email
:语法
... OIDCIssuers: - Issuer: "https://accounts.google.com" IssuerURL: "https://accounts.google.com" ClientID: "CLIENT_ID" Type: email ...
... OIDCIssuers: - Issuer: "https://accounts.google.com" IssuerURL: "https://accounts.google.com" ClientID: "CLIENT_ID" Type: email ...
Copy to Clipboard Copied! 将 Google 客户端标识符添加到
ClientID
字段。- 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
更改 OIDC 签发者和客户端 id 环境变量以使用 Google:
示例
export OIDC_ISSUER_URL=https://accounts.google.com export COSIGN_OIDC_CLIENT_ID="314919563931-35zke44ouf2oiztjg7v8o8c2ge9usnd1.apps.googleexample.com"
export OIDC_ISSUER_URL=https://accounts.google.com export COSIGN_OIDC_CLIENT_ID="314919563931-35zke44ouf2oiztjg7v8o8c2ge9usnd1.apps.googleexample.com"
Copy to Clipboard Copied! 将您的 secret 从 Google Console 复制并粘贴到纯文本文件中:
语法
echo SECRET > my-google-client-secret
echo SECRET > my-google-client-secret
Copy to Clipboard Copied! 如果您已运行 RHTAS 服务,您可以通过签署测试容器镜像来验证更新的配置。
创建一个空容器镜像:
Example
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 将空容器镜像推送到
ttl.sh
临时 registry:Example
podman push ttl.sh/rhtas/test-image:1h
podman push ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 删除临时 Docker 文件:
Example
rm ./tmp.Dockerfile
rm ./tmp.Dockerfile
Copy to Clipboard Copied! 为容器镜像签名:
语法
cosign sign -y --oidc-client-secret-file=SECRET_FILE IMAGE_NAME:TAG
cosign sign -y --oidc-client-secret-file=SECRET_FILE IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign sign -y --oidc-client-secret-file=my-google-client-secret ttl.sh/rhtas/test-image:1h
cosign sign -y --oidc-client-secret-file=my-google-client-secret ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。
1.4.2. 将 Red Hat SSO 配置为 Trusted Artifact Signer 的 OpenID Connect 供应商
您可以使用 Red Hat Single Sign-On (SSO)作为红帽的 Trusted Artifact Signer (RHTAS)服务的 OpenID Connect 供应商。这可让您为应用程序和安全服务的 Keycloak 身份验证环境。
先决条件
- Red Hat OpenShift Container Platform 4.15 或更高版本。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 - 有 1 GB 的容器存储可用于 Keycloak PostgreSQL 数据库。
-
安装了
oc
二进制文件的工作站。
流程
-
使用具有
cluster-admin
角色的用户登录 OpenShift Web 控制台。 创建一个新项目来部署 Keycloak 服务。
- 从 Administrator 视角中,从导航菜单中展开 Home,再单击 Projects。
- 点 Create Project 按钮。
-
新项目名称为
keycloak-system
,然后单击 Create 按钮。
- 从导航菜单中展开 Operators,然后点 OperatorHub。
- 在搜索字段中,键入 sso,然后单击 Red Hat Single Sign-on 标题。
- 单击 Install 按钮,以显示 Operator 详情。
-
如果尚未设置,请从 Installed Namespace 下拉菜单中选择
keycloak-system
。 - 在 Install Operator 页面中点 Install,并等待安装完成。
- 安装完成后,点 View Operator。
在 workstation 终端中登录到 OpenShift 集群:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台查找要在命令行中使用的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
切换到 Keycloak 项目:
Example
oc project keycloak-system
oc project keycloak-system
Copy to Clipboard Copied! 创建 Keycloak 实例:
Example
cat <<EOF | oc apply -f - apiVersion: keycloak.org/v1alpha1 kind: Keycloak metadata: labels: app: sso name: keycloak spec: externalAccess: enabled: true instances: 1 keycloakDeploymentSpec: imagePullPolicy: Always postgresDeploymentSpec: imagePullPolicy: Always EOF
cat <<EOF | oc apply -f - apiVersion: keycloak.org/v1alpha1 kind: Keycloak metadata: labels: app: sso name: keycloak spec: externalAccess: enabled: true instances: 1 keycloakDeploymentSpec: imagePullPolicy: Always postgresDeploymentSpec: imagePullPolicy: Always EOF
Copy to Clipboard Copied! 创建 Keycloak 域:
Example
cat <<EOF | oc apply -f - apiVersion: keycloak.org/v1alpha1 kind: KeycloakRealm metadata: labels: app: sso name: trusted-artifact-signer spec: instanceSelector: matchLabels: app: sso realm: displayName: Red-Hat-Trusted-Artifact-Signer enabled: true id: trusted-artifact-signer realm: trusted-artifact-signer sslRequired: none EOF
cat <<EOF | oc apply -f - apiVersion: keycloak.org/v1alpha1 kind: KeycloakRealm metadata: labels: app: sso name: trusted-artifact-signer spec: instanceSelector: matchLabels: app: sso realm: displayName: Red-Hat-Trusted-Artifact-Signer enabled: true id: trusted-artifact-signer realm: trusted-artifact-signer sslRequired: none EOF
Copy to Clipboard Copied! 创建 Keycloak 客户端:
Example
cat <<EOF | oc apply -f - apiVersion: keycloak.org/v1alpha1 kind: KeycloakClient metadata: labels: app: sso name: trusted-artifact-signer spec: client: attributes: request.object.signature.alg: RS256 user.info.response.signature.alg: RS256 clientAuthenticatorType: client-secret clientId: trusted-artifact-signer defaultClientScopes: - profile - email description: Client for Red Hat Trusted Artifact Signer authentication directAccessGrantsEnabled: true implicitFlowEnabled: false name: trusted-artifact-signer protocol: openid-connect protocolMappers: - config: claim.name: email id.token.claim: "true" jsonType.label: String user.attribute: email userinfo.token.claim: "true" name: email protocol: openid-connect protocolMapper: oidc-usermodel-property-mapper - config: claim.name: email-verified id.token.claim: "true" user.attribute: emailVerified userinfo.token.claim: "true" name: email-verified protocol: openid-connect protocolMapper: oidc-usermodel-property-mapper - config: claim.name: aud claim.value: trusted-artifact-signer id.token.claim: "true" access.token.claim: "true" userinfo.token.claim: "true" name: audience protocol: openid-connect protocolMapper: oidc-hardcoded-claim-mapper publicClient: true standardFlowEnabled: true redirectUris: - "*" realmSelector: matchLabels: app: sso EOF
cat <<EOF | oc apply -f - apiVersion: keycloak.org/v1alpha1 kind: KeycloakClient metadata: labels: app: sso name: trusted-artifact-signer spec: client: attributes: request.object.signature.alg: RS256 user.info.response.signature.alg: RS256 clientAuthenticatorType: client-secret clientId: trusted-artifact-signer defaultClientScopes: - profile - email description: Client for Red Hat Trusted Artifact Signer authentication directAccessGrantsEnabled: true implicitFlowEnabled: false name: trusted-artifact-signer protocol: openid-connect protocolMappers: - config: claim.name: email id.token.claim: "true" jsonType.label: String user.attribute: email userinfo.token.claim: "true" name: email protocol: openid-connect protocolMapper: oidc-usermodel-property-mapper - config: claim.name: email-verified id.token.claim: "true" user.attribute: emailVerified userinfo.token.claim: "true" name: email-verified protocol: openid-connect protocolMapper: oidc-usermodel-property-mapper - config: claim.name: aud claim.value: trusted-artifact-signer id.token.claim: "true" access.token.claim: "true" userinfo.token.claim: "true" name: audience protocol: openid-connect protocolMapper: oidc-hardcoded-claim-mapper publicClient: true standardFlowEnabled: true redirectUris: - "*" realmSelector: matchLabels: app: sso EOF
Copy to Clipboard Copied! 创建 Keycloak 用户:
Example
cat <<EOF | oc apply -f - apiVersion: keycloak.org/v1alpha1 kind: KeycloakUser metadata: labels: app: sso name: jdoe spec: realmSelector: matchLabels: app: sso user: email: jdoe@redhat.com enabled: true emailVerified: true credentials: - type: "password" value: "secure" firstName: Jane lastName: Doe username: jdoe EOF
cat <<EOF | oc apply -f - apiVersion: keycloak.org/v1alpha1 kind: KeycloakUser metadata: labels: app: sso name: jdoe spec: realmSelector: matchLabels: app: sso user: email: jdoe@redhat.com enabled: true emailVerified: true credentials: - type: "password" value: "secure" firstName: Jane lastName: Doe username: jdoe EOF
Copy to Clipboard Copied! 设置用户名、用户的电子邮件地址以及密码或引用 secret 对象。
- 返回到 OpenShift Web 控制台,点 All instances 选项卡监视并等待 Keycloak 系统成功初始化。
1.4.3. 将 Keycloak 的红帽构建配置为 Trusted Artifact Signer 的 OpenID Connect 供应商
您可以将红帽构建的 Keycloak (RHBK)配置为红帽受信任的工件签名程序(RHTAS)服务的 OpenID Connect (OIDC)供应商。此流程指导您将 RHBK 与 RHTAS 集成。
您可以在相同的 SecureSign 配置中为 Fulcio 定义几个不同的 OIDC 供应商。
先决条件
流程
-
使用具有
cluster-admin
角色的用户登录 OpenShift Web 控制台。 创建一个新项目来部署 Keycloak 服务。
- 从 Administrator 视角中,从导航菜单中展开 Home,再单击 Projects。
- 点 Create Project 按钮。
-
新项目名称为
keycloak-system
,然后点 Create 按钮。
部署 PostgreSQL 实例,供 Keycloak 用于存储持久数据。
重要如果 Keycloak 已存在数据库,请替换与您的数据库实例对应的
Secret
资源的用户名
、密码和数据库名称
值。您可以跳过 PostgreSQL Service 和 StatefulSet 步骤的创建,并继续下一步。
创建
Secret
资源以存储数据库信息。- 从导航菜单中展开 Workloads,再单击 Secrets。
-
从 Project 下拉菜单中选择
keycloak-system
。 - 单击 Create 下拉菜单,再选择 Key/Value secret。
-
在 Secret name 字段中输入
postgresql-db
。 -
在 Key 字段中输入
username
。 -
在 Value 字段中输入
keycloak
。这是用于向 PostgreSQL 数据库实例进行身份验证的用户名 Keycloak。 - 单击 Add key/value 链接,以添加另一个键值对。
-
在 Key 字段中输入
password
。 - 在 Value 字段中输入您选择的密码。这是用于向 PostgreSQL 数据库实例进行身份验证的密码 Keycloak。
- 单击 Add key/value 链接,以添加另一个键值对。
-
在 Key 字段中输入
database
。 -
在 Value 字段中输入
keycloak
。这是用于将 Keycloak 数据存储在 PostgreSQL 数据库实例中的数据库名称。 - 点 Create 按钮。
创建 PostgreSQL Service 和 StatefulSet。
- 点 + 图标。
- 复制 Service 和 StatefulSet YAML 配置文本,并在 Import YAML 页面中,将文本粘贴到 文本编辑器框中。
-
点 Create 按钮,将 Service 和 StatefulSet 添加到
keycloak-system
项目中。
从工作站打开一个终端,并登录到 OpenShift 集群:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台查找要在命令行中使用的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
创建新的
Secret
资源,使其包含传输层安全(TLS)证书和对应的私钥:语法
oc create secret tls SECRET_NAME -n NAMESPACE --cert CERTIFICATE_FILE_NAME --key PRIVATE_KEY_FILE_NAME
oc create secret tls SECRET_NAME -n NAMESPACE --cert CERTIFICATE_FILE_NAME --key PRIVATE_KEY_FILE_NAME
Copy to Clipboard Copied! Example
oc create secret tls keycloak-tls -n keycloak-system --cert certificate.pem --key key.pem
oc create secret tls keycloak-tls -n keycloak-system --cert certificate.pem --key key.pem
Copy to Clipboard Copied! 注意OpenShift 的服务服务证书可以自动生成和管理用于 Keycloak 的 TLS 证书。如需更多信息 , 请参阅附录。
- 在 OpenShift Web 控制台中,从导航菜单中展开 Operator,然后点 OperatorHub。
- 在搜索字段中,键入 keycloak,然后单击认证红帽目录中的 Keycloak Operator 标题。
- 单击 Install 按钮,以显示 Operator 详情。
-
在 Install Operator 页面中,从 Installed Namespace 下拉菜单中选择
keycloak-system
,然后点 Install 按钮。等待安装完成。 - 安装完成后,点 View Operator 按钮。
- 在 Keycloak 标题中点 Create instance。
在 Create Keycloak 页面中,选择 YAML 视图。
-
在
name
行中,将example-keycloak
替换为您的自定义名称,如keycloak
。 主机名可以在
hostname
属性中明确指定,或者自动生成与其他路由类似。在hostname
行中,将example.org
替换为您的自定义主机名。注意有关使 OpenShift 为 Keycloak 实例生成主机名所需的步骤,请参阅附录。???
在
spec
部分,添加您的数据库详情:Example
spec: ... db: vendor: postgres host: postgresql-db usernameSecret: name: postgresql-db key: username passwordSecret: name: postgresql-db key: password ...
spec: ... db: vendor: postgres host: postgresql-db usernameSecret: name: postgresql-db key: username passwordSecret: name: postgresql-db key: password ...
Copy to Clipboard Copied! 另外,在
http
属性的spec
部分下,指定包含 TLS 证书的Secret
资源的名称。Example
spec: ... http: tlsSecret: keycloak-tls ...
spec: ... http: tlsSecret: keycloak-tls ...
Copy to Clipboard Copied! - 点 Create 按钮。
-
在
- 展开 Networking 导航菜单,再单击 Routes。
- 要打开 Keycloak 管理控制台,请点击与 Keycloak 实例关联的路由的链接。
-
admin
用户的默认凭据存储在名为 keycloak-initial-admin 的 Secret 中。要查找密码,展开 Workloads 导航菜单,再单击 Secrets。 - 选择 keycloak-initial-admin Secret。
-
在 Data 部分下,找到 password 键,然后点
图标。
-
在 Keycloak Administration Console 登录页面中,输入
admin
作为用户名,并粘贴上一步的内容作为密码。 创建一个名为
trusted-artifact-signer
的新域。- 在导航菜单中,选择 Red Hat Build of Keycloak 下拉菜单。
- 选择 Create Realm。
-
输入
trusted-artifact-signer
作为 资源名称。 - 单击 Create 以创建新域。
创建新用户 。新用户可以登录到 Keycloak 管理控制台,也可以使用 RHTAS 为容器和提交签名。
- 在导航菜单的 Manage 部分下,然后选择 Clients。
- 点 Create Client 按钮
-
在 Client Id 字段中,输入
trusted-artifact-signer
。 - 另外,您还可以在对应的字段中输入 Name 和 Description。
- 点击 Next。
- 接受新客户端创建过程的 Capability Config 步骤的默认选项。
- 点击 Next。
-
在 Valid redirect URIs 字段中,输入
*
。 - 单击 Save 以创建客户端。
-
在导航菜单的 Configure 部分下,选择 Realm Settings 以查找
trusted-artifact-signer
域的 Issuer URL。 - 在 Endpoints 旁边,单击 OpenID Endpoint Configuration 链接。
-
从
issuer
属性复制 URL。 在 RHTAS 的
SecureSign
资源的.spec.fulcio.config.OIDCIssuers
部分下,将 CLIENT_ID 替换为trusted-artifact-signer
,并粘贴 URL 内容来替换 RHBK_REALM_ISSUER_URL :语法
spec: ... fulcio: config: OIDCIssuers: - ClientID: CLIENT_ID Issuer: 'RHBK_REALM_ISSUER_URL' IssuerURL: 'RHBK_REALM_ISSUER_URL' Type: email ...
spec: ... fulcio: config: OIDCIssuers: - ClientID: CLIENT_ID Issuer: 'RHBK_REALM_ISSUER_URL' IssuerURL: 'RHBK_REALM_ISSUER_URL' Type: email ...
Copy to Clipboard Copied! Example
spec: ... fulcio: config: OIDCIssuers: - ClientID: trusted-artifact-signer Issuer: 'https://keycloak-ingress-keycloak-system.apps.openshift.example.com/realms/trusted-artifact-signer' IssuerURL: 'https://keycloak-ingress-keycloak-system.apps.openshift.example.com/realms/trusted-artifact-signer' Type: email ...
spec: ... fulcio: config: OIDCIssuers: - ClientID: trusted-artifact-signer Issuer: 'https://keycloak-ingress-keycloak-system.apps.openshift.example.com/realms/trusted-artifact-signer' IssuerURL: 'https://keycloak-ingress-keycloak-system.apps.openshift.example.com/realms/trusted-artifact-signer' Type: email ...
Copy to Clipboard Copied!
1.4.4. 将 Amazon STS 配置为 Trusted Artifact Signer 的 OpenID Connect 供应商
您可以将 Amazon 的安全令牌服务(STS)用作红帽受信任的工件签名程序(RHTAS)服务的 OpenID Connect (OIDC)供应商。您可以决定在RHAS 部署期间或稍后配置 Amazon STS。
您可以在同一配置中定义多个不同的 OIDC 供应商。
先决条件
- Red Hat OpenShift Container Platform 4.15 或更高版本。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 -
安装了
oc
、podman
和aws
二进制文件的工作站。 - 为 OpenShift 环境启用受管 Amazon Web Service (AWS)资源。
创建了一个具有完整权限的 Amazon Identity and Access Management (IAM)用户。这允许访问运行 IAM 操作。
- 为此用户创建访问密钥。
流程
在工作站上打开一个终端,并登录到 OpenShift:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
查找 AWS OIDC 供应商 URL:
Example
oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}'
oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}'
Copy to Clipboard Copied! 更新 RHTAS 配置。
打开以编辑
Securesign
资源:语法
oc edit Securesign NAME -n NAMESPACE
oc edit Securesign NAME -n NAMESPACE
Copy to Clipboard Copied! Example
oc edit Securesign securesign-sample -n trusted-artifact-signer
oc edit Securesign securesign-sample -n trusted-artifact-signer
Copy to Clipboard Copied! 注意您必须使用为 RHTAS 安装创建的项目名称作为命名空间。
在
OIDCIssuers
部分下,使用 AWS STS 客户端标识符、签发者的 URL 添加新子,并将Type
值设置为kubernetes
:Example
... OIDCIssuers: - Issuer: "https://example.s3.us-east-1.aws.com/47bd6cg0vs5nn01mue83fbof94dj4m9c" IssuerURL: "https://example.s3.us-east-1.aws.com/47bd6cg0vs5nn01mue83fbof94dj4m9c" ClientID: "trusted-artifact-signer" Type: kubernetes ...
... OIDCIssuers: - Issuer: "https://example.s3.us-east-1.aws.com/47bd6cg0vs5nn01mue83fbof94dj4m9c" IssuerURL: "https://example.s3.us-east-1.aws.com/47bd6cg0vs5nn01mue83fbof94dj4m9c" ClientID: "trusted-artifact-signer" Type: kubernetes ...
Copy to Clipboard Copied! - 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
输入您的访问密钥、secret 密钥、默认区域和输出格式来配置 AWS 命令行工具:
Example
aws configure
aws configure
Copy to Clipboard Copied! 设置以下环境变量:
Example
export account_id=$(aws sts get-caller-identity --query "Account" --output text) export oidc_provider="$(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}' | cut -d '/' -f3-)" export role_name=rhtas-sts export namespace=rhtas-sts export service_account=cosign-sts
export account_id=$(aws sts get-caller-identity --query "Account" --output text) export oidc_provider="$(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}' | cut -d '/' -f3-)" export role_name=rhtas-sts export namespace=rhtas-sts export service_account=cosign-sts
Copy to Clipboard Copied! 创建与新创建的 IAM 角色关联的信任策略:
Example
cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::${account_id}:oidc-provider/${oidc_provider}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "${oidc_provider}:aud": "trusted-artifact-signer" } } } ] } EOF
cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::${account_id}:oidc-provider/${oidc_provider}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "${oidc_provider}:aud": "trusted-artifact-signer" } } } ] } EOF
Copy to Clipboard Copied! 使用信任策略为 RHTAS 服务创建一个新的 IAM 角色:
Example
aws iam create-role --role-name rhtas-sts --assume-role-policy-document file://trust-relationship.json --description "Red Hat Trusted Artifact Signer STS Role"
aws iam create-role --role-name rhtas-sts --assume-role-policy-document file://trust-relationship.json --description "Red Hat Trusted Artifact Signer STS Role"
Copy to Clipboard Copied! 在启用了 STS 的 OpenShift 集群中,创建一个新项目命名空间:
语法
oc new-project NAMESPACE
oc new-project NAMESPACE
Copy to Clipboard Copied! Example
oc new-project rhtas-sts
oc new-project rhtas-sts
Copy to Clipboard Copied! 为假设 IAM 角色创建服务帐户,并在 OpenShift 项目命名空间中运行工作负载。
创建服务帐户清单:
Example
cat >service_account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: $service_account namespace: $namespace annotations: eks.amazonaws.com/role-arn: "arn:aws:iam::${account_id}:role/${role_name}" # optional: Defaults to "sts.amazonaws.com" if not set eks.amazonaws.com/audience: "trusted-artifact-signer" # optional: When "true", adds AWS_STS_REGIONAL_ENDPOINTS env var to containers eks.amazonaws.com/sts-regional-endpoints: "true" # optional: Defaults to 86400 for expirationSeconds if not set eks.amazonaws.com/token-expiration: "86400" EOF
cat >service_account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: $service_account namespace: $namespace annotations: eks.amazonaws.com/role-arn: "arn:aws:iam::${account_id}:role/${role_name}" # optional: Defaults to "sts.amazonaws.com" if not set eks.amazonaws.com/audience: "trusted-artifact-signer" # optional: When "true", adds AWS_STS_REGIONAL_ENDPOINTS env var to containers eks.amazonaws.com/sts-regional-endpoints: "true" # optional: Defaults to 86400 for expirationSeconds if not set eks.amazonaws.com/token-expiration: "86400" EOF
Copy to Clipboard Copied! 将服务帐户清单应用到 OpenShift:
Example
oc apply -f service_account.yaml
oc apply -f service_account.yaml
Copy to Clipboard Copied!
创建新的部署工作负载,以便在镜像 registry 中签名容器镜像。
创建部署清单:
Example
cat >deployment.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: cosign-sts namespace: ${namespace} spec: selector: matchLabels: app: cosign-sts template: metadata: labels: app: cosign-sts spec: securityContext: runAsNonRoot: true serviceAccountName: cosign-sts containers: - args: - -c - env; cosign initialize --mirror=\$COSIGN_MIRROR --root=\$COSIGN_ROOT; while true; do sleep 86400; done command: - /bin/sh name: cosign image: registry.redhat.io/rhtas-tech-preview/cosign-rhel9@sha256:f4c2cec3fc1e24bbe094b511f6fe2fe3c6fa972da0edacaf6ac5672f06253a3e pullPolicy: IfNotPresent env: - name: AWS_ROLE_SESSION_NAME value: signer-identity-session - name: AWS_REGION value: us-east-1 - name: OPENSHIFT_APPS_SUBDOMAIN value: $(oc get cm -n openshift-config-managed console-public -o go-template="{{ .data.consoleURL }}" | sed 's@https://@@; s/^[^.]*\.//') - name: OIDC_AUTHENTICATION_REALM value: "trusted-artifact-signer" - name: COSIGN_FULCIO_URL value: $(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_OIDC_ISSUER value: $(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}') - name: COSIGN_CERTIFICATE_OIDC_ISSUER value: $(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}') - name: COSIGN_REKOR_URL value: $(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_MIRROR value: $(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_ROOT value: "$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer)/root.json" - name: COSIGN_YES value: "true" securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: runAsNonRoot: true serviceAccount: ${service_account} serviceAccountName: ${service_account} terminationGracePeriodSeconds: 30 EOF
cat >deployment.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: cosign-sts namespace: ${namespace} spec: selector: matchLabels: app: cosign-sts template: metadata: labels: app: cosign-sts spec: securityContext: runAsNonRoot: true serviceAccountName: cosign-sts containers: - args: - -c - env; cosign initialize --mirror=\$COSIGN_MIRROR --root=\$COSIGN_ROOT; while true; do sleep 86400; done command: - /bin/sh name: cosign image: registry.redhat.io/rhtas-tech-preview/cosign-rhel9@sha256:f4c2cec3fc1e24bbe094b511f6fe2fe3c6fa972da0edacaf6ac5672f06253a3e pullPolicy: IfNotPresent env: - name: AWS_ROLE_SESSION_NAME value: signer-identity-session - name: AWS_REGION value: us-east-1 - name: OPENSHIFT_APPS_SUBDOMAIN value: $(oc get cm -n openshift-config-managed console-public -o go-template="{{ .data.consoleURL }}" | sed 's@https://@@; s/^[^.]*\.//') - name: OIDC_AUTHENTICATION_REALM value: "trusted-artifact-signer" - name: COSIGN_FULCIO_URL value: $(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_OIDC_ISSUER value: $(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}') - name: COSIGN_CERTIFICATE_OIDC_ISSUER value: $(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}') - name: COSIGN_REKOR_URL value: $(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_MIRROR value: $(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) - name: COSIGN_ROOT value: "$(oc get tuf -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer)/root.json" - name: COSIGN_YES value: "true" securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: runAsNonRoot: true serviceAccount: ${service_account} serviceAccountName: ${service_account} terminationGracePeriodSeconds: 30 EOF
Copy to Clipboard Copied! 将部署清单应用到 OpenShift:
Example
oc apply -f deployment.yaml
oc apply -f deployment.yaml
Copy to Clipboard Copied!
创建测试容器镜像以签名。
创建一个空容器镜像:
Example
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 将空容器镜像推送到
ttl.sh
临时 registry:Example
podman push ttl.sh/rhtas/test-image:1h
podman push ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 删除临时 Docker 文件:
Example
rm ./tmp.Dockerfile
rm ./tmp.Dockerfile
Copy to Clipboard Copied!
通过签名和验证测试容器镜像来验证配置。
在正在运行的 pod 中打开远程 shell 会话:
语法
oc rsh -n NAMESPACE deployment/cosign-sts env IMAGE=IMAGE_NAME:TAG /bin/sh
oc rsh -n NAMESPACE deployment/cosign-sts env IMAGE=IMAGE_NAME:TAG /bin/sh
Copy to Clipboard Copied! Example
oc rsh -n rhtas-sts deployment/cosign-sts env IMAGE=ttl.sh/rhtas/test-image:1h /bin/sh
oc rsh -n rhtas-sts deployment/cosign-sts env IMAGE=ttl.sh/rhtas/test-image:1h /bin/sh
Copy to Clipboard Copied! 为容器镜像签名:
Example
cosign sign -y --identity-token=$(cat $AWS_WEB_IDENTITY_TOKEN_FILE) ttl.sh/rhtas/test-image:1h
cosign sign -y --identity-token=$(cat $AWS_WEB_IDENTITY_TOKEN_FILE) ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 验证签名的容器镜像:
Example
cosign verify --certificate-identity=https://kubernetes.io/namespaces/$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)/serviceaccounts/cosign-sts --certificate-oidc-issuer=$COSIGN_CERTIFICATE_OIDC_ISSUER ttl.sh/rhtas/test-image:1h
cosign verify --certificate-identity=https://kubernetes.io/namespaces/$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)/serviceaccounts/cosign-sts --certificate-oidc-issuer=$COSIGN_CERTIFICATE_OIDC_ISSUER ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied!
1.4.5. 将 GitHub 配置为 Trusted Artifact Signer 的 OpenID Connect 供应商
当使用红帽单点登录(SSO)服务作为 Red Hat Trusted Artifact Signer (RHTAS)服务的 OpenID Connect (OIDC)服务时,您可以使用 GitHub OAuth 2.0。此流程指导您将 GitHub OAuth 与 OpenShift 上的现有 Red Hat SSO 部署集成。
您可以在同一配置中定义多个不同的 OIDC 供应商。
先决条件
- Red Hat OpenShift Container Platform 4.15 或更高版本。
- 正在运行的 Red Hat SSO 实例。
-
安装了
oc
二进制文件的工作站。 创建 GitHub OAuth 应用,并在注册应用后记录客户端标识符和机密值。
重要在注册新的 GitHub OAuth 应用程序时,您必须指定 Homepage URL 和 Authorization 回调 URL。为这两个字段输入占位符值,例如
https://localhost:8080
。稍后,您将使用这些字段的预期值修改 GitHub OAuth 应用程序。
流程
在工作站上打开一个终端,并登录到 OpenShift:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
登录到 Red Hat SSO 控制台。
从命令行查找 Red Hat SSO 控制台 URL:
Example
oc get routes -n keycloak-system keycloak -o jsonpath='https://{.spec.host}'
oc get routes -n keycloak-system keycloak -o jsonpath='https://{.spec.host}'
Copy to Clipboard Copied! - 将 Red Hat SSO 控制台 URL 复制并粘贴到您的 Web 浏览器中。
- 单击 Administration Console。
从命令行检索
admin
密码:Example
oc get secret/credential-keycloak -n keycloak-system -o jsonpath='{ .data.ADMIN_PASSWORD }' | base64 -d
oc get secret/credential-keycloak -n keycloak-system -o jsonpath='{ .data.ADMIN_PASSWORD }' | base64 -d
Copy to Clipboard Copied! 复制此命令的输出。
-
在 Web 浏览器中,以
admin
用户身份登录,并将密码粘贴到对应的字段中。点 Sign In 按钮。
- 从导航菜单的下拉菜单中选择您的域。
添加 GitHub 身份提供程序。
- 在导航菜单中点 Identity Providers。
- 在 Add provider… 下拉菜单中选择 GitHub。
- 将 GitHub OAuth 客户端标识符添加到 客户端 ID 字段。
- 将 GitHub OAuth 客户端 secret 添加到 Client Secret 字段中。
- 打开 Trust Email 选项。
- 点 Save 按钮。
将身份提供程序映射程序添加到新创建的身份提供程序。
- 点 Mapper 选项卡。
- 点 Create 按钮。
- 为新映射程序指定 Name。
- 将 Mapper Type 更改为 Hardcoded Attribute。
-
将 User Attribute 字段设置为
emailVerified
。 -
将 User Attribute Value 字段设置为
true
。 - 点 Save 按钮。
-
在 GitHub Identity Provider Settings 页面中,复制 Redirect URI 值,并将它粘贴到 GitHub OAuth 应用 授权回调 URL 字段。另外,将此值粘贴到 Homepage URL 字段中,但删除 URL 字符串的
broker/github/endpoint
部分。 - 单击 Update Application。现在,您可以使用 GitHub 作为 OIDC 供应商为 提交 签名。https://docs.redhat.com/en/documentation/red_hat_trusted_artifact_signer/1/html/deployment_guide/verify_the_trusted_artifact_signer_service_installation#signing-and-verifying-containers-by-using-cosign-from-the-command-line-interface_deploy
- 在签名工件时,会打开网页浏览器并提示您登录到 Red Hat SSO 帐户。点 GitHub 按钮使用您的凭证登录。
- 单击 Authorize 按钮,以启用 GitHub 用户详情,以供 Red Hat SSO 访问。
1.4.6. 将 Microsoft Entra ID 配置为 Trusted Artifact Signer 的 OpenID Connect 供应商
对于红帽的 Trusted Artifact Signer (RHTAS)服务,您可以使用 Microsoft Entra ID 作为 OpenID Connect (OIDC)供应商。您可以决定在 RHTAS 部署期间或稍后配置 Microsoft Entra ID。
将 Microsoft Entra ID 与 RHTAS 集成不需要订阅。
您可以在同一配置中定义多个不同的 OIDC 供应商。
先决条件
- Red Hat OpenShift Container Platform 4.15 或更高版本。
- 具有创建资源的 Microsoft Azure 帐户。
- 用于用户签名工件的 Azure 验证的电子邮件地址。
- 访问 Microsoft Azure 命令行界面。
-
安装了
oc
、cosign
、podman
和az
二进制文件的工作站。
流程
- 在工作站上打开一个终端。
在 Microsoft Entra ID 中创建代表客户端的 App Registration:
Example
export RHTAS_APP_REGISTRATION=$(az ad app create --display-name=rhtas --web-redirect-uris=http://localhost:0/auth/callback --enable-id-token-issuance --query appId -o tsv)
export RHTAS_APP_REGISTRATION=$(az ad app create --display-name=rhtas --web-redirect-uris=http://localhost:0/auth/callback --enable-id-token-issuance --query appId -o tsv)
Copy to Clipboard Copied! 创建一个新的客户端 secret,允许用户使用 App Registration 获取 ID 令牌:
Example
export RHTAS_APP_REGISTRATION_CLIENT_SECRET=$(az ad app credential reset --id=$RHTAS_APP_REGISTRATION --display-name="RHTAS Client Secret" -o tsv --query 'password')
export RHTAS_APP_REGISTRATION_CLIENT_SECRET=$(az ad app credential reset --id=$RHTAS_APP_REGISTRATION --display-name="RHTAS Client Secret" -o tsv --query 'password')
Copy to Clipboard Copied! 注意默认情况下,客户端 secret 仅在一年内有效。您可以使用
-
的标记自定义这个值。年
或日期创建新的 Claim Mapping Policy 以定义一个名为
email_verified
的新 JWT 声明,使用静态值true
:Example
az rest -m post --headers Content-Type=application/json --uri https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies --body '{"definition": ["{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\", \"ClaimsSchema\":[{\"value\":\"true\",\"JwtClaimType\":\"email_verified\"}]}}"],"displayName": "EmailVerified"}'
az rest -m post --headers Content-Type=application/json --uri https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies --body '{"definition": ["{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\", \"ClaimsSchema\":[{\"value\":\"true\",\"JwtClaimType\":\"email_verified\"}]}}"],"displayName": "EmailVerified"}'
Copy to Clipboard Copied! 获取 App Registration 对象标识符:
Example
export RHTAS_APP_REGISTRATION_OBJ_ID=$(az ad app show --id $RHTAS_APP_REGISTRATION --output tsv --query id)
export RHTAS_APP_REGISTRATION_OBJ_ID=$(az ad app show --id $RHTAS_APP_REGISTRATION --output tsv --query id)
Copy to Clipboard Copied! 更新 App Registration 清单:
Example
az rest --method PATCH --uri https://graph.microsoft.com/v1.0/applications/${RHTAS_APP_REGISTRATION_OBJ_ID} --headers 'Content-Type=application/json' --body "{\"api\":{\"acceptMappedClaims\":true}}"
az rest --method PATCH --uri https://graph.microsoft.com/v1.0/applications/${RHTAS_APP_REGISTRATION_OBJ_ID} --headers 'Content-Type=application/json' --body "{\"api\":{\"acceptMappedClaims\":true}}"
Copy to Clipboard Copied! 创建新 Service Principal 并将其与 App Registration 关联:
Example
export SERVICE_PRINCIPAL_ID=$(az ad sp create --id=${RHTAS_APP_REGISTRATION} -o tsv --query 'id')
export SERVICE_PRINCIPAL_ID=$(az ad sp create --id=${RHTAS_APP_REGISTRATION} -o tsv --query 'id')
Copy to Clipboard Copied! 获取 Claim Mapping Policy 标识符:
Example
export CLAIM_MAPPING_POLICY_ID=$(az rest --uri https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies -o tsv --query "value[?displayName=='EmailVerified'] | [0].id")
export CLAIM_MAPPING_POLICY_ID=$(az rest --uri https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies -o tsv --query "value[?displayName=='EmailVerified'] | [0].id")
Copy to Clipboard Copied! 将 Claim Mapping Policy 与 Service Principal 关联:
Example
az rest -m post --headers Content-Type=application/json --uri "https://graph.microsoft.com/v1.0/servicePrincipals/${SERVICE_PRINCIPAL_ID}/claimsMappingPolicies/\$ref" --body "{\"@odata.id\": \"https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies/${CLAIM_MAPPING_POLICY_ID}\"}"
az rest -m post --headers Content-Type=application/json --uri "https://graph.microsoft.com/v1.0/servicePrincipals/${SERVICE_PRINCIPAL_ID}/claimsMappingPolicies/\$ref" --body "{\"@odata.id\": \"https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies/${CLAIM_MAPPING_POLICY_ID}\"}"
Copy to Clipboard Copied! 获取租户标识符:
Example
export TENANT_ID=$(az account show -o tsv --query tenantId)
export TENANT_ID=$(az account show -o tsv --query tenantId)
Copy to Clipboard Copied! 获取 OIDC 端点:
Example
export ENTRA_ID_OIDC_ENDPOINT=$(echo https://login.microsoftonline.com/${TENANT_ID}/v2.0)
export ENTRA_ID_OIDC_ENDPOINT=$(echo https://login.microsoftonline.com/${TENANT_ID}/v2.0)
Copy to Clipboard Copied! 更新 RHTAS 配置。
打开以编辑
Securesign
资源:语法
oc edit Securesign NAME -n NAMESPACE
oc edit Securesign NAME -n NAMESPACE
Copy to Clipboard Copied! Example
oc edit Securesign securesign-sample -n trusted-artifact-signer
oc edit Securesign securesign-sample -n trusted-artifact-signer
Copy to Clipboard Copied! 注意您必须使用为 RHTAS 安装创建的项目名称作为命名空间。
在
OIDCIssuers
部分下,使用客户端标识符、签发者 URL 添加新小节,并将Type
值设置为email
:语法
... OIDCIssuers: - Issuer: "${ENTRA_ID_OIDC_ENDPOINT}" IssuerURL: "${ENTRA_ID_OIDC_ENDPOINT}" ClientID: "${RHTAS_APP_REGISTRATION}" Type: email ...
... OIDCIssuers: - Issuer: "${ENTRA_ID_OIDC_ENDPOINT}" IssuerURL: "${ENTRA_ID_OIDC_ENDPOINT}" ClientID: "${RHTAS_APP_REGISTRATION}" Type: email ...
Copy to Clipboard Copied! - 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
创建本地客户端 secret 文件:
Example
echo $RHTAS_APP_REGISTRATION_CLIENT_SECRET > rhtas-entra-id-client-secret
echo $RHTAS_APP_REGISTRATION_CLIENT_SECRET > rhtas-entra-id-client-secret
Copy to Clipboard Copied! 为签名工件配置 shell 环境:
Example
export TUF_URL=$(oc get tuf -n trusted-artifact-signer -o jsonpath='{.items[0].status.url}') export OIDC_ISSUER_URL=$(oc get securesign -n trusted-artifact-signer rhtas -o jsonpath='{ .spec.fulcio.config.OIDCIssuers[0].Issuer }') export COSIGN_REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID=$RHTAS_APP_REGISTRATION export SIGSTORE_OIDC_CLIENT_ID=$COSIGN_OIDC_CLIENT_ID export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export COSIGN_FULCIO_URL=$(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export COSIGN_OIDC_CLIENT_SECRET_FILE=$(pwd)/rhtas-entra-id-client-secret
export TUF_URL=$(oc get tuf -n trusted-artifact-signer -o jsonpath='{.items[0].status.url}') export OIDC_ISSUER_URL=$(oc get securesign -n trusted-artifact-signer rhtas -o jsonpath='{ .spec.fulcio.config.OIDCIssuers[0].Issuer }') export COSIGN_REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID=$RHTAS_APP_REGISTRATION export SIGSTORE_OIDC_CLIENT_ID=$COSIGN_OIDC_CLIENT_ID export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export COSIGN_FULCIO_URL=$(oc get fulcio -o jsonpath='{.items[0].status.url}' -n trusted-artifact-signer) export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export COSIGN_OIDC_CLIENT_SECRET_FILE=$(pwd)/rhtas-entra-id-client-secret
Copy to Clipboard Copied! 初始化本地机器以签名:
Example
cosign initialize
$ cosign initialize
Copy to Clipboard Copied! 通过签名测试容器镜像来验证更新的配置。
创建一个空容器镜像:
Example
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 将空容器镜像推送到
ttl.sh
临时 registry:Example
podman push ttl.sh/rhtas/test-image:1h
podman push ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 删除临时 Docker 文件:
Example
rm ./tmp.Dockerfile
rm ./tmp.Dockerfile
Copy to Clipboard Copied! 为容器镜像签名:
语法
cosign sign -y --oidc-client-secret-file=SECRET_FILE IMAGE_NAME:TAG
cosign sign -y --oidc-client-secret-file=SECRET_FILE IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign sign -y --oidc-client-secret-file=rhtas-entra-id-client-secret ttl.sh/rhtas/test-image:1h
cosign sign -y --oidc-client-secret-file=rhtas-entra-id-client-secret ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。
1.5. 为 Trusted Artifact Signer 配置替代数据库
您可以将 Trillian 的 Red Hat Trusted Artifact Signer (RHTAS)默认数据库替换为外部管理的 MariaDB 数据库实例。数据库实例可以是云托管的数据库提供程序,如 Amazon 的 Relational Database Service (RDS),或者在 OpenShift 中自己的数据库部署。
1.5.1. 先决条件
- Red Hat OpenShift Container Platform 版本 4.13、4.14 或 4.15。
1.5.2. 为受信任的工件签名程序配置 Amazon RDS
使用这个流程,您可以将红帽的 Trusted Artifact Signer (RHTAS)默认数据库替换为 Amazon 的 Relational Database Service (RDS)管理的 MariaDB 实例。
红帽建议在生产环境中使用高可用性 MariaDB 数据库。
先决条件
- 可访问 Amazon RDS 控制台的 Amazon Web Service (AWS)帐户。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 -
安装了
oc
、curl
和mysql
二进制文件的工作站。 - 具有特权的命令行访问权限,以创建数据库并填充 MariaDB 实例。
流程
打开 Amazon RDS 控制台,并创建一个新的 MariaDB 实例。
- 等待 MariaDB 实例部署好,并且可用。
从您的工作站,通过提供区域端点、端口和用户凭证来登录到新数据库:
语法
mysql -h REGIONAL_ENDPOINT -P 3306 -u USER_NAME -p
mysql -h REGIONAL_ENDPOINT -P 3306 -u USER_NAME -p
Copy to Clipboard Copied! Example
mysql -h exampledb.1234.us-east-1.rds.amazonaws.com -P 3306 -u admin -p
mysql -h exampledb.1234.us-east-1.rds.amazonaws.com -P 3306 -u admin -p
Copy to Clipboard Copied! 创建名为 trillian 的新数据库:
Example
create database trillian;
create database trillian;
Copy to Clipboard Copied! 切换到新创建的数据库:
Example
use trillian;
use trillian;
Copy to Clipboard Copied! 创建名为
trillian
的新数据库用户,并为新创建的用户设置 PASSWORD :语法
CREATE USER trillian@'%' IDENTIFIED BY 'PASSWORD'; GRANT ALL PRIVILEGES ON trillian.* TO 'trillian'@'%'; FLUSH PRIVILEGES;
CREATE USER trillian@'%' IDENTIFIED BY 'PASSWORD'; GRANT ALL PRIVILEGES ON trillian.* TO 'trillian'@'%'; FLUSH PRIVILEGES;
Copy to Clipboard Copied! 断开与数据库的连接:
Example
EXIT
EXIT
Copy to Clipboard Copied! 下载数据库配置文件:
Example
curl -o dbconfig.sql https://raw.githubusercontent.com/securesign/trillian/main/storage/mysql/schema/storage.sql
curl -o dbconfig.sql https://raw.githubusercontent.com/securesign/trillian/main/storage/mysql/schema/storage.sql
Copy to Clipboard Copied! 将数据库配置应用到新数据库:
语法
mysql -h FQDN_or_SERVICE_ADDR -P 3306 -u USER_NAME -p PASSWORD -D DB_NAME < PATH_TO_CONFIG_FILE
mysql -h FQDN_or_SERVICE_ADDR -P 3306 -u USER_NAME -p PASSWORD -D DB_NAME < PATH_TO_CONFIG_FILE
Copy to Clipboard Copied! Example
mysql -h rhtasdb.example.com -P 3306 -u trillian -p mypassword123 -D trillian < dbconfig.sql
mysql -h rhtasdb.example.com -P 3306 -u trillian -p mypassword123 -D trillian < dbconfig.sql
Copy to Clipboard Copied! 在工作站上打开一个终端,并登录到 OpenShift:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
创建一个新的 Secret,其中包含之前创建的 MariaDB 实例中 Trillian 数据库的凭证:
语法
oc create secret generic OBJECT_NAME \ --from-literal=mysql-database=trillian \ --from-literal=mysql-host=FQDN_or_SERVICE_ADDR \ --from-literal=mysql-password=PASSWORD \ --from-literal=mysql-port=3306 \ --from-literal=mysql-root-password=PASSWORD \ --from-literal=mysql-user=USER_NAME
oc create secret generic OBJECT_NAME \ --from-literal=mysql-database=trillian \ --from-literal=mysql-host=FQDN_or_SERVICE_ADDR \ --from-literal=mysql-password=PASSWORD \ --from-literal=mysql-port=3306 \ --from-literal=mysql-root-password=PASSWORD \ --from-literal=mysql-user=USER_NAME
Copy to Clipboard Copied! Example
oc create secret generic trillian-mysql \ --from-literal=mysql-database=trillian \ --from-literal=mysql-host=mariadb.trusted-artifact-signer.svc.cluster.local \ --from-literal=mysql-password=mypassword123 \ --from-literal=mysql-port=3306 \ --from-literal=mysql-root-password=myrootpassword123 \ --from-literal=mysql-user=trillian
oc create secret generic trillian-mysql \ --from-literal=mysql-database=trillian \ --from-literal=mysql-host=mariadb.trusted-artifact-signer.svc.cluster.local \ --from-literal=mysql-password=mypassword123 \ --from-literal=mysql-port=3306 \ --from-literal=mysql-root-password=myrootpassword123 \ --from-literal=mysql-user=trillian
Copy to Clipboard Copied! 您可以将 OpenShift 内部服务名称用于 MariaDB 实例。
- 现在,您可以部署 Trusted Artifact Signer 服务来使用此数据库。如果您遵循 Trusted Artifact Signer 安装过程,您可以 继续下一步。
1.5.3. 在 OpenShift 中为受信任的工件签名程序配置数据库
使用这个流程,您可以将红帽的 Trusted Artifact Signer (RHTAS)默认数据库替换为 Amazon 的 Relational Database Service (RDS)管理的 MariaDB 实例。
红帽建议在生产环境中使用高可用性 MariaDB 数据库。
先决条件
- 创建 OpenShift 项目的权限,并从 OpenShift 示例目录部署数据库实例。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 -
安装了
oc
、curl
和mysql
二进制文件的工作站。 - 具有特权的命令行访问权限,以创建数据库并填充 MariaDB 实例。
流程
- 登录到您要部署 RHTAS 服务的 OpenShift Web 控制台:
- 进入 Developer 视角。
如果项目已存在,选择
trusted-artifact-signer
项目,否则为数据库创建一个新项目:- 若要创建新项目,请单击下拉菜单,再 单击创建项目按钮。
-
将新项目命名为
trusted-artifact-signer
,然后点 Create 按钮。
- 在 Developer Catalog 卡上,单击 Database。
选择 MariaDB,然后单击 Instantiate Template 按钮。
重要不要选择 MariaDB (Ephemeral)。
在 Instantiate Template 页面中,配置以下字段:
-
在 MariaDB Database Name 字段中,输入
trillian
。 -
在 Volume Capacity 字段中,输入
5Gi
。 - 点 Create 按钮。
-
在 MariaDB Database Name 字段中,输入
开始远程 shell 会话:
- 在 Topology 页面中,选择 MariaDB pod 会打开一个侧面板,点 Resources 选项卡。
- 在 Pods 部分下,点 MariaDB pod 名称。
- 点 Terminal 选项卡启动到 MariaDB pod 的远程 shell 会话。
在远程 shell 会话中,验证您可以连接到 Trillian 数据库:
Example
mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -D$MYSQL_DATABASE
$ mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -D$MYSQL_DATABASE
Copy to Clipboard Copied! 注意凭据通过服务名称(
mariadb
)存储在机密对象中,包含数据库的名称和用户名,以及数据库 root 密码。记录这些凭证,因为稍后在创建数据库 secret 对象时将使用这些凭证。断开与数据库的连接:
Example
EXIT
EXIT
Copy to Clipboard Copied! 下载数据库配置文件:
Example
curl -o dbconfig.sql https://raw.githubusercontent.com/securesign/trillian/main/storage/mysql/schema/storage.sql
curl -o dbconfig.sql https://raw.githubusercontent.com/securesign/trillian/main/storage/mysql/schema/storage.sql
Copy to Clipboard Copied! 将数据库配置应用到新数据库:
语法
mysql -h FQDN_or_SERVICE_ADDR -P 3306 -u USER_NAME -p PASSWORD -D DB_NAME < PATH_TO_CONFIG_FILE
mysql -h FQDN_or_SERVICE_ADDR -P 3306 -u USER_NAME -p PASSWORD -D DB_NAME < PATH_TO_CONFIG_FILE
Copy to Clipboard Copied! Example
mysql -h rhtasdb.example.com -P 3306 -u trillian -p mypassword123 -D trillian < dbconfig.sql
mysql -h rhtasdb.example.com -P 3306 -u trillian -p mypassword123 -D trillian < dbconfig.sql
Copy to Clipboard Copied! 在工作站上打开一个终端,并登录到 OpenShift:
语法
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
Copy to Clipboard Copied! Example
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
Copy to Clipboard Copied! 注意您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
创建一个新的 Secret,其中包含之前创建的 MariaDB 实例中 Trillian 数据库的凭证:
语法
oc create secret generic OBJECT_NAME \ --from-literal=mysql-database=trillian \ --from-literal=mysql-host=FQDN_or_SERVICE_ADDR \ --from-literal=mysql-password=PASSWORD \ --from-literal=mysql-port=3306 \ --from-literal=mysql-root-password=PASSWORD \ --from-literal=mysql-user=USER_NAME
oc create secret generic OBJECT_NAME \ --from-literal=mysql-database=trillian \ --from-literal=mysql-host=FQDN_or_SERVICE_ADDR \ --from-literal=mysql-password=PASSWORD \ --from-literal=mysql-port=3306 \ --from-literal=mysql-root-password=PASSWORD \ --from-literal=mysql-user=USER_NAME
Copy to Clipboard Copied! Example
oc create secret generic trillian-mysql \ --from-literal=mysql-database=trillian \ --from-literal=mysql-host=mariadb.trusted-artifact-signer.svc.cluster.local \ --from-literal=mysql-password=mypassword123 \ --from-literal=mysql-port=3306 \ --from-literal=mysql-root-password=myrootpassword123 \ --from-literal=mysql-user=trillian
oc create secret generic trillian-mysql \ --from-literal=mysql-database=trillian \ --from-literal=mysql-host=mariadb.trusted-artifact-signer.svc.cluster.local \ --from-literal=mysql-password=mypassword123 \ --from-literal=mysql-port=3306 \ --from-literal=mysql-root-password=myrootpassword123 \ --from-literal=mysql-user=trillian
Copy to Clipboard Copied! 您可以将 OpenShift 内部服务名称用于 MariaDB 实例。
- 现在,您可以部署 Trusted Artifact Signer 服务来使用此数据库。如果您遵循 Trusted Artifact Signer 安装过程,您可以 继续下一步。
1.6. 配置 OpenShift 服务服务证书,以便为 Keycloak 生成 TLS 证书
OpenShift 的服务服务证书可以自动生成和管理传输层安全(TLS)证书,供 Keycloak 使用。OpenShift 集群内的基础架构组件(如 Ingress Controller)将信任这些 TLS 证书。
先决条件
- Red Hat OpenShift Container Platform 4.15 或更高版本。
- 安装 RHBK 操作器.
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。
流程
- 在 OpenShift Web 控制台中,从 Administrator 视角中,从导航菜单中展开 Home,再单击 Projects。
-
搜索
keycloak
,然后选择keycloak-system
命名空间。 创建新服务。
- 点 + 图标。
在 Import YAML 文本框中,复制示例,并将它粘贴到文本框中。
Example
apiVersion: v1 kind: Service metadata: annotations: service.beta.openshift.io/serving-cert-secret-name: keycloak-tls labels: app: keycloak app.kubernetes.io/instance: keycloak name: keycloak-service-trusted namespace: keycloak-system spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: https port: 8443 selector: app: keycloak app.kubernetes.io/instance: keycloak
apiVersion: v1 kind: Service metadata: annotations: service.beta.openshift.io/serving-cert-secret-name: keycloak-tls labels: app: keycloak app.kubernetes.io/instance: keycloak name: keycloak-service-trusted namespace: keycloak-system spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: https port: 8443 selector: app: keycloak app.kubernetes.io/instance: keycloak
Copy to Clipboard Copied! - 点 Create 按钮。
- 从导航菜单中展开 Operators,点 Installed Operators,然后点 Keycloak Operator。
在
Keycloak
资源的 YAML 视图中,在spec
部分添加ingress
属性:Example
spec: ... ingress: annotations: route.openshift.io/destination-ca-certificate-secret: keycloak-tls route.openshift.io/termination: reencrypt ...
spec: ... ingress: annotations: route.openshift.io/destination-ca-certificate-secret: keycloak-tls route.openshift.io/termination: reencrypt ...
Copy to Clipboard Copied! 默认情况下,Keycloak operator 创建 Ingress 资源而不是路由。OpenShift 根据 Ingress 定义自动创建路由。
在
spec
部分下指定包含 TLS 证书的 secret 名称:Example
spec: ... http: tlsSecret: keycloak-tls ...
spec: ... http: tlsSecret: keycloak-tls ...
Copy to Clipboard Copied! 一旦 Keycloak 启动后,OpenShift 的服务服务证书将开始为 Keycloak 生成 TLS 证书。
1.7. 自动生成 Keycloak 主机名
OpenShift 路由支持使用集合模式自动生成主机名。此功能可以与红帽构建的 Keycloak (RHBK) operator 集成。
先决条件
- Red Hat OpenShift Container Platform 4.15 或更高版本。
- 安装 RHBK 操作器.
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 -
安装了
oc
二进制文件的工作站。
流程
启用自动生成的路由主机名功能。
在
.spec
部分下,删除整个hostname
部分,并将其替换为Keycloak
资源中的ingress
部分和className
属性:Example
spec: ... hostname: hostname: example.com ...
spec: ... hostname: hostname: example.com ...
Copy to Clipboard Copied! Example
spec: ... ingress: className: openshift-default ...
spec: ... ingress: className: openshift-default ...
Copy to Clipboard Copied! 注意要查看所有可用的 Ingress 类,请运行以下命令:
oc get ingressclass
oc get ingressclass
Copy to Clipboard Copied! - 点 Save 按钮。
点 Reload 按钮查看最新配置来验证自动生成的
主机名
:Example
spec: ... hostname: hostname: example-keycloak-ingress-keycloak-system.apps.rhtas.example.com ...
spec: ... hostname: hostname: example-keycloak-ingress-keycloak-system.apps.rhtas.example.com ...
Copy to Clipboard Copied!
第 2 章 Red Hat Enterprise Linux
2.1. 使用 Ansible 安装 Trusted Artifact Signer
您可以使用红帽提供的 Ansible Playbook 在 Red Hat Enterprise Linux 上安装 Red Hat Trusted Artifact Signer (RHTAS)。此部署为您提供了使用 Keycloak 作为 OpenID Connect (OIDC)供应商的基本签名框架。
红帽建议不要在生产环境中使用 Ansible 日志记录详细或调试模式。
有关更多信息,请参阅 Ansible 文档。
先决条件
- Red Hat Enterprise Linux 9.4 或更高版本。
- 用于访问 Red Hat Hybrid Cloud 控制台的红帽用户帐户。
流程
- 使用您的红帽凭证登录到 Red Hat Hybrid Cloud Console。
- 在主页中,点 Services 下拉菜单,然后点 Red Hat Ansible Automation Platform。
- 在导航菜单中展开 Automation Hub,然后点 Collections。
- 在搜索字段中,键入 rhtas 并按 enter。
- 点 Red Hat Trusted Artifact Signer 标题上的 artifact_signer 链接。
单击 Documentation 选项卡,然后按照以下步骤在 Red Hat Enterprise Linux 上完成 RHTAS 安装。
注意有关所有配置参数的详细概述,请单击 Roles 部分下的 tas_single_node 链接。
2.2. 验证 Trusted Artifact Signer 安装
作为系统管理员,您可以验证在 Red Hat Enterprise Linux 上运行的 Red Hat Trusted Artifact Signer (RHTAS)的部署是否成功。
您可以签署测试容器镜像,并验证该签名的真实性,以验证您环境中的 RHTAS 部署。
可以通过两种方式从代码管道验证构建工件。您可以使用 cosign
和 gitsign
签署和验证,但只能使用企业合同进行验证。
2.2.1. 使用命令行界面使用 Cosign 签名和验证容器
通过 cosign
工具,您可以使用红帽的Trusted Artifact Signer (RHTAS)服务签名和验证开放容器项目(OCI)容器镜像以及其他构建工件。
对于 RHTAS,您必须使用 cosign
版本 2.2 或更高版本。
先决条件
- 在 Red Hat Enterprise Linux 9.4 或更高版本上运行的 RHTAS 安装由 Ansible 管理。
-
安装了
podman
二进制文件的工作站。
流程
从本地命令行界面(CLI)工具下载
cosign
二进制文件到您的工作站。注意URL 地址是由
tas_single_node_base_hostname
变量定义的配置的节点。一个 URL 地址示例应为https://cli-server.example.com
,它赋予tas_single_node_base_hostname
值,如example.com
。- 在下载页面中,进入 cosign 下载部分,然后点击您的平台的链接。
在工作站上打开一个终端,解压缩二进制
.gz
文件,并设置执行位:Example
gunzip cosign-amd64.gz chmod +x cosign-amd64
gunzip cosign-amd64.gz chmod +x cosign-amd64
Copy to Clipboard Copied! 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv cosign-amd64 /usr/local/bin/cosign
sudo mv cosign-amd64 /usr/local/bin/cosign
Copy to Clipboard Copied!
配置 shell 环境,以执行容器镜像签名和验证。
Example
export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE export TUF_URL="https://tuf.${BASE_HOSTNAME}" export OIDC_ISSUER_URL=OIDC_ISSUER_URL export COSIGN_FULCIO_URL="https://fulcio.${BASE_HOSTNAME}" export COSIGN_REKOR_URL="https://rekor.${BASE_HOSTNAME}" export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE export TUF_URL="https://tuf.${BASE_HOSTNAME}" export OIDC_ISSUER_URL=OIDC_ISSUER_URL export COSIGN_FULCIO_URL="https://fulcio.${BASE_HOSTNAME}" export COSIGN_REKOR_URL="https://rekor.${BASE_HOSTNAME}" export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
Copy to Clipboard Copied! 将 BASE_HOSTNAME_OF_RHTAS_SERVICE 替换为
tas_single_node_base_hostname 的
变量的值,并将 OIDC_ISSUER_URL 替换为您的 OpenID Connect (OIDC)供应商 URL 字符串。初始化更新框架(TUF)系统:
Example
cosign initialize
cosign initialize
Copy to Clipboard Copied! 为测试容器镜像签名。
创建一个空容器镜像:
Example
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 将空容器镜像推送到
ttl.sh
临时 registry:Example
podman push ttl.sh/rhtas/test-image:1h
podman push ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 为容器镜像签名:
语法
cosign sign -y IMAGE_NAME:TAG
cosign sign -y IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign sign -y ttl.sh/rhtas/test-image:1h
cosign sign -y ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。
删除临时 Docker 文件:
Example
rm ./tmp.Dockerfile
rm ./tmp.Dockerfile
Copy to Clipboard Copied!
使用证书身份和签发者验证签名的容器镜像:
语法
cosign verify --certificate-identity=SIGNING_EMAIL_ADDR IMAGE_NAME:TAG
cosign verify --certificate-identity=SIGNING_EMAIL_ADDR IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign verify --certificate-identity=jdoe@redhat.com ttl.sh/rhtas/test-image:1h
cosign verify --certificate-identity=jdoe@redhat.com ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 注意您还可以使用
cosign
命令--certificate-identity-regexp
和--certificate-oidc-issuer-regexp
的以下选项对证书身份和签发者使用正则表达式。从本地命令行界面(CLI)工具下载
rekor-cli
二进制文件,将页面下载到您的工作站。打开 Web 浏览器,再前往 CLI 服务器网页。
注意URL 地址是由
tas_single_node_base_hostname
变量定义的配置的节点。一个 URL 地址示例为https://cli-server.example.com
,因为tas_single_node_base_hostname
的值为example.com
。- 在下载页面中,进入 rekor-cli 下载部分,然后点击您的平台的链接。
在工作站上打开一个终端,解压缩二进制
.gz
文件,并设置执行位:Example
gunzip rekor-cli-amd64.gz chmod +x rekor-cli-amd64
gunzip rekor-cli-amd64.gz chmod +x rekor-cli-amd64
Copy to Clipboard Copied! 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv rekor-cli-amd64 /usr/local/bin/rekor-cli
sudo mv rekor-cli-amd64 /usr/local/bin/rekor-cli
Copy to Clipboard Copied!
使用 Rekor 命令行界面查询透明日志。
根据日志索引进行搜索:
Example
rekor-cli get --log-index 0 --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli get --log-index 0 --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied! 搜索电子邮件地址以获取通用唯一标识符(UUID):
语法
rekor-cli search --email SIGNING_EMAIL_ADDR --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli search --email SIGNING_EMAIL_ADDR --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied! Example
rekor-cli search --email jdoe@redhat.com --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli search --email jdoe@redhat.com --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied! 此命令返回用于下一步的 UUID。
使用 UUID 获取事务详情:
语法
rekor-cli get --uuid UUID --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli get --uuid UUID --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied! Example
rekor-cli get --uuid 24296fb24b8ad77a71b9c1374e207537bafdd75b4f591dcee10f3f697f150d7cc5d0b725eea641e7 --rekor_server $COSIGN_REKOR_URL --format json | jq
rekor-cli get --uuid 24296fb24b8ad77a71b9c1374e207537bafdd75b4f591dcee10f3f697f150d7cc5d0b725eea641e7 --rekor_server $COSIGN_REKOR_URL --format json | jq
Copy to Clipboard Copied!
2.2.2. 使用命令行界面使用 Gitsign 签名和验证提交
gitsign
工具可让您使用红帽的 Trusted Artifact Signer (RHTAS)服务签名和验证 Git 存储库提交。
先决条件
- 在 Red Hat Enterprise Linux 9.4 或更高版本上运行的 RHTAS 安装由 Ansible 管理。
安装了
git
和cosign
二进制文件的工作站。-
您必须使用
cosign
版本 2.2 或更高版本。
-
您必须使用
流程
将
gitsign
二进制文件从本地命令行界面(CLI)工具下载页面到您的工作站。注意URL 地址是由
tas_single_node_base_hostname
变量定义的配置的节点。一个 URL 地址示例应为https://cli-server.example.com
,它赋予tas_single_node_base_hostname
值,如example.com
。- 在下载页面中,进入 gitsign 下载部分,然后单击您的平台的链接。
在工作站上打开一个终端,解压缩 .gz 文件,并设置执行位:
Example
gunzip gitsign-amd64.gz chmod +x gitsign-amd64
gunzip gitsign-amd64.gz chmod +x gitsign-amd64
Copy to Clipboard Copied! 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv gitsign-amd64 /usr/local/bin/gitsign
sudo mv gitsign-amd64 /usr/local/bin/gitsign
Copy to Clipboard Copied!
配置您的 shell 环境,以进行提交签名和验证。
Example
export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE export TUF_URL="https://tuf.${BASE_HOSTNAME}" export OIDC_ISSUER_URL=OIDC_ISSUER_URL export COSIGN_FULCIO_URL="https://fulcio.${BASE_HOSTNAME}" export COSIGN_REKOR_URL="https://rekor.${BASE_HOSTNAME}" export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE export TUF_URL="https://tuf.${BASE_HOSTNAME}" export OIDC_ISSUER_URL=OIDC_ISSUER_URL export COSIGN_FULCIO_URL="https://fulcio.${BASE_HOSTNAME}" export COSIGN_REKOR_URL="https://rekor.${BASE_HOSTNAME}" export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
Copy to Clipboard Copied! 将 BASE_HOSTNAME_OF_RHTAS_SERVICE 替换为
tas_single_node_base_hostname 的
变量的值,并将 OIDC_ISSUER_URL 替换为您的 OpenID Connect (OIDC)供应商 URL 字符串。使用 RHTAS 服务配置本地存储库配置以签署您的提交:
Example
git config --local commit.gpgsign true git config --local tag.gpgsign true git config --local gpg.x509.program gitsign git config --local gpg.format x509 git config --local gitsign.fulcio $SIGSTORE_FULCIO_URL git config --local gitsign.rekor $SIGSTORE_REKOR_URL git config --local gitsign.issuer $SIGSTORE_OIDC_ISSUER git config --local gitsign.clientID trusted-artifact-signer
git config --local commit.gpgsign true git config --local tag.gpgsign true git config --local gpg.x509.program gitsign git config --local gpg.format x509 git config --local gitsign.fulcio $SIGSTORE_FULCIO_URL git config --local gitsign.rekor $SIGSTORE_REKOR_URL git config --local gitsign.issuer $SIGSTORE_OIDC_ISSUER git config --local gitsign.clientID trusted-artifact-signer
Copy to Clipboard Copied! 将提交提交到本地存储库:
Example
git commit --allow-empty -S -m “Test of a signed commit”
git commit --allow-empty -S -m “Test of a signed commit”
Copy to Clipboard Copied! 此时会打开一个 Web 浏览器,允许您使用电子邮件地址为提交签名。
初始化更新框架(TUF)系统:
Example
cosign initialize
cosign initialize
Copy to Clipboard Copied! 验证提交:
语法
gitsign verify --certificate-identity=SIGNING_EMAIL --certificate-oidc-issuer=$SIGSTORE_OIDC_ISSUER HEAD
gitsign verify --certificate-identity=SIGNING_EMAIL --certificate-oidc-issuer=$SIGSTORE_OIDC_ISSUER HEAD
Copy to Clipboard Copied! Example
gitsign verify --certificate-identity=jdoe@redhat.com --certificate-oidc-issuer=$SIGSTORE_OIDC_ISSUER HEAD
gitsign verify --certificate-identity=jdoe@redhat.com --certificate-oidc-issuer=$SIGSTORE_OIDC_ISSUER HEAD
Copy to Clipboard Copied!
2.2.3. 使用企业合同验证容器镜像上的签名
企业合同(EC)是维护软件供应链安全性的工具,您可以使用它来定义和执行容器镜像的策略。您可以使用 ec
二进制文件来验证使用红帽的 Trusted Artifact Signer (RHTAS)签名框架的容器镜像的待测试和签名。
先决条件
- 在 Red Hat Enterprise Linux 9.4 或更高版本上运行的 RHTAS 安装由 Ansible 管理。
安装了
cosign
和podman
二进制文件的工作站。-
您必须使用
cosign
版本 2.2 或更高版本。
-
您必须使用
流程
从本地命令行界面(CLI)工具下载
ec
二进制文件到您的工作站。注意URL 地址是由
tas_single_node_base_hostname
变量定义的配置的节点。一个 URL 地址示例应为https://cli-server.example.com
,它赋予tas_single_node_base_hostname
值,如example.com
。- 在下载页面中,进入 ec 下载部分,再单击平台的链接。
在工作站上打开一个终端,解压缩二进制 .gz 文件,并设置执行位:
Example
gunzip ec-amd64.gz chmod +x ec-amd64
gunzip ec-amd64.gz chmod +x ec-amd64
Copy to Clipboard Copied! 将二进制文件移到
$PATH
环境中的位置:Example
sudo mv ec-amd64 /usr/local/bin/ec
sudo mv ec-amd64 /usr/local/bin/ec
Copy to Clipboard Copied!
配置 shell 环境,以执行容器镜像签名和验证。
Example
export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE export TUF_URL="https://tuf.${BASE_HOSTNAME}" export OIDC_ISSUER_URL=OIDC_ISSUER_URL export COSIGN_FULCIO_URL="https://fulcio.${BASE_HOSTNAME}" export COSIGN_REKOR_URL="https://rekor.${BASE_HOSTNAME}" export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
export BASE_HOSTNAME=BASE_HOSTNAME_OF_RHTAS_SERVICE export TUF_URL="https://tuf.${BASE_HOSTNAME}" export OIDC_ISSUER_URL=OIDC_ISSUER_URL export COSIGN_FULCIO_URL="https://fulcio.${BASE_HOSTNAME}" export COSIGN_REKOR_URL="https://rekor.${BASE_HOSTNAME}" export COSIGN_MIRROR=$TUF_URL export COSIGN_ROOT=$TUF_URL/root.json export COSIGN_OIDC_CLIENT_ID="trusted-artifact-signer" export COSIGN_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_CERTIFICATE_OIDC_ISSUER=$OIDC_ISSUER_URL export COSIGN_YES="true" export SIGSTORE_FULCIO_URL=$COSIGN_FULCIO_URL export SIGSTORE_OIDC_ISSUER=$COSIGN_OIDC_ISSUER export SIGSTORE_REKOR_URL=$COSIGN_REKOR_URL export REKOR_REKOR_SERVER=$COSIGN_REKOR_URL
Copy to Clipboard Copied! 将 BASE_HOSTNAME_OF_RHTAS_SERVICE 替换为
tas_single_node_base_hostname 的
变量的值,并将 OIDC_ISSUER_URL 替换为您的 OpenID Connect (OIDC)供应商 URL 字符串。初始化更新框架(TUF)系统:
Example
cosign initialize
cosign initialize
Copy to Clipboard Copied! 为测试容器镜像签名。
创建一个空容器镜像:
Example
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
echo "FROM scratch" > ./tmp.Dockerfile podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 将空容器镜像推送到
ttl.sh
临时 registry:Example
podman push ttl.sh/rhtas/test-image:1h
podman push ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 为容器镜像签名:
语法
cosign sign -y IMAGE_NAME:TAG
cosign sign -y IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign sign -y ttl.sh/rhtas/test-image:1h
cosign sign -y ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。
删除临时 Docker 文件:
Example
rm ./tmp.Dockerfile
rm ./tmp.Dockerfile
Copy to Clipboard Copied!
创建
predicate.json
文件:Example
{ "builder": { "id": "https://localhost/dummy-id" }, "buildType": "https://example.com/tekton-pipeline", "invocation": {}, "buildConfig": {}, "metadata": { "completeness": { "parameters": false, "environment": false, "materials": false }, "reproducible": false }, "materials": [] }
{ "builder": { "id": "https://localhost/dummy-id" }, "buildType": "https://example.com/tekton-pipeline", "invocation": {}, "buildConfig": {}, "metadata": { "completeness": { "parameters": false, "environment": false, "materials": false }, "reproducible": false }, "materials": [] }
Copy to Clipboard Copied! 如需有关 schema 布局的更多信息,请参阅 SLSA provenance predicate 规格。
将
predicate.json
文件与容器镜像关联:语法
cosign attest -y --predicate ./predicate.json --type slsaprovenance IMAGE_NAME:TAG
cosign attest -y --predicate ./predicate.json --type slsaprovenance IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign attest -y --predicate ./predicate.json --type slsaprovenance ttl.sh/rhtas/test-image:1h
cosign attest -y --predicate ./predicate.json --type slsaprovenance ttl.sh/rhtas/test-image:1h
Copy to Clipboard Copied! 验证容器镜像是否至少有一个测试和签名:
语法
cosign tree IMAGE_NAME:TAG
cosign tree IMAGE_NAME:TAG
Copy to Clipboard Copied! Example
cosign tree ttl.sh/rhtas/test-image:1h 📦 Supply Chain Security Related artifacts for an image: ttl.sh/rhtas/test-image@sha256:7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35 └── 💾 Attestations for an image tag: ttl.sh/rhtas/test-image:sha256-7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35.att └── 🍒 sha256:40d94d96a6d3ab3d94b429881e1b470ae9a3cac55a3ec874051bdecd9da06c2e └── 🔐 Signatures for an image tag: ttl.sh/rhtas/test-image:sha256-7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35.sig └── 🍒 sha256:f32171250715d4538aec33adc40fac2343f5092631d4fc2457e2116a489387b7
cosign tree ttl.sh/rhtas/test-image:1h 📦 Supply Chain Security Related artifacts for an image: ttl.sh/rhtas/test-image@sha256:7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35 └── 💾 Attestations for an image tag: ttl.sh/rhtas/test-image:sha256-7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35.att └── 🍒 sha256:40d94d96a6d3ab3d94b429881e1b470ae9a3cac55a3ec874051bdecd9da06c2e └── 🔐 Signatures for an image tag: ttl.sh/rhtas/test-image:sha256-7de5fa822a9d1e507c36565ee0cf50c08faa64505461c844a3ce3944d23efa35.sig └── 🍒 sha256:f32171250715d4538aec33adc40fac2343f5092631d4fc2457e2116a489387b7
Copy to Clipboard Copied! 使用企业联系人验证容器镜像:
语法
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-successes
Copy to Clipboard Copied! Example
ec validate image --image ttl.sh/rhtas/test-image:1h --certificate-identity-regexp 'jdoe@example.com' --certificate-oidc-issuer-regexp 'keycloak-keycloak-system' --output yaml --show-successes success: true successes: - metadata: code: builtin.attestation.signature_check msg: Pass - metadata: code: builtin.attestation.syntax_check msg: Pass - metadata: code: builtin.image.signature_check msg: Pass ec-version: v0.1.2427-499ef12 effective-time: "2024-01-21T19:57:51.338191Z" key: "" policy: {} success: true
ec validate image --image ttl.sh/rhtas/test-image:1h --certificate-identity-regexp 'jdoe@example.com' --certificate-oidc-issuer-regexp 'keycloak-keycloak-system' --output yaml --show-successes success: true successes: - metadata: code: builtin.attestation.signature_check msg: Pass - metadata: code: builtin.attestation.syntax_check msg: Pass - metadata: code: builtin.image.signature_check msg: Pass ec-version: v0.1.2427-499ef12 effective-time: "2024-01-21T19:57:51.338191Z" key: "" policy: {} success: true
Copy to Clipboard Copied! 企业合同生成 pass-fail 报告,其中包含有关任何安全违反情况的详细信息。添加
--info
标志时,报告包括所有找到违反情况的详情和可能的解决方案。
其它资源
- 如需更多信息,请参阅企业合同 网站。
附录 A. 红帽构建的 Keycloak 的 service 和 StatefulSet YAML 配置
为红帽信任的 Artifact Signer (RHTAS)服务配置红帽构建的 Keycloak (RHBK)时使用的 Service 和 StatefulSet YAML 资源配置。
--- apiVersion: v1 kind: Service metadata: name: postgresql-db namespace: keycloak-system spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - port: 5432 selector: app: postgresql-db --- apiVersion: apps/v1 kind: StatefulSet metadata: name: postgresql-db namespace: keycloak-system spec: persistentVolumeClaimRetentionPolicy: whenDeleted: Retain whenScaled: Retain podManagementPolicy: OrderedReady replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: postgresql-db serviceName: postgresql-db template: metadata: labels: app: postgresql-db spec: containers: - env: - name: POSTGRESQL_USER valueFrom: secretKeyRef: key: username name: postgresql-db - name: POSTGRESQL_PASSWORD valueFrom: secretKeyRef: key: password name: postgresql-db - name: POSTGRESQL_DATABASE valueFrom: secretKeyRef: key: database name: postgresql-db image: registry.redhat.io/rhel9/postgresql-15:latest imagePullPolicy: IfNotPresent livenessProbe: exec: command: - /usr/libexec/check-container - --live failureThreshold: 3 initialDelaySeconds: 120 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 10 name: postgresql-db readinessProbe: exec: command: - /usr/libexec/check-container failureThreshold: 3 initialDelaySeconds: 5 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/lib/pgsql/data name: data dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault terminationGracePeriodSeconds: 30 updateStrategy: rollingUpdate: partition: 0 type: RollingUpdate volumeClaimTemplates: - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi volumeMode: Filesystem
---
apiVersion: v1
kind: Service
metadata:
name: postgresql-db
namespace: keycloak-system
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 5432
selector:
app: postgresql-db
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql-db
namespace: keycloak-system
spec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain
whenScaled: Retain
podManagementPolicy: OrderedReady
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: postgresql-db
serviceName: postgresql-db
template:
metadata:
labels:
app: postgresql-db
spec:
containers:
- env:
- name: POSTGRESQL_USER
valueFrom:
secretKeyRef:
key: username
name: postgresql-db
- name: POSTGRESQL_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: postgresql-db
- name: POSTGRESQL_DATABASE
valueFrom:
secretKeyRef:
key: database
name: postgresql-db
image: registry.redhat.io/rhel9/postgresql-15:latest
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- /usr/libexec/check-container
- --live
failureThreshold: 3
initialDelaySeconds: 120
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
name: postgresql-db
readinessProbe:
exec:
command:
- /usr/libexec/check-container
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/lib/pgsql/data
name: data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
volumeMode: Filesystem
附录 B. 可信 Artifact Signer 组件和版本号
下表列出了 Red Hat 的 Trusted Artifact Signer (RHTAS)软件组件及其对应的版本号,用于 1.2.1 版本。
二进制 | Version |
---|---|
| 2.4.3 |
| 0.12.0 |
| 1.3.9 |
| 0.6 |
| 1.7.1 |
| 1.7.1 |
| 0.12.0 |
| 0.17.1 |
| 1.2.4 |
组件 | Version |
---|---|
logserver | 1.7.1 |
logsigner | 1.7.1 |
database | 1.7.1 |
redis | 1.7.1 |
组件 | Version |
---|---|
rekor-server | 1.3.9 |
backfill-redis | 1.3.9 |
rekor-search-ui | 1.3.9 |
组件 | Version |
---|---|
fulcio-server | 1.6.6 |
组件 | Version |
---|---|
certificate-transparency-go | 1.3.1 |
组件 | Version |
---|---|
timestamp-authority | 1.2.4 |