# ROS 2 DDS-Security集成 *机器人学充满了实验:评估不同的硬件和软件,推进有效的方案,淘汰无效的方案。ROS旨在具有灵活性以支持这种实验;允许现有的组件轻松地与新的组件结合或与其他组件交互。在ROS 1中,这种灵活性被置于一切之上,因此牺牲了安全性。基于DDS的设计,ROS 2能够在保持这种灵活性的同时,通过正确利用DDS-Security规范获得被保护的能力。本文描述了ROS 2如何与DDS-Security集成。* ## 作者:Kyle Fazzari ## 撰写日期:2019-07 ## 最后修改:2020-07 ## DDS-Security概述 DDS-Security规范在DDS规范的基础上进行了扩展,通过定义服务插件接口(SPI)架构、一组内置的SPI实现,以及SPI强制执行的安全模型,增加了安全增强功能。具体来说,定义了五个SPI: - 认证:验证给定领域参与者的身份。 - 访问控制:强制执行已认证领域参与者可以执行的与DDS相关的操作的限制。 - 加密:处理所有必需的加密、签名和哈希操作。 - 日志记录:提供审计DDS-Security相关事件的能力。 - 数据标记:提供给数据样本添加标签的能力。 ROS 2目前只使用前三个。这是因为日志记录或数据标记不是符合DDS-Security规范所必需的(见第2.3节),因此并非所有DDS实现都支持它们。让我们进一步深入了解前三个插件。 ## 认证 认证插件(见DDS-Security spec的第8.3节)是整个SPI架构的核心,因为它提供了确认身份的概念,没有它,进一步的执行将是不可能的(例如,如果无法安全地确定给定的ROS身份,就很难确保它只能访问特定主题)。 SPI架构允许多种潜在的认证方案,但ROS 2使用内置的认证插件(称为“DDS:Auth:PKI-DH”,见DDS-Security spec的第9.3节),它使用经过验证的公钥基础设施(PKI)。它要求每个领域参与者都有一个公钥和私钥,以及一个将参与者的公钥绑定到特定名称的x.509证书。每个x.509证书必须由(或有签名链到)插件配置为信任的特定证书颁发机构(CA)签名。 使用内置插件而不是其他任何插件的原因有两个: 1. 它是规范(spec)详细描述的唯一方法。 2. 所有符合DDS-Security规范的实现都必须能够支持它以实现互操作性(见DDS-Security规范的第2.3节),这使得ROS 2的安全功能可以在不同供应商之间以最小的努力工作。 ## 访问控制 访问控制插件(见DDS-Security spec的第8.4节)负责定义和强制执行对给定领域参与者的DDS相关能力的访问限制。例如,它允许用户将特定参与者限制在特定的DDS域中,或者只允许参与者读取或写入特定的DDS主题等。 SPI架构再次为插件完成任务提供了一定的灵活性,但ROS 2使用内置的访问控制插件(称为“DDS:Access:Permission”,见DDS-Security规范的第9.4节),它再次使用PKI。它要求每个领域参与者有两个文件: - 治理文件:一个指定领域应如何被保护的签名XML文档。 - 权限文件:一个包含领域参与者权限的签名XML文档,绑定到认证插件定义的参与者名称(这是通过我们刚刚讨论的x.509证书完成的)。 这两个文件都必须由插件配置为信任的CA签名。这可能是认证插件信任的同一个CA,但这不是必需的。 使用内置插件而不是其他任何插件的原因与认证插件相同: 1. 它是规范中详细描述的唯一方法。 2. 所有符合DDS-Security spec的实现都必须能够支持它以实现互操作性(见DDS-Security spec的第2.3节),这使得ROS 2的安全功能可以在不同供应商之间以最小的努力工作。 ## 加密 加密插件(见DDS-Security spec的第8.5节)是处理所有与加密相关的操作的地方:加密、解密、签名、哈希等。认证和访问控制插件都利用加密插件的能力来验证签名等。这也是加密DDS主题通信功能的所在地。 虽然SPI架构再次允许多种可能性,但ROS 2使用内置的加密插件(称为“DDS:Crypto:AES-GCM-GMAC”,见DDS-Security规范的第9.5节),它提供使用高级加密标准(AES)在伽罗瓦计数器模式(AES-GCM)中的认证加密。 使用内置插件而不是其他任何插件的原因与其他插件相同: 1. 它是规范中详细描述的唯一方法。 2. 所有符合DDS-Security规范的实现都必须能够支持它以实现互操作性(见DDS-Security spec的第2.3节),这使得ROS 2的安全功能可以在不同供应商之间以最小的努力工作。 ## DDS-Security与ROS 2的集成:SROS 2 现在我们已经建立了对DDS中安全支持的共同理解,让我们讨论这种支持如何在ROS 2中暴露。默认情况下,ROS 2中没有启用DDS的任何安全特性。ROS 2中用于启用它们的一系列特性和工具统称为“Secure ROS 2”(SROS 2)。 ## ROS客户端库(RCL)中的特性 SROS 2的大部分用户面向的运行时支持都包含在ROS客户端库中。一旦满足了它的要求,它就会负责配置每个支持的DDS实现的中间件支持。RCL包括以下SROS 2的特性: - 支持每个领域参与者的安全文件。 - 支持宽松和严格两种模式的安全性执行。 - 支持所有SROS 2特性的主“开关”。 让我们依次讨论这些 ### 每个领域参与者的安全文件 如前所述,DDS-Security插件需要每个领域参与者的一组安全文件(例如密钥、治理和权限文件等)。领域参与者映射到ROS 2中的进程上下文,因此每个进程都需要这样一组文件。RCL支持通过两种不同的方式指向包含安全文件的目录: - 所有安全文件的目录树。 - 手动指定。 让我们进一步深入了解这些。 #### 所有安全文件的目录树 RCL支持在根密钥库中保留的飞地子文件夹内的一个目录中找到安全文件,该目录对应于每个飞地的完全限定路径。例如,对于/front/camera飞地,目录结构如下: ``` ├── enclaves │ └── front │ └── camera │ ├── cert.pem │ ├── key.pem │ ├── ... └── public ├── ... ``` 每个飞地实例目录中预期的文件集包括: - identity_ca.cert.pem:认证插件信任的CA的x.509证书(“身份”CA)。 - cert.pem:这个飞地实例的x.509证书(由身份CA签名)。 - key.pem:这个飞地实例的私钥。 - permissions_ca.cert.pem:访问控制插件信任的CA的x.509证书(“权限”CA)。 - governance.p7s:指定访问控制插件应如何保护域的XML文档(由权限CA签名)。 - permissions.p7s:指定这个特定飞地实例的权限给访问控制插件的XML文档(也由权限CA签名)。 这可以通过将ROS_SECURITY_KEYSTORE环境变量设置为指向密钥库目录树的根目录来指定,然后使用`--ros-args`运行时参数`-e、--enclave`指定飞地路径,例如: ```bash export ROS_SECURITY_KEYSTORE="/home/bob/.ros/sros2_keystore" ros2 run --ros-args --enclave="/front/camera" ``` #### 手动指定 RCL还支持使用覆盖环境变量指定需要启动的进程的飞地路径。这可以通过将ROS_SECURITY_ENCLAVE_OVERRIDE环境变量设置为密钥库内的替代飞地路径来完成。请注意,此设置优先于带有--enclave的ROS_SECURITY_KEYSTORE。 请注意,以下两个示例与前面演示的相同飞地路径加载: ```bash export ROS_SECURITY_KEYSTORE="/home/bob/.ros/sros2_keystore" export ROS_SECURITY_ENCLAVE_OVERRIDE="/front/camera" ros2 run export ROS_SECURITY_KEYSTORE="/home/bob/.ros/sros2_keystore" export ROS_SECURITY_ENCLAVE_OVERRIDE="/front/camera" ros2 run --ros-args --enclave="/spam" ``` ### 支持宽松和严格两种模式的安全性执行 启用了安全特性的参与者将不会与没有启用的参与者通信,但是如果有人尝试启动一个没有明显飞地(密钥/权限等)的参与者,RCL应该怎么做?它有两个选项: - 宽松模式:尝试找到安全文件,如果找不到,就启动参与者而不启用任何安全特性。这是默认行为。 - 严格模式:尝试找到安全文件,如果找不到,就运行参与者失败。 可以通过将ROS_SECURITY_STRATEGY环境变量设置为“Enforce”(区分大小写)来指定所需的模式类型,对于宽松模式,则设置为任何其他值。 ### 支持所有SROS 2特性的主“开关” 除了刚刚讨论的支持特性外,RCL还支持一个主关闭安全特性的开关,便于轻松实验。如果关闭(默认),上述所有安全特性将不会被启用。 为了启用SROS 2,将`ROS_SECURITY_ENABLE`环境变量设置为“true”(区分大小写)。要禁用,请设置为任何其他值。 ## SROS 2 CLI中的特性 在RCL中配置ROS 2系统以实现安全性涉及许多新技术(PKI、DDS治理和权限文件及其语法等)。如果用户对这些技术感到满意,上述信息应该足以正确锁定所有内容。然而,SROS 2 CLI应该包括一个工具ros2 security,以帮助那些不想自己设置所有内容的用户,包括以下功能: - 创建身份和权限CA。 - 创建包含所有安全文件的目录树。 - 为给定飞地创建新身份,生成密钥对,并使用身份CA签名其x.509证书。 - 创建默认加密所有DDS流量的治理文件。 - 支持以熟悉的ROS术语指定飞地权限,然后自动转换为低级DDS权限。 - 支持自动从运行中的ROS系统发现所需权限。