1.4. 配置额外的 OpenID Connect 供应商


作为系统管理员,您可以配置许多不同的 OpenID Connect (OIDC)供应商,以用于红帽的 Trusted Artifact Signer 服务。您可以配置以下 OIDC 供应商来验证用户:

  • 红帽构建的 Keycloak
  • Red Hat Single Sign-on (SSO)
  • Google
  • 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 控制台。
  • 安装了 ocpodman 二进制文件的工作站。
  • Google Cloud Console 中,使用以下设置创建一个 OAuth 客户端 ID:

流程

  1. 在工作站上打开一个终端,并登录到 OpenShift:

    语法

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    示例

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注意

    您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。

  2. 更新 RHTAS 配置。

    1. 打开以编辑 Securesign 资源:

      语法

      oc edit Securesign NAME -n NAMESPACE
      Copy to Clipboard Toggle word wrap

      Example

      oc edit Securesign securesign-sample -n trusted-artifact-signer
      Copy to Clipboard Toggle word wrap

      注意

      您必须使用为 RHTAS 安装创建的项目名称作为命名空间。

    2. OIDCIssuers 部分下,使用 Google 客户端标识符、签发者的 URL 添加新子,并将 Type 值设置为 email

      语法

      ...
      OIDCIssuers:
        - Issuer: "https://accounts.google.com"
          IssuerURL: "https://accounts.google.com"
          ClientID: "CLIENT_ID"
          Type: email
      ...
      Copy to Clipboard Toggle word wrap

      将 Google 客户端标识符添加到 ClientID 字段。

    3. 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
  3. 更改 OIDC 签发者和客户端 id 环境变量以使用 Google:

    示例

    export OIDC_ISSUER_URL=https://accounts.google.com
    export COSIGN_OIDC_CLIENT_ID="314919563931-35zke44ouf2oiztjg7v8o8c2ge9usnd1.apps.googleexample.com"
    Copy to Clipboard Toggle word wrap

  4. 将您的 secret 从 Google Console 复制并粘贴到纯文本文件中:

    语法

    echo SECRET > my-google-client-secret
    Copy to Clipboard Toggle word wrap

  5. 如果您已运行 RHTAS 服务,您可以通过签署测试容器镜像来验证更新的配置。

    1. 创建一个空容器镜像:

      Example

      echo "FROM scratch" > ./tmp.Dockerfile
      podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

    2. 将空容器镜像推送到 ttl.sh 临时 registry:

      Example

      podman push ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

    3. 删除临时 Docker 文件:

      Example

      rm ./tmp.Dockerfile
      Copy to Clipboard Toggle word wrap

    4. 为容器镜像签名:

      语法

      cosign sign -y --oidc-client-secret-file=SECRET_FILE IMAGE_NAME:TAG
      Copy to Clipboard Toggle word wrap

      Example

      cosign sign -y --oidc-client-secret-file=my-google-client-secret ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

      此时会打开一个 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 二进制文件的工作站。

流程

  1. 使用具有 cluster-admin 角色的用户登录 OpenShift Web 控制台。
  2. 创建一个新项目来部署 Keycloak 服务。

    1. Administrator 视角中,从导航菜单中展开 Home,再单击 Projects
    2. Create Project 按钮。
    3. 新项目名称为 keycloak-system,然后单击 Create 按钮。
  3. 从导航菜单中展开 Operators,然后点 OperatorHub
  4. 在搜索字段中,键入 sso,然后单击 Red Hat Single Sign-on 标题。
  5. 单击 Install 按钮,以显示 Operator 详情。
  6. 如果尚未设置,请从 Installed Namespace 下拉菜单中选择 keycloak-system
  7. Install Operator 页面中点 Install,并等待安装完成。
  8. 安装完成后,点 View Operator
  9. 在 workstation 终端中登录到 OpenShift 集群:

    语法

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    Example

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注意

    您可以从 OpenShift Web 控制台查找要在命令行中使用的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。

  10. 切换到 Keycloak 项目:

    Example

    oc project keycloak-system
    Copy to Clipboard Toggle word wrap

  11. 创建 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
    Copy to Clipboard Toggle word wrap

  12. 创建 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
    Copy to Clipboard Toggle word wrap

  13. 创建 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
    Copy to Clipboard Toggle word wrap

  14. 创建 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
    Copy to Clipboard Toggle word wrap

    设置用户名、用户的电子邮件地址以及密码或引用 secret 对象。

  15. 返回到 OpenShift Web 控制台,点 All instances 选项卡监视并等待 Keycloak 系统成功初始化。

