第17章 安全与权限管理

码枢沄社 · 嵌入式体系化教程平台
高级 👤 需要将机器人部署到公共环境或共享网络的开发者 🔧 多机器人协同产线、远程医疗操作、自动驾驶车队
本章你将学到
  • SROS2安全框架的三大支柱:认证、授权、加密
  • 用门禁卡类比理解访问控制策略(ACE)的配置逻辑
  • 从零搭建一个具备权限管控的安全ROS2系统
核心概念 SROS2 DDS Security ACE策略 PKI证书

2021年,某高校的物流机器人实验室因未启用任何通信加密,被外部设备嗅探到话题数据,导致错误任务指令被注入——三台机器人原地失控。这类事故在真实项目中并不罕见。ROS2自带的SROS2安全框架就是为了堵住这类漏洞而设计的,但多数团队用ROS2做原型验证时,往往把安全配置这一步跳过了。

安全架构与组件

安全层面 SROS2组件 类比 用途
身份认证 证书 + CA 员工工牌 + 发证机构 确认节点身份是否可信
访问控制 权限文件(permissions.xml) 门禁系统的楼层权限表 规定节点能读写哪些话题/服务
传输加密 治理文件(governance.xml) 保密会议室的门锁 防止通信内容被窃听或篡改

SROS2 基于 DDS Security 1.1 标准实现,三层安全机制层层递进:没有证书的节点无法加入系统,即使加入了也找不到无权访问的话题,即使找到了也读不懂加密后的数据。我在部署第一个安全机器人项目时,就因为漏掉了 governance.xml 中的加密规则,导致话题数据以明文传输——系统日志里能看到完整的传感器数值,相当于白配了证书。

节点A
(持证书)
DDS安全中间件
(认证/加密/权限校验)
节点B
(持证书)
CA根证书
权限策略(permissions.xml)
治理策略(governance.xml)

身份认证与证书体系

SROS2 采用 PKI(公钥基础设施)体系:一台离线机器充当 CA(证书颁发机构),为每个节点签发独立证书。节点启动时,DDS 层会验证对方证书是否由同一 CA 签发——就像机场安检核对护照章是否由海关盖的。

🔐
技术定义
每个 ROS2 节点拥有一对公私钥和一份证书。公钥随证书广播,私钥仅节点自己持有。DDS Security 使用 X.509 证书格式,证书中包含节点身份标识(如节点名、所属域)。

生成证书链时,先创建 CA 根证书,再为每个节点生成证书签名请求(CSR),由 CA 签署后分发。我踩过的一个坑:节点证书的 Common Name(CN) 字段没有按照 节点名@域名 的格式填写,导致权限文件的规则匹配不上,节点一直报 Authentication failed

访问控制策略(ACE)

权限文件 permissions.xml 的核心是一组 ACE(访问控制条目),每个条目定义了一个节点对某话题或服务的操作权限。格式类似这样:

allow
    subject: "节点A"
    action: "publish"
    topic: "/camera/image"

ACE 的语法来自 DDS Security 规范,支持 allow / denypublish / subscribe / call / service 等动作类型。一个常见的初学者错误是把话题名写成了 /camera/image/(末尾多了斜杠),导致策略失效——ROS2 的话题名不允许尾部斜杠。

⚠️ 常见误区

  • 证书CN命名随意:CN字段必须与权限文件中的subject名称严格一致,大小写都算不同。建议统一用小写加下划线命名。
  • 权限文件遗漏系统话题:只给自己的业务话题配了权限,忘了 /parameter_events/rosout 等系统内部话题——节点启动后直接报权限不足。
  • 加密与权限混淆:权限控制解决"谁能读写",加密解决"数据是否可见"。只配权限不开加密,数据仍然明文传输;只开加密不配权限,节点能访问所有话题——两者需同时启用。

治理策略与加密配置

治理文件 governance.xml 定义哪些话题需要加密、哪些节点之间需要身份认证。它是一份"通信安全等级"地图。实际项目中,大部分团队会对所有话题开启加密,但会为诊断日志等低敏数据关闭认证以降低延迟。

编者提示
在真实产品中,我建议先用 ros2 security --enclave 在开发阶段生成一份基线权限文件,然后基于这份文件做裁剪——而不是从空文件开始写ACE规则。基线文件会列出系统已知的所有话题和服务,能有效避免漏配。另外,keystore 目录务必放在版本控制之外,尤其是私钥文件(.key),泄露等于整个安全体系失效。

安全通信建立流程

从节点启动到安全通信建立,内部经历了四个步骤,用流程图可以看得更清楚:

节点启动,加载证书 & 私钥
DDS发起认证握手
(交换证书 + 验证签名)
权限校验:匹配 ACE 规则
协商加密密钥,建立安全通道
正常收发话题/服务数据

如果认证或权限校验未通过,DDS 底层会直接丢弃报文,节点收不到任何错误提示——只有通过 ros2 security debug 或在 DDS 日志中才能看到具体拒绝原因。这是新手排查时最容易被迷惑的地方:节点看起来正常启动,但就是收不到数据。

✅ 成功场景

  • 证书链完整
  • ACE规则覆盖所有话题
  • 加密协商成功
  • 通信延迟增加约5-8%

❌ 失败场景1:认证失败

  • 证书过期或CN不匹配
  • 节点之间无法建立连接
  • 日志显示"authentication error"

❌ 失败场景2:权限不足

  • 话题数据为空
  • 节点无任何报错
  • 检查permissions.xml中的topic名

❌ 失败场景3:加密不匹配

  • 两端加密策略不一致
  • 节点反复重连
  • 检查governance.xml中domain_id

针对失败场景2,我提供一个排错线索:在权限文件中加入一条 allow * * *(通配所有话题和动作)来测试——如果节点通信恢复正常,就说明是权限规则写漏了。生产环境不要保留这条通配规则,仅用于调试。

动手试一试

在单机上部署一个带安全管控的 ROS2 系统:

  1. 使用 ros2 security create_keystore 创建 keystore 目录
  2. 为两个节点(talker / listener)分别生成证书和密钥
  3. 编写 permissions.xml,只允许 talker 发布 /chatter,listener 订阅 /chatter
  4. 编写 governance.xml,对 /chatter 话题开启加密
  5. 分别启动两个节点,用 ros2 topic echo 验证能否读取数据(此时因权限不足应读取失败)
  6. 修改权限文件,为 ros2 topic echo 对应的节点名加上订阅权限,再次验证

检验你的理解

  1. 判断题:只要配了权限文件(permissions.xml),通信数据就是加密的。(对 / 错)
  2. 选择题:节点启动后收不到话题数据且没有任何报错,应该优先检查哪个文件?
    A. governance.xml   B. permissions.xml   C. CA证书   D. DDS配置文件
  3. 选择题:ACE规则中的action类型包含以下哪项?
    A. read/write   B. publish/subscribe   C. send/receive   D. import/export

本章小结

  • SROS2 安全三要素:认证(证书)、授权(ACE规则)、加密(治理策略),三者缺一不可
  • 权限文件中的话题名必须与 ROS2 实际话题名完全一致,末尾不能有斜杠
  • 安全通信建立经过四个阶段:证书加载 → 认证握手 → 权限校验 → 加密协商
  • 排查安全问题时,先用通配规则定位是权限配置错误还是证书问题
  • 私钥文件属于最高敏感资产,严禁提交到代码仓库或通过不安全网络传输
← 上一章 返回目录 下一章 →