4、微隔离技术实战:基于网络功能(NF)的微分段、使用Service Mesh(如Istio)实现东西向流量隔离、在Kubernetes上部署微隔离策略
4.1 为什么微隔离是核心网零信任的“最后一公里”
说实话,我在做核心网云化项目之前,对微隔离的理解还停留在“防火墙策略细化”这个层面。直到有一次,我们在现网测试5G核心网的UPF和SMF之间的东西向流量,发现一旦某个Pod被攻破,攻击者可以横向移动到相邻的NF实例——那一刻我才真正意识到,南北向防火墙根本挡不住东西向的威胁。
微隔离,说白了就是在数据中心内部,把网络切成极细的“格子”。每个格子里的服务只能访问它该访问的东西。你想想看,5G核心网里AMF、SMF、UPF、PCF这些NF之间,通信关系是固定的、可预期的。这就给了我们做微分段的绝佳条件。
4.2 基于网络功能(NF)的微分段设计
我习惯把微分段分成三个层次:
- 第一层:NF级别的隔离——比如AMF和SMF属于不同的安全域,它们之间默认不通。
- 第二层:NF实例级别的隔离——同一个NF的不同实例(比如两个AMF实例),只允许通过服务网格通信。
- 第三层:工作负载级别的隔离——Pod级别的细粒度策略,精确到每个容器的进出流量。
举个例子。我在一个项目中,需要让SMF只能被AMF和PCF访问,而UPF只能被SMF访问。传统做法是配一堆ACL,但维护起来简直是噩梦。用微隔离的话,我们只需要定义几条策略:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: smf-authz
namespace: 5g-core
spec:
selector:
matchLabels:
app: smf
rules:
- from:
- source:
principals: ["cluster.local/ns/5g-core/sa/amf-sa"]
- source:
principals: ["cluster.local/ns/5g-core/sa/pcf-sa"]
to:
- operation:
ports: ["80", "443"]
嗯,这里要注意:NF的标签设计一定要规范。我见过不少团队,标签随便起,结果策略写出来自己都看不懂。我的建议是:统一用 nf-type、nf-instance、security-zone 三个标签,分别表示NF类型、实例编号和安全域。
4.3 使用Service Mesh(Istio)实现东西向流量隔离
为什么选Istio?因为它在Kubernetes上做东西向流量隔离,简直是天生一对。Istio的Sidecar代理会拦截所有进出Pod的流量,然后根据你定义的策略做授权和加密。
我记得有一次,客户问:“你们怎么保证SMF和UPF之间的流量不被篡改?”我直接给他们看了Istio的mTLS配置:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: 5g-core
spec:
mtls:
mode: STRICT
portLevelMtls:
8080:
mode: DISABLE # 某些监控端口可以不用mTLS
说白了,STRICT模式意味着所有东西向流量都必须经过TLS加密。你想想看,就算攻击者进了Pod,没有合法的证书,他也发不出任何请求。
但这里有个坑——性能开销。我曾经在一个高吞吐的UPF场景下测试,开了mTLS后CPU开销增加了15%左右。所以我的建议是:核心网的控制面NF(AMF、SMF、PCF)可以全量开启mTLS,但用户面NF(UPF)要按需开启,或者只在关键信令链路上启用。
AuthorizationPolicy 结合 PeerAuthentication 实现“先认证、后授权”的两层防护。先确保对方身份可信,再判断它有没有权限访问。
4.4 在Kubernetes上部署微隔离策略
部署微隔离策略,我建议分三步走:
- 第一步:梳理通信矩阵——画出所有NF之间的通信关系图。哪个NF需要访问哪个NF的哪个端口?协议是什么?
- 第二步:定义安全域——把NF分成几个安全域,比如“信令域”、“用户面域”、“管理域”。域内默认允许,域间默认拒绝。
- 第三步:逐步下发策略——先以“审计模式”运行,只记录不拦截。确认无误后再切换到“强制模式”。
我画了一张图,帮你理解这个流程:
部署的时候,我强烈建议用GitOps的方式管理策略。把所有的AuthorizationPolicy、PeerAuthentication都写成YAML文件,放到Git仓库里。这样每次变更都有记录,回滚也方便。
4.5 实战案例:5G核心网SMF的微隔离配置
最后,我分享一个完整的配置示例。假设我们要保护SMF,只允许AMF和PCF访问它:
# 1. 启用mTLS
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: smf-mtls
namespace: 5g-core
spec:
selector:
matchLabels:
app: smf
mtls:
mode: STRICT
---
# 2. 定义授权策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: smf-access
namespace: 5g-core
spec:
selector:
matchLabels:
app: smf
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/5g-core/sa/amf-sa"]
- source:
principals: ["cluster.local/ns/5g-core/sa/pcf-sa"]
to:
- operation:
methods: ["GET", "POST"]
ports: ["8080"]
- from:
- source:
namespaces: ["istio-system"]
to:
- operation:
ports: ["15020"] # 允许Istio健康检查
---
# 3. 默认拒绝所有其他流量
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: smf-deny-all
namespace: 5g-core
spec:
selector:
matchLabels:
app: smf
action: DENY
rules:
- from:
- source:
notPrincipals: ["*"]
嗯,这里有个细节:DENY策略的优先级高于ALLOW。所以上面的配置逻辑是:先允许AMF和PCF访问,再拒绝其他所有。如果你反过来写,那AMF和PCF也会被拒绝。
说实话,微隔离这东西,策略本身不难写,难的是梳理清楚通信关系。我建议你从最简单的场景开始,比如先保护一个NF,跑通了再扩展到整个核心网。别想着一步到位,那只会让你陷入策略冲突的泥潭。
公众号:蓝海资料掘金营,微信deep3321