您可以将红帽构建的 Keycloak (RHBK)配置为红帽受信任的工件签名程序(RHTAS)服务的 OpenID Connect (OIDC)供应商。此流程指导您将 RHBK 与 RHTAS 集成。

重要

您可以在相同的 SecureSign 配置中为 Fulcio 定义几个不同的 OIDC 供应商。

先决条件

  • OpenShift Container Platform 4.15 或更高版本上的 RHTAS 安装。
  • 使用 cluster-admin 角色访问 OpenShift Web 控制台。
  • 安装了 oc 二进制文件的工作站。
  • 有 1 GB 的持久性存储可用于 Keycloak PostgreSQL 数据库
  • TLS 证书和密钥

流程

  1. 使用具有 cluster-admin 角色的用户登录 OpenShift Web 控制台。
  2. 创建一个新项目来部署 Keycloak 服务。

    1. Administrator 视角中,从导航菜单中展开 Home,再单击 Projects
    2. Create Project 按钮。
    3. 新项目名称为 keycloak-system,然后点 Create 按钮。
  3. 部署 PostgreSQL 实例,供 Keycloak 用于存储持久数据。

    重要

    如果 Keycloak 已存在数据库,请替换与您的数据库实例对应的 Secret 资源 的用户名密码和数据库名称 值。您可以跳过 PostgreSQL Service 和 StatefulSet 步骤的创建,并继续下一步。

    1. 创建 Secret 资源以存储数据库信息。

      1. 从导航菜单中展开 Workloads,再单击 Secrets
      2. Project 下拉菜单中选择 keycloak-system
      3. 单击 Create 下拉菜单,再选择 Key/Value secret
      4. Secret name 字段中输入 postgresql-db
      5. Key 字段中输入 username
      6. Value 字段中输入 keycloak。这是用于向 PostgreSQL 数据库实例进行身份验证的用户名 Keycloak。
      7. 单击 Add key/value 链接,以添加另一个键值对。
      8. Key 字段中输入 password
      9. Value 字段中输入您选择的密码。这是用于向 PostgreSQL 数据库实例进行身份验证的密码 Keycloak。
      10. 单击 Add key/value 链接,以添加另一个键值对。
      11. Key 字段中输入 database
      12. Value 字段中输入 keycloak。这是用于将 Keycloak 数据存储在 PostgreSQL 数据库实例中的数据库名称。
      13. Create 按钮。
    2. 创建 PostgreSQL Service 和 StatefulSet。

      1. + 图标。
      2. 复制 Service 和 StatefulSet YAML 配置文本,并在 Import YAML 页面中,将文本粘贴到 文本编辑器框中。
      3. Create 按钮,将 Service 和 StatefulSet 添加到 keycloak-system 项目中。
  4. 从工作站打开一个终端,并登录到 OpenShift 集群:

    语法

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    Example

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注意

    您可以从 OpenShift Web 控制台查找要在命令行中使用的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。

  5. 创建新的 Secret 资源,使其包含传输层安全(TLS)证书和对应的私钥:

    语法

    oc create secret tls SECRET_NAME -n NAMESPACE --cert CERTIFICATE_FILE_NAME --key PRIVATE_KEY_FILE_NAME
    Copy to Clipboard Toggle word wrap

    Example

    oc create secret tls keycloak-tls -n keycloak-system --cert certificate.pem --key key.pem
    Copy to Clipboard Toggle word wrap

    注意

    OpenShift 的服务服务证书可以自动生成和管理用于 Keycloak 的 TLS 证书。如需更多信息 请参阅附录。

  6. 在 OpenShift Web 控制台中,从导航菜单中展开 Operator,然后点 OperatorHub
  7. 在搜索字段中,键入 keycloak,然后单击认证红帽目录中的 Keycloak Operator 标题。
  8. 单击 Install 按钮,以显示 Operator 详情。
  9. Install Operator 页面中,从 Installed Namespace 下拉菜单中选择 keycloak-system,然后点 Install 按钮。等待安装完成。
  10. 安装完成后,点 View Operator 按钮。
  11. 在 Keycloak 标题中点 Create instance
  12. Create Keycloak 页面中,选择 YAML 视图

    1. name 行中,将 example-keycloak 替换为您的自定义名称,如 keycloak
    2. 主机名可以在 hostname 属性中明确指定,或者自动生成与其他路由类似。在 hostname 行中,将 example.org 替换为您的自定义主机名。

      注意

      有关使 OpenShift 为 Keycloak 实例生成主机名所需的步骤,请参阅附录。???

    3. spec 部分,添加您的数据库详情:

      Example

      spec:
      ...
        db:
          vendor: postgres
          host: postgresql-db
          usernameSecret:
            name: postgresql-db
            key: username
          passwordSecret:
            name: postgresql-db
            key: password
      ...
      Copy to Clipboard Toggle word wrap

    4. 另外,在 http 属性的 spec 部分下,指定包含 TLS 证书的 Secret 资源的名称。

      Example

      spec:
      ...
        http:
          tlsSecret: keycloak-tls
      ...
      Copy to Clipboard Toggle word wrap

    5. Create 按钮。
  13. 展开 Networking 导航菜单,再单击 Routes
  14. 要打开 Keycloak 管理控制台,请点击与 Keycloak 实例关联的路由的链接。
  15. admin 用户的默认凭据存储在名为 keycloak-initial-admin 的 Secret 中。要查找密码,展开 Workloads 导航菜单,再单击 Secrets
  16. 选择 keycloak-initial-admin Secret。
  17. Data 部分下,找到 password 键,然后点 copy content icon 图标。
  18. 在 Keycloak Administration Console 登录页面中,输入 admin 作为用户名,并粘贴上一步的内容作为密码。
  19. 创建一个名为 trusted-artifact-signer 的新域。

    1. 在导航菜单中,选择 Red Hat Build of Keycloak 下拉菜单。
    2. 选择 Create Realm
    3. 输入 trusted-artifact-signer 作为 资源名称
    4. 单击 Create 以创建新域。
  20. 创建新用户 。新用户可以登录到 Keycloak 管理控制台,也可以使用 RHTAS 为容器和提交签名。

    1. 在导航菜单的 Manage 部分下,然后选择 Clients
    2. Create Client 按钮
    3. Client Id 字段中,输入 trusted-artifact-signer
    4. 另外,您还可以在对应的字段中输入 NameDescription
    5. 点击 Next
    6. 接受新客户端创建过程的 Capability Config 步骤的默认选项。
    7. 点击 Next
    8. Valid redirect URIs 字段中,输入 *
    9. 单击 Save 以创建客户端。
  21. 在导航菜单的 Configure 部分下,选择 Realm Settings 以查找 trusted-artifact-signer 域的 Issuer URL
  22. Endpoints 旁边,单击 OpenID Endpoint Configuration 链接。
  23. issuer 属性复制 URL
  24. 在 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
    ...
    Copy to Clipboard Toggle word wrap

    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
    ...
    Copy to Clipboard Toggle word wrap

