3.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.13 或更高版本。
- 具有创建资源的 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)
创建一个新的客户端 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')
注意默认情况下,客户端 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"}'
获取 App Registration 对象标识符:
Example
$ export RHTAS_APP_REGISTRATION_OBJ_ID=$(az ad app show --id $RHTAS_APP_REGISTRATION --output tsv --query id)
更新 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}}"
创建新 Service Principal 并将其与 App Registration 关联:
Example
$ export SERVICE_PRINCIPAL_ID=$(az ad sp create --id=${RHTAS_APP_REGISTRATION} -o tsv --query 'id')
获取 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")
将 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}\"}"
获取租户标识符:
Example
$ export TENANT_ID=$(az account show -o tsv --query tenantId)
获取 OIDC 端点:
Example
$ export ENTRA_ID_OIDC_ENDPOINT=$(echo https://login.microsoftonline.com/${TENANT_ID}/v2.0)
更新 RHTAS 配置。
打开以编辑
Securesign
资源:语法
oc edit Securesign NAME -n NAMESPACE
Example
$ oc edit Securesign securesign-sample -n trusted-artifact-signer
注意您必须使用为 RHTAS 安装创建的项目名称作为命名空间。
在
OIDCIssuers
部分下,使用客户端标识符、签发者 URL 添加新小节,并将Type
值设置为email
:语法
... OIDCIssuers: - Issuer: "${ENTRA_ID_OIDC_ENDPOINT}" IssuerURL: "${ENTRA_ID_OIDC_ENDPOINT}" ClientID: "${RHTAS_APP_REGISTRATION}" Type: email ...
- 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
创建本地客户端 secret 文件:
Example
$ echo $RHTAS_APP_REGISTRATION_CLIENT_SECRET > rhtas-entra-id-client-secret
为签名工件配置 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
初始化本地机器以签名:
Example
$ cosign initialize
通过签名测试容器镜像来验证更新的配置。
创建一个空容器镜像:
Example
$ echo "FROM scratch" > ./tmp.Dockerfile $ podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
将空容器镜像推送到
ttl.sh
临时 registry:Example
$ podman push ttl.sh/rhtas/test-image:1h
删除临时 Docker 文件:
Example
$ rm ./tmp.Dockerfile
为容器镜像签名:
语法
cosign sign -y --oidc-client-secret-file=SECRET_FILE IMAGE_NAME:TAG
Example
$ cosign sign -y --oidc-client-secret-file=rhtas-entra-id-client-secret ttl.sh/rhtas/test-image:1h
此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。