news 2026/3/30 19:47:39

kubernetes-对node的kubeconfig安全加固

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
kubernetes-对node的kubeconfig安全加固

kubernetes-对node的kubeconfig安全加固

​ 日拱一卒,功不唐捐。大家好,目前我的kubernetes集群遇到一个安全问题,因为有些集群部署kubeadm部署方式部署的,所以有些集群中kubelet启动的时候使用的admin权限的kubeconfig,这个在生产环境下是存在安全风险的,所以考虑对其进行安全加固。

​ 我们知道kubelet启动的时候需要传kubeconfig,如果使用的是admin权限的kubeconfig,那如果被黑客利用了有很大的安全风险,那如何解决呢?我们自然会想到要么降低权限大小要么选择加密对吧,加密自然麻烦一些你得改kubernetes代码,加密倒不是不可以,主要是还得自己维护代码,所以这里选择降低权限,选择降低node权限使其只能访问本节点数据,不能横向访问其他节点数据。其实是借助了kubernetes的Node Authorizer + NodeRestriction, 限制kubelet只能访问本node的相关资源。

完整流程
admin kubeconfig(仅用于创建 CSR) ↓ 创建 kubelet CSR(system:node:<nodeName>) ↓ approve + 签发证书 ↓ 生成 kubelet 专用 kubeconfig ↓ 重启 kubelet ↓ 删除 admin kubeconfig

假设node的主机名称是 node1.localdomain

1. 控制节点参数
apiserver启用Node+RBAC
--authorization-mode=Node,RBAC
apiserver启用NodeRestriction Admission
--enable-admission-plugins=NodeRestriction
controller-manager
--cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem --cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem
2. 为node生成证书

生成私钥

#openssl genrsa -out kubelet.key 2048

CSR 资源用于请求指定签名者签发证书,流程如下:

设置 CSR 的 CN 和 O 属性非常重要。CN 是用户的名称,O 是此用户所属的群组。 你可以参阅 RBAC 了解标准的群组。

#openssl req -new \ -key kubelet.key \ -subj "/CN=system:node:node1.localdomain/O=system:nodes" \ -out kubelet.csr

创建 CertificateSigningRequest 并通过 kubectl 将其提交到 Kubernetes 集群, 并 批准CerfificateSigningRequest,确保状态是Approved,Issued

#cat <<EOF | kubectl --kubeconfig config-cluster-test apply -f - apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: node1.localdomain-kubelet-client spec: signerName: kubernetes.io/kube-apiserver-client-kubelet request: $(base64 -w0 kubelet.csr) usages: - client auth - digital signature - key encipherment EOF #kubectl --kubeconfig config-cluster-test certificate approve node1.localdomain-kubelet-client

证书值以 Base64 编码格式显示在.status.certificate下, 从 CertificateSigningRequest 导出已颁发的证书。

#kubectl --kubeconfig config-cluster-test get csr node1.localdomain-kubelet-client -o jsonpath='{.status.certificate}' | base64 -d > kubelet-client.crt

将证书配置到 kubeconfig 中并生成新的 /var/lib/kubelet/kubeconfig

#kubectl --kubeconfig config-cluster-test config set-cluster kubernetes \ --server=https://10.236.111.57:6443 \ --certificate-authority=/etc/kubernetes/ca.crt \ --embed-certs=true \ --kubeconfig=/var/lib/kubelet/kubeconfig #kubelet-client.crt和kubelet-client.key为前面生成的私钥和crt #kubectl --kubeconfig config-cluster-test config set-credentials system:node:node1.localdomain \ --client-certificate=/var/lib/kubelet/pki/kubelet-client.crt \ --client-key=/var/lib/kubelet/pki/kubelet-client.key \ --embed-certs=true \ --kubeconfig=/var/lib/kubelet/kubeconfig #kubectl --kubeconfig config-cluster-test config set-context default \ --cluster=kubernetes \ --user=system:node:node1.localdomain \ --kubeconfig=/var/lib/kubelet/kubeconfig #kubectl --kubeconfig config-cluster-test config use-context default \ --kubeconfig=/var/lib/kubelet/kubeconfig
测试
#kubectl --kubeconfig=/var/lib/kubelet/kubeconfig auth can-i get pods
测试效果

实测不能list ns以及configmap/secret, 只能获取本pod相关的configmap以及pod以及secret都能获取,同时能list获取nodes以及pod,但不能exec pod.

# kubectl --kubeconfig=/var/lib/kubelet/kubeconfig -n my-test get secrets Error from server (Forbidden): secrets is forbidden: User "system:node:node1.localdomain" cannot list resource "secrets" in API group "" in the namespace "my-test": No Object name found

附脚本:

#!/bin/sh #用于集群生成node证书 #------ 变量 -------# NODE_HOSTNAME=`hostname` #当前worker节点主机名 API_ENDPOINT="https://10.236.111.57:3141" #集群api的地址 CA_PUB_PATH="/etc/kubernetes/ca.crt" #集群的ca证书 ADMIN_KUBECONFIG="/root/admin-kubeconfig" #集群的admin的kubeconfig DST_KUBECONFIG_PATH="/var/lib/kubelet/kubeconfig.node.new" #最终新的kubeconfig #--------------------# #cd /root openssl genrsa -out kubelet-client.key 2048 openssl req -new \ -key kubelet-client.key \ -subj "/CN=system:node:$HOSTNAME/O=system:nodes" \ -out kubelet-client.csr kubectl --kubeconfig $ADMIN_KUBECONFIG delete csr $NODE_HOSTNAME-kubelet-client cat <<EOF | kubectl --kubeconfig $ADMIN_KUBECONFIG apply -f - apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: $NODE_HOSTNAME-kubelet-client spec: signerName: kubernetes.io/kube-apiserver-client-kubelet request: $(base64 -w0 kubelet-client.csr) usages: - client auth - digital signature - key encipherment EOF sleep 3 kubectl --kubeconfig $ADMIN_KUBECONFIG certificate approve $NODE_HOSTNAME-kubelet-client kubectl --kubeconfig $ADMIN_KUBECONFIG get csr $NODE_HOSTNAME-kubelet-client -o jsonpath='{.status.certificate}' | base64 -d > kubelet-client.crt kubectl --kubeconfig $ADMIN_KUBECONFIG config set-cluster kubernetes \ --server=$API_ENDPOINT \ --certificate-authority=$CA_PUB_PATH \ --embed-certs=true \ --kubeconfig=$DST_KUBECONFIG_PATH kubectl --kubeconfig $ADMIN_KUBECONFIG config set-credentials system:node:$NODE_HOSTNAME \ --client-certificate=./kubelet-client.crt \ --client-key=./kubelet-client.key \ --embed-certs=true \ --kubeconfig=$DST_KUBECONFIG_PATH kubectl --kubeconfig $ADMIN_KUBECONFIG config set-context default \ --cluster=kubernetes \ --user=system:node:$NODE_HOSTNAME \ --kubeconfig=$DST_KUBECONFIG_PATH kubectl --kubeconfig $ADMIN_KUBECONFIG config use-context default \ --kubeconfig=$DST_KUBECONFIG_PATH #覆盖原来使用的kubeconfig cat $DST_KUBECONFIG_PATH > /etc/kubernetes/admin.config

参考:

https://kubernetes.io/zh-cn/docs/tasks/tls/certificate-issue-client-csr/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/20 8:28:38

Windows Terminal终极效率提升指南:从新手到高手的5个实用技巧

Windows Terminal终极效率提升指南&#xff1a;从新手到高手的5个实用技巧 【免费下载链接】terminal The new Windows Terminal and the original Windows console host, all in the same place! 项目地址: https://gitcode.com/GitHub_Trending/term/terminal 还在为命…

作者头像 李华
网站建设 2026/3/27 14:12:18

Unity内置着色器终极指南:版本管理与完整教程

Unity-Built-in-Shaders项目为Unity开发者提供了完整的官方内置着色器代码库&#xff0c;实现了跨版本着色器代码的集中管理和便捷访问。这个开源资源让开发者能够轻松对比不同Unity版本的着色器差异&#xff0c;为项目版本升级和兼容性维护提供了有力支持。 【免费下载链接】U…

作者头像 李华
网站建设 2026/3/27 2:46:07

分子模拟在生物制药中的应用(罕见实战案例曝光)

第一章&#xff1a;分子模拟在生物制药中的革命性角色分子模拟技术正以前所未有的速度重塑生物制药的研发范式。通过在原子级别上精确建模蛋白质、核酸与小分子之间的相互作用&#xff0c;科学家能够在计算机中预测药物分子的结合亲和力、稳定性及潜在毒性&#xff0c;大幅缩短…

作者头像 李华
网站建设 2026/3/29 2:18:22

攻克生物图像分析难题:CellProfiler从入门到精通实战指南

攻克生物图像分析难题&#xff1a;CellProfiler从入门到精通实战指南 【免费下载链接】CellProfiler An open-source application for biological image analysis 项目地址: https://gitcode.com/gh_mirrors/ce/CellProfiler 生物图像分析作为现代生命科学研究的重要工具…

作者头像 李华
网站建设 2026/3/27 4:21:30

MongoDB可视化终极指南:Grafana监控实战技巧

在当今数据驱动的时代&#xff0c;如何将海量MongoDB数据转化为直观的可视化图表成为运维工程师的核心技能。MongoDB Grafana插件通过创新的聚合管道技术&#xff0c;实现了真正的实时监控和数据可视化。本文将带您从零开始&#xff0c;掌握这一强大的监控利器。 【免费下载链接…

作者头像 李华
网站建设 2026/3/24 14:36:25

3步精通JayDeBeApi:Python与Java数据库的无缝桥梁

3步精通JayDeBeApi&#xff1a;Python与Java数据库的无缝桥梁 【免费下载链接】jaydebeapi JayDeBeApi module allows you to connect from Python code to databases using Java JDBC. It provides a Python DB-API v2.0 to that database. 项目地址: https://gitcode.com/g…

作者头像 李华