如何在kubelogin中使用用户名替代OIDC提供商分配的sub/user_id
解决方案
问题根源
Kubernetes APIServer 解析OIDC Token时,默认根据你配置的oidc-username-claim字段从JWT payload中取值作为用户唯一标识,你当前配置的是sub,所以APIServer拿到的用户名永远是Token里的REDACTED_SUB,和你kubeconfig里配置的凭证别名没有关系。
操作步骤
- 确认OIDC Token包含用户名字段
先解码你拿到的ID Token,查看payload中是否有存储用户名的字段,常见的字段名包括preferred_username、name、email等。如果没有对应字段,需要先调整你的OIDC提供商配置,将用户名写入ID Token的声明中。 - 修改Minikube APIServer配置
重新启动Minikube,将oidc-username-claim参数修改为你要使用的用户名字段,示例如下(以preferred_username为例):
minikube start --extra-config=apiserver.authorization-mode=RBAC,Node \ --extra-config=apiserver.oidc-issuer-url=$ISSUER_URL \ --extra-config=apiserver.oidc-client-id=$CLIENT_ID \ --extra-config=apiserver.oidc-username-claim=preferred_username
如果需要避免用户名和集群内其他用户重名,可以额外添加--extra-config=apiserver.oidc-username-prefix=oidc:参数,这样APIServer会自动给所有OIDC登录的用户名加上oidc:前缀。
3. 重新绑定集群角色
现在APIServer解析出的用户名就是你指定字段的值,直接将ClusterRole绑定到对应用户名即可,假设你的用户名字段值为custom-user,命令如下:
kubectl create clusterrolebinding oidc-cluster-admin --clusterrole=cluster-admin --user=custom-user
如果加了前缀就把参数值改成oidc:custom-user。
4. 验证权限
按照之前的步骤配置好kubeconfig后,执行权限验证命令即可:
kubectl --user=oidc get nodes
补充说明
kubeconfig中set-credentials后面跟的oidc只是本地凭证的别名,仅用于本地区分不同凭证,不会作为用户名传给APIServer,不需要和实际的OIDC用户名保持一致。如果你的OIDC提供商确实不支持自定义ID Token声明,也可以直接使用sub值作为用户标识,仅在本地给凭证起易读的别名即可,不会影响正常使用。
内容的提问来源于stack exchange,提问作者user_af
相关产品推荐
相关产品推荐

