跳到主要内容

10. 安全机制 (Security Mechanisms)

本节描述安全 RPL 消息的生成和处理. RPL 消息 code 的高位标识某个 RPL 消息是否为安全消息. 除了基本控制消息 (DIS, DIO, DAO, DAO-ACK) 的安全版本之外, RPL 还有若干只与启用安全的网络相关的消息.

实现复杂度和规模是 LLN 的核心关注点, 因而在 RPL 实现中包含复杂安全能力可能在经济上或物理上不可行. 此外, 许多部署可以利用链路层或其他安全机制来满足其安全需求, 而无需在 RPL 中使用安全机制.

因此, 本文档描述的安全功能实现上是 OPTIONAL 的. 给定实现 MAY 支持所述安全功能的一个子集 (包括空集), 例如它可以支持完整性和机密性, 但不支持签名. 实现 SHOULD 清楚说明支持哪些安全机制, 并且 RECOMMENDED 实现者仔细考虑其网络中的安全需求和安全机制可用性.

10.1. 安全概述 (Security Overview)

RPL 支持三种安全模式:

  • Unsecured: 在此安全模式中, RPL 使用不带 Security 部分的基本 DIS, DIO, DAO 和 DAO-ACK 消息. 由于网络可能使用其他安全机制, 例如链路层安全, 因此 unsecured 模式并不意味着所有消息都在没有任何保护的情况下发送.

  • Preinstalled: 在此安全模式中, RPL 使用安全消息. 要加入 RPL Instance, 节点必须具有预安装密钥. 节点使用该密钥提供消息机密性, 完整性和真实性. 节点可以使用该预安装密钥作为主机或路由器加入 RPL 网络.

  • Authenticated: 在此安全模式中, RPL 使用安全消息. 要加入 RPL Instance, 节点必须具有预安装密钥. 节点使用该密钥提供消息机密性, 完整性和真实性. 使用该预安装密钥时, 节点只能作为主机加入网络. 要作为路由器加入网络, 节点必须从密钥授权方获得第二个密钥. 密钥授权方可以先认证请求方是否被允许作为路由器, 然后再向其提供第二个密钥. Authenticated 模式不能由对称算法支持. 截至本规范撰写时, RPL 仅支持对称算法: authenticated 模式被纳入是为了服务潜在的未来密码学原语. 见第 10.3 节.

RPL Instance 是否使用 unsecured 模式, 由它是否使用安全 RPL 消息来指示. 安全网络使用 preinstalled 模式还是 authenticated 模式, 由 DAG Configuration 选项的 'A' 位来指示.

本规范指定 CCM -- Counter with CBC-MAC (Cipher Block Chaining - Message Authentication Code) -- 作为 RPL 安全的密码学基础 [RFC3610]. 在本规范中, CCM 使用 AES-128 作为底层密码学算法. Security 部分中保留了一些位, 以便未来指定其他算法.

所有安全 RPL 消息都有 MAC 或签名. 可选地, 安全 RPL 消息还具有用于机密性的加密保护. 安全 RPL 消息格式既支持集成式加密/认证方案 (例如 CCM), 也支持分别加密和认证分组的方案.

10.2. 加入安全网络 (Joining a Secure Network)

RPL 安全假定希望加入安全网络的节点已预配置一个共享密钥, 用于与邻居和 RPL 根通信. 要加入安全 RPL 网络, 节点要么监听安全 DIO, 要么通过发送安全 DIS 来触发安全 DIO. 除第 8 节中的 DIO/DIS 规则外, 安全 DIO 和 DIS 消息还具有以下规则:

  1. 如果发送该初始安全 DIS, 则它 MUST 将 Key Identifier Mode 字段设置为 0 (00), 并且 MUST 将 Security Level 字段设置为 1 (001). 使用的密钥 MUST 是预配置组密钥 (Key Index 0x00).

  2. 当节点响应安全 DIS 而重置其 Trickle 计时器时 (第 8.3 节), 它传输的下一个 DIO MUST 是安全 DIO, 且具有与该安全 DIS 相同的安全配置. 如果节点在传输 DIO 之前收到多个安全 DIS 消息, 则该安全 DIO MUST 具有与它正在响应的最后一个 DIS 相同的安全配置.

  3. 当节点响应单播安全 DIS 发送 DIO 时 (第 8.3 节), 该 DIO MUST 是安全 DIO.

上述规则允许节点使用预配置共享密钥加入安全 RPL Instance. 一旦节点使用预配置共享密钥加入 DODAG, Configuration 选项的 'A' 位就决定其能力. 如果 Configuration 选项的 'A' 位被清零, 则节点可以使用该预安装共享密钥正常交换消息: 它可以发出 DIO, DAO 等.

