排查身份和授权问题

本文档提供有关身份和授权问题的问题排查指南。

保持 gcloud anthos auth 最新

您可以通过验证 gcloud anthos auth 安装的组件处于最新状态,以避免许多常见问题。

因为 gcloud anthos auth 命令在 gcloud 核心组件及独立封装的 anthos-auth 组件中包含逻辑,所以必须验证两个部分。

更新 gcloud

gcloud components update

更新 anthos-auth

gcloud components install anthos-auth

提供方配置无效

如果您的身份提供方配置无效,点击登录后,身份提供方将显示错误屏幕。按照特定于提供方的说明正确配置提供方或您的集群。

权限无效

如果您完成了身份验证流程,但仍看不到集群的详细信息,请确保您已向与 OIDC 搭配使用的帐号授予了正确的 RBAC 权限。请注意,此帐号可能与您用于访问 Google Cloud 控制台的帐号不同。

缺少刷新令牌

如果授权服务器提示是否同意,但未提供所需的身份验证参数,就会出现以下问题。

Error: missing 'RefreshToken' field in 'OAuth2Token' in credentials struct

要解决此问题,请在集群配置文件中将 prompt=consent 添加到 authentication.oidc.extraParams 字段。然后重新生成客户端身份验证文件。

刷新令牌已过期

当 kubeconfig 文件中的刷新令牌已过期时,会出现此问题:

Unable to connect to the server: Get {DISCOVERY_ENDPOINT}: x509:
    certificate signed by unknown authority

如需解决此问题,请再次运行 login 命令。

gkectl create-login-config 无法获取 clientconfig

如果传递到 gkectl create-login-config 的 kubeconfig 文件不适用于用户集群,或者 ClientConfig 自定义资源在集群创建过程中未出现,则会出现此问题。

Error getting clientconfig using KUBECONFIG

要解决此问题,请确保用户集群具有正确的 kubeconfig 文件。然后检查 ClientConfig 对象是否在集群中:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG  get clientconfig default -n kube-public

gkectl create-login-config 由于集群名称重复而失败

如果您尝试写入包含目标文件中已存在的集群名称的登录配置数据,则会出现此问题。每个登录配置文件都必须包含唯一的集群名称。

error merging with file MERGE_FILE because MERGE_FILE contains a
  cluster with the same name as the one read from KUBECONFIG. Please write to
  a new output file

如需解决此问题,请使用 --output 标志指定新的目标文件。

如果未提供 --output,此登录配置数据将写入当前目录中名为 kubectl-anthos-config.yaml 的文件。

gcloud anthos auth login 失败并显示 proxyconnect tcp

如果 https_proxyHTTPS_PROXY 环境变量配置出错,就会出现此问题。如果环境变量中指定了 https://,则当代理配置为使用其他协议(如 SOCK5)来处理 HTTPS 连接时,GoLang HTTP 客户端库可能会失败。

可能的错误消息:

proxyconnect tcp: tls: first record does not look like a TLS handshake

如需解决此问题,请修改 https_proxyHTTPS_PROXY 环境变量以省略 https:// prefix。在 Windows 上,修改系统环境变量。例如,将 https_proxy 环境变量的值从 https://webproxy.example.com:8000 更改为 webproxy.example.com:8000

使用 gcloud anthos auth login 生成的 kubeconfig 时集群访问失败

当 Kubernetes API 服务器无法向用户授权时,就会出现此问题。如果相应的 RBAC 不存在或错误,或者集群的 OIDC 配置存在错误,就可能发生这种情况。

Unauthorized

要解决此问题,请执行以下操作:

  1. gcloud anthos auth login 生成的 kubeconfig 文件中,复制 id-token 的值。

    kind: Config
    …
    users:
    — name: …
      user:
        auth-provider:
          config:
            id-token: xxxxyyyy
    
  2. 安装 jwt-cli 并运行以下命令:

    jwt ID_TOKEN
    
  3. 验证 OIDC 配置。

    用户集群配置文件中的 authentication.oidc 具有 groupusername 字段,用于在 Kubernetes API 服务器中设置 --oidc-group-claim--oidc-username-claim 标志。当 API 服务器收到令牌时,会将令牌转发到 Anthos Identity Service,后者随后会将提取的 group-claimusername-claim 返回给 AIP 服务器。API 服务器使用响应来验证对应的组或用户具有正确的权限。

    验证 ID 令牌中包含集群配置文件的 authentication.oidc 部分中为 groupuser 设置的声明。

  4. 检查已应用的 RBAC。

    针对上一步由 username-claim 指定的用户或者 group-claim 中列出的某个群组,验证是否存在具有正确权限的 RBAC。RBAC 中用户或群组的名称应该带有用户集群配置文件中指定的 usernameprefixgroupprefix 前缀。

    请注意,如果 usernameprefix 为空,并且 username 的值不是 email,则前缀默认为 issuerurl#。要停用用户名前缀,请将 usernameprefix 设置为 -

    如需详细了解用户和群组前缀,请参阅使用 OIDC 进行身份验证

    请注意,Kubernetes API 服务器将反斜杠视为转义字符。因此,如果用户或群组的名称包含 \\,则 API 服务器会在解析 ID 令牌时将其作为单个 \ 进行读取。因此,应用到此用户或群组的 RBAC 角色绑定只能包含一个反斜杠,否则您可能会看到 Unauthorized 错误。

    集群配置文件:

    oidc:
      ...
      username: "unique_name"
      usernameprefix: "-"
      group: "group"
      groupprefix: "oidc:"
    

    ID 令牌:

    {
      ...
      "email": "cluster-developer@example.com",
      "unique_name": "EXAMPLE\\cluster-developer",
      "group": [
        "Domain Users",
        "EXAMPLE\\developers"
      ],
    ...
    }
    

    以下 RBAC 绑定会向此群组和用户授予 pod-reader 集群角色。请注意名称字段中应包含单斜杠,而不是双斜杠:

    群组 ClusterRoleBinding:

    apiVersion:
    kind: ClusterRoleBinding
    metadata:
      name: example-binding
    subjects:
    — kind: Group
      name: "oidc:EXAMPLE\developers"
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
    

    用户 ClusterRoleBinding:

    apiVersion:
    kind: ClusterRoleBinding
    metadata:
      name: example-binding
    subjects:
    — kind: User
      name: "EXAMPLE\cluster-developer"
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
    
  5. 检查 Kubernetes API 服务器日志。

    如果 Kubernetes API 服务器中配置的 OIDC 插件未正确启动,则 API 服务器会在收到 ID 令牌时返回 Unauthorized 错误。如需检查 API 服务器中的 OIDC 插件是否存在任何问题,请运行以下命令:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG logs statefulset/kube-apiserver -n USER_CLUSTER_NAME