您可以将 Amazon 的安全令牌服务(STS)用作红帽受信任的工件签名程序(RHTAS)服务的 OpenID Connect (OIDC)供应商。您可以决定在RHAS 部署期间或稍后配置 Amazon STS。

重要

您可以在同一配置中定义多个不同的 OIDC 供应商。

先决条件

流程

  1. 在工作站上打开一个终端,并登录到 OpenShift:

    语法

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    Example

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注意

    您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。

  2. 查找 AWS OIDC 供应商 URL:

    Example

    oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}'
    Copy to Clipboard Toggle word wrap

  3. 更新 RHTAS 配置。

    1. 打开以编辑 Securesign 资源:

      语法

      oc edit Securesign NAME -n NAMESPACE
      Copy to Clipboard Toggle word wrap

      Example

      oc edit Securesign securesign-sample -n trusted-artifact-signer
      Copy to Clipboard Toggle word wrap

      注意

      您必须使用为 RHTAS 安装创建的项目名称作为命名空间。

    2. 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
      ...
      Copy to Clipboard Toggle word wrap

    3. 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
  4. 输入您的访问密钥、secret 密钥、默认区域和输出格式来配置 AWS 命令行工具:

    Example

    aws configure
    Copy to Clipboard Toggle word wrap

  5. 设置以下环境变量:

    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
    Copy to Clipboard Toggle word wrap

  6. 创建与新创建的 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
    Copy to Clipboard Toggle word wrap

  7. 使用信任策略为 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"
    Copy to Clipboard Toggle word wrap

  8. 在启用了 STS 的 OpenShift 集群中,创建一个新项目命名空间:

    语法

    oc new-project NAMESPACE
    Copy to Clipboard Toggle word wrap

    Example

    oc new-project rhtas-sts
    Copy to Clipboard Toggle word wrap

  9. 为假设 IAM 角色创建服务帐户,并在 OpenShift 项目命名空间中运行工作负载。

    1. 创建服务帐户清单:

      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
      Copy to Clipboard Toggle word wrap

    2. 将服务帐户清单应用到 OpenShift:

      Example

      oc apply -f service_account.yaml
      Copy to Clipboard Toggle word wrap

  10. 创建新的部署工作负载,以便在镜像 registry 中签名容器镜像。

    1. 创建部署清单:

      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
      Copy to Clipboard Toggle word wrap

    2. 将部署清单应用到 OpenShift:

      Example

      oc apply -f deployment.yaml
      Copy to Clipboard Toggle word wrap

  11. 创建测试容器镜像以签名。

    1. 创建一个空容器镜像:

      Example

      echo "FROM scratch" > ./tmp.Dockerfile
      podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

    2. 将空容器镜像推送到 ttl.sh 临时 registry:

      Example

      podman push ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

    3. 删除临时 Docker 文件:

      Example

      rm ./tmp.Dockerfile
      Copy to Clipboard Toggle word wrap

  12. 通过签名和验证测试容器镜像来验证配置。

    1. 在正在运行的 pod 中打开远程 shell 会话:

      语法

      oc rsh -n NAMESPACE deployment/cosign-sts env IMAGE=IMAGE_NAME:TAG /bin/sh
      Copy to Clipboard Toggle word wrap

      Example

      oc rsh -n rhtas-sts deployment/cosign-sts env IMAGE=ttl.sh/rhtas/test-image:1h /bin/sh
      Copy to Clipboard Toggle word wrap

    2. 为容器镜像签名:

      Example

      cosign sign -y --identity-token=$(cat $AWS_WEB_IDENTITY_TOKEN_FILE) ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

    3. 验证签名的容器镜像:

      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
      Copy to Clipboard Toggle word wrap