如果 Configuration 选项的 'A' 位被设置且 RPL Instance 在 authenticated 模式下运行:

  1. 节点在使用 Key Index 0x00 保护的安全 DIO 中 MUST NOT 通告除 INFINITE_RANK 以外的 Rank. 处理使用 Key Index 0x00 保护的 DIO 消息时, 处理节点 MUST 将所通告 Rank 视为 INFINITE_RANK. 任何其他值都会导致消息被丢弃.

  2. 使用 Key Index 0x00 的安全 DAO MUST NOT 具有前缀不是该节点地址的 RPL Target 选项. 如果节点收到使用预安装共享密钥的安全 DAO 消息, 且其中 RPL Target 选项与 IPv6 源地址不匹配, 则它 MUST 丢弃该安全 DAO 消息且不进一步处理.

上述规则意味着, 在设置了 'A' 位的 RPL Instance 中, 使用 Key Index 0x00 时, 节点可以作为主机加入 RPL Instance, 但不能作为路由器加入. 节点必须与密钥授权方通信以获得能使其作为路由器运行的密钥.

10.3. 安装密钥 (Installing Keys)

Authenticated 模式要求想成为路由器的节点在作为主机加入网络后动态安装新密钥. 作为主机加入后, 节点使用标准 IP 消息与授权服务器通信, 后者可以提供新密钥.

获取此类密钥的协议超出本规范范围, 并将在未来规范中详细说明. RPL 要在 authenticated 模式下安全运行, 需要这种详细说明.

10.4. 一致性检查 (Consistency Checks)

RPL 节点发送一致性检查 (Consistency Check, CC) 消息, 以防范重放攻击并同步计数器.

  1. 如果节点收到清除了 'R' 位的单播 CC 消息, 并且它是关联 DODAG 的成员或正在加入该 DODAG, 则它 SHOULD 向发送方返回单播 CC 消息. 该响应 MUST 设置 'R' 位, 且其 CC nonce, RPLInstanceID 和 DODAGID 字段 MUST 与收到的消息相同.

  2. 如果节点收到组播 CC 消息, 它 MUST 丢弃该消息且不进一步处理.

Consistency Check 消息允许节点发出质询-响应来验证节点当前计数器值. 由于 CC nonce 由质询方生成, 重放消息的攻击者不太可能生成正确响应. Consistency Check 响应中的计数器允许质询方验证它听到的计数器值.

10.5. 计数器 (Counters)

在最简单情况下, 计数器值是一个无符号整数, 节点在每次安全 RPL 传输时将其递增一或更多. 计数器 MAY 表示具有以下属性的时间戳:

  1. 时间戳 MUST 至少为六个八位字节长.

  2. 时间戳 MUST 具有 1024 Hz (二进制毫秒) 粒度.

  3. 时间戳开始时间 MUST 是 January 1, 1970, 12:00:00AM UTC.

  4. 如果计数器表示时间戳, 则计数器值 MUST 是按如下方式计算的值. 令 T 为时间戳, S 为正在使用的密钥开始时间, E 为正在使用的密钥结束时间. S 和 E 都使用与上述时间戳相同的三条规则表示. 如果 E > T < S, 则计数器无效, 节点 MUST NOT 生成分组. 否则, 计数器值等于 T-S.

  5. 如果计数器表示此类时间戳, 节点 MAY 设置安全 RPL 分组 Security 部分的 'T' 标志.

  6. 如果 Counter 字段不表示此类时间戳, 则节点 MUST NOT 设置 'T' 标志.

  7. 如果节点没有满足上述要求的本地时间戳, 它 MUST 忽略 'T' 标志.

如果节点支持此类时间戳, 并且收到设置了 'T' 标志的消息, 则它 MAY 对收到的消息应用第 10.7.1 节所述的时间检查. 如果节点收到未设置 'T' 标志的消息, 它 MUST NOT 应用该时间检查. 出于应用原因, 节点的安全策略 MAY 包含拒绝所有未设置 'T' 标志的消息.

'T' 标志存在的原因是, 当今许多 LLN 已经出于安全, 应用和其他原因, 以亚毫秒粒度维护全局时间同步. 允许 RPL 在存在该功能时利用它, 可以极大简化某些安全问题的解决方案, 例如延迟保护.

10.6. 传出分组传输 (Transmission of Outgoing Packets)

给定一个传出的 RPL 控制分组以及所需安全保护, 本节描述 RPL 如何生成要传输的安全分组. 它还描述提供所需保护时密码学操作的顺序.

传出 RPL 分组所需的安全保护要求和要应用的安全级别应由节点的安全策略数据库确定. 该安全策略数据库用于传出分组处理的配置依赖于实现.

当要传输安全 RPL 消息时, RPL 节点 MUST 在传出 RPL 分组中设置 Security 部分 (T, Sec, KIM 和 LVL), 以描述所应用的保护级别和安全设置 (见第 6.1 节). RPL Message Code 字段的 Security 子字段位 MUST 被设置, 以指示安全 RPL 消息.

