标签:#Kubernetes #Python #DevSecOps #网络安全 #云原生 #自动化运维
🚨 前言:你的集群也许正在“裸奔”
你是否见过这种 YAML 配置?
securityContext:privileged:true# 为了省事,直接给特权runAsUser:0# 直接用 root 跑这种配置在开发环境很常见,可一旦溜进生产环境,就是严重的容器逃逸风险。
普通的镜像扫描(Image Scanning)只能扫出软件漏洞(CVE),扫不出这种配置漏洞。我们需要的是配置审计(Configuration Audit)。
🏗️ 一、 核心架构:基于 K8s API 的巡检
我们要做的不是黑客攻击,而是以“管理员”的身份,通过 Python 调用 K8s 的 API Server,拉取所有资源的配置清单,然后用一套规则去匹配。
扫描器工作流 (Mermaid):
🛠️ 二、 环境准备
我们需要安装 Python 的 K8s 官方客户端:
pipinstallkubernetes确保你的机器上配置了~/.kube/config,且有权限读取集群信息。
💻 三、 代码实战:编写扫描核心
我们将实现一个简单的K8sScanner类,演示如何查找“特权容器”和“未设置资源限制”的 Pod。
1. 初始化连接
fromkubernetesimportclient,configclassK8sScanner:def__init__(self):# 1. 加载 kubeconfig,如果在 Pod 内部运行则用 load_incluster_config()try:config.load_kube_config()print("✅ 成功连接到 K8s 集群")exceptExceptionase:print(f"❌ 连接失败:{e}")exit(1)self.v1=client.CoreV1Api()2. 核心检测逻辑
defscan_privileged_pods(self,namespace='default'):""" 规则:检测开启了 privileged=true 的危险容器 """print(f"🔍 开始扫描{namespace}命名空间的特权容器...")try:pods=self.v1.list_namespaced_pod(namespace)risks=[]forpodinpods.items:pod_name=pod.metadata.nameforcontainerinpod.spec.containers:# 获取 security_contextsec_ctx=container.security_contextifsec_ctxandsec_ctx.privileged:risk_msg=f"🔴 [高危] Pod:{pod_name}| 容器:{container.name}| 问题: 开启了特权模式!"risks.append(risk_msg)print(risk_msg)ifnotrisks:print("✅ 未发现特权容器。")returnrisksexceptExceptionase:print(f"扫描出错:{e}")return[]defscan_resource_limits(self,namespace='default'):""" 规则:检测未设置 CPU/Memory Limit 的容器 (容易导致节点雪崩) """print(f"🔍 开始扫描{namespace}命名空间的资源限制...")pods=self.v1.list_namespaced_pod(namespace)forpodinpods.items:forcontainerinpod.spec.containers:resources=container.resources# 检查 limits 是否存在ifresources.limitsisNone:print(f"⚠️ [中危] Pod:{pod.metadata.name}| 容器:{container.name}| 问题: 未设置资源限制 (OOM风险)")3. 运行扫描
if__name__=="__main__":scanner=K8sScanner()# 扫描 default 命名空间scanner.scan_privileged_pods("default")scanner.scan_resource_limits("default")# 你可以遍历所有 namespace# namespaces = [ns.metadata.name for ns in scanner.v1.list_namespace().items]🛡️ 四、 进阶:DevSecOps 的闭环
写好脚本只是第一步,如何把它融入到运维体系中?
- CI/CD 集成:
把这个脚本放在 Jenkins 或 GitLab CI 里。
当开发者提交 YAML 文件时,先跑一遍 Python 脚本(解析本地 YAML 文件而非连接集群),如果有高危配置,直接打断构建,禁止发布。 - 准入控制 (Admission Controller):
如果你想做的更绝一点,可以了解OPA (Open Policy Agent)或Kyverno。它们是 K8s 原生的拦截器,可以在 API 请求阶段就拒绝不合规的 Pod 创建。
我们的 Python 脚本适合做“事后审计”,OPA 适合做“事前拦截”。 - 自定义规则扩展:
- 镜像来源检查:必须来自公司私有 Harbor,禁止使用
docker.io公共镜像。 - 探针检查:检查 Deployment 是否配置了
livenessProbe和readinessProbe。 - 标签规范:检查是否包含
app,owner,env等必填 Label。
🎯 总结
通过 Pythonkubernetes库,我们将黑盒的集群配置变成了可编程、可审计的数据对象。
这不仅是一个安全工具,更是一个运维治理的利器。
别等到黑客通过一个特权 Pod 拿下了你的 Master 节点,才后悔没有早点做配置审计。
Next Step:
打开你的 IDE,把上面的代码复制进去,运行一下。看看你的开发环境集群里,到底藏了多少个没设资源限制的“裸奔”容器?结果可能会让你大吃一惊!