ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

k0s 集群 OpenID Connect 集成指南:为 kubectl 启用基于 OIDC 的单点登录与 RBAC 授权

k0s 集群 OpenID Connect 集成指南:为 kubectl 启用基于 OIDC 的单点登录与 RBAC 授权 云原生容器编排边缘计算【免费下载链接】k0sk0s - The Zero Friction Kubernetes项目地址https://gitcode.com/gh_mirrors/k0/k0s点击查看免费下载本指南基于 k0s 官方 OIDC 集成文档讲解如何在 k0s 集群中通过修改ClusterConfig的spec.api.extraArgs为 kube-apiserver 注入 OIDC 认证参数从而让开发者的kubectl通过身份提供方IdP令牌完成登录替代共享证书的不安全做法。读完本文你将掌握 OIDC 认证参数的完整配置方法、Google Cloud / kubelogin 两种客户端工具链的接入方式以及基于 OIDC 用户或组进行 RBAC 角色绑定与用户级 kubeconfig 分发的完整实战方案。为什么需要 OIDC共享证书的隐患开发者访问 Kubernetes 集群最常用的工具是kubectl。默认情况下kubectl使用 X.509 证书向 Kubernetes API Server 认证。当多个开发者需要访问同一集群时就必须共享同一份证书。共享凭据是一个严重的安全问题证书一旦泄露攻击者即可获得与该证书完全相同的权限且泄露后难以追溯责任人后果可能是灾难性的。OIDCOpenID Connect基于 OAuth 2.0 构建为 kubectl 提供单点登录SSO能力。开发者在浏览器中完成身份提供方认证kubectl 通过exec插件如kubelogin或k8s-oidc-helper获取短期 ID Token 与刷新令牌API Server 通过--oidc-*系列参数校验令牌签名与声明claims从而实现对每个开发者身份的唯一识别、可审计和可撤销。密码或令牌不需要存放在集群侧凭据生命周期也更短大幅降低了泄露面。OpenID Connect 认证通过 extraArgs 启用k0s 并不在配置中显式定义 OIDC 专有字段而是通过标准的extraArgs机制把 kube-apiserver 的 OIDC 参数透传下去。这是 k0s 的通用设计ClusterConfig中spec.api的ExtraArgs是传递给 kube-apiserver 进程的任意键值参数见 pkg/apis/k0s/v1beta1/api.go文档同时建议优先使用extraArgs而非rawArgs。从源码看extraArgs的注入点位于 pkg/component/controller/apiserver.gok0s 先构造 apiserver 的默认参数args然后遍历a.NodeConfig.Spec.API.ExtraArgs逐一覆盖或新增若某个键已存在默认值会打印overriding apiserver flag with user provided value警告。这意味着你可以用extraArgs覆盖 k0s 管理的默认参数例如调整tls-min-version、bind-address等OIDC 参数oidc-issuer-url等k0s 默认不设置属于纯新增项不会触发覆盖警告除extraArgs外还有rawArgs字符串切片它会被追加在extraArgs之后且不做任何校验仅在extraArgs无法表达的场景如重复参数下才需要使用。kube-apiserver 的 OIDC 参数清单下表是 kube-apiserver 支持、并由 k0s 通过extraArgs透传的 OIDC 参数与 k0s 官方文档一致参数说明示例是否必填--oidc-issuer-url提供方 URLAPI Server 据此发现公钥以校验令牌签名。仅接受https://协议。通常是提供方的 discovery URL 去掉路径后的部分即.well-known/openid-configuration所在层级之下若 discovery URL 是https://accounts.google.com/.well-known/openid-configuration则取值https://accounts.google.com是--oidc-client-id所有令牌必须为其签发的 client idkubernetes是--oidc-username-claim用作用户名的 JWT 声明默认sub终端用户的唯一标识。管理员可按提供方选择email或name等除email外的声明会加上 issuer URL 前缀以防与其他插件冲突sub否--oidc-username-prefix加在用户名声明前的前缀防止与既有名称如system:用户冲突。例如值oidc:会生成oidc:jane.doe这类用户名。若未提供该参数且--oidc-username-claim不是email前缀默认取( Issuer URL )#( Issuer URL )即--oidc-issuer-url的值值-可禁用所有前缀oidc:否--oidc-groups-claim用作组成员信息的 JWT 声明。若该声明存在必须是字符串数组groups否--oidc-groups-prefix加在组声明前的前缀防止与既有名称如system:组冲突。例如oidc:会生成oidc:engineering、oidc:infra这类组名oidc:否--oidc-required-claim描述 ID Token 中必需声明的keyvalue对。若设置则校验该声明必须存在于 ID Token 且值匹配。可重复该参数指定多个声明claimvalue否--oidc-ca-file签署身份提供方 Web 证书的 CA 证书路径默认使用宿主机的根 CA 列表/etc/kubernetes/ssl/kc-ca.pem否前提条件启用 OIDC 认证前你需要从身份提供方获得三项信息issuer-url提供方的签发者 URLclient-id为 k0s 集群kube-apiserver注册的 OAuth 客户端 IDusername-claim从令牌中提取用户名的声明名。具体如何创建应用、申请客户端凭据取决于你选择的 OIDC 提供方。可参考 k0s 文档中的 提供方配置指南以 Google Cloud 为例或查阅所选提供方的官方文档——k0s 文档并未覆盖所有提供方。注意若使用自建stand-aloneOIDC 提供方其 Web 证书可能不在宿主机根 CA 信任链内此时需要额外设置--oidc-ca-file指向该提供方的 CA 证书。最小配置示例满足裸机最小可用场景只需三个参数oidc-issuer-url、oidc-client-id、oidc-username-claim。将下面的片段合并进你的ClusterConfigapiVersion: k0s.k0sproject.io/v1beta1 kind: ClusterConfig spec: api: extraArgs: oidc-issuer-url: issuer-url oidc-client-id: client-id oidc-username-claim: email # we use email token claim field as a username以该配置为起点继续参考 k0s 配置指南 完成集群安装与启动。从类型定义看APISpec.ExtraArgs是map[string]string对应 YAML 中extraArgs下的键值对见 pkg/apis/k0s/v1beta1/api.go 与 CRD 定义 static/_crds/k0s/k0s.k0sproject.io_clusterconfigs.yaml。除 API Server 外etcd、kine、kube-router、kube-proxy、controller-manager、scheduler 等组件同样拥有extraArgs字段机制完全一致见 pkg/apis/k0s/v1beta1/clusterconfig_types.go因此这套配置方式可推广到其他组件参数的透传。OpenID Connect 授权两种实现路径OIDC 解决的是你是谁认证而你能做什么授权仍需通过 Kubernetes RBAC 完成。文档给出两种替代方案。方案一提供方侧角色映射组驱动在extraArgs中加入oidc-groups-claim指定 ID Token 中携带组的声明spec: api: extraArgs: oidc-issuer-url: issuer-url oidc-client-id: client-id oidc-username-claim: email oidc-groups-claim: groups一般做法是oidc-groups-claim告诉 kube-apiserver 从令牌的哪个声明读取用户的组列表随后在集群中为这些组创建对应的 RBACClusterRole与ClusterRoleBinding将subjects[].kind设为Group。k0s 官方文档强调你仍需要自行在 OIDC 提供方与 kube-api 的 RBAC 体系之间同步组数据——即保证提供方签发的组名与集群内 RoleBinding 引用的组名一致。具体到某提供方如何配置组声明请参考 提供方配置指南。方案二手动角色管理用户驱动不依赖提供方的组数据而是为每个新用户手动创建 Role 与 RoleBinding。角色本身可为所有用户共享。角色示例注意这是全包容示例涵盖全部资源与动作生产环境应裁剪到实际所需的最小权限--- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: dev-role rules: - apiGroups: [*] resources: [*] verbs: [*]RoleBinding 示例subjects[].name必须是用户在 OIDC 提供方侧的 ID——即--oidc-username-claim所选声明在令牌中的实际取值例如email声明对应的邮箱地址或sub声明的唯一标识kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dev-role-binding subjects: - kind: User name: provider side user id roleRef: kind: Role name: dev-role apiGroup: rbac.authorization.k8s.io注意事项上面的 Role 只是示例务必根据实际需求收窄权限最小权限原则不要在生产集群直接套用全部权限的角色若改用组驱动将subjects[].kind改为Group、name改为提供方签发的组名即可并可使用ClusterRoleBinding让权限作用于所有命名空间命名空间级Role/RoleBinding与集群级ClusterRole/ClusterRoleBinding的选择取决于你希望授权覆盖的范围。kubeconfig 管理给用户签发最小权限的 kubeconfig重要提醒不要把/var/lib/k0s/pki/admin.conf的完整内容直接提供给终端用户。该文件携带管理员级权限直接分发等同于把集群管理权交给他人。正确做法是以/var/lib/k0s/pki/admin.conf为模板复制出集群相关的连接信息server URL、证书颁发机构 CA 等替换其中的用户凭据部分为用户单独创建一个用户专属、权限受限的 kubeconfig其中用户条目需按所选认证工具生成见下文授权侧的具体做法由提供方专属指南描述。这样每个开发者持有自己的 kubeconfig只能行使 RBAC 授予的权限且凭据与身份一一对应便于审计与回收。客户端侧为 kubectl 接入 OIDC 登录kubeconfig 的用户条目需要配置一个认证插件让 kubectl 在访问集群时自动换取令牌。k0s 文档提供了两种主流方式详见 提供方配置指南使用 k8s-oidc-helperGoogle Cloud 示例k0s 文档以 Google Cloud 为示例提供方issuer URL 为https://accounts.google.com并使用k8s-oidc-helper生成 kubeconfig 用户记录。准备流程在 Google Cloud Dashboard 的 Credentials 页面创建项目创建 OAuth consent screenOAuth 同意屏幕创建新凭据类型选 OAuth client ID应用类型选 Desktop桌面应用保存 client ID 与 client secret。然后运行命令并交互式授权k8s-oidc-helper --client-idCLIENT_ID \ --client-secretCLIENT_SECRET \ --writetrue工具会将 OIDC 用户记录写入 kubeconfig后续 kubectl 即可使用该用户身份访问集群。若你使用其他提供方请查阅其自身文档完成客户端注册。使用 kubelogin 插件通用方案对于其他 OIDC 提供方推荐kubelogin插件。其安装与完整配置参见 kubelogin 官方 setup 指南。Google Cloud 场景下两步操作如下。第一步交互式换取令牌并写入 kubeconfigkubectl oidc-login setup \ --oidc-issuer-urlhttps://accounts.google.com \ --oidc-client-idCLIENT_ID \ --oidc-client-secretCLIENT_SECRET第二步为 kubeconfig 配置 exec 凭证插件让 kubectl 每次访问自动调用kubectl oidc-login get-tokenkubectl config set-credentials oidc \ --exec-api-versionclient.authentication.k8s.io/v1beta1 \ --exec-commandkubectl \ --exec-argoidc-login \ --exec-argget-token \ --exec-arg--oidc-issuer-urlhttps://accounts.google.com \ --exec-arg--oidc-client-idCLIENT_ID \ --exec-arg--oidc-client-secretCLIENT_SECRET最后将当前 context 切换到oidc用户kubectl config set-context --current --useroidc此后 kubectl 会在令牌过期时自动触发 OIDC 登录流程完成刷新。端到端配置清单与验证思路将整条链路串起来一次完整的 OIDC 改造包括以下步骤提供方侧在 IdP 注册应用取得client-id与--oidc-client-id一致确认issuer-urldiscovery URL 去掉路径明确将用于用户名的声明如email。集群侧认证在 k0s 配置 的spec.api.extraArgs中加入oidc-issuer-url、oidc-client-id、oidc-username-claim如需组驱动授权再加oidc-groups-claim自建 IdP 需加oidc-ca-file。集群侧授权创建 Role/RoleBinding或 ClusterRole/ClusterRoleBindingsubjects[].name填写用户在 IdP 侧的用户 ID 或组名。客户端以/var/lib/k0s/pki/admin.conf为模板生成用户专属 kubeconfig配置 kubelogin 或 k8s-oidc-helper 作为认证插件。验证kubectl auth whoami确认当前身份是否为 OIDC 声明解析出的用户名尝试执行被授予/未授予的操作确认 RBAC 生效检查 API Server 日志确认无oidc相关认证报错。参考文档OAuth2 规范Kubernetes 授权系统RBACKubernetes 认证系统k0s 仓库相关实现pkg/component/controller/apiserver.goextraArgs 注入逻辑、pkg/apis/k0s/v1beta1/api.goAPISpec 类型定义、pkg/apis/k0s/v1beta1/clusterconfig_types.go各组件 ExtraArgs 定义、docs/configuration.mdextraArgs 参数说明表赞分享云原生容器编排边缘计算【免费下载链接】k0sk0s - The Zero Friction Kubernetes项目地址https://gitcode.com/gh_mirrors/k0/k0s点击查看免费下载相关推荐Authelia 与 Drupal 集成指南基于 OpenID Connect 1.0 实现单点登录SSOAuthelia 与 Drupal 集成指南基于 OpenID Connect 1.0 实现单点登录SSO 本篇技术指南以 Authelia 作为 Ope后端认证鉴权单点登录身份认证应用安全Authelia 集成 DokuWiki基于 OpenID Connect 1.0 的 SSO 单点登录配置指南Authelia 集成 DokuWiki基于 OpenID Connect 1.0 的 SSO 单点登录配置指南 本指南以 Authelia 的 OpenID后端认证鉴权单点登录身份认证应用安全Kuberos OIDC Helper为启用 OIDC 与 RBAC 的 Kubernetes 集群生成 kubectl 配置片段Kuberos OIDC Helper为启用 OIDC 与 RBAC 的 Kubernetes 集群生成 kubectl 配置片段 本指南以 Helm Cha上一篇NCM文件解密完整指南免费开源工具ncmdump3分钟还原网易云音乐下一篇EldenRingSaveCopier 艾尔登法环存档迁移教程5 分钟搬走一个角色不连累整份存档免费开源创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表