13.3 网络隔离与最小暴露面

一句话

最小暴露面 = “默认拒绝 + 白名单放行”:能不通的就不通、能只走一跳的就别直连;判断标准不是 “有没有防火墙”,而是 “从互联网出发,能到达哪些不该到达的东西”。

实测:策略矩阵下的可达性

一个 6 节点拓扑(internet → waf → web → app → db,另有 admin 直连 internet 与 db):

策略 从 internet 可达 说明
全通(默认允许) admin、app、db、web、waf、internet 数据库与运维后台可被互联网直达
收敛(默认拒绝 + 白名单) waf、web、app、db admin 不可从互联网直达;db 只能经 app 间接访问
# 可达性检查:默认拒绝,只走白名单边
def reachable(allow):
    seen, stack = {"internet"}, ["internet"]
    while stack:
        n = stack.pop()
        for a, b in edges:
            if a == n and (a, b) in allow and b not in seen:
                seen.add(b); stack.append(b)
    return seen

关键不是 “节点多不多”,而是路径:internet → admin → db 这条边存在,等于把所有隔离都绕过了。

隔离的四个层次

层 手段 作用
边界 安全组/NACL/WAF 挡 “从外到内”
东西向 服务网格 mTLS / NetworkPolicy 挡 “内部横向移动”
管理面 堡垒机 / 跳板机 运维不直连生产
数据面 私网访问、无公网 IP 数据库不出网

代码:K8s NetworkPolicy(默认拒绝 + 白名单)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: {name: default-deny}
spec:
  podSelector: {}                     # 所有 Pod 默认拒绝
  policyTypes: [Ingress, Egress]
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: {name: app-from-web}
spec:
  podSelector: {matchLabels: {app: app}}
  policyTypes: [Ingress]
  ingress:
    - from: [{podSelector: {matchLabels: {app: web}}}]
      ports: [{protocol: TCP, port: 8080}]

反模式

反模式 后果
默认允许、只加几条拒绝 漏一条就等于全通
安全组按 “网段” 全开 内网横向移动畅通
运维后台直接暴露公网 被扫到即被爆破(见 38.6 常见攻击)
数据库有公网 IP 拖库风险,且难审计
只做边界不做东西向 一台被攻破后可横向到全部
不做可达性定期扫描 策略随时间腐化,没人知道实际暴露面

三条铁律

🔑 默认拒绝;白名单之外的流量一律不通。

🔑 运维面不走公网;堡垒机是底线。

🔑 定期扫可达性,而不是 “配完就不管”。

自检

Q1 为什么 “只加几条拒绝规则” 不可靠?

▸ 答案:因为默认允许意味着任何新增的路径都自动通:新加一个服务、改一条路由,就可能绕过拒绝规则。默认拒绝 + 白名单则相反:新增路径默认不通,必须显式放行,暴露面只会 “被批准地增加”。

Q2 实测里 “全通” 状态下最危险的是哪条边?

▸ 答案:internet → admin 与 admin → db:攻击者不需要攻破应用,直接打运维后台就能进数据库。收敛后这两条被去掉,db 只能经 app 访问——把 “运维面” 与 “数据面” 从公网隔开。

Q3 东西向隔离为什么越来越重要?

▸ 答案:因为边界防护假设 “内部可信”,但现实中一台机器被攻破后可以横向移动:容器/微服务之间默认互通,攻击者从弱服务跳到数据库。东西向策略(mTLS + NetworkPolicy)把 “内网” 也变成 “需要授权才能通”。

Q4 安全组与 NACL 有什么区别?

▸ 答案:安全组是有状态的(放行请求即自动放行响应),作用在实例/网卡级;NACL 是无状态的(要分别配入站/出站),作用在子网级。常见用法是 “NACL 做粗粒度子网隔离,安全组做实例级精细控制”。

Q5 如何验证 “暴露面真的收敛了”?

▸ 答案:从外部视角扫:公网端口扫描、DNS 解析记录、云上 “公网 IP 清单”、以及 “从互联网能否到达管理端口”。配置检查只能证明 “你以为的”,扫描才能证明 “实际的”。

Q6 隔离会不会影响可用性/排障?

▸ 答案:会:默认拒绝会让 “临时联调” 变麻烦,排障时可能被策略挡住。缓解办法是 IaC 管理策略变更(可审计、可回滚)、按环境分级(dev 宽松、prod 严格)、保留观测通道(日志/指标可出,业务流量不可随意进)。

Q7 最小暴露面和 “零信任” 是什么关系?

▸ 答案:最小暴露面是零信任的一部分:零信任还要求 “每次访问都认证授权、不因内网位置而默认信任”。先做最小暴露面(网络层收敛),再做身份层(mTLS/短期凭证)与策略层(按身份授权),是渐进路径(见 38.8 零信任)。

关联