4.4.1. 安全策略数据库(SPD)
SA 是一种管理构造,用于对穿越 IPsec 边界的流量强制执行安全策略。因此,SA 处理的一个基本要素是底层的“安全策略数据库(SPD)”,它规定了要向 IP 数据报提供哪些安全服务以及以何种方式提供。该数据库的形式及其接口不在本规范的范围之内。但是,本节规定了必须提供的最低限度管理功能,以便允许用户或系统管理员控制 IPsec 是否以及怎样应用于主机发送或接收的流量,或穿越安全网关的流量。在处理所有穿越 IPsec 边界的流量(包括入站和出站,也包括不受 IPsec 保护的流量)时,都必须查询 SPD 或相关的缓存,其中包括 IKE 等 IPsec 管理流量。
SPD 要求
一个 IPsec 实现必须(MUST)至少拥有一个 SPD,并且如果适合其运行的上下文,可以(MAY)支持多个 SPD。不再像 RFC 2401 所规定的那样要求按每个接口维护 SPD。但是,如果某个实现支持多个 SPD,则它必须包含一个显式的 SPD 选择函数,用于为出站流量处理选择适当的 SPD。该函数的输入是出站包,以及执行 SPD 选择函数所需的任何本地元数据(例如该包到达的接口)。函数的输出是一个 SPD 标识符(SPD-ID)。
有序数据库
SPD 是一个有序数据库,这与防火墙、路由器等设备中访问控制列表(ACL)或包过滤器(packet filter)的使用方式一致。之所以有排序要求,是因为由于选择器取值可以是(非平凡的)范围,条目之间经常会发生重叠。因此,用户或管理员必须(MUST)能够对条目排序,以表达所需的访问控制策略。由于选择器取值允许使用通配符(wildcard),且不同类型的选择器之间不存在层级关系,因而无法对 SPD 条目强加一种通用的规范顺序。
处理选择:DISCARD、BYPASS、PROTECT
SPD 必须区分获得 IPsec 保护的流量与允许绕过(bypass)IPsec 的流量。这既适用于发送方将要应用的 IPsec 保护,也适用于接收方处必须存在的 IPsec 保护。对于任何出站或入站数据报,有三种可能的处理选择:DISCARD(丢弃)、BYPASS IPsec(绕过)、或使用 IPsec 进行 PROTECT(保护)。
- DISCARD(丢弃):不允许(在指定方向上)穿越 IPsec 边界的流量。
- BYPASS(绕过):允许在没有 IPsec 保护的情况下穿越 IPsec 边界的流量。
- PROTECT(保护):获得 IPsec 保护的流量。对于此类流量,SPD 必须规定要使用的安协议、其模式、安全服务选项,以及要使用的密码算法。
SPD-S、SPD-I、SPD-O
SPD 在逻辑上分为三部分:
- SPD-S(安全流量,secure traffic):包含所有受 IPsec 保护约束的流量的条目。
- SPD-O(出站,outbound):包含所有要被绕过或丢弃的出站流量的条目。
- SPD-I(入站,inbound):应用于将被绕过或丢弃的入站流量。
这三部分都可以去相关(decorrelate)以便缓存。如果一个 IPsec 实现只支持一个 SPD,那么该 SPD 由全部三部分组成。如果支持多个 SPD,其中一些可能是部分的(partial),例如某些 SPD 可能只包含 SPD-I 条目,用于按每个接口控制入站被绕过的流量。这种拆分允许针对此类流量查询 SPD-I 而无需查询 SPD-S。
由于 SPD-I 只是 SPD 的一部分,因此如果在 SPD-I 中查找的包无法匹配其中任何条目,则该包必须(MUST)被丢弃。注意,对于出站流量,如果在 SPD-S 中找不到匹配项,则必须检查 SPD-O,以确定该流量是否应被绕过。类似地,如果先检查 SPD-O 且未找到匹配项,则必须检查 SPD-S。在一个有序且未去相关的 SPD 中,SPD-S、SPD-I 和 SPD-O 的条目是交错排列的,因此只需在 SPD 中查找一次。
SPD 条目
每个 SPD 条目将被处理包的指派(disposition)指定为 BYPASS、DISCARD 或 PROTECT。该条目以一个或更多选择器的列表作为键(key)。SPD 包含这些条目的有序列表。必需的选择器类型在第 4.4.1.1 节定义。这些选择器用于定义响应出站包或响应对端提议而创建的 SA 的粒度。SPD 条目的详细结构在第 4.4.1.2 节描述。每个 SPD 应该(SHOULD)有一个名义上的最终条目,匹配其他任何未匹配的内容并将其丢弃。
SPD 必须(MUST)允许用户或管理员按如下方式指定策略条目:
- SPD-I:对于要被绕过或丢弃的入站流量,该条目由适用于该流量的选择器取值组成。
- SPD-O:对于要被绕过或丢弃的出站流量,该条目由适用于该流量的选择器取值组成。
- SPD-S:对于要使用 IPsec 保护的流量,该条目由以下部分组成:适用于通过 AH 或 ESP 保护的流量的选择器取值;关于如何基于这些选择器创建 SA 的控制信息;以及实现这种保护所需的参数(例如算法、模式等)。注意,SPD-S 条目还包含诸如“从包中填充(populate from packet,PFP)”标志等信息,以及指示 SA 查找除 SPI 外是否还使用本地和远端 IP 地址的位(bit)。
在 SPD 条目中表示方向性
对于受 IPsec 保护的流量,SPD 条目中的本地和远端地址与端口会被交换以表示方向性,这与 IKE 惯例一致。一般而言,IPsec 所处理的协议具有这样的属性:需要本地/远端 IP 地址翻转后的对称 SA。但是,对于 ICMP,通常不存在这种双向授权(authorization)要求。尽管如此,为了保持统一和简单,ICMP 的 SPD 条目仍以与其他协议相同的方式规定。还需注意,对于 ICMP、移动头(Mobility Header)和非初始分片(non-initial fragment),这些包中没有端口字段。
OPAQUE 与 ANY
对于 SPD 条目中的每个选择器,除了定义匹配的字面量取值之外,还有两个特殊取值:ANY 和 OPAQUE。
- ANY:通配符,匹配包相应字段中的任何取值,或匹配该字段不存在或被遮蔽的包。
- OPAQUE:表示相应的选择器字段不可供检查,因为它可能不存在于分片中、对给定的下一层协议不存在,或者先前应用 IPsec 已将其加密。
ANY 取值包含了 OPAQUE 取值。因此,只有在需要区分“字段允许任意取值”与“字段缺失或不可用(例如由于加密)”这两种情况时,才需要使用 OPAQUE。
相关小节
- 4.4.1.1. 选择器 - 选择器详细定义
- 4.4.1.2. 策略条目结构 - SPD 条目结构