设置安全性
目标: 使用 sros2
设置安全性。
教程级别: 高级
时间: 15分钟
内容
背景
sros2
包提供了在 DDS-Security 之上使用 ROS 2 的工具和说明。安全功能已在不同平台(Linux、macOS 和 Windows)以及不同语言(C++ 和 Python)上进行了测试。SROS2 已设计成可与任何安全中间件一起使用,尽管并非所有中间件都是开源的,支持程度取决于正在使用的 ROS 版本。如果遇到任何支持问题,请联系 ROS 2 安全工作组。
安装
通常情况下,安装后可以使用 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,请按照 这些说明 进行安装
Fast DDS需要一个额外的CMake标志来构建安全插件,因此需要修改colcon调用以传递以下内容:
colcon build --symlink-install --cmake-args -DSECURITY=ON
选择替代的中间件
如果您选择不使用默认的中间件实现,请务必在继续之前 更改您的DDS实现。
ROS 2 允许您在运行时更改 DDS 实现。请参阅 如何使用多个 RMW 实现 以探索不同的中间件实现。
请注意,不支持供应商之间的安全通信。
运行演示
1. 为安全文件创建一个文件夹。
首先创建一个文件夹,用于存储此演示所需的所有文件:
mkdir ~/sros2_demomkdir ~/sros2_demomd 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
如果出现 无法写入 'random state'
的错误,请设置环境变量 RANDFILE
。
set RANDFILE=C:\dev\ros2\sros2_demo\.rnd
然后重新运行上述命令。
4. 配置环境变量
三个环境变量允许中间件定位加密材料并启用(可能强制执行)安全性。这些和其他与安全相关的环境变量在 ROS 2 DDS-Security Integration 设计文档 中有描述。
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
在另一个终端中,执行相同的操作来启动 listener
节点。该终端中的环境变量必须正确设置,如上述第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安全性了吗?请查看 安全的Turtlebot2演示 。您将找到一个功能齐全且复杂的ROS 2安全性实现,可以尝试您自己的定制场景。请务必在此处创建拉取请求和问题,以便我们可以继续改进ROS的安全支持!