设置安全性
目标: 使用“sros2”设置安全性。
教程级别: 高级
时间: 15 分钟
背景
sros2
软件包提供了在 DDS-Security 上使用 ROS 2 的工具和说明。
安全功能已在各个平台(Linux、macOS 和 Windows)以及不同语言(C++ 和 Python)上进行了测试。
SROS2 旨在与任何安全中间件配合使用,但并非所有中间件都是开源的,并且支持因使用的 ROS 发行版而异。
安装
通常在使用 ROS 2 安装指南 和 配置指南 安装后即可获得安全性。 但是,如果您打算从源代码安装或切换中间件实现,请考虑以下注意事项:
从源代码安装
在从源代码安装之前,您需要安装最新版本的 openssl(1.0.2g 或更高版本):
sudo apt update
sudo apt install libssl-dev
brew install openssl
您需要在库路径上安装 OpenSSL 才能运行 DDS-Security 演示。
运行以下命令,并考虑将其添加到您的“~/.bash_profile”中:
export DYLD_LIBRARY_PATH=`brew --prefix openssl`/lib:$DYLD_LIBRARY_PATH
export OPENSSL_ROOT_DIR=`brew --prefix openssl`
如果您没有安装 OpenSSL,请按照:ref:这些说明 操作
Fast DDS 需要额外的 CMake 标志来构建安全插件,因此需要修改 colcon 调用以传递:
colcon build --symlink-install --cmake-args -DSECURITY=ON
选择备用中间件
如果您选择不使用默认中间件实现,请务必在继续之前:doc:更改您的 DDS 实现。
ROS 2 允许您在运行时更改 DDS 实现。 请参阅`如何使用多个 RMW 实现 <../../../How-To-Guides/Working-with-multiple-RMW-implementations>` 以探索不同的中间件实现。
请注意,不支持供应商之间的安全通信。
运行演示
1.为安全文件创建一个文件夹
首先创建文件夹来存储此演示所需的所有文件:
mkdir ~/sros2_demo
mkdir ~/sros2_demo
md C:\dev\ros2\sros2_demo
2. 生成密钥库
使用 sros2
实用程序创建密钥库。
密钥库中的文件将用于为 ROS 2 图表中的所有参与者启用安全性。
cd ~/sros2_demo
ros2 security create_keystore demo_keystore
cd ~/sros2_demo
ros2 security create_keystore demo_keystore
cd sros2_demo
ros2 security create_keystore demo_keystore
3. 生成密钥和证书
创建密钥库后,为每个启用了安全性的节点创建密钥和证书。
对于我们的演示,这包括 talker 和 listener 节点。
此命令使用 create_enclave
功能,该功能将在下一个教程中详细介绍。
ros2 security create_enclave demo_keystore /talker_listener/talker
ros2 security create_enclave demo_keystore /talker_listener/listener
ros2 security create_enclave demo_keystore /talker_listener/talker
ros2 security create_enclave demo_keystore /talker_listener/listener
ros2 security create_enclave demo_keystore /talker_listener/talker
ros2 security create_enclave demo_keystore /talker_listener/listener
如果出现“无法写入‘随机状态’”,则设置环境变量“RANDFILE”。
set RANDFILE=C:\dev\ros2\sros2_demo\.rnd
Then re-run the commands above.
4. 配置环境变量
三个环境变量允许中间件定位加密材料并启用(并可能强制执行)安全性。 这些和其他与安全相关的环境变量在`ROS 2 DDS-Security Integration 设计文档 <https://design.ros2.org/articles/ros2_dds_security.html>`_ 中进行了描述。
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
set ROS_SECURITY_KEYSTORE=%cd%/demo_keystore
set ROS_SECURITY_ENABLE=true
set ROS_SECURITY_STRATEGY=Enforce
这些变量需要在用于演示的每个终端中定义。 为了方便起见,您可以将它们添加到启动环境中。
5. 运行``talker/listener`` 演示
通过启动 talker 节点开始演示。
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
在另一个终端中,执行相同操作以启动“侦听器”节点。 必须按照上面步骤 4 的说明正确设置此终端中的环境变量。
ros2 run demo_nodes_py listener --ros-args --enclave /talker_listener/listener
这些节点将使用身份验证和加密进行通信! 如果您查看数据包内容(例如,使用另一个教程中介绍的“tcpdump”或“Wireshark”),则可以看到消息已加密。
注意:您可以任意在 C++(demo_nodes_cpp)和 Python(demo_nodes_py)包之间切换。
这些节点能够进行通信,因为我们为它们创建了适当的密钥和证书。
在回答以下问题时,让两个节点保持运行。
参加测验!
打开另一个终端会话,但**不要**设置环境变量,这样安全性就不会启用。 启动监听器。 你期望发生什么?
侦听器启动但未收到任何消息。 所有流量都经过加密,如果不启用安全性,侦听器将不会收到任何消息。
停止监听器,将环境变量“ROS_SECURITY_ENABLE”设置为“true”,然后重新启动监听器。 这次你期望什么结果?
侦听器仍会启动,但不会接收消息。 虽然安全性现已启用,但由于 ROS 无法找到密钥文件,因此配置不正确。 侦听器会启动,但由于未强制执行安全性,因此处于非安全模式,这意味着虽然正确配置的谈话者正在发送加密消息,但此侦听器无法解密它们。
停止监听器并将“ROS_SECURITY_STRATEGY”设置为“Enforce”。 现在会发生什么?
侦听器启动失败。 安全已启用并正在执行。 由于仍未正确配置,因此会抛出错误,而不是以非安全模式启动。
了解更多!
您准备好进一步了解 ROS 安全性了吗? 请查看 Secure Turtlebot2 Demo。 您将找到 ROS 2 安全性的功能齐全且复杂的实现,随时可以尝试您自己的自定义场景。 请务必在此处创建拉取请求和问题,以便我们继续改进 ROS 中的安全支持!