用于构造 AES-128 CCM nonce (图 31) 以保护传出分组的计数器值, MUST 是发送到该特定目的地址的上一计数器值的递增值.

当安全策略指定应用延迟保护时, 用于构造 CCM nonce 以保护传出分组的 Timestamp 计数器 MUST 按第 10.5 节中的规则递增. 当应用 Timestamp 计数器时 (通过设置 'T' 标志指示), 本地维护的 Timestamp 计数器 MUST 作为所传输安全 RPL 消息的一部分包含在内.

用于保护传出分组的密码学算法应由节点的安全策略数据库指定, 并且 MUST 在传出消息中设置的 Sec 字段值中指示.

传出分组的安全策略应确定适用的 KIM 和 Key Identifier, 指定用于密码学分组处理的安全密钥, 包括可选使用签名密钥 (见第 6.1 节). 安全策略还会以认证或认证加密的形式指定适用于传出分组的算法 (Algorithm) 和保护级别 (Level), 以及可能使用的签名.

当应用加密时, 节点 MUST 使用分组 Security 部分中指定的安全保护, 密钥和 CCM nonce 加密原始分组负载, 并用加密后的负载替换原始分组负载.

所有安全 RPL 消息都包含完整性保护. 结合安全算法处理, 节点派生出一个 MAC 或签名, 该 MAC 或签名 MUST 作为传出安全 RPL 分组的一部分包含在内.

10.7. 传入分组接收 (Reception of Incoming Packets)

本节描述安全 RPL 分组的接收和处理. 给定一个传入安全 RPL 分组, 且 RPL Message Code 字段的 Security 子字段位被设置时, 本节描述 RPL 如何生成该分组的未加密变体并验证其完整性.

接收方使用 RPL 安全控制字段来确定必要的分组安全处理. 如果该消息类型和发起方的所述安全级别未知, 或不满足本地维护的安全策略, 则节点 MUST 丢弃该分组且不进一步处理, MAY 产生管理告警, 并且 MUST NOT 发送任何响应消息. 这些策略可以包括安全级别, 使用的密钥, 源标识符, 或缺少基于时间戳的计数器 (由 'T' 标志指示). 安全策略数据库用于传入分组处理的配置超出本规范范围 (例如, 它可以通过 DIO Configuration 或带外管理路由器配置定义).

当消息 Security Level (LVL) 指示加密 RPL 消息时, 节点使用通过 KIM 字段标识的密钥信息以及 CCM nonce 作为消息负载解密处理的输入. CCM nonce 应从消息 Counter 字段以及其他收到和本地维护的信息中派生 (见第 10.9.1 节). 明文消息内容应通过调用接收分组 Sec 字段指定的密码学运行模式的逆过程获得.

接收方应使用 CCM nonce 和已标识密钥信息来检查传入分组的完整性. 如果针对接收 MAC 的完整性检查失败, 节点 MUST 丢弃该分组.

如果收到的消息具有已初始化 (零值) 的计数器值, 且接收方当前为消息发起方维护了传入计数器, 则接收方 MUST 通过向消息源发送 Consistency Check 响应消息 (见第 6.6 节) 来发起计数器重新同步. Consistency Check 响应消息应使用为该特定节点地址维护的当前完整传出计数器来保护. 该传出计数器将包含在消息的 Security 部分中, 而传入计数器将包含在 Consistency Check 消息负载中.

根据指定的安全策略, 节点 MAY 对收到的 RPL 消息应用重放保护. 重放检查 SHOULD 在接收分组认证之前执行. 从传入分组获得的计数器应与为给定发起节点地址维护的传入计数器水位线进行比较. 如果收到的消息计数器值非零且小于所维护的传入计数器水位线, 则表示存在潜在分组重放, 节点 MUST 丢弃该传入分组.

如果在传入分组安全策略检查中指定了延迟保护, 则 Timestamp 计数器用于验证收到的 RPL 消息的及时性. 如果传入消息 Timestamp 计数器值表示消息传输时间早于为发起方地址本地维护的传输时间计数器, 则表示发生重放违规, 节点 MUST 丢弃该传入分组. 如果收到的 Timestamp 计数器值表示消息传输时间早于 Current time 减去可接受分组延迟所得时间, 则表示发生延迟违规, 节点 MUST 丢弃该传入分组.

一旦消息在适用时已解密, 并已成功通过完整性检查, 重放检查以及可选的延迟保护检查, 节点就可以更新其本地安全信息, 例如源的预期计数器值, 用于重放比较.

节点在收到未通过安全策略检查或其他已应用的完整性, 重放或延迟检查的消息时, MUST NOT 更新其安全信息.

10.7.1. 时间戳密钥检查 (Timestamp Key Checks)

