安全

本章介绍如何使用 DDS 安全工具为 RMF 系统提供身份验证、加密和访问控制。

RMF 系统的安全性可分为两个主要部分: 其 ROS 2 元素和仪表板。 ROS 2 元素的安全性由 DDS 安全工具提供,这些工具有助于确保身份验证、 加密和访问控制。仪表板为用户提供仪表板,同时确保通过 TLS 与服务器连接的加密、完整性和身份验证。用户身份验证和访问控制是通过针对数据库检查用户/密码,然后 为该用户提供与该用户角色相对应的安全 ROS 2 网络的访问权限来完成的。

Security System Infrastructure

RMF Demos Office World 存储库包含使用安全 ROS 2 通信的完整 RMF 应用程序示例以及分步说明。

ROS 2 安全

ROS 2 包含可帮助创建和加载所需安全工件的工具,以启用 DDS 安全。RMF 使用这些工具来启用其 ROS 2 元素上的安全性。这里简要介绍了这些工具及其用法。如需更深入地了解整个系统,请参阅 ROS 2 DDS 安全集成 文档。

DDS-Security 概述

DDS-Security 规范DDS 规范 的基础上进行了扩展, 通过定义服务插件接口 (SPI) 架构、一组 SPI 的内置实现以及 SPI 强制执行的安全模型,增加了安全性增强功能。 具体来说,定义了五个 SPI:

  • 身份验证:验证给定域参与者的身份。
  • 访问控制:对经过身份验证的域参与者可以执行的 DDS 相关操作实施限制。
  • 加密:处理所有必需的加密、签名和散列操作。
  • 日志记录:提供审核 DDS 安全相关事件的能力。
  • 数据标记:提供向数据样本添加标记的能力。

ROS 2 的安全功能目前仅使用前三个。 这是因为,日志记录数据标记都不是符合 DDS-Security spec (参见第 2.3 节)所必需的,因此并非所有 DDS 实现都支持它们。

SROS 2 工具

由于 DDS-Security 插件需要每个域参与者一组安全文件,因此需要事先创建这些文件,以便为 RMF 的 ROS 2 元素提供身份验证、访问控制和加密。域参与者通常映射到 ROS 2 中进程内的上下文,因此每个进程都需要一组这样的文件。

