4. SROS2核心概念

SROS2 并不是在 ROS 2 之上简单叠加一个“加密开关”,而是把机器人通信中的每个参与者都纳入一套可验证、可授权、可审计的安全体系。理解这套体系,需要抓住五个相互咬合的核心概念:安全域、密钥库、身份、权限与访问控制,以及它们共同支撑的加密通信。只有把这五个概念串成一条链,才能明白为什么一个节点能发布话题、另一个节点只能订阅,以及为什么密钥一旦错配,通信会直接失败而不是“降级为明文”。

一、核心原理:从“域”到“密文”的五层结构

安全域(Security Domain)是最高层的逻辑边界。它通常对应一个机器人系统、一个产品型号或一个组织单元。同一个安全域内的所有节点共享同一套信任根和策略体系;跨域通信默认不被信任,除非显式建立跨域信任关系。安全域决定了“谁和谁可以谈”,但不决定“谈什么”。

密钥库(Keystore)是安全域落地的物理载体。它通常是一个目录,内部包含 CA 证书、各节点的身份证书、私钥、权限签名文件以及治理文件。密钥库的目录结构本身就是一种安全边界:私钥文件权限必须严格限制,权限文件必须由 CA 签名,任何未签名的策略都不会被 SROS2 接受。

身份(Identity)是每个节点的“身份证”。在 SROS2 中,身份由一对密钥和一张由 CA 签发的证书表示。节点的身份不是它的名字,而是它持有的证书链。名字可以重复,但证书指纹唯一。身份解决了“你是谁”的问题。

权限(Permissions)与访问控制(Access Control)解决“你能做什么”。权限文件以 XML 描述,逐条列出该节点可以发布、订阅、请求或应答哪些话题、服务和动作。访问控制则是在运行时由 SROS2 中间件执行的强制检查:即使节点持有合法身份,只要权限文件没有授予某话题的发布权,发布操作就会被拒绝。

加密通信是上述机制的自然结果。当两个节点都通过身份验证、且权限允许它们在同一话题上通信时,SROS2 会使用 DDS Security 插件建立加密通道。数据在传输前被加密,接收方验证发送方身份和权限后才解密。加密不是独立配置项,而是身份与权限通过后的默认行为。

SROS2 安全通信五层结构 安全域 → 密钥库 → 身份 → 权限/访问控制 → 加密通信 ① 安全域 Security Domain 逻辑边界:同一机器人系统 / 产品型号 / 组织单元共享信任根与策略体系;跨域默认不信任 域 ID / 信任根 enclave 边界 ② 密钥库 Keystore 物理载体:CA 证书、节点身份证书、私钥、权限签名文件、治理文件;目录权限即安全边界 keystore/ ca / certs / keys / policies ③ 身份 Identity 每个节点的“身份证”:密钥对 + CA 签发证书;身份由证书链决定,而非节点名称 cert.pem + key.pem 证书指纹唯一 ④ 权限与访问控制 Permissions & Access Control XML 策略逐条声明发布/订阅/请求/应答权限;运行时强制检查,未授权操作直接拒绝 permissions.xml allow / deny 规则 ⑤ 加密通信 Encrypted Communication 身份验证 + 权限通过后,DDS Security 自动建立加密通道;数据加密传输,接收方验签解密 AES-GCM / TLS 通道 信任逐层传递

二、方法流程:从创建密钥库到加密通信

在工程实践中,这五个概念会转化为一条可执行的操作链。下面以创建一个名为 robot_arm 的安全域为例,展示典型流程。

# 1. 创建安全域与密钥库
ros2 security create_keystore robot_arm_keystore

# 2. 为节点生成身份与密钥
ros2 security create_key robot_arm_keystore /arm_controller
ros2 security create_key robot_arm_keystore /joint_state_publisher

# 3. 生成权限策略模板
ros2 security create_permission robot_arm_keystore /arm_controller \
  --policy policies/arm_controller_policy.xml

# 4. 签名权限文件(由 CA 执行)
ros2 security sign_permission robot_arm_keystore /arm_controller

# 5. 启用安全环境变量
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
export ROS_SECURITY_KEYSTORE=./robot_arm_keystore

其中 ROS_SECURITY_STRATEGY 是关键参数。Enforce 表示强制安全,任何未授权通信都会被拒绝;Permissive 则允许未授权通信但会记录警告,通常只用于调试。生产环境必须使用 Enforce。

三、案例场景:机械臂控制器的权限边界

假设 /arm_controller 需要发布 /joint_commands 话题,并订阅 /joint_states。它的权限文件应精确表达这一边界:

<permissions>
  <grant name="arm_controller_grant">
    <allow>
      <publish>/joint_commands</publish>
      <subscribe>/joint_states</subscribe>
    </allow>
    <deny>
      <publish>/safety_override</publish>
    </deny>
  </grant>
</permissions>

如果攻击者篡改了 /arm_controller 的进程,试图发布 /safety_override,SROS2 会在发布前检查权限文件,发现该话题被显式拒绝,于是直接阻断。即使攻击者持有合法私钥,也无法越权。这就是访问控制的价值:它把“身份可信”和“行为受限”分开,避免一个节点被攻破后拖垮整个系统。

四、误区与复盘

常见误区一:认为“有证书就等于有权限”。证书只证明身份,权限文件才决定能做什么。只创建密钥而不配置权限,节点在 Enforce 模式下几乎无法通信。

常见误区二:把密钥库提交到代码仓库。私钥一旦泄露,攻击者可以伪造节点身份。密钥库必须加入 .gitignore,并通过安全渠道分发。

常见误区三:用 Permissive 模式上线。Permissive 只记录警告不阻断,等于没有访问控制。上线前必须切换为 Enforce 并完成全链路验证。

五、概念对照清单

概念 回答的问题 载体/形式 失效后果
安全域 谁和谁可以谈 域 ID、信任根、enclave 边界 跨域节点无法建立信任
密钥库 信任材料放在哪 目录:CA、证书、私钥、策略 私钥泄露或权限文件缺失
身份 你是谁 密钥对 + CA 签发证书 无法通过身份验证
权限 你能做什么 XML 策略文件(需签名) 越权操作被拒绝
访问控制 运行时如何执行 DDS Security 插件强制检查 未授权通信被阻断
加密通信 数据如何保护 AES-GCM / TLS 通道 明文暴露或通信失败

记忆口诀:域定边界,库存信任,证明确身份,策约束行为,密保护数据。五者缺一不可,且顺序不能颠倒——没有域就没有信任根,没有信任根就签不出证书,没有证书就谈不上权限,没有权限就无法安全地加密通信。

掌握这五个概念后,再去看 SROS2 的配置文件、环境变量和调试日志,就不会被零散的参数淹没。每一个参数都能对应到上述某一层:ROS_SECURITY_KEYSTORE 指向密钥库,ROS_SECURITY_STRATEGY 控制访问控制的执行力度,而权限文件中的每一条 allow 或 deny 都在定义节点的行为边界。只有把概念链和操作链对齐,才能构建真正可用的机器人安全通信系统。