安全区域就是「按信任程度给接口分组」——分组之后,策略才写得动。 三个区域、六个跨区方向,这就是一张防火墙策略的骨架。
上一节讲怎么读字段,这一节讲怎么把这些字段组织成「策略的维度」。 如果没有区域这个概念,策略就要按「接口对」写——10 个接口就是 90 个方向。
一、为什么必须分组
算一下「不分组」的代价:N 个接口两两组合是 N × (N - 1) 个方向。
10 个接口 :90 个方向。 20 个接口:380 个方向。 50 个接口:2450 个方向。
而分成 3 个区域之后:方向数固定为 6 个,与接口数量彻底解耦。 这就是「抽象」的价值——把 N² 变成常数。
所以区域的本质不是「安全概念」,是「策略的索引维度」: 策略写成「区域到区域」,接口挂进区域,加接口不用改策略。
二、三个标准区域
Trust(内网):办公终端、内部服务器。信任级别最高。 DMZ(隔离区):对外提供服务的服务器。信任级别居中。 Untrust(外网):互联网。信任级别最低。
区域 放什么 级别
Trust 内网办公终端 100 DMZ 对外服务器 50 Untrust 互联网 0
DMZ 这个区域是整件事的关键:它存在的唯一目的是「把对外的服务器从内网挪出来」。 因为对外服务器是「最可能被攻陷的那一台」,把它放在 DMZ,即使被拿下,它也没法直接打内网。
所以「服务器放哪」这个决定,比「策略怎么写」更重要: 服务器放错区,后面写多少策略都补不回来。
三、默认策略的方向性
按「高信任级别可以访问低级别」的默认规则: Trust → Untrust 放行、Trust → DMZ 放行、DMZ → Untrust 放行,反向一律拒绝。
注意 DMZ → Trust 是拒绝的,这正是分区设计的意义所在:服务器一旦被拿下,它打不进内网。
但这条默认规则有两个常见的例外需求: 一、外网要访问 DMZ 的 Web 服务:这是 Untrust → DMZ,低到高,必须显式放行, 而且只放行 80 与 443 两个端口。 二、DMZ 的服务器要连内网的数据库:这是 DMZ → Trust,必须显式放行, 而且要限定「哪台服务器到哪台数据库的哪个端口」。
这两条例外是安全事故的高发点: 因为它们打破了「低不到高」的原则,必须一条一条写清楚,绝不能图省事写「any → any」。
四、动手 Demo:三个安全区域,九个方向
这段把三个区域两两组合的九个方向列出来,按信任级别逐个判断「默认放行还是默认拒绝」, 重点看 DMZ 那一列。
lvl = {u"Trust": 100, u"DMZ": 50, u"Untrust": 0}
for a in zones:
for b in zones:
if a == b:
continue
ok = u"默认放行" if lvl[a] > lvl[b] else u"默认拒绝"
实跑输出:
--------------------------------------------------------------------
三个安全区域,九个方向
--------------------------------------------------------------------
**安全区域就是「信任程度相同的接口分到一组」。**
**分组之后,策略才写得动。**
区域 放什么 信任级别
-----------------------------------------
Trust 内网办公终端 100
DMZ 对外服务器 50
Untrust 互联网 0
3 个区域两两组合 = 9 个方向,其中同区 3 个、跨区 6 个。
**同区内部默认互通**(一层交换就够),**真正要写策略的是那 6 个跨区方向。**
**按「高信任级别可以访问低级别」的默认规则,逐个看**:
Trust → DMZ 默认放行
Trust → Untrust 默认放行
DMZ → Trust 默认拒绝
DMZ → Untrust 默认放行
Untrust → Trust 默认拒绝
Untrust → DMZ 默认拒绝
**注意 DMZ 这一列**:**从 DMZ 往 Trust 是「低到高」,默认拒绝**——
**服务器一旦被拿下,它打不进内网,这是分区的全部意义。**
九个方向里六个跨区、三个同区, 而同区内部默认互通(一层交换就够)——所以真正要写策略的只有六个。 这个「6」就是三个区域的策略规模上限,也是分区设计的功劳。
DMZ 那一列的「拒绝」是这一节的核心:它把「服务器被攻陷」的后果限制在了一个区域内。 而现实中很多事故是「服务器直接放在内网」——那样一旦被拿下,攻击者就在内网里了,防火墙一点作用都没有。
顺带说一句「同区默认互通」的风险: 内网一个区里几千台机器互相全通,一台中毒就全网横向——这也是为什么现在流行「把大区切小」以及「微隔离」。
30 秒实验
- 画出你单位网络的区域划分,标出对外的服务器放在哪。
- 数一下现有策略里有多少条是「低信任到高信任」。
- 想一想:如果 DMZ 的服务器要连内网数据库,该怎么写策略?
常见误区
- 以为区域越多越安全。区域越多策略方向越多,越容易写错。
- 以为对外服务器放内网也一样。一旦被攻陷,攻击者直接进内网。
- 以为同区互通不用管。横向移动正是靠这一点。
自测三问(点开对答案)
1. 分区域解决的是什么问题? —— 把策略的方向数从「接口数平方」降到常数,加接口不用改策略。 2. DMZ 存在的唯一目的是什么? —— 把最可能被攻陷的对外服务器挪出内网,限制被攻陷后的影响范围。 3. 为什么 DMZ 到 Trust 默认拒绝? —— 因为它就是「低到高」,这条拒绝正是分区设计的意义所在。下一节:区域有了,策略怎么写、顺序为什么致命。
- ☐ (本节完,下一节 05.07.04 安全策略)