K8s安全防护:深入解析未授权访问漏洞及防御策略

张开发
2026/4/16 23:02:52 15 分钟阅读

分享文章

K8s安全防护:深入解析未授权访问漏洞及防御策略
1. Kubernetes未授权访问漏洞全景扫描当你把公司最核心的业务搬上Kubernetes集群时有没有想过这样一个场景某个深夜黑客仅用一条curl命令就获取了你集群的所有控制权这不是危言耸听去年某电商平台就因Kubelet端口暴露导致千万用户数据泄露。作为从业十年的云原生安全老兵我见过太多因配置疏忽引发的安全事故今天我们就来彻底拆解K8s集群中最危险的万能钥匙——未授权访问漏洞。先看个真实案例某金融公司测试环境的API Server 8080端口对外开放攻击者发现后直接通过kubectl创建了特权Pod不仅窃取了数据库凭证还通过挂载宿主机目录植入了挖矿程序。整个过程仅耗时17分钟而企业直到服务器负载飙升才察觉异常。这类漏洞之所以危险在于它们绕过了认证体系相当于给集群开了后门。当前主流K8s发行版中需要重点监控的敏感端口包括6443/8080API Server的HTTPS/HTTP服务端口10250/10255Kubelet的读写/只读接口2379/2380etcd数据库通信端口30000-32767NodePort服务暴露范围这些端口的风险组合就像多米诺骨牌一旦某个组件失守攻击者就能横向渗透整个集群。我曾做过渗透测试通过暴露的etcd获取kube-system命名空间的token最终只用3步就拿到了集群管理员权限。2. API Server集群大门的钥匙保管员API Server作为集群的交通枢纽其安全配置直接影响整个系统的防御等级。在给某车企做安全审计时我发现他们仍在使用旧版配置# 危险配置示例 spec: containers: - command: - kube-apiserver - --insecure-port8080 - --insecure-bind-address0.0.0.0这种配置相当于把家门钥匙挂在门把手上。攻击者发现后可以这样长驱直入# 查看集群所有节点 curl http://IP:8080/api/v1/nodes # 获取default命名空间所有Pod kubectl --serverhttp://IP:8080 get pods更隐蔽的风险在于6443端口的匿名访问。某次红队行动中我们发现某系统存在这样的ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dangerous-anonymous-access roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: system:anonymous加固方案应该像银行金库一样层层设防彻底关闭insecure-port或仅绑定127.0.0.1启用AlwaysPullImages准入控制器防止镜像篡改配置NetworkPolicy限制API Server访问源IP定期审计ClusterRoleBinding配置实测表明开启审计日志后能发现90%的异常请求。建议配置如下审计策略apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata resources: - group: resources: [secrets, configmaps]3. Kubelet工作节点的致命后门去年曝光的CVE-2020-8558漏洞让Kubelet安全问题再次引发关注。在帮助某视频平台排查入侵事件时我发现攻击者正是利用了10250端口的exec功能实现容器逃逸# 查看节点所有Pod信息 curl -k https://IP:10250/pods # 在容器内执行命令 curl -XPOST -k https://IP:10250/run/default/malicious-pod/nginx -d cmdcat /etc/shadow问题根源在于kubelet-config.yaml的错误配置# 危险配置 apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration authentication: anonymous: enabled: true authorization: mode: AlwaysAllow加固措施需要从三方面入手认证层面# 修改kubelet配置 authentication: anonymous: enabled: false webhook: enabled: true authorization: mode: Webhook网络层面# 使用Calico NetworkPolicy限制访问 apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: kubelet-firewall spec: selector: has(node-role.kubernetes.io/worker) ingress: - action: Allow protocol: TCP source: nets: [10.0.0.0/24] # 仅允许管理网段访问 destination: ports: [10250]运行时防护# 启用Seccomp和AppArmor securityContext: seccompProfile: type: RuntimeDefault appArmorProfile: type: runtime/default4. etcd集群记忆体的数据保险箱etcd存储着K8s集群的全部秘密包括service account token、证书等敏感信息。在金融行业安全评估中我常用以下方法检测etcd安全性# 检查etcd端口暴露情况 netstat -tulnp | grep etcd # 测试未授权访问 ETCDCTL_API3 etcdctl --endpointshttp://IP:2379 get / --prefix --keys-only常见错误配置包括# etcd.yaml危险片段 spec: containers: - command: - etcd - --listen-client-urlshttp://0.0.0.0:2379 - --client-cert-authfalse加固方案需要多管齐下传输加密# 启用双向TLS认证 --listen-client-urlshttps://0.0.0.0:2379 --cert-file/etc/kubernetes/pki/etcd/server.crt --key-file/etc/kubernetes/pki/etcd/server.key --client-cert-authtrue访问控制# 使用防火墙规则限制访问 iptables -A INPUT -p tcp --dport 2379 -s 10.0.0.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 2379 -j DROP数据加密# 启用KMS加密 apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets providers: - kms: name: vault endpoint: unix:///var/run/vault-plugin.sock5. 防御体系的纵深布防真正的安全防护不是单点加固而是构建纵深防御体系。在某政务云项目中我们实施了以下防护矩阵第一层网络隔离# 使用命名空间隔离不同业务 kubectl create namespace finance kubectl label namespace finance security-levelhigh # 配置网络策略 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress - Egress第二层权限收敛# 使用RBAC最小权限原则 apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [] resources: [pods] verbs: [get, watch, list]第三层运行时防护# 部署OPA策略示例 package kubernetes.admission deny[msg] { input.request.kind.kind Pod not input.request.object.spec.securityContext.runAsNonRoot msg : Pods must set runAsNonRoot to true }第四层持续监控# Falco检测规则示例 - rule: Unexpected K8s NodePort Connection desc: Detect connection to NodePort service from external IP condition: evt.typeconnect and evt.dir and fd.sport30000-32767 and not (fd.sip in (10.0.0.0/8, 192.168.0.0/16)) output: Unexpected NodePort connection (user%user.name fd%fd.name) priority: WARNING记得去年处理某次安全事件时攻击者已经突破了外层防线但最终在动态凭证校验环节被拦截。这印证了安全界那句老话防御不是筑墙而是建立可观测、可响应的活体系统。

更多文章