ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Kubernetes从入门到精通】第56篇:NetworkPolicy安全实战——用零信任网络把微服务“关进笼子“

【Kubernetes从入门到精通】第56篇:NetworkPolicy安全实战——用零信任网络把微服务“关进笼子“ 上一篇【第55篇】SecurityContext——容器安全配置的三件套下一篇【第57篇】Secret管理的最佳实践——Vault/SealedSecrets/External Secrets摘要第047篇我们讲了NetworkPolicy的语法第047篇也提了默认拒绝的思路。但语法≠架构。真要在生产环境搭一套安全的网络你需要的是从安全原则出发的整体设计而不是零散的几条规则。这就是零信任Zero Trust网络——它的核心信条是永不信任始终验证。在K8s里翻译成大白话默认所有Pod之间都不通然后一条条精确放通必须通的链路。这篇文章从零信任三原则讲起给你一套三层应用的完整微隔离方案前端→后端→数据库再讲namespace之间的流量控制最后看看Cilium怎么把策略做到HTTP级别。读完你就能照着给自己的集群上锁。一、零信任的三条铁律1.1 原则【零信任网络的三条铁律】 铁律1: 默认拒绝一切 (Default Deny) • 没有任何策略时 全通(危险!) • 安全做法: 先锁死再发钥匙 铁律2: 最小权限 (Least Privilege) • 只放通业务必须的那条链路 • frontend→backend:8080 放行 • frontend→database:5432 绝不放行(越级访问!) 铁律3: 假设已被突破 (Assume Breach) • 即使一个Pod被攻陷它的活动范围已被策略锁死 • 攻击者横向移动的成本被极大抬高要点零信任的精髓是心态转变——从内部是可信的变成内部也不可信。传统网络像公司大楼进了大门就能到处走零信任像银行金库每个房间都要单独授权。在K8s里NetworkPolicy就是你实现这种金库模型的工具。二、三层应用微隔离实战2.1 架构目标【我们要实现的安全拓扑】 Internet │ (只放Ingress Controller进frontend) ▼ [Ingress Nginx] ──allow 80/443──► [frontend] │ (只放frontend→backend:8080) ▼ [backend] │ (只放backend→database:5432) ▼ [database] │ └─ allow DNS (否则全崩) 禁止的访问(策略自动挡) • frontend → database (越级!) • Internet → backend (绕过前端!) • frontend → 其他namespace (乱窜!)2.2 完整策略集# ① 基础锁默认拒绝所有入站出站(必须先有这条)apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:default-denynamespace:shopspec:podSelector:{}policyTypes:[Ingress,Egress]# ② 放行DNS(否则Pod连名字都解析不了应用直接崩)apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:allow-dnsnamespace:shopspec:podSelector:{}policyTypes:[Egress]egress:-to:-namespaceSelector:{}ports:-{protocol:UDP,port:53}-{protocol:TCP,port:53}# ③ Ingress Controller → frontendapiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:frontend-from-ingressnamespace:shopspec:podSelector:matchLabels:{app:frontend}policyTypes:[Ingress]ingress:-from:-namespaceSelector:matchLabels:{kubernetes.io/metadata.name:ingress-nginx}ports:-{protocol:TCP,port:80}# ④ frontend → backend:8080apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:backend-from-frontendnamespace:shopspec:podSelector:matchLabels:{app:backend}policyTypes:[Ingress]ingress:-from:-podSelector:matchLabels:{app:frontend}ports:-{protocol:TCP,port:8080}# ⑤ backend → database:5432apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:db-from-backendnamespace:shopspec:podSelector:matchLabels:{app:database}policyTypes:[Ingress]ingress:-from:-podSelector:matchLabels:{app:backend}ports:-{protocol:TCP,port:5432}要点这套策略的关键在顺序——先default-deny锁死再DNS放行否则应用崩然后逐层放通链路。注意第⑤条database的策略只接受来自backend的流量frontend根本不在白名单里所以frontend直连database会被自动挡掉实现了严格的层级隔离。三、namespace之间的流量控制3.1 多团队隔离【跨namespace的流量控制——部门墙】 namespace: team-a (前端团队) namespace: team-b (数据团队) team-a 的Pod 默认不能访问 team-b 的Pod → 除非显式写策略允许 典型需求team-a 的 backend 需要访问 team-b 的 mysql → 在 team-b 里写一条策略from 指定 team-a 的namespace# team-b (数据团队) 里允许 team-a 的backend访问mysqlapiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:mysql-allow-teama-backendnamespace:team-bspec:podSelector:matchLabels:{app:mysql}policyTypes:[Ingress]ingress:-from:-namespaceSelector:matchLabels:{team:team-a}podSelector:matchLabels:{app:backend}ports:-{protocol:TCP,port:3306}四、Cilium把策略做到L74.1 HTTP级别隔离传统NetworkPolicy只能到L4端口。Cilium的CiliumNetworkPolicy能到L7# 只允许 frontend 对 backend 发 GET /api拒绝一切其他请求apiVersion:cilium.io/v2kind:CiliumNetworkPolicymetadata:name:backend-l7spec:endpointSelector:matchLabels:{app:backend}ingress:-fromEndpoints:-matchLabels:{app:frontend}toPorts:-ports:-port:8080protocol:TCPrules:http:-method:GETpath:/api/.*【L4 vs L7 策略——能进门 vs 能碰保险柜】 L4 (NetworkPolicy): 允许 frontend → backend:8080 → 黑客可以 POST /admin/delete照样进 L7 (CiliumNetworkPolicy): 允许 frontend → backend:8080 的 GET /api/* → POST /admin/delete 被直接拦在L7要点L7策略是微服务安全的终极形态——它理解应用协议能在方法/路径/Header级别做访问控制。但只有Cilium等支持eBPF的插件能做到见第049篇。对绝大多数场景L4的NetworkPolicy已经能提供扎实的微隔离对金融、多租户等高安全场景上Cilium做L7。五、验证你的零信任网络# 1. 故意从frontend直连database(应该失败)kubectlexec-itfrontend-xxx-nshop --\nc-zvdatabase5432# ❌ 超时/拒绝 → 策略生效# 2. 从backend连database(应该成功)kubectlexec-itbackend-xxx-nshop --\nc-zvdatabase5432# ✅ 连接成功 → 链路放通正确# 3. 看Calico/Cilium的策略是否真的落地kubectlexec-nkube-system calico-node-xxx --\calicoctl get networkpolicy-owide本篇小结零信任网络三铁律默认拒绝、最小权限、假设已被突破。在K8s里落地就是先default-deny锁死所有流量再放行DNS然后逐层精确放通业务链路。三层应用前端→后端→数据库的隔离实战是最常见的模板关键是database的策略只接受backend越级访问自动被挡。跨namespace用namespaceSelector做部门墙。需要HTTP/gRPC级别隔离金融/多租户上Cilium的L7策略。下一篇聊Secret管理——K8s里敏感信息的保险箱该怎么用才安全。上一篇【第55篇】SecurityContext——容器安全配置的三件套下一篇【第57篇】Secret管理的最佳实践——Vault/SealedSecrets/External Secrets
返回列表