3. 微分段策略模型:基于身份、标签与应用层

策略模型这东西,说白了就是回答三个问题:谁能访问什么,以及怎么访问。微分段不像传统防火墙那样只看 IP 五元组,它给了你更多维度的控制手段。我个人习惯把这三种模型串起来用,效果比单打独斗好得多。

核心观点:三种策略模型不是互斥的,而是层层递进的关系。身份解决“谁”,标签解决“在哪”,应用层解决“干什么”。

3.1 基于身份的策略

先聊身份。传统网络里,你只能靠 IP 地址判断流量来源。但虚拟化环境里,VM 漂移、容器启停,IP 说变就变。这时候基于身份的策略就派上用场了。

身份可以是:

  • 用户身份:AD/LDAP 里的用户或用户组
  • 设备身份:虚拟机 UUID、容器 ID、物理机序列号
  • 服务身份:服务账户、SPN(服务主体名称)

我在项目中遇到过一件事:某金融客户做零信任改造,一开始坚持用 IP 写策略。结果每周都有 VM 迁移导致策略失效,运维团队叫苦连天。后来换成基于 VM 身份的策略,迁移后策略自动跟随,再也没出过问题。

小技巧:身份策略的粒度要适中。太粗(比如整个部门一个身份)等于没做微分段;太细(每个进程一个身份)管理成本爆炸。我建议按“业务角色”划分,比如“Web 服务器角色”、“数据库角色”。

3.2 基于标签的策略

标签策略是我个人最喜欢的方式。它灵活,而且特别适合动态环境。你想想看,容器环境下 Pod 的 IP 随时变,但标签(Label)是稳定的。

标签策略的核心逻辑是:

  1. 给资源打标签(比如 env=prod, app=web, tier=frontend)
  2. 基于标签组合写策略(比如允许 env=prod 且 app=web 的流量访问 env=prod 且 app=api)
  3. 新资源加入时自动继承标签,策略自动生效

举个例子,在 Kubernetes 里用 NetworkPolicy:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-web-to-api
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: web
    ports:
    - protocol: TCP
      port: 8080

这段策略的意思是:只有带 app: web 标签的 Pod,才能访问带 app: api 标签的 Pod 的 8080 端口。IP 变了?没关系,标签没变就行。

注意:标签命名一定要规范。我曾经见过一个项目,标签名五花八门,有叫“env”的,有叫“environment”的,还有叫“ENV”的。结果策略匹配不上,排查了一整天。建议制定标签命名规范,统一大小写和命名风格。

3.3 基于应用层的策略

前两种策略管的是“谁访问谁”,但管不了“访问的内容是什么”。应用层策略就是解决这个问题的。它基于 L7 协议(HTTP、gRPC、SQL 等)做精细化控制。

举个例子:

  • 允许前端访问后端的 /api/v1/orders 路径
  • 禁止前端访问后端的 /admin 路径
  • 只允许 GET 请求,拒绝 POST 请求

我记得有一次帮客户排查安全事件。他们用了基于身份和标签的策略,但攻击者还是通过 SQL 注入拿到了数据。为什么?因为策略只允许 Web 访问 DB,但没限制 SQL 语句的内容。后来加了应用层策略,只允许预编译的 SELECT 语句通过,注入攻击才被彻底堵住。

应用层策略的实现方式:

技术 适用场景 优势 劣势
服务网格 Sidecar Kubernetes 环境 细粒度 L7 控制,可观测性强 性能开销稍大
API 网关 南北向流量 集中管理,易于审计 东西向流量覆盖不足
主机防火墙 L7 模块 传统虚拟化环境 性能好,兼容性强 配置复杂

3.4 三种策略的协同模型

实际生产环境里,这三种策略是配合使用的。我画了一张图来说明它们的关系:

微分段策略模型协同架构 基于身份的策略(Who) 用户身份 · 设备身份 · 服务身份 解决“谁在访问”的问题 基于标签的策略(Where) 环境标签 · 应用标签 · 层级标签 解决“访问哪个资源”的问题 基于应用层的策略(What) HTTP 方法 · URL 路径 · SQL 语句 · RPC 方法 解决“允许做什么操作”的问题 三层策略叠加使用,实现最小权限原则。缺一层都可能留下安全盲区。

从图上你能看到,这三层是自下而上叠加的。身份策略先过滤“谁”,标签策略再限定“去哪”,应用层策略最后控制“做什么”。少一层,策略就不完整。

最佳实践:我建议从身份策略开始落地,因为身份是最稳定的维度。等身份策略跑顺了,再叠加标签策略。应用层策略最后加,因为它对性能影响最大,需要充分测试。

3.5 避坑指南

做策略模型设计时,有几个坑我踩过,分享给你:

  • 策略膨胀:我曾经见过一个客户,半年写了 3000 条策略。结果没人敢动,一改就出问题。建议定期清理无效策略,能用标签聚合的就别写多条。
  • 默认拒绝缺失:很多人只写允许策略,忘了加默认拒绝。结果新服务上线后,流量不受控地乱跑。记住:微分段的基石是“白名单模式”。
  • 日志不记录:策略配好了,但不记录日志。出问题时根本不知道是被策略拦截了,还是应用本身挂了。一定要开启策略日志,至少保留 90 天。

我的习惯:每次上线新策略前,先在“审计模式”下跑一周。只记录命中情况,不实际拦截。确认没有误杀后,再切换到“强制模式”。这个习惯帮我避免了好几次生产事故。