当使用红帽单点登录(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 URLAuthorization 回调 URL。为这两个字段输入占位符值,例如 https://localhost:8080。稍后,您将使用这些字段的预期值修改 GitHub OAuth 应用程序。

流程

  1. 在工作站上打开一个终端,并登录到 OpenShift:

    语法

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    Example

    oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注意

    您可以从 OpenShift Web 控制台在命令行中查找您的登录令牌和 URL。登录 OpenShift Web 控制台。点您的用户名,然后点 Copy login 命令。如果被要求,请再次提供您的用户名和密码,然后单击 Display Token 查看命令。

  2. 登录到 Red Hat SSO 控制台。

    1. 从命令行查找 Red Hat SSO 控制台 URL:

      Example

      oc get routes -n keycloak-system keycloak -o jsonpath='https://{.spec.host}'
      Copy to Clipboard Toggle word wrap

    2. 将 Red Hat SSO 控制台 URL 复制并粘贴到您的 Web 浏览器中。
    3. 单击 Administration Console
    4. 从命令行检索 admin 密码:

      Example

      oc get secret/credential-keycloak -n keycloak-system -o jsonpath='{ .data.ADMIN_PASSWORD }' | base64 -d
      Copy to Clipboard Toggle word wrap

      复制此命令的输出。

    5. 在 Web 浏览器中,以 admin 用户身份登录,并将密码粘贴到对应的字段中。点 Sign In 按钮。
  3. 从导航菜单的下拉菜单中选择您的域。
  4. 添加 GitHub 身份提供程序。

    1. 在导航菜单中点 Identity Providers
    2. Add provider… 下拉菜单中选择 GitHub
    3. 将 GitHub OAuth 客户端标识符添加到 客户端 ID 字段。
    4. 将 GitHub OAuth 客户端 secret 添加到 Client Secret 字段中。
    5. 打开 Trust Email 选项。
    6. Save 按钮。
  5. 将身份提供程序映射程序添加到新创建的身份提供程序。

    1. Mapper 选项卡。
    2. Create 按钮。
    3. 为新映射程序指定 Name
    4. Mapper Type 更改为 Hardcoded Attribute
    5. User Attribute 字段设置为 emailVerified
    6. User Attribute Value 字段设置为 true
    7. Save 按钮。
  6. GitHub Identity Provider Settings 页面中,复制 Redirect URI 值,并将它粘贴到 GitHub OAuth 应用 授权回调 URL 字段。另外,将此值粘贴到 Homepage URL 字段中,但删除 URL 字符串的 broker/github/endpoint 部分。
  7. 单击 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
  8. 在签名工件时,会打开网页浏览器并提示您登录到 Red Hat SSO 帐户。点 GitHub 按钮使用您的凭证登录。
  9. 单击 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 命令行界面。
  • 安装了 occosignpodmanaz 二进制文件的工作站。

流程

  1. 在工作站上打开一个终端。
  2. 在 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)
    Copy to Clipboard Toggle word wrap

  3. 创建一个新的客户端 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')
    Copy to Clipboard Toggle word wrap

    注意

    默认情况下,客户端 secret 仅在一年内有效。您可以使用 - 或日期 的标记自定义这个值。

  4. 创建新的 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"}'
    Copy to Clipboard Toggle word wrap

  5. 获取 App Registration 对象标识符:

    Example

    export RHTAS_APP_REGISTRATION_OBJ_ID=$(az ad app show --id $RHTAS_APP_REGISTRATION --output tsv --query id)
    Copy to Clipboard Toggle word wrap

  6. 更新 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}}"
    Copy to Clipboard Toggle word wrap

  7. 创建新 Service Principal 并将其与 App Registration 关联:

    Example

    export SERVICE_PRINCIPAL_ID=$(az ad sp create --id=${RHTAS_APP_REGISTRATION} -o tsv --query 'id')
    Copy to Clipboard Toggle word wrap

  8. 获取 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")
    Copy to Clipboard Toggle word wrap

  9. 将 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}\"}"
    Copy to Clipboard Toggle word wrap

  10. 获取租户标识符:

    Example

    export TENANT_ID=$(az account show -o tsv --query tenantId)
    Copy to Clipboard Toggle word wrap

  11. 获取 OIDC 端点:

    Example

    export ENTRA_ID_OIDC_ENDPOINT=$(echo https://login.microsoftonline.com/${TENANT_ID}/v2.0)
    Copy to Clipboard Toggle word wrap

  12. 更新 RHTAS 配置。

    1. 打开以编辑 Securesign 资源:

      语法

      oc edit Securesign NAME -n NAMESPACE
      Copy to Clipboard Toggle word wrap

      Example

      oc edit Securesign securesign-sample -n trusted-artifact-signer
      Copy to Clipboard Toggle word wrap

      注意

      您必须使用为 RHTAS 安装创建的项目名称作为命名空间。

    2. OIDCIssuers 部分下,使用客户端标识符、签发者 URL 添加新小节,并将 Type 值设置为 email

      语法

      ...
      OIDCIssuers:
        - Issuer: "${ENTRA_ID_OIDC_ENDPOINT}"
          IssuerURL: "${ENTRA_ID_OIDC_ENDPOINT}"
          ClientID: "${RHTAS_APP_REGISTRATION}"
          Type: email
      ...
      Copy to Clipboard Toggle word wrap

    3. 保存更改,退出编辑器。几秒钟后,操作员会自动重新配置 RHTAS 软件堆栈。
  13. 创建本地客户端 secret 文件:

    Example

    echo $RHTAS_APP_REGISTRATION_CLIENT_SECRET > rhtas-entra-id-client-secret
    Copy to Clipboard Toggle word wrap

  14. 为签名工件配置 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
    Copy to Clipboard Toggle word wrap

  15. 初始化本地机器以签名:

    Example

    $ cosign initialize
    Copy to Clipboard Toggle word wrap

  16. 通过签名测试容器镜像来验证更新的配置。

    1. 创建一个空容器镜像:

      Example

      echo "FROM scratch" > ./tmp.Dockerfile
      podman build . -f ./tmp.Dockerfile -t ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

    2. 将空容器镜像推送到 ttl.sh 临时 registry:

      Example

      podman push ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

    3. 删除临时 Docker 文件:

      Example

      rm ./tmp.Dockerfile
      Copy to Clipboard Toggle word wrap

    4. 为容器镜像签名:

      语法

      cosign sign -y --oidc-client-secret-file=SECRET_FILE IMAGE_NAME:TAG
      Copy to Clipboard Toggle word wrap

      Example

      cosign sign -y --oidc-client-secret-file=rhtas-entra-id-client-secret ttl.sh/rhtas/test-image:1h
      Copy to Clipboard Toggle word wrap

      此时会打开一个 Web 浏览器,允许您使用电子邮件地址为容器镜像签名。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat