演示:使用 Keycloak 或 Google 单点登录进行身份验证

本页面适用于平台管理员

您只能出于演示或测试目的,尝试使用 Keycloak 或 Google 单点登录 (SSO) 进行身份验证。

使用 Keycloak 进行身份验证

Keyclak 是一款开源软件身份和访问权限管理产品。您可以将它设置为 OIDC 提供商以进行快速演示。

准备工作

要安装并启用 Keycloak,您需要有一个 Kubernetes 集群,它具有一个可从 Anthos 不公开模式部署访问的 Ingress 地址。本页面使用 Anthos 专用模式管理员集群作为示例。

您还必须为 Anthos 专用模式 Management Center 创建自定义域名。请参阅配置域名以访问 Management Center

  1. 将 Management Center 域名导出为变量,例如:

    export ANTHOS_MANAGEMENT_CENTER=anthos.example.com
    
  2. 将私有注册表导出为变量,例如:

    export PRIVATE_REGISTRY=10.200.0.2/library
    

下载 Keycloak 映像并推送到私有注册表

  1. 从 dockerhub 下载 Keycloak 映像:

    actl images save \
      --output keycloak-image \
      jboss/keycloak:12.0.2
    
  2. 将 Keycloak 映像推送到私有注册表:

    actl images push \
      --images keycloak-image \
      --private-registry=${PRIVATE_REGISTRY}
    

部署 Keycloak