由于 SROS 2 尚不支持启动文件,因此每个二进制文件都需要在其自己的终端上单独启动。或者,我们建议创建脚本来自动化此过程。 例如,[Office SROS 2 演示][https://github.com/open-rmf/rmf_demos/blob/main/docs/secure_office_world.md] 中使用的 tmux 脚本。

ros2 security 命令是访问 SROS 2 工具集以创建和管理 DDS-security 工件的方式。您可以通过 -h 标志访问文档来了解其功能:

$ ros2 security -h
usage: ros2 security [-h] Call `ros2 security <command> -h` for more detailed usage. ...

Various security related sub-commands

optional arguments:
  -h, --help            show this help message and exit

Commands:
  create_key          Create key
  create_keystore     Create keystore
  create_permission   Create permission
  generate_artifacts  Generate keys and permission files from a list of identities and policy files
  generate_policy     Generate XML policy file from ROS graph data
  list_keys           List keys

  Call \`ros2 security <command> -h\` for more detailed usage.

SROS 2 环境变量

使用 SROS 2 时,您应该注意几个环境变量:

  • ROS_SECURITY_ENABLE 是 SROS 2 启用变量,它采用布尔值 (true 或 false)并指示是否启用了安全性。

  • ROS_SECURITY_STRATEGY 可以设置为 EnforcePermissive,如果使用第一个,如果未找到安全文件,它将无法运行参与者,而如果使用第二个,如果未找到这些文件,它将仅在非安全模式下运行参与者。

  • ROS_SECURITY_KEYSTORE 应指向密钥库目录树的根。这将有助于 RCL 找到安全工件的位置以初始化 ROS 2 安全环境。

SROS 2 安全密钥库

密钥库是存储 DDS 安全工件的根目录。 RCL 将使用此目录的内容为 ROS 2 网络提供 DDS 安全性。ROS_SECURITY_KEYSTORE 环境变量应按照惯例指向此目录。为了初始化和填充 keystore_storage 目录文件,可以使用以下命令:

$ ros2 security create_keystore keystore_storage
creating keystore: keystore_storage
creating new CA key/cert pair
creating governance file: keystore_storage/enclaves/governance.xml
creating signed governance file: keystore_storage/enclaves/governance.p7s

创建密钥库后,其初始结构如下:

keystore_storage
├── enclaves
|   ├── governance.p7s
|   └── governance.xml
├── private
|   ├── ca.key.pem
|   ├── identity_ca.key.pem
|   └── permissions_ca.key.pem
└── public
    ├── ca.key.pem
    ├── identity_ca.key.pem
    └── permissions_ca.key.pem

public 目录包含任何可公开的内容,例如身份的公共证书或权限证书颁发机构 (CA)。因此,可以授予对所有可执行文件的读取权限。请注意,在默认情况下,identity_capermissions_ca 都指向同一个 CA 证书。

private 目录包含任何可私有的内容,例如上述证书颁发机构的私钥材料。在将密钥库部署到目标设备/机器人之前,应删除此目录。

enclaves 目录包含与各个安全区域相关的安全工件。 SROS 2 引入了安全“enclave”的概念,其中“enclave”是一个进程或一组进程,它们将共享相同的身份和访问控制规则。enclaves 文件夹可以递归嵌套子路径以组织单独的 enclave。

SROS 2 飞地密钥

初始化“密钥库”后,您可能希望为您的飞地创建安全密钥。这将使用必要的密钥和治理文件填充“飞地”目录。例如,为了为我们的“/hospital/rviz”飞地创建安全文件,将发出以下命令:

$ ros2 security create_key keystore_storage /hospital/rviz
creating key for identity: '/hospital/rviz'
creating cert and key
creating permission

在此之后,‘keystore_storage’目录应该包含 rviz enclave:

keystore_storage
├── enclaves
|   ├── governance.p7s
|   ├── governance.xml
│   └── hospital
|       ├── rviz
│       |   ├── cert.pem
│       |   ├── key.pem
│       |   ├── governance.p7s
|       |   ├── identity_ca_cert.pem
|       |   ├── permissions_ca.cert.pem
|       |   ├── permissions.p7s
|       |   └── permissions.xml
...     ... 

现在,有一个包含以下文件的 enclave:

  • identity_ca.cert.pem:受 Authentication 插件信任的 CA 的 x.509 证书(“身份”CA)。
  • cert.pem:此 enclave 实例的 x.509 证书(由身份 CA 签名)。
  • key.pem:此 enclave 实例的私钥。
  • permissions_ca.cert.pem:受 Access control 插件信任的 CA 的 x.509 证书(“权限”CA)。
  • governance.p7s:向 Access control 插件指定应如何保护域的 XML 文档(由权限 CA 签名)。
  • permissions.p7s:指定此特定 enclave 实例对访问控制插件的权限的 XML 文档(也由权限 CA 签名)。

SROS 2 访问控制

为了提供访问控制,需要将安全权限添加到 enclave 的权限文件中 并由 CA 签名。为此,需要遵循 SROS 2 策略架构 的策略文件。 此文件指定授予 ROS 2 网络内 enclave 的权限。 要创建和签署权限,可以使用 create_permission 选项:

$ ros2 security create_permission keystore_storage /hospital/rviz policy.xml 
creating permission file for identity: '/hospital/rviz'
creating permission

运行此命令后, enclave /hospital/rviz 的 permissions.p7spermissions.xml 文件将包含 policy.xml 中指定的签名权限。 在启动我们的流程时,我们必须通过 rosargs 指定此 enclave:

$ ros2 run <package> <executable> --rosargs ---enclave /hospital/rviz

SROS 2 自动生成

生成密钥和权限的过程有时可能很繁琐,因此 SROS 2 提供了工具来自动化此过程。提供了一种自动生成策略的方法,可以通过运行以下命令来触发:

$ ros2 security generate_policy policy.xml

此命令将在运行时获取 ROS 图并生成与其对应的 policy.xml 文件。请注意,由于它仅使用当前 ROS 图作为信息来源,因此可能仍会错过未来发布者、订阅者、服务或其他人的政策。

流程和密钥及权限的生成也可能很麻烦,SROS 2 提供了一个命令,您可以使用它一次性生成所有这些:

$ ros2 security generate_artifacts -k keystore_storage -p policy.xml
keystore_storage is not a valid keystore, creating new keystore
creating keystore: keystore_storage
creating new CA key/cert pair
creating governance file: keystore_storage/enclaves/governance.xml
creating signed governance file: keystore_storage/enclaves/governance.p7s
all done! enjoy your keystore in keystore_storage
cheers!
creating key for identity: '/hosptial/rviz'
creating cert and key
creating permission
creating permission file for identity: '/hosptical/rviz'
creating permission
...

最后,SROS 2 还提供了一种轻松列出某个密钥存储的密钥的方法:

$ ros2 security list_keys keystore_storage
/hospital/building_map_server
/hopsital/building_systems_visualizer
/hospital/door_supervisor
/hospital/fleet_state_visualizer
/hosptial/loop_request_publisher
/hosptial/rviz2
...

RMF Web 仪表板安全

[RMF Web] (https://github.com/open-rmf/rmf-web) 是一个 Web 应用程序,可提供对 RMF 系统的整体可视化和控制。它通过 TLS 提供服务,以确保与最终用户的通信的加密、完整性和身份验证。服务器使用 openid-connect (OIDC) 进行身份验证,这是一个基于 oauth 2.0JOSE 的开放标准。目前,仪表板使用 Keycloack,这是 OIDC 的开源实现。它提供了一个用户管理系统,用于创建/删除用户。每个用户都被分配一个角色,该角色反映在用户生成的 id 令牌上。此 id 令牌经过安全签名并发送到 api 服务器,然后它可以查看用户的角色并采取相应行动。 API 服务器为每个角色运行一个安全的 ROS 2 节点,并根据每个用户的 id 令牌提供对它们的访问权限。