返回专辑
·Johan·3 分钟阅读

SROS 2 基础:默认开放图的边界

权限与密钥是部署契约;先锁关键话题,区分权限失败与 QoS 失败。

SROS 2 基础:默认开放图的边界

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
bash
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:

bash
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 成本极高(每节点证书、调试复杂度)。试点顺序建议:

  1. /cmd_vel/wheel_odom 等控制与反馈
  2. 定位结果、地图服务
  3. 视频流与远程运维接口

未授权参与者订 /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 以上才可见,应在部署清单写死。

相关

也可以看看

← 全部文章

johan's blog