2.4. Security Parameters Index (安全参数索引, SPI)
SPI 是一个任意的 32 位值, 接收方使用它来标识传入数据包绑定到的 SA。对于单播 SA (unicast SA), SPI 可以单独用于指定 SA, 或者可以与 IPsec 协议类型 (在本例中为 AH) 结合使用。因为对于单播 SA, SPI 值由接收方生成, 所以该值是否足以单独标识 SA, 或者是否必须与 IPsec 协议值结合使用, 是一个本地问题 (local matter)。SPI 字段是强制的, 并且所有 AH 实现必须 (MUST) 支持上述将入站流量映射到单播 SA 的机制。
如果 IPsec 实现支持多播 (multicast), 则必须 (MUST) 使用以下算法支持多播 SA, 以便将入站 IPsec 数据报映射到 SA。仅支持单播流量的实现无需实现此解复用 (de-multiplexing) 算法。
在许多安全多播架构中, 例如 [RFC3740], 中央 Group Controller/Key Server (组控制器/密钥服务器) 单方面分配组安全关联的 SPI。此 SPI 分配不会与驻留在组成该组的各个终端系统中的密钥管理 (例如, IKE) 子系统进行协商或协调。因此, 组安全关联和单播安全关联可能同时使用相同的 SPI。支持多播的 IPsec 实现必须 (MUST) 正确地解复用入站流量, 即使在 SPI 冲突 (SPI collisions) 的情况下也是如此。
Security Association Database (安全关联数据库, SAD) [Ken-Arch] 中的每个条目必须指示 SA 查找除了使用 SPI 之外, 是否还使用目标地址或目标和源 IP 地址。对于多播 SA, 协议字段不用于 SA 查找。对于每个入站的受 IPsec 保护的数据包, 实现必须进行 SAD 搜索, 以便找到与 "最长" SA 标识符匹配的条目。在这种情况下, 如果两个或多个 SAD 条目基于 SPI 值匹配, 则还基于目标地址或目标和源地址比较匹配的条目 (如 SAD 条目中所示) 是 "最长" 匹配。这意味着 SAD 搜索的逻辑顺序如下:
-
在 SAD 中搜索 {SPI, destination address, source address} 的匹配项。如果 SAD 条目匹配, 则使用该匹配的 SAD 条目处理入站 AH 数据包。否则, 进入步骤 2。
-
在 SAD 中搜索 {SPI, destination address} 的匹配项。如果 SAD 条目匹配, 则使用该匹配的 SAD 条目处理入站 AH 数据包。否则, 进入步骤 3。
-
如果接收方选择为 AH 和 ESP 维护单个 SPI 空间, 则仅在 SAD 中搜索 {SPI} 的匹配项, 否则搜索 {SPI, protocol}。如果 SAD 条目匹配, 则使用该匹配的 SAD 条目处理入站 AH 数据包。否则, 丢弃该数据包并记录可审计事件 (auditable event)。
实际上, 实现可以 (MAY) 选择任何方法来加速此搜索, 尽管其外部可见行为必须 (MUST) 在功能上等同于按上述顺序搜索 SAD。例如, 基于软件的实现可以通过 SPI 索引到哈希表中。每个哈希表桶的链表中的 SAD 条目被排序, 使具有最长 SA 标识符的 SAD 条目首先出现在该链表中。具有最短 SA 标识符的 SAD 条目被排序, 使它们成为链表中的最后条目。基于硬件的实现可能能够使用常用的三元内容可寻址存储器 (Ternary Content-Addressable Memory, TCAM) 功能本质上实现最长匹配搜索。
源地址和目标地址匹配是否需要将入站 IPsec 流量映射到 SA 的指示必须 (MUST) 作为手动 SA 配置的副作用设置, 或通过使用 SA 管理协议 (例如, IKE 或 Group Domain of Interpretation (GDOI) [RFC3547]) 进行协商来设置。通常, Source-Specific Multicast (源特定多播, SSM) [HC03] 组使用由 SPI, 目标多播地址和源地址组成的 3 元组 SA 标识符。Any-Source Multicast (任意源多播) 组 SA 仅需要 SPI 和目标多播地址作为标识符。
1 到 255 范围内的 SPI 值集由 Internet Assigned Numbers Authority (互联网号码分配机构, IANA) 保留供将来使用; 除非分配的 SPI 值的使用在 RFC 中指定, 否则 IANA 通常不会分配保留的 SPI 值。SPI 值零 (0) 保留用于本地的, 特定于实现的使用, 并且绝对不能 (MUST NOT) 在网络上发送。(例如, 密钥管理实现可能使用零 SPI 值来表示 "No Security Association Exists (不存在安全关联)", 这发生在 IPsec 实现请求其密钥管理实体建立新 SA 期间, 但 SA 尚未建立时。)