1.4. 配置额外的 OpenID Connect 供应商
作为系统管理员,您可以配置许多不同的 OpenID Connect (OIDC)供应商,以用于红帽的 Trusted Artifact Signer 服务。您可以配置以下 OIDC 供应商来验证用户:
- 红帽构建的 Keycloak
- Red Hat Single Sign-on (SSO)
- Amazon 安全令牌服务(STS)
- Microsoft Entra ID
- GitHub
您可以将 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=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443注意您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
更新 RHTAS 配置。
打开以编辑
Securesign资源:语法
oc edit Securesign NAME -n NAMESPACEExample
oc edit Securesign securesign-sample -n trusted-artifact-signer注意您必须使用为 RHTAS 安装创建的项目名称作为命名空间。
在
OIDCIssuers部分下,使用 Google 客户端标识符、签发者的 URL 添加新子,并将Type值设置为email:语法
... OIDCIssuers: - Issuer: "https://accounts.google.com" IssuerURL: "https://accounts.google.com" ClientID: "CLIENT_ID" Type: email ...将 Google 客户端标识符添加到
ClientID字段。- 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
更改 OIDC 签发者和客户端 id 环境变量以使用 Google:
示例
export OIDC_ISSUER_URL=https://accounts.google.com export COSIGN_OIDC_CLIENT_ID="314919563931-35zke44ouf2oiztjg7v8o8c2ge9usnd1.apps.googleexample.com"将您的 secret 从 Google Console 复制并粘贴到纯文本文件中:
语法
echo SECRET > my-google-client-secret如果您已运行 RHTAS 服务,您可以通过签署测试容器镜像来验证更新的配置。
创建一个空容器镜像:
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:TAGExample
cosign sign -y --oidc-client-secret-file=my-google-client-secret ttl.sh/rhtas/test-image:1h此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。
您可以使用 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_PORTExample
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443注意您可以从 OpenShift Web 控制台查找要在命令行中使用的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
切换到 Keycloak 项目:
Example
oc project keycloak-system创建 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创建 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创建 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创建 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设置用户名、用户的电子邮件地址以及密码或引用 secret 对象。
- 返回到 OpenShift Web 控制台,点 All instances 选项卡监视并等待 Keycloak 系统成功初始化。
您可以将红帽构建的 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_PORTExample
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443注意您可以从 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_NAMEExample
oc create secret tls keycloak-tls -n keycloak-system --cert certificate.pem --key key.pem注意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 ...另外,在
http属性的spec部分下,指定包含 TLS 证书的Secret资源的名称。Example
spec: ... http: tlsSecret: keycloak-tls ...- 点 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 ...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 ...
您可以将 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_PORTExample
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443注意您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。
查找 AWS OIDC 供应商 URL:
Example
oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}'更新 RHTAS 配置。
打开以编辑
Securesign资源:语法
oc edit Securesign NAME -n NAMESPACEExample
oc edit Securesign securesign-sample -n trusted-artifact-signer注意您必须使用为 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 ...- 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
输入您的访问密钥、secret 密钥、默认区域和输出格式来配置 AWS 命令行工具:
Example
aws configure设置以下环境变量:
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创建与新创建的 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使用信任策略为 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"在启用了 STS 的 OpenShift 集群中,创建一个新项目命名空间:
语法
oc new-project NAMESPACEExample
oc new-project rhtas-sts为假设 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将服务帐户清单应用到 OpenShift:
Example
oc apply -f service_account.yaml
创建新的部署工作负载,以便在镜像 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将部署清单应用到 OpenShift:
Example
oc apply -f deployment.yaml
创建测试容器镜像以签名。
创建一个空容器镜像:
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
通过签名和验证测试容器镜像来验证配置。
在正在运行的 pod 中打开远程 shell 会话:
语法
oc rsh -n NAMESPACE deployment/cosign-sts env IMAGE=IMAGE_NAME:TAG /bin/shExample
oc rsh -n rhtas-sts deployment/cosign-sts env IMAGE=ttl.sh/rhtas/test-image:1h /bin/sh为容器镜像签名:
Example
cosign sign -y --identity-token=$(cat $AWS_WEB_IDENTITY_TOKEN_FILE) ttl.sh/rhtas/test-image:1h验证签名的容器镜像:
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
当使用红帽单点登录(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_PORTExample
oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443注意您可以从 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}'- 将 Red Hat SSO 控制台 URL 复制并粘贴到您的 Web 浏览器中。
- 单击 Administration Console。
从命令行检索
admin密码:Example
oc get secret/credential-keycloak -n keycloak-system -o jsonpath='{ .data.ADMIN_PASSWORD }' | base64 -d复制此命令的输出。
-
在 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 访问。
对于红帽的 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)创建一个新的客户端 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 NAMESPACEExample
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:TAGExample
cosign sign -y --oidc-client-secret-file=rhtas-entra-id-client-secret ttl.sh/rhtas/test-image:1h此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。