场景
作为 SRE,你发现 Kubernetes 工作节点上的 kubelet 端口(10250)暴露在内部网络中,允许未经认证的访问,可能被用于获取 Pod 和容器信息甚至执行命令。
症状
- 安全扫描报告显示 kubelet 端口开放。
- 在系统命名空间下意外创建 Pod。
- API 服务器日志中出现大量来自未知身份的对 kubelet 的请求。
诊断
- 检查 kubelet 启动参数:
ps aux | grep kubelet,查看是否缺少--authentication-token-webhook和--authorization-mode设置。 - 使用网络扫描确认端口暴露:
nmap -p 10250 <node-ip>。 - 尝试直接访问 kubelet API:
curl -k https://<node-ip>:10250/pods,如果返回 Pod 列表则存在安全隐患。
命令与操作
1. 启用 kubelet 认证与授权
编辑 kubelet 配置文件(通常位于 /var/lib/kubelet/config.yaml),添加或修改:
authentication:
webhook:
enabled: true
anonymous:
enabled: false
authorization:
mode: Webhook
重启 kubelet:systemctl restart kubelet。
2. 网络层面限制访问
使用 Kubernetes NetworkPolicy 或云平台防火墙规则,仅允许 API 服务器和 Prometheus 等必要组件访问 kubelet 端口。示例 NetworkPolicy:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-kubelet
namespace: kube-system
spec:
podSelector:
matchLabels:
component: kubelet
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
component: kube-apiserver
ports:
- port: 10250
3. 启用 NodeRestriction 准入控制器
在 kube-apiserver 启动参数中添加 --enable-admission-plugins=NodeRestriction,确保节点只能修改自身相关的资源。
4. 配置 RBAC 以限制 kubelet API 权限
创建 ClusterRole 和 ClusterRoleBinding,仅允许系统节点使用 nodes/proxy 等必要资源。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:kubelet-api-admin
rules:
- apiGroups: [""]
resources: ["nodes/proxy"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:kubelet-api-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:kubelet-api-admin
subjects:
- kind: Group
name: system:nodes
apiGroup: rbac.authorization.k8s.io
5. 强制 Pod 安全标准
启用 Pod Security Admission(PSA),设置命名空间标签:
kubectl label ns default pod-security.kubernetes.io/enforce=restricted
或使用 OPA/Gatekeeper 实施自定义策略。
风险控制
- 所有更改先在预发布环境测试。
- 确保 API 服务器有足够内存处理额外准入 Webhook 调用。
- 备份 kubelet 配置文件。
- 对 kubelet 重启采用滚动更新策略,避免同时重启多个节点。
回滚
- 还原 kubelet 配置文件,重启服务。
- 删除添加的 RBAC 资源:
kubectl delete clusterrole system:kubelet-api-admin。 - 删除 NetworkPolicy。
- 移除 Pod Security Admission 标签。
验证
- 尝试未认证访问:
curl -k https://<node-ip>:10250/pods应返回 401 或 403。 - 使用有效的 ServiceAccount 令牌测试:
kubectl get --raw /api/v1/nodes/<node>/proxy/pods应成功(需 RBAC 授权)。 - 检查 API 服务器日志确认无未授权 kubelet 请求。
何时提交 OpsGlobal 工单
- 实施后出现大规模的 Pod 连接异常或节点不可用。
- 需要协助配置 Pod Security Admission 的基线或受限模式。
- 计划集成 OPA/Gatekeeper 但缺乏经验。
- 需要审计日志配置和告警规则。
OpsGlobal 的资深 SRE 专家可以提供 7x24 远程支持,确保生产集群安全稳定。
适用场景
适合正在处理 Security、Kubernetes, SRE 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
学习从 RBAC、网络策略到 Pod 安全准入和审计日志的关键 Kubernetes 集群安全加固步骤,包含真实 SRE 场景和回滚流程。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。