如果消息的 'T' 标志被设置, 且节点具有符合第 10.5 节要求的本地时间戳, 则节点 MAY 检查该消息的时间一致性. 节点通过将计数器值加到关联密钥的开始时间来计算消息传输时间. 如果该传输时间超过密钥结束时间, 节点 MAY 丢弃该消息且不进一步处理. 如果与接收方本地时间相比, 该传输时间过于久远或过于超前, 则它 MAY 丢弃该消息且不进一步处理.

10.8. 完整性和机密性覆盖范围 (Coverage of Integrity and Confidentiality)

对于 RPL ICMPv6 消息, 整个分组都在 RPL 安全的作用范围内.

MAC 和签名基于整个未安全保护的 IPv6 分组计算. 计算 MAC 和签名时, 可变 IPv6 字段按照 [RFC4302] (IPsec Authenticated Header) 第 3.3.3.1 节中的规则视为填充零. MAC 和签名计算在低层可能应用任何压缩之前执行.

当 RPL ICMPv6 消息被加密时, 加密从 Security 部分之后的第一个字节开始, 一直持续到分组的最后一个字节. IPv6 头部, ICMPv6 头部以及直到 Security 部分结束的 RPL 消息不会被加密, 因为正确解密分组需要它们.

例如, 发送 LVL=1, KIM=0 和 Algorithm=0 的消息的节点使用 CCM 算法 [RFC3610] 创建具有 ENC-MAC-32 属性的分组: 它加密分组并附加一个 32 位 MAC. 分组密码密钥由 Key Index 确定. CCM nonce 按第 10.9.1 节所述计算; 要认证和加密的消息是从 Security 部分之后的第一个字节开始并以分组最后一个字节结束的 RPL 消息. 附加认证数据从 IPv6 头部开头开始, 到 RPL Security 部分的最后一个字节结束.

10.9. 密码学运行模式 (Cryptographic Mode of Operation)

本规范描述的密码学运行模式 (Algorithm = 0) 基于 CCM 和分组密码 AES-128 [RFC3610]. 这种运行模式受到现有实现的广泛支持. CCM 模式需要 nonce (CCM nonce).

10.9.1. CCM Nonce

RPL 节点按如下方式构造 CCM nonce:

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Source Identifier +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Counter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|KIM|Resvd| LVL |
+-+-+-+-+-+-+-+-+

图 31: CCM Nonce
  • Source Identifier: 8 字节. Source Identifier 设置为受保护分组发起方的逻辑标识符.

  • Counter: 4 字节. Counter 设置为 RPL 控制消息 Security 选项中对应字段的 (未压缩) 值.

  • Key Identifier Mode (KIM): 2 位. KIM 设置为 RPL 控制消息 Security 选项中对应字段的值.

  • Security Level (LVL): 3 位. Security Level 设置为 RPL 控制消息 Security 选项中对应字段的值.

CCM nonce 的未分配位为保留位. 构造 CCM nonce 时 MUST 将其设置为零.

CCM nonce 的所有字段都以最高有效八位字节和最高有效位在前的顺序表示.

10.9.2. 签名 (Signatures)

如果 KIM 指示使用签名 (值为 3), 则节点将签名附加到分组的数据负载. Security Level (LVL) 字段描述该签名的长度. RPL 中 Security Mode 3 的签名方案是 [RFC3447] 第 8.1 节定义的 RSA 算法 (RSASSA-PSS) 的一种实例化. 作为公钥, 它使用二元组 (n,e), 其中 n 是 2048 位或 3072 位 RSA 模数, e=2^{16}+1. 它使用 CCM 模式 [RFC3610] 作为加密方案, 且 M=0 (作为流密码). 注意, 尽管 [RFC3610] 不允许 M=0 的 CCM 模式, RPL 在与签名结合使用时显式允许 M=0 的 CCM 模式, 因为签名提供了足够的数据认证. 此处, M=0 的 CCM 模式按 [RFC3610] 指定, 但第 2.2 节中的 M' 字段 MUST 设置为 0. 它使用 [FIPS180] 第 6.2 节指定的 SHA-256 哈希函数. 它使用 [RFC3447] 第 8.1 节的消息编码规则.

令 'a' 为计数器的 6 字节表示与消息头部的串接. 分组负载是分组数据 'm' 和签名 's' 的右串接. 该签名方案以消息部分 a 和 m 的右串接作为输入调用, 而签名验证则以消息部分 a 和 m 的右串接以及签名 s 作为输入调用.

这种形式的 RSA 签名为 RPL 网络提供足够保护. 如果需要, 生成更简短签名的替代签名方案超出本规范范围, 可作为未来规范的主题.

支持 2048 位或 3072 位签名的 RSA 签名实现 SHOULD 支持验证 2048 位和 3072 位 RSA 签名. 这是出于为 RPL 部署提供升级路径的考虑.