
1. 同域即可读写——实验室行,上车不行
默认 DDS 安全关闭:同一 ROS_DOMAIN_ID 内,任何进程可 pub/sub 任意话题。展厅一台访客笔记本接入车间 Wi-Fi,理论上能订 /cmd_vel、发伪造定位。SROS 2 在 DDS 层用密钥 + 权限 XML 限制参与者身份与可读写的 topic/service 名——这是部署契约,不是应用里 if (trusted) 能替代的。
2. 核心工件
SROS 2 工具链生成:
- Keystore:CA、节点证书、私钥
- Governance / Permissions XML:允许哪些 DDS 参与者访问哪些 topic
ros2 security create_keystore ~/sros2_keystore
ros2 security create_enclave ~/sros2_keystore /robot/nav
ros2 security create_permission \
~/sros2_keystore /robot/nav policy.xml节点启动时需环境变量指向 enclave:
export ROS_SECURITY_KEYSTORE=~/sros2_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
export ROS_SECURITY_ENCLAVE=/robot/nav权限文件应进版本库(不含私钥);私钥分发走安全通道,与代码 release 分离。Governance 里 allow_unauthenticated_participants 在 prod 必须为 false——CI 应用 lint 检查 permissions XML,防止 merge 误开全网可读。
3. 试点范围:先锁关键面
全图一次性上 SROS 成本极高(每节点证书、调试复杂度)。试点顺序建议:
/cmd_vel、/wheel_odom等控制与反馈- 定位结果、地图服务
- 视频流与远程运维接口
未授权参与者订 /cmd_vel 应明确失败(日志含 security denied),而非 silent 无数据——后者会被当成 QoS 问题排错到驱动层。ros2 security list_enclaves 与现场进程 enclave 对账,应成为每季度演练的固定步骤。
4. 分诊:权限 vs QoS vs 发现
| 现象 | 优先查 |
|---|---|
| 未授权节点完全无 graph | 证书/enclave 路径 |
| 授权 pub 但 sub 无数据 | QoS 兼容 |
| 对端 graph 为空 | DOMAIN_ID / 网络 / discovery |
故障手册应单独一行「安全层」,避免现场「为演示先 ROS_SECURITY_ENABLE=false」成为永久配置。
5. 开发 enclave 与生产 enclave
开发者日常若长期关闭安全,生产权限 XML 从未被真实图验证,上车首日全红。应维护:
- dev enclave:宽松,仅 CI 与本地
- prod enclave:与现场 topic 图一致,仿真 CI 在 Enforce 下跑冒烟
两者密钥分离,禁止 prod 私钥进开发机默认路径。
6. 权限变更流程
权限文件变更 = 接口变更:谁可读写哪条 topic、变更原因、回滚包。密钥轮换要有窗口与双证书过渡。临时关闭安全须票证 + 时限 + 复原检查——无票关闭视为事故,否则「临时」变永久架构。
7. 即使不上 SROS 的底线
- 生产网络不与访客 Wi-Fi 同广播域
- 不在公网暴露 DDS 端口
- 敏感 bag 脱敏或加密存储
- 远程运维走 VPN + 应用层鉴权,不靠「保密 domain ID」
8. 验收
- 未授权进程 sub
/cmd_vel:失败且日志可识别 - 授权 Nav2 栈:功能与无安全模式一致
- 权限 XML diff 可审计;CI 在 Enforce 下通过核心用例
- 开发者文档写清 enclave 与启动 env,不是口头传
新节点上车 checklist 增加一行:enclave 是否在 permissions 白名单、证书是否过期——与 URDF 校验同级。
9. 案例:权限失败被当成「雷达坏了」
某车 /scan 无数据,现场换雷达。实际是新建节点 enclave 未写入 permissions,ROS_SECURITY_STRATEGY=Enforce 下订阅被拒。日志默认级别未开 security 详情,排错耗一天。此后启动自检脚本断言 ros2 topic echo 关键 topic 一条消息,失败时打印 ROS_SECURITY_* 环境。
10. 默认策略
关键话题先锁;开发/生产 enclave 分离;故障分诊含安全层;关安全须票证化。安全是部署面,越晚补越贵。
11. 与 lifecycle、录包
Lifecycle 节点 inactive 时若仍持有旧 graph 缓存,切 active 后可能短暂用错误权限重连——切换路径要在集成测试覆盖。录 bag 含敏感 topic 时,权限 XML 也应限制谁能录;bag 本身加密存储,与 SROS 互补而非替代。复盘安全相关事故时,日志须保留 security 拒绝事件,默认级别常被现场调成 error 以上才可见,应在部署清单写死。
相关
也可以看看
- ·15 分钟阅读
ContentFilteredTopic:把过滤下推到中间件还是应用层
对比订阅端丢弃、应用层条件判断与 DDS 内容过滤的 CPU/带宽边界,说明表达式能力与发现时序限制;用高频率噪声话题与延迟尖峰验收过滤位置选择。
- ·16 分钟阅读
ROS 2 Action 取消语义:收到 cancel 不等于执行器已经停下
梳理 goal handle 状态机、取消回调与硬件停止之间的异步边界;用可中断执行循环、截止时间和终态发布构建契约并以注入验收。
- ·9 分钟阅读
ROS 2 大消息内存路径:intra-process、loaned message 与 shared memory 不是一回事
以 4K 图像和点云管线为例,逐段核对 rclcpp、RMW 与进程边界上的所有权、分配和真实拷贝。
johan's blog