kubeasz 客户端 kubeconfig 管理实战:用 ezctl kcfg-adm 签发限权限、限时限的用户证书
kubeasz 客户端 kubeconfig 管理实战用 ezctl kcfg-adm 签发限权限、限时限的用户证书【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeaszkubeasz 集群安装完成后默认生成的 kubectl kubeconfig 拥有集群全部管理权限且有效期长达 50 年直接分发给普通用户存在极大安全风险。本篇技术指南围绕 docs/op/kcfg-adm.md 展开系统讲解 kubeasz 内置的ezctl kcfg-adm子命令如何基于 cfssl 证书签发与 Kubernetes RBAC 权限绑定批量创建、列举和删除限定权限、限定期限的自定义用户 kubeconfig。读完本文你将掌握-A / -D / -L / -e / -t / -u六个参数的完整用法并理解从证书签名请求到 ClusterRoleBinding 落地的整条实现链路可直接用于日常集群的多用户权限治理。背景为什么需要单独管理客户端 kubeconfigKubernetes 的 API Server 认证体系支持多种策略kubeasz 默认采用客户端证书client certificate认证 RBAC 授权的组合用户持有由集群 CA 签发的客户端证书访问 API Server证书中的CNCommon Name字段被识别为用户名随后由 RBAC 的 ClusterRoleBinding / RoleBinding 决定该用户能执行哪些操作。kubeasz 安装完成后deploy角色会通过 create-kubectl-kubeconfig.yml 生成一个供管理员使用的kubectl.kubeconfig它绑定cluster-admin集群角色证书期限长达 50 年。这份万能钥匙一旦泄露攻击者即可完全控制集群因此它不应该被直接分发给普通用户更合理的做法是像 kcfg-adm 这样为每个使用者单独签发一份限定权限admin 或 view、限定有效期的证书和 kubeconfig。原文档开头即强调默认 k8s集群安装成功后生成客户端kubeconfig它拥有集群管理的所有权限不要将这个admin权限、50年期限的kubeconfig流露出去。ezctl kcfg-adm正是 kubeasz 封装好的解决方案其思路可以概括为三句话用 cfssl 以kcfgprofile 为用户签发带过期时间的客户端证书CN 即用户名用 kubectl config 系列命令组装出独立的 kubeconfig 文件用ClusterRoleBinding把该用户绑定到cluster-adminadmin或view只读集群角色。kcfg-adm 命令总览与参数说明在/etc/kubeasz目录kubeasz 安装根目录下执行ezctl kcfg-adm cluster args运行ezctl help kcfg-adm可以看到完整帮助信息Usage: ezctl kcfg-adm cluster args available args: -A to add a client kubeconfig with a newly created user -D to delete a client kubeconfig with the existed user -L to list all of the users -e to set expiry of the user certs in hours (ex. 24h, 8h, 240h) -t to set a user-type (admin or view) -u to set a user-name prefix examples: ./ezctl kcfg-adm test-k8s -L ./ezctl kcfg-adm default -A -e 240h -t admin -u jack ./ezctl kcfg-adm default -D -u jim-202101162141各参数含义如下表参数作用取值说明默认值-A新增一个用户及其 kubeconfig需配合-u可选-e、-t无动作参数必选其一-D删除一个已存在的用户 kubeconfig-u后跟完整用户名含时间戳后缀无-L列出集群中所有自定义用户无附加参数无-e设置证书有效期小时数如24h、8h、240h必须形如数字h4800h即 200 天-t设置用户类型仅admin或viewadmin-u设置用户名前缀任意字符串实际用户名会追加时间戳user上述默认值与参数校验规则均可在 ezctl 的函数实现中找到依据脚本中初始化EXPIRY4800h、USER_TYPEadmin、USER_NAMEuser并分别用正则校验参数格式-e必须匹配^[1-9][0-9]*h$否则报错-e must be set like 2h, 5h, 50000h, ...-t只能是admin或view否则报错-t can only be set as admin or view。核心能力概括为两点可以设置过期时间证书到期后 API Server 将拒绝该客户端证书无需人工回收可以设置权限admin对应clusterrole:cluster-admin全权view对应clusterrole:view只读。使用实战完整的五个操作步骤以下以集群k8s-01为例下文命令输出均为真实运行效果时间戳来自原文档演示从查看、新增、复核到删除的完整流程。1. 查看集群当前自定义 kubeconfigezctl kcfg-adm k8s-01 -L 2021-01-24 16:32:43 INFO list-kcfg k8s-01 2021-01-24 16:32:43 INFO list-kcfg in cluster:k8s-01 USER TYPE EXPIRY(8h if in Asia/Shanghai) --------------------------------------------------------------------------------- 2021-01-24 16:32:43 INFO list-kcfg k8s-01 success初始情况下列表为空表格只有表头。注意表头第三列的提示证书过期时间按 UTC 存储若当前时区为 Asia/Shanghai东八区实际到期时刻需 8 小时。2. 新增用户 user01期限 24h、只读权限ezctl kcfg-adm k8s-01 -A -u user01 -e 24h -t view 2021-01-24 17:32:33 INFO add-kcfg k8s-01 2021-01-24 17:32:33 INFO add-kcfg in cluster:k8s-01 with user:user01-202101241732 PLAY [localhost] ***************************************************************************************************** ...此处省略输出 TASK [deploy : debug] ************************************************************************************************ ok: [localhost] { msg: 查看user01-202101241732自定义kubeconfig/etc/kubeasz/clusters/k8s-01/ssl/users/user01-202101241732.kubeconfig } PLAY RECAP *********************************************************************************************************** localhost : ok12 changed10 unreachable0 failed0 skipped0 rescued0 ignored0 2021-01-24 17:32:41 INFO add-kcfg k8s-01 success注意日志中的关键信息传入的用户名user01被自动追加了时间戳实际用户名为user01-202101241732年月日时分生成的 kubeconfig 位于/etc/kubeasz/clusters/k8s-01/ssl/users/user01-202101241732.kubeconfig时间戳后缀的意义在于避免重名、便于审计每次新增都会生成全新用户历史证书即使泄露也可精准定位并按名删除。3. 再增加用户 user02期限 240h、admin 权限ezctl kcfg-adm k8s-01 -A -u user02 -e 240h -t admin 2021-01-24 18:38:47 INFO add-kcfg k8s-01 2021-01-24 18:38:47 INFO add-kcfg in cluster:k8s-01 with user:user02-202101241838 PLAY [localhost] ***************************************************************************************************** ...此处省略输出 TASK [deploy : debug] ************************************************************************************************ ok: [localhost] { msg: 查看user02-202101241838自定义kubeconfig/etc/kubeasz/clusters/k8s-01/ssl/users/user02-202101241838.kubeconfig } PLAY RECAP *********************************************************************************************************** localhost : ok12 changed9 unreachable0 failed0 skipped0 rescued0 ignored0 2021-01-24 18:38:55 INFO add-kcfg k8s-01 success本次只改了用户类型admin与有效期240h其余流程一致。admin 类型的分发对象应当是集群运维/管理员角色务必谨慎。4. 再次查看确认两类用户已生效ezctl kcfg-adm k8s-01 -L 2021-01-24 18:40:30 INFO list-kcfg k8s-01 2021-01-24 18:40:30 INFO list-kcfg in cluster:k8s-01 USER TYPE EXPIRY(8h if in Asia/Shanghai) --------------------------------------------------------------------------------- user02-202101241838 cluster-admin 2021-02-03T10:34:00Z user01-202101241732 view 2021-01-25T09:28:00Z 2021-01-24 18:40:31 INFO list-kcfg k8s-01 success列表按权限类型分组展示user02-202101241838为cluster-admin到期2021-02-03T10:34:00Zuser01-202101241732为view到期2021-01-25T09:28:00Z与创建时指定的-e、-t完全对应。过期时间换算到北京时间user01 实际在2021-01-25 17:28失效user02 实际在2021-02-03 18:34失效。5. 删除用户 user01-202101241732 的权限ezctl kcfg-adm k8s-01 -D -u user01-202101241732 2021-01-24 21:41:50 INFO del-kcfg k8s-01 2021-01-24 21:41:50 INFO del-kcfg in cluster:k8s-01 with user:user01-202101241732 clusterrolebinding.rbac.authorization.k8s.io crb-user01-202101241732 deleted 2021-01-24 21:41:50 INFO del-kcfg k8s-01 success删除操作删除的是名为crb-user01-202101241732的 ClusterRoleBinding。再次列出确认ezctl kcfg-adm k8s-01 -L 2021-01-24 21:42:02 INFO list-kcfg k8s-01 2021-01-24 21:42:02 INFO list-kcfg in cluster:k8s-01 USER TYPE EXPIRY(8h if in Asia/Shanghai) --------------------------------------------------------------------------------- user02-202101241838 cluster-admin 2021-02-03T10:34:00Z 2021-01-24 21:42:02 INFO list-kcfg k8s-01 successuser01 已从列表消失集群中只剩 user02 一个自定义用户。底层实现解析一条 kubeconfig 是如何诞生的理解实现细节有助于在排障或二次开发时快速定位问题。整个功能由三部分协作完成ezctl 脚本命令入口、deploy 角色的 Ansible 任务证书与 kubeconfig 生成、模板文件证书请求与 RBAC 声明。ezctl 中的三个核心函数在 ezctl 中kcfg-adm函数负责参数解析与分发随后分别调用add-kcfg新增执行USER_NAME$USER_NAME-$(date %Y%m%d%H%M)追加时间戳然后调用 ansible-playbookansible-playbook -i clusters/$1/hosts -e clusters/$1/config.yml \ -e CUSTOM_EXPIRY$EXPIRY -e USER_TYPE$USER_TYPE \ -e USER_NAME$USER_NAME -e ADD_KCFGtrue \ -t add-kcfg roles/deploy/deploy.yml注意它同时注入了四个关键变量CUSTOM_EXPIRY证书期限、USER_TYPE权限类型、USER_NAME最终用户名、ADD_KCFGtrue开关并只执行add-kcfgtagdel-kcfg删除先通过 kubectl 的 jsonpath 过滤出 subjects 中匹配该用户名的 ClusterRoleBinding 名称再kubectl delete clusterrolebindings删除绑定最后清理clusters/$1/ssl/users/$USER_NAME*相关文件list-kcfg列举分别用 jsonpath 按roleRef.name cluster-admin和roleRef.name view过滤出两类用户再用cfssl-certinfo读取各用户证书的not_after字段解析出过期时间最后按admin → view → 其他unknown的顺序打印表格。deploy 角色的证书签发链路命令最终落到 deploy.yml- hosts: localhost角色为 deploy。在 main.yml 中只有当ADD_KCFG|bool为真时才导入 add-custom-kubectl-kubeconfig.ymltag 为add-kcfg整个任务流共 11 个步骤可分为四段准备目录与 CSR创建ssl/users/目录准备 CA 配置文件 ca-config.json.j2并根据 user-csr.json.j2 模板生成用户证书签名请求。CSR 中CN: {{ USER_NAME }}是关键——它将被 API Server 识别为 RBAC 中的用户名签发证书使用 cfssl 以kcfgprofile 签发客户端证书cfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json \ -profilekcfg {{ USER_NAME }}-csr.json | cfssljson -bare {{ USER_NAME }}其中 ca-config.json.j2 中定义了kcfgprofileusages 仅含signing、key encipherment、client auth纯客户端用途而expiry取值为{{ CUSTOM_EXPIRY }}——这正是-e参数能控制证书有效期的根本原因组装 kubeconfig依次执行kubectl config set-cluster写入 API Server 地址与 CA 证书、set-credentials写入客户端证书与私钥、set-context和use-context--embed-certstrue将证书内容内嵌进文件方便直接拷贝给用户使用绑定 RBAC 权限根据 crb.yaml.j2 模板生成 ClusterRoleBinding 并通过kubectl apply -f生效。模板通过 Jinja2 条件判断决定绑定哪个集群角色{% if USER_TYPE admin %} name: cluster-admin {% else %} name: view {% endif %}subjects 中kind: User、name: {{ USER_NAME }}与证书 CN 严格对应形成证书认证 → 用户名 → RBAC 授权的完整闭环。产物目录结构每次新增操作会在集群目录下留下以下文件以 user01 为例/etc/kubeasz/clusters/k8s-01/ssl/users/ ├── user01-202101241732-csr.json # 证书签名请求 ├── user01-202101241732.pem # 客户端证书 ├── user01-202101241732-key.pem # 客户端私钥 ├── user01-202101241732.kubeconfig # 最终交付给用户的配置文件 └── crb-user01-202101241732.yaml # ClusterRoleBinding 声明其中crb-*.yaml是本次部署的编排产物可留作审计交付给用户时只需拷贝*.kubeconfig一份文件证书已内嵌。使用建议与安全注意事项综合原文档与实现源码归纳以下几点实操建议管理员 kubeconfig 严格保密默认kubectl.kubeconfig是 50 年期限的 cluster-admin只应保存在可信管理端切勿随意外发按需设置有效期临时授权建议用短期限如-e 24h长期合作再放宽如-e 240h。证书到期自动失效无需手动回收是成本最低的自动吊销手段只读权限优先绝大多数查看类需求用-t view即可满足admin仅授予确有管理职责的人员删除需用完整用户名-D参数要求传入带时间戳后缀的完整用户名如user01-202101241732因为删除逻辑是按完整名称匹配 ClusterRoleBinding 的 subjects注意时区换算-L输出的 EXPIRY 为 UTC 时间东八区用户请自行 8 小时判断实际失效时刻强制校验保证安全ezctl 对-e、-t的输入做了正则校验错误格式会直接报错退出避免误传非法参数导致意外行为。如果需要对已有集群的 CA 或证书进行整体轮换可参考 force_ch_certs.mdkcfg-adm 与 kubeasz 其他运维子命令如 add-node、add-master、backup 等的完整清单见 op-index.mdezctl 的整体用法可查阅 ezctl.md。本文涉及的源码文件均可直接在仓库中继续深入阅读ezctl、add-custom-kubectl-kubeconfig.yml、user-csr.json.j2、crb.yaml.j2、ca-config.json.j2。【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考