Skip to content

DDS Security 安全机制:风险模型与五个安全插件 ​

DDS 默认没有任何安全机制:进程只要接入网络就能加入域,数据以明文在网络上流转,发现协议也不验证通信对端的身份。OMG 的 DDS-Security 规范为此定义了一套插件化的安全架构。本文介绍 DDS 在无安全机制时的风险模型、五个安全插件的分工,以及启用安全机制后对发现与通信的实际影响,适合正在评估或准备启用 DDS 安全特性的开发者。

没有安全机制时的风险模型 ​

DDS 的发现协议(SPDP/SEDP)只负责交换参与者与端点信息:谁的 DataWriter 发布哪个 Topic、谁的 DataReader 订阅哪个 Topic。它既不认证对端身份,也不校验发布/订阅权限。以一个发布 Topic T 的域为例,几类典型的越权行为都不需要攻破任何东西,只要把进程接入网络:

角色 行为 后果
未授权订阅者 未加密的组播场景中,与其余订阅者监听同一组播地址,直接收到 Topic 数据 数据泄露
未授权发布者 伪造身份(修改 RTPS 报文中的 GUID 等字段)发布 Topic 数据 干扰合法订阅者对数据的判断
无发布权限的合法订阅者 能正常收到数据,再伪造发送身份向网络注入数据 数据污染

第三类角色值得说明:即使数据加了密,只读权限的订阅者本身就能解密收到的数据,加密防不住它伪造发送身份,身份认证与来源验证要靠专门机制解决。

DDS-Security 的解法:服务插件接口 ​

DDS-Security 规范(现行版本 1.2)定义了 DDS 的 Security Model 与服务插件接口(Service Plugin Interface,SPI)架构:安全能力以插件形式接入 DDS 实现,由 DDS 实现在协议栈底层调用,应用程序代码基本不需要改动。规范共定义五个插件:

插件 职责 是否必选
Authentication(认证) 验证调用 DDS 的应用/用户身份,参与者间相互认证并协商共享密钥 必选
Access Control(访问控制) 决定已认证实体可以做什么:可加入的域、可发布/订阅的主题 必选
Cryptographic(加密) 全部密码学操作:加解密、散列、数字签名、密钥派生 必选
Logging(日志) 安全审计日志 可选
Data Tagging(数据标记) 为数据附加标签,配合访问控制使用 可选

三个必选插件规范定义了内建实现,主流 DDS 实现(Cyclone DDS、Fast DDS、RTI、OpenDDS)都按此提供缺省能力,插件以动态库形式加载,加载位置由配置或参与者 QoS 指定。

三个必选插件如何工作 ​

Authentication:先确认「你是谁」 ​

内建实现基于 PKI:部署时预置一个共同信任的证书颁发机构(CA),每个参与者持有 CA 签发的身份证书。参与者相互发现后执行认证握手,完成三件事:验证对方证书、相互确认身份、通过密钥交换协商出只有双方知道的共享密钥。具体算法上,RSA 用于认证,Diffie-Hellman 用于密钥交换。

Access Control:再确认「你能做什么」 ​

访问控制依据两份 XML 文档,均由权限 CA 以 S/MIME 格式签名,所有参与者必须使用同一个权限 CA:

  • Governance(治理)文档:定义域和主题的安全行为,核心是保护级别;
  • Permissions(权限)文档:定义每个参与者可加入的域、可发布/订阅的主题范围。

保护级别分五档,决定对报文施加的密码学变换:NONE(不处理)、SIGN(MAC 认证)、ENCRYPT(加密)、SIGN_WITH_ORIGIN_AUTHENTICATION 与 ENCRYPT_WITH_ORIGIN_AUTHENTICATION(在认证/加密基础上追加来源证明,向接收方证明消息确实出自声明的发送者,防止其他接收者冒充)。保护的作用范围分三层,分别对应整条 RTPS 报文、部分 RTPS 子报文、序列化后的数据负载。要注意通信双方的治理配置必须一致,否则无法建立通信。

Cryptographic:实际动手加密 ​

加密插件执行所有密码学操作。内建实现用 AES-GCM 做加密、AES-GMAC 做消息认证,会话密钥从认证阶段协商出的共享密钥派生。

启用安全机制后的实际影响 ​

安全不是免费的,以 Cyclone DDS 官方文档为准,启用后有几个实际影响:

  • 发现变慢:发现流程本身不变,但每个参与者对都要多做一次认证握手,节点较多时发现开销随节点数量呈平方增长;
  • 握手期间的易失数据丢失:认证握手发生在参与者发现之后,握手成功前读写匹配被推迟,此期间按 volatile 可靠性发送的数据会丢失(相当于没有订阅者存在);
  • 密钥交换期间的 best-effort 数据丢失:读写匹配完成后双方交换加解密密钥,交换期间 best-effort 数据丢失,reliable 数据事后重发。

安全通信建立的完整时序如下:

要点 ​

  • DDS 的发现协议只交换端点信息,不认证身份、不校验权限,所以「接入网络即放行」,防泄露、防伪造、防篡改要靠 DDS-Security 补齐;
  • 五个插件中认证、访问控制、加密三个必选且有内建实现,安全机制在 DDS 实现层生效,对应用代码基本透明;
  • 访问控制的两份签名文档是管理核心:治理文档定保护强度(五档 × 三层作用范围),权限文档定各参与者能做什么,双方配置必须一致;
  • 启用后的代价集中在发现与建链阶段:握手使发现开销随节点数平方增长,握手与密钥交换期间的易失与 best-effort 数据会丢失,对可靠性敏感的设计要预留重传。
最近更新

基于 VitePress 构建