目标:使用 sros2
设置安全性。
教程级别:高级
时间:15 分钟
内容
-
背景
-
安装
-
从源代码安装
-
选择替代中间件
-
-
运行演示
-
- 为安全文件创建一个文件夹
-
- 生成密钥库
-
- 生成密钥和证书
-
- 配置环境变量
-
- 运行
talker/listener
演示
- 运行
-
-
参加测验!
-
了解更多!
背景
sros2
包提供了在 DDS-Security 之上使用 ROS 2 的工具和说明 。安全功能已在各个平台(Linux、macOS 和 Windows)以及不同语言(C++ 和 Python)中进行了测试。SROS2 旨在与任何安全中间件一起使用,尽管并非所有中间件都是开源的,并且支持因使用的 ROS 发行版而异。如果遇到任何支持问题,请联系 ROS 2 安全工作组。https://docs.ros.org/en/jazzy/The-ROS2-Project/Governance/Working-Groups.html#security-working-group
安装
通常在使用 ROS 2 安装指南https://docs.ros.org/en/jazzy/Installation.html 和配置指南https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools/Configuring-ROS2-Environment.html 进行安装后即可获得安全性。但是,如果您打算从源代码安装或切换中间件实现,请考虑以下注意事项:
从源代码安装(compile Fast DDS)
在从源代码安装之前,您需要安装一个最近版本的 openssl(1.0.2g 或更高版本):
properties
sudo apt update
sudo apt install libssl-dev
Fast DDS 需要额外的 CMake 标志来构建安全插件,因此需要修改 colcon 调用以传递:
apache
colcon build --symlink-install --cmake-args -DSECURITY=ON
sql
cxy@cxy-Ubuntu2404:~/ros2_jazzy$ sudo apt update
cxy@cxy-Ubuntu2404:~/ros2_jazzy$ sudo apt install libssl-dev
cxy@cxy-Ubuntu2404:~/ros2_jazzy$ colcon build --symlink-install --cmake-args -DSECURITY=ON
选择替代的中间件
如果您选择不使用默认的中间件实现,请务必在继续之前更改您的 DDS 实现 https://docs.ros.org/en/jazzy/Installation/DDS-Implementations.html 。
properties
Ubuntu Linux 源代码安装
# 1. RTI Connext(版本 6.0.1,仅 amd64)
ROS 2 apt 仓库中提供的 Debian 软件包
您可以安装在 ROS 2 apt 仓库中提供的 RTI Connext 的 Debian 软件包。您需要接受 RTI 的许可。
sudo apt update && sudo apt install -q -y rti-connext-dds-6.0.1
源设置文件以设置 NDDSHOME 环境变量。
cd /opt/rti.com/rti_connext_dds-6.0.1/resource/scripts && source ./rtisetenv_x64Linux4gcc7.3.0.bash; cd -
注意:使用 zsh 时,您需要位于脚本所在的目录中,以便正确运行
现在您可以正常构建,并且对 RTI 的支持也将被构建。
# 2. 来自 RTI 的官方二进制软件包
您可以通过大学、购买或评估提供的选项,安装由 RTI 提供的 Linux 版 Connext 6.0.1 软件包。
下载后,在 .run 可执行文件上使用 chmod +x ,然后执行它。请注意,如果您要安装到系统目录,请同时使用 sudo 。
默认位置是 ~/rti_connext_dds-6.0.1
安装后,运行 RTI 启动器并指向您的许可证文件(从 RTI 获得)。
将以下行添加到您的 .bashrc 文件中,指向您的许可证副本。
export RTI_LICENSE_FILE=path/to/rti_license.dat
请获取安装文件以设置 NDDSHOME 环境变量。
cd ~/rti_connext_dds-6.0.1/resource/scripts && source ./rtisetenv_x64Linux4gcc7.3.0.bash; cd -
现在您可以像往常一样构建,并且还将构建对 RTI 的支持。
Ubuntu Linux 二进制安装
RTI Connext(版本 6.0.1,仅 amd64)
要使用 RTI Connext DDS,有适用于大学、购买或评估的全套安装选项,或者您可以安装 RTI Connext 6.0.1 的仅库 Debian 软件包,该软件包可从 OSRF Apt 存储库中获得,且在非商业许可下使用。
要安装仅包含库的 Debian 软件包:
sudo apt update && sudo apt install -q -y rti-connext-dds-6.0.1
您需要接受 RTI 的许可协议,并在安装中找到一个'rti_license.dat'文件。
将以下行添加到您的 .bashrc 文件中,指向您的许可证副本(并引用它)。
export RTI_LICENSE_FILE=path/to/rti_license.dat
所有选项都需要您获取安装文件以设置 NDDSHOME 环境变量
cd /opt/rti.com/rti_connext_dds-6.0.1/resource/scripts && source ./rtisetenv_x64Linux4gcc7.3.0.bash; cd -
注意:以上内容可能需要修改以匹配您的 RTI 安装位置
如果您想安装 Connext DDS-Security 插件,请参阅此页面。https://docs.ros.org/en/jazzy/Installation/DDS-Implementations/Install-Connext-Security-Plugins.html
ROS 2 允许您在运行时更改 DDS 实现。了解如何使用多个 RMW 实现来探索不同的中间件实现。https://docs.ros.org/en/jazzy/How-To-Guides/Working-with-multiple-RMW-implementations.html
请注意,不支持(不同中间件)供应商之间的安全通信。
运行演示
1. 为安全文件创建一个文件夹
首先创建一个文件夹来存储此演示所需的所有文件:
Linux:
nginx
mkdir ~/sros2_demo
2. 生成密钥库
使用 sros2
工具创建密钥库。密钥库中的文件将用于为 ROS 2 graph 中的所有参与者启用安全性。
Linux:
properties
cd ~/sros2_demo
ros2 security create_keystore demo_keystore
3. 生成密钥和证书
一旦创建了密钥库,为每个启用了安全性的节点创建密钥和证书 。对于我们的演示,包括 talker 和 listener 节点。此命令使用 create_enclave
功能,该功能将在下一个教程中更详细地介绍。
properties
ros2 security create_enclave demo_keystore /talker_listener/talker
ros2 security create_enclave demo_keystore /talker_listener/listener
4. 配置环境变量
三个环境变量允许中间件定位加密材料并启用(并可能强制)安全性 。这些和其他与安全相关的环境变量在 ROS 2 DDS-Security Integration 设计文档中有描述。https://design.ros2.org/articles/ros2_dds_security.html
Linux:
javascript
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
这些变量需要在用于演示的每个终端中定义。为了方便,您可以将它们添加到您的启动环境中。
5. 运行 talker/listener
演示
启动 talker 节点以开始演示。
nginx
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
在另一个终端中,执行相同的操作以启动 listener
节点。此终端中的环境变量必须按照上述步骤 4 中的描述正确设置。
nginx
ros2 run demo_nodes_py listener --ros-args --enclave /talker_listener/listener
这些节点将使用身份验证和加密进行通信!如果你查看数据包内容(例如,使用 tcpdump
或 Wireshark
,如在另一个教程中所述),你可以看到消息是加密的。
注意:您可以任意切换 C++(demo_nodes_cpp)和 Python(demo_nodes_py)包。
**这些节点之所以能够通信,是因为我们为它们创建了适当的密钥和证书。**在回答以下问题时,请保持两个节点运行。
参加测验!
问题 1
打开另一个终端会话,但不要设置环境变量,以便不启用安全性。启动监听器。你期望会发生什么?
答案1: 监听器启动了,但没有接收到任何消息。所有流量都是加密的,如果没有启用安全功能,监听器什么也接收不到。
问题 2
停止监听器,将环境变量 ROS_SECURITY_ENABLE
设置为 true
,然后重新启动监听器。这次你期望有什么结果?
答案2:监听器仍然启动,但无法接收消息。尽管现在已经启用了安全性,但由于 ROS 无法找到密钥文件,因此未正确配置安全性 。监听器启动,但由于未强制执行安全性,因此以非安全模式启动,这意味着尽管正确配置的发言者正在发送加密消息,但此监听器无法解密这些消息。
问题 3
停止监听并将 ROS_SECURITY_STRATEGY
设置为 Enforce
。现在会发生什么?
答案3:监听器启动失败。安全功能已经被启用并正在强制执行。由于它仍然没有被正确配置 ,系统会抛出错误而不是以非安全模式启动。
了解更多!
你准备好进一步了解 ROS 安全性了吗?看看Secure Turtlebot2 演示 https://github.com/ros-swg/turtlebot3_demo 。你会发现一个功能齐全且复杂的 ROS 2 安全性实现,准备好尝试你自己的自定义场景。请务必在此处创建拉取请求和问题,以便我们继续改进 ROS 的安全支持!