第3章:SROS2工具链:sros2包安装与配置,keystore与密钥管理,访问控制策略
好,咱们进入正题。上一章聊了ROS2的安全架构,这一章我们动手实操。说白了,SROS2就是给ROS2套上一层加密和权限的外衣。我刚开始接触时也觉得挺复杂,但用顺手了就会发现——其实核心就三件事:装工具、管钥匙、定策略。
3.1 安装sros2包
先说说安装。我个人习惯用二进制包,省事。但如果你要定制化,源码编译也行。
# 二进制安装(推荐)
sudo apt install ros-humble-sros2
# 验证安装
ros2 security --help
嗯,这里要注意:不同ROS2发行版的包名略有差异。比如Humble就叫ros-humble-sros2,Galactic是ros-galactic-sros2。我在项目中遇到过有人装错版本,结果折腾了半天才发现是源没配对。
ros2 security generate_artifacts --help,看看子命令是否齐全。如果提示找不到命令,大概率是环境变量没source。
3.2 Keystore与密钥管理
密钥管理是安全的基础。你想想看,如果钥匙都被人拿走了,锁再结实也没用。SROS2使用PKI体系,核心就是Keystore——一个存放所有密钥和证书的目录。
3.2.1 创建Keystore
# 创建密钥仓库
ros2 security create_keystore ~/sros2_demo/keystore
# 查看生成的文件
ls -la ~/sros2_demo/keystore/
# 你会看到:ca.cert.pem, ca.key.pem, public.pem 等
这里生成的ca.cert.pem就是根证书,相当于整个安全体系的信任锚点。我曾经犯过一个错——把keystore放在/tmp目录下,结果重启后全没了。所以,keystore一定要放在持久化存储中。
3.2.2 为节点生成密钥
每个节点都需要自己的身份证书。说白了,就像每个员工都要有自己的工牌。
# 为talker节点生成密钥和证书
ros2 security create_key ~/sros2_demo/keystore /talker
# 为listener节点生成
ros2 security create_key ~/sros2_demo/keystore /listener
执行后,keystore目录下会多出/talker和/listener两个子目录,里面包含:
| 文件 | 说明 |
|---|---|
| key.pem | 节点的私钥(绝对保密) |
| cert.pem | 节点的证书(公开) |
| ca.cert.pem | 根证书副本 |
key.pem一旦泄露,整个安全体系就形同虚设。我在生产环境中会设置chmod 600 key.pem,并考虑使用HSM硬件安全模块。
3.3 访问控制策略
有了钥匙,还得规定谁能进哪个门。这就是访问控制策略(Access Control Policy)干的事。SROS2支持两种格式:XML和YAML。我个人更偏爱YAML,可读性好,但XML在复杂场景下更严谨。
3.3.1 YAML策略示例
# policy.yaml
nodes:
- name: /talker
publications:
- topic: /chatter
type: std_msgs/msg/String
subscriptions: []
services: []
- name: /listener
publications: []
subscriptions:
- topic: /chatter
type: std_msgs/msg/String
services: []
这个策略说白了就是:talker只能发/chatter话题,listener只能收/chatter话题。其他操作一律禁止。
3.3.2 XML策略示例
<?xml version="1.0"?>
<policy version="1.0">
<node name="/talker">
<topic name="/chatter" direction="publish">
<type>std_msgs/msg/String</type>
</topic>
</node>
<node name="/listener">
<topic name="/chatter" direction="subscribe">
<type>std_msgs/msg/String</type>
</topic>
</node>
</policy>
XML写起来啰嗦点,但胜在结构清晰。我在项目中遇到过YAML缩进搞错导致策略失效的坑,后来改用XML反而更稳。
3.3.3 应用策略
# 生成加密的权限文件
ros2 security create_permission \
~/sros2_demo/keystore \
/talker \
policy.yaml
ros2 security create_permission \
~/sros2_demo/keystore \
/listener \
policy.yaml
执行后,每个节点目录下会生成permissions.xml和permissions.p7s。前者是策略内容,后者是签名——防止策略被篡改。
3.4 启动安全节点
最后一步,让节点带上安全配置启动:
# 设置环境变量
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
export ROS_SECURITY_KEYSTORE=~/sros2_demo/keystore
# 启动节点
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker
ros2 run demo_nodes_cpp listener --ros-args --enclave /listener
这里--enclave参数指定了节点的安全域,必须和keystore中的目录名一致。我刚开始总忘记加这个参数,结果节点启动后报错Failed to find security artifacts——嗯,踩过的坑都是经验。
- Keystore是安全体系的根,务必保护好
- 每个节点要有独立的密钥和证书
- 访问控制策略要遵循最小权限原则
- 生产环境建议使用Enforce模式,拒绝未授权通信
好了,这一章的内容就这些。说白了,SROS2工具链就是帮你完成「造钥匙、发工牌、定门禁」这三件事。下一章我们会深入权限管理的细节,聊聊如何设计更细粒度的访问控制策略。