【问题标题】:Kubernetes OIDC: No valid group mappingKubernetes OIDC:没有有效的组映射
【发布时间】:2021-02-16 23:26:30
【问题描述】:

我的问题是我可以通过OIDC登录我的仪表板,但是没有正确映射oidc组信息,我无法访问相应的资源。

基本设置

  • K8s 版本:1.19.0
  • K8s 设置:1 个主节点 + 2 个工作节点
  • 基于 Debian 10 虚拟机
  • CNI:印花布
  • Louketo Proxy 作为 OIDC 代理
  • OIDC:Keycloak 服务器(Keycloak X [Quarkus])

配置

我已经用这些参数配置了 K8s apiserver。

kube-apiserver.yaml

- --oidc-issuer-url=https://test.test.com/auth/realms/Test
- --oidc-client-id=test
- --oidc-username-claim=preferred_username
- --oidc-username-prefix="oidc:"
- --oidc-groups-claim=groups
- --oidc-groups-prefix="oidc:"

集群角色绑定

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: "test-cluster-admin"
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: "Test"

我使用了以下louketo参数

Louketo 代理

/usr/bin/louketo-proxy --discovery-url=$OIDC_DISCOVERY_URL --client-id=$OIDC_CLIENT_ID --client-secret=$OIDC_CLIENT_SECRET  -listen=$OIDC_LISTEN_URL --encryption-key=$OIDC_ENCRYPTION_KEY --redirection-url=$OIDC_REDIRECTION_KEY --enable-refresh-tokens=true --upstream-url=$OIDC_UPSTREAM_URL --enable-metrics

我在仪表板中收到以下错误消息。 K8s 错误

replicasets.apps is forbidden: User "\"oidc:\"<user_name>" cannot list resource "replicasets" in API group "apps" in the namespace "default"

希望你能帮我解决这个问题,我已经尝试了网上的大部分手册,但还没有找到解决方案。

PS:我已经在Keycloak服务器中做了相应的组映射,也验证了组条目已经转移。

【问题讨论】:

  • 您的 oidc ServiceAccount 有正确的 ClusterRoleClusterRoleBinding 设置吗?
  • @WytrzymałyWiktor OIDC 服务帐户是什么意思?
  • "\"oidc:\"&lt;user_name&gt;" 后面的那个。在我能够发布有意义的答案之前,我正试图找出问题的根源。
  • @WytrzymałyWiktor 我还没有使用 OIDC 用户的凭据创建 K8s 服务帐户。我可以确认存在ClusterRoleBindingClusterRole 和 OIDC 用户。我使用的角色是 K8s 集群的默认管理员角色(cluster-admin)。这能回答你的问题吗?
  • 有人知道我该如何解决这个问题吗?

标签: kubernetes keycloak openid-connect kube-apiserver


【解决方案1】:

如果您面临与我相同的挑战,并且希望将 Keycloak 集成到您的 K8s 集群中,请共享仪表板并将其连接到 Keycloak,您可以在下面找到我的配置。在我的集群中,我使用 Louketo 代理作为 Kubernetes 和 Keycloak 之间的接口。部署的对应配置不在本帖中。

钥匙斗篷

我想从 Keycloak 的配置开始。在第一步中,我创建了一个具有以下设置的相应客户端。

之后,我创建了两个组成员和受众(louketo 代理需要)映射器。

映射器的确切设置可以从两个图像中获取。

组成员映射

受众映射

Kubernetes

在第二步中,我必须更新 api 服务器清单并在 Kubernetes 集群中创建 RoleBindingClusterRoleBinding

Api 服务器清单 (default path: /etc/kubernetes/manifests/kube-apiserver.yaml)

- --oidc-issuer-url=https://test.test.com/auth/realms/Test
- --oidc-client-id=test
- --oidc-username-claim=preferred_username
- --oidc-username-prefix="oidc:"
- --oidc-groups-claim=groups
- --oidc-groups-prefix="oidc:"

角色绑定

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: "test"
namespace: "kubernetes-dashboard"
subjects:
- kind: User
  name: "\"oidc:\"Test"
  namespace: "kube-system"
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin

ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: "test"
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: "\"oidc:\"Test"

@Community 我希望我可以帮助您进行此配置。如果您有任何问题,请随时问我。

【讨论】:

    【解决方案2】:

    这是一个社区 wiki 答案,旨在从 Kubernetes 方面解决问题。任何熟悉可能的 Keycloak 组/角色映射解决方案的人都可以随意编辑它。

    您看到的错误意味着 OIDC 的服务帐户没有适当的权限在默认命名空间中列出 replicasets。最简单的方法是从头开始设置ServiceAccountClusterRoleClusterRoleBinding,并确保它具有适当的权限。例如,您可以创建一个具有“admin”权限的clusterrolebinding by executing

    kubectl create clusterrolebinding OIDCrolebinding - -clusterrole=admin - - group=system:serviceaccounts:OIDC
    

    can be doneClusterRole 相同:

    kubectl create clusterrole OIDC --verb=get,list,watch --resource=replicasets --namespace=default
    

    更多关于如何在此场景中使用kubectl create 的示例可以找到here

    Here您可以找到有关 RBAC 授权的完整官方指南。

    编辑:

    另外,请检查ClusterRoleBinding"\"oidc:\"&lt;user_name&gt;" 是否在"default" 命名空间中。

    【讨论】:

    • 感谢您的回答。 但首先我不明白我应该创建/使用哪个服务帐户,其次从 OIDC 组到 K8s 组的角色映射应该如何工作? 示例性错误并不是唯一缺少的权限问题。我宁愿认为组的实际映射存在问题,甚至可能因为我的 oidc 组被称为“测试”并且只有小写组是可能的。
    • 我尝试从 K8s 方面解决您的问题。我很抱歉这还不够。不幸的是,我对 Keycloak 的概念不太熟悉,但为了消除组映射问题,我将从检查 herehere 开始。我将编辑我的答案并将其更改为社区 wiki,因为它没有解决整个问题。
    • 感谢您的支持。你到底是什么意思,我必须创建哪个服务帐户?我可以肯定地说该组包含在令牌中。我想知道 OIDC 组映射到底是什么样的? johnharris85 能帮我解决这个问题吗?
    • 抱歉回复晚了。你成功了吗?如果没有,还请检查您的ClusterRoleBinding 是否在“默认”命名空间中"\"oidc:\"&lt;user_name&gt;"。正如我所说,我不确定映射应该是什么样子,但我想确保 k8s 组件可以更好地缩小问题范围。
    • 非常感谢您对ClusterRoleBinding 的提示。我再次检查了所有设置,并且可以找到错误。我将在接下来的几天内发布我的完整配置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2011-02-02
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多