更新 DNS 配置并生成证书以部署 Keycloak。

  1. 创建 Keycloak 服务以公开 Keycloak 的 IP:

    kubectl create -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: keycloak
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: keycloak-svc
      namespace: keycloak
      labels:
        app: keycloak
    spec:
      ports:
      - name: http
        port: 80
        targetPort: 8080
      - name: https
        port: 443
        targetPort: 8443
      selector:
        app: keycloak
      type: LoadBalancer
    EOF
    
  2. 在 LoadBalancer 分配 IP 后,将该 IP 导出到变量中,例如:

    export KEYCLOAK_SVC_IP=$(kubectl get services -n keycloak \
        -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
    
  3. 将“A 记录”添加到您的 DNS 网域配置,并将其设置为 ${KEYCLOAK_SVC_IP}

    export KEYCLOAK_SVC=keycloak.example.com
    
  4. 为 Keycloak 生成用于 TLS 的自签名证书。

    openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -subj \
        "/CN=${KEYCLOAK_SVC}" \
        -addext "subjectAltName = DNS:localhost,DNS:${KEYCLOAK_SVC},IP:${KEYCLOAK_SVC_IP}" \
        -out "tls.crt" -keyout "tls.key"
    
  5. 将证书和私钥上传到集群中:

    kubectl create secret tls tls-config -n keycloak --cert=tls.crt \
        --key=tls.key
    
  6. 运行以下命令以部署 Keycloak:

    kubectl create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: keycloak
      namespace: keycloak
      labels:
        app: keycloak
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: keycloak
      template:
        metadata:
          labels:
            app: keycloak
        spec:
          volumes:
          - name: tls-config-volume
            secret:
              secretName: tls-config
              items:
              - key: tls.crt
                path: tls.crt
              - key: tls.key
                path: tls.key
          containers:
          - name: keycloak
            # Set the image as original path but the actual image will be pulled from the registry mirror,
            # which was configured by 'actl push' command.
            image: jboss/keycloak:12.0.2
            # Keycloak uses certificates stored in /etc/x509/https to set up TLS.
            # https://github.com/keycloak/keycloak-containers/blob/master/server/README.md#setting-up-tlsssl
            volumeMounts:
            - name: tls-config-volume
              mountPath: "/etc/x509/https"
            env:
            - name: KEYCLOAK_USER
              value: "admin"
            - name: KEYCLOAK_PASSWORD
              value: "admin"
            - name: PROXY_ADDRESS_FORWARDING
              value: "true"
            ports:
            - name: http
              containerPort: 8080
            - name: https
              containerPort: 8443
            readinessProbe:
              httpGet:
                path: /auth/realms/master
                port: 8080
    EOF
    

设置 Keycloak 用户和客户端

在管理员工作站上打开 Keycloak 控制台,然后使用 keycloak.yaml 文件中的 KEYCLOAK_USERKEYCLOAK_PASSWORD 登录。默认情况下,这些值为 KEYCLOAK_USER=adminKEYCLOAK_PASSWORD=admin。如果需要,请在浏览器中接受自签名证书。如果 Chrome 显示有关不受信任证书的警告,请在对话框中输入 thisisunsafe

echo "Keycloak console: https://${KEYCLOAK_SVC}"

创建大区

  1. 将光标悬停在左上角的主实例上,然后点击添加大区
  2. 输入 anthos 作为新大区的名称,然后点击创建
  3. 大区设置 > 令牌中,将访问令牌有效期更改为 1 Hour,以防止令牌过早过期,然后点击保存

创建用户

  1. 在左侧导航栏中,点击用户,然后点击添加用户
  2. 为用户配置以下设置,然后点击保存
    1. 用户名anthos-platform-admin
    2. 电子邮件地址anthos-platform-admin@example.com
    3. 用户已启用:开启
    4. 电子邮件已验证:开启
  3. 凭据标签页中,填写密码确认密码字段。点击设置密码,并在系统提示时进行验证。

创建客户端

  1. 在左侧导航栏中,点击客户端,然后点击创建
  2. 为客户端配置以下设置,然后点击保存ANTHOS_MANAGEMENT_CENTER 是您用于 Management Center 的自定义域名。
    1. 客户端 ID:Anthos
    2. 客户端协议:openid-connect
    3. 根网址:https://ANTHOS_MANAGEMENT_CENTER
  3. 转到新创建的客户端的管理页面。
  4. 在客户端管理页面的设置标签页上,执行以下步骤:
    1. 访问权限类型设置为 confidential
    2. 将以下 URI 添加到有效的重定向 URI 中。
      • http://localhost:9879/callback
      • https://ANTHOS_MANAGEMENT_CENTER/_gcp_anthos_oidc_callback
    3. 点击保存
  5. 在客户端管理页面的凭据标签页中,选择客户端 ID 和 Secret 作为客户端身份验证器。
  6. 在某一位置记下密文。
    1. 在左侧导航栏中,点击群组,然后点击新建
    2. 输入您的群组名称:anthos-platform-admin-group
    3. 返回左侧的用户标签页,然后点击查看所有用户
    4. 点击您刚刚创建的用户 (anthos-platform-admin),然后点击群组标签页。
    5. 可用组下,选择您创建的组 anthos-platform-admin-group,然后点击加入
    6. 返回到 anthos 客户端管理页面。
    7. 点击映射器标签页,然后点击创建
      1. 输入此映射器的名称:anthos-platform-admin-group-mapper
      2. 映射器类型下拉列表中,选择群组成员资格
      3. Token Claim Name 是身份验证令牌中显示的属性值。Anthos 不公开模式下的默认值为“groups”,因此您可以在此字段中使用 groups。请记住,如果 Token Claim Name 名称不是 groups,则需要使用此值修改 OIDC 配置 GroupsClaim 字段。
      4. 确保已停用完整群组路径
      5. 确保添加到 ID 令牌添加到访问令牌添加到用户信息均已启用。
      6. 点击保存

启用 OIDC 身份验证

获取要在后续步骤中使用的 OIDC 提供商网址。

  1. 运行以下命令:

    export ISSUER_URL=https://${KEYCLOAK_SVC}/auth/realms/anthos
    echo "Issuer URL: ${ISSUER_URL}"
    
  2. 使用前面的 tls.crt 生成 Base64 编码的证书。

    export BASE64_CERT=$(openssl base64 -A -in tls.crt)
    echo "Use the following string as the base64-encoded certificate for the OIDC provider: ${BASE64_CERT}"
    
  1. 在 Management Center Console 中,打开身份和访问权限菜单。
  2. 身份标签页中,点击设置 Anthos Identity Service (OIDC)
  3. 填写以下字段,为 Keycloak 创建配置文件,然后点击提交

    1. 配置文件名称keycloak
    2. OIDC 提供商网址启用 OIDC 身份验证部分中的颁发者网址。
    3. OIDC 客户端 IDanthos
    4. OIDC 客户端密钥创建客户端部分中的客户端密钥
    5. 用户名声明email
    6. 用户名前缀keycloak-
    7. 群组声明设置群组成员资格部分中的群组声明。如果将此字段留空,则值为 groups
    8. 群组前缀keycloak-
    9. 范围email openid
    10. 额外参数access_type=offline
    11. 证书授权机构数据:使用启用 OIDC 身份验证部分中的 base64 编码证书。
  4. 点击将配置文件应用于集群,然后点击管理员集群标签页。

  5. 对于配置文件,请选择您刚刚创建的“keycloak”配置文件。

  6. 对于域名,请输入 ANTHOS_MANAGEMENT_CENTER

  7. 对于初始平台管理员,请始终在用户名之前添加用户前缀。例如,如果要添加 anthos-platform-admin@example.com,请输入 keycloak-anthos-platform-admin@example.com

  8. 点击提交,然后等待一分钟,让系统重新配置各种系统组件。

  9. 在无痕式窗口中,导航到 https://ANTHOS_MANAGEMENT_CENTER。您将被重定向到 Keycloak 登录页面,您可在设置永久性密码之后,以 anthos-platform-admin 身份登录。

替代方法(通过应用 yaml 文件)

  1. 为网域设置 IDP 提供商。如果为网域创建了 DomainConfig,请修补该对象以通过以下命令设置要用于网域的身份验证方法名称:

    kubectl patch domainconfig anthos.example.com --type=json -p='[{"op": "replace", "path":
    "/spec/authMethodName", "value":"keycloak"}]'
    

    如果没有为网域创建 DomainConfig,请使用以下命令进行创建:

    kubectl create -f - <<EOF
    apiVersion: managementcenter.anthos.cloud.google.com/v1
    kind: DomainConfig
    metadata:
      name: anthos.example.com
    spec:
      authMethodName: keycloak
    EOF
    
  2. 请使用以下内容创建 clientconfig-patch.yaml

    # Use this to set the OIDC configuration of Keycloak:
    # kubectl patch ClientConfig default -n kube-public --type=merge --patch $(cat clientconfig-patch.yaml)
    spec:
      authentication:
      # The name of the OIDC configuration to create.
      - name: keycloak
        oidc:
          # ID for the client application that makes authentication requests to the OpenID provider.
          clientID: anthos
          # ID for the client application that makes authentication requests to the OpenID provider.
          clientSecret: YOUR_CLIENT_SECRET
          # The URI to redirect users going through the OAuth flow using cloud console.
          # This is not supported by Anthos private mode.
          cloudConsoleRedirectURI: http://cloud.console.not.enabled
          # Additional key-value parameters (comma-separated) to send to the OpenID provider.
          extraParams: access_type=offline
          # URL where authorization requests are sent to your OpenID.
          issuerURI: YOUR_ISSUER_URI
          # The redirect URL that kubectl uses for authorization.
          kubectlRedirectURI: http://localhost:9879/callback
          # Additional scopes to send to the OpenID provider.
          scopes: openid email
          # JWT claim to use as the username. You can choose other claims, such as email or name,
          # depending on the OpenID provider. However, claims other than email are prefixed
          # with the issuer URL to prevent naming clashes.
          userClaim: email
          # A base64-encoded PEM-encoded certificate for the OIDC provider. To create the string,
          # encode the certificate, including headers, into base64. Include the resulting string
          # in certificateAuthorityData as a single line.
          certificateAuthorityData: YOUR_CERTIFICATE
    
  3. 使用 Keycloak 设置修改 clientconfig-patch.yaml

    sed -i "s|YOUR_ISSUER_URI|${ISSUER_URL}|g" clientconfig-patch.yaml
    sed -i "s|YOUR_CERTIFICATE|${BASE64_CERT}|g" clientconfig-patch.yaml
    
  4. YOUR_CLIENT_SECRET 替换为从 Keycloak 的凭据标签页中获取的客户端密钥。

  5. 运行以下命令以配置 OIDC:

    kubectl patch ClientConfig default -n kube-public --type=merge \
        --patch "$(cat clientconfig-patch.yaml)"
    
  6. 请等待一分钟,以便重新配置各种系统组件。

  7. 按照配置授权角色中的说明设置初始平台管理员帐号。

  8. 在无痕式窗口中,导航到 https://ANTHOS_MANAGEMENT_CENTER。您将被重定向到 Keycloak 登录页面,您可在设置永久性密码之后,以 anthos-platform-admin 身份登录。

删除 Keycloak

使用完 Keycloak 演示后,请删除 Keycloak 安装。

kubectl delete ns keycloak

使用 Google 单点登录进行身份验证

Google 单点登录在 Anthos 不公开模式下不可用。如果要使用 Google 单点登录,则集群和浏览器都必须能够与 Google 的单点登录服务器通信。Google 的单点登录服务器需要与用户集群通信。

  1. 登录 Google Cloud Console 并选择有效的项目。
  2. 访问“API 和服务 > OAuth 同意屏幕”部分。
  3. 创建一个新的 OAuth 同意屏幕。系统会向用户显示此信息。
    1. 应用首页设置为管理员网址。
  4. API 和服务 > 凭据部分中执行以下操作:
    1. 点击创建凭据
    2. 创建一个新的 OAuth 客户端 ID
    3. 将应用类型设置为 Web 应用
    4. 选择一个相关的名称
    5. 对于 JavaScript 来源,请设置 https://anthos.example.com(假设 https://anthos.example.com 是 Management Center 的域名)。
    6. 对于已获授权的重定向 URI,请设置:
      • https://anthos.example.com/_gcp_anthos_oidc_callback
      • http://localhost:9879/callback
  5. 将 ClientID 和客户端密钥复制到 AdminUI 配置。
  6. 将 OIDC 提供方网址设置为 https://accounts.google.com。。
  7. Username Claim设置为email,并将Scopes设置为 openid email
  8. 将“额外的参数”设置为 prompt=consent,access_type=offline。否则,您无法使用 Kubernetes API 服务器登录。
  9. 添加要授予 Platform Admin 权限的用户电子邮件的初始列表(用英文逗号分隔)。
  10. 点击 Save

Google 单点登录

后续步骤