【问题标题】:API Server: Unable to authenticate the request due to an error: invalid bearer tokenAPI 服务器:由于错误无法验证请求:无效的不记名令牌
【发布时间】:2019-05-08 14:41:59
【问题描述】:

我设置了一个包含 3 个主节点和 2 个工作节点的示例 Kubernetes 集群。 我试图将它连接到 OpenId 提供程序(在我的情况下为 Keycloak)。但是在查询 API 时,我从 kubectl 收到以下消息:

error: You must be logged in to the server (Unauthorized)

或通过卷曲:

curl -H "Authorization: Bearer $token" -k https://192.168.178.30:6443/api/v1/namespaces/default/pods
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "Unauthorized",
  "reason": "Unauthorized",
  "code": 401
}

并在 API 服务器日志中显示

Unable to authenticate the request due to an error: invalid bearer token

根据jwt.io,我的令牌似乎是有效的。

API 服务器的配置

在 API 服务器中,我指定了以下参数:

oidc-issuer-url: https://192.168.178.25:8443/auth/realms/master
oidc-client-id: account
oidc-ca-file: /etc/kubernetes/ssl/keycloak-rootCA.pem
oidc-username-claim: sub
oidc-groups-claim: groups

我必须指定 CA 文件,因为用于 keycloak 的证书是自签名证书

证书似乎可以工作,因为没有 CA 文件的 curl 会导致错误;没有指定 CA 文件的地方:

ansible@node1:~$ curl https://192.168.178.25:8443/auth/realms/master
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.


ansible@node1:~$ curl --cacert /etc/kubernetes/ssl/keycloak-rootCA.pem https://192.168.178.25:8443/auth/realms/master
{"realm":"master","public_key":"...","token-service":"https://192.168.178.25:8443/auth/realms/master/protocol/openid-connect","account-service":"https://192.168.178.25:8443/auth/realms/master/account","tokens-not-before":0}

JWT 令牌

我的 JWT 令牌的有效负载如下所示:

{
  "jti": "455feab7-5828-49f3-9243-a2ce0a1ae6f9",
  "exp": 1557246081,
  "nbf": 0,
  "iat": 1557246021,
  "iss": "https://192.168.178.25:8443/auth/realms/master",
  "aud": "account",
  "sub": "78f9bdc8-d1a4-43c4-ab83-f1b4645519f6",
  "typ": "ID",
  "azp": "account",
  "auth_time": 1557246020,
  "session_state": "ccafaa62-a888-43dd-9135-1c5a31766e0b",
  "acr": "1",
  "email_verified": true,
  "name": "Testuser",
  "groups": [
    "group1",
    "k8s-admin"
  ],
  "preferred_username": "dummy-username",
  "given_name": "Firstname1",
  "family_name": "Lastname1",
  "email": "me@example.com"
}

当我尝试使用生成的服务帐户(来自 kubernetes)的令牌登录时,一切正常。

附加信息

环境是通过 Kubespray 设置的,API 服务器参数按以下方式指定:

kube_oidc_url: https://192.168.178.25:8443/auth/realms/master
kube_oidc_client_id: account
kube_oidc_ca_file: "{{ kube_cert_dir }}/keycloak-rootCA.pem"
kube_oidc_username_claim: sub
kube_oidc_groups_claim: groups
#kube_oidc_username_prefix: "oidc:"
#kube_oidc_groups_prefix: "oidc:"

感谢您的帮助。

【问题讨论】:

    标签: kubernetes keycloak kubernetes-apiserver kubespray


    【解决方案1】:

    问题在于 Kubespray 没有将我的设置超越我的设置,进入 api-server (/etc/kubernetes/manifests/kube-apiserver.yaml) 的 Pod 规范。当我在每个 api-server 的 Pod 规范中添加参数时(我有一个多主设置),它按预期工作:

    - --oidc-issuer-url=https://192.168.178.25:8443/auth/realms/master
    - --oidc-client-id=account
    - --oidc-username-claim=email
    - '--oidc-username-prefix=oidc:'
    - --oidc-groups-claim=groups
    - '--oidc-groups-prefix=oidc:'
    - --oidc-ca-file=/etc/kubernetes/ssl/keycloak-rootCA.pem
    

    【讨论】:

      【解决方案2】:

      我认为在你的情况下kube_oidc_url 应该是https://192.168.178.25:8443

      还要注意 documentation 的 CA 证书要求:

      关于上述要求 3 的说明,需要 CA 签名证书。 如果您部署自己的身份提供者(而不是其中一个 像谷歌或微软这样的云提供商)你必须有你的身份 由 CA 证书签署的提供商的 Web 服务器证书 标志设置为 TRUE,即使它是自签名的。这是由于 GoLang TLS 客户端实现对周围的标准非常严格 证书验证。如果你手边没有 CA,你可以使用这个 来自 CoreOS 团队的脚本,用于创建简单的 CA 和签名的 证书和密钥对。或者你可以使用这个类似的脚本 生成具有更长寿命和更大密钥大小的 SHA256 证书。

      【讨论】:

      • 感谢您的评论 Vasily Angapov。 CA 文件设置了此标志 (X509v3 Basic Constraints: critical CA:TRUE)。更改kube_oidc_url 并没有影响结果(实际上我想知道没有不同的错误,因为文档说此路径上必须存在.well-known/openid-configuration(在本例中为https://192.168.178.25:8443/.well-known/openid-configuration)什么不是例。相反,它存在于https://192.168.178.25:8443/auth/realms/master/.well-known/openid-configuration)。还有其他想法吗?
      猜你喜欢
      • 2019-04-20
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2020-06-30
      • 2014-01-31
      • 2018-12-27
      相关资源
      最近更新 更多