robot-notes — 機器人知識筆記 GitHub ↗
本章與本頁目次

資安

robot-notes /資安/SROS2 / DDS-Security

SROS2 / DDS-Security:幫 ROS2 節點間通訊加上認證 + 加密 + 授權

資安總覽 裡最該先補的洞,就是 ROS2 DDS 預設明文裸奔——同網路誰都能訂閱 topic、甚至注入 /cmd_vel 控車。補它的標準做法是 SROS2(Secure ROS 2),它建在 DDS-Security 上,一次把三件套(認證、加密、授權)加到節點間通訊。

前置:ROS2 的 DDS(先懂 DDS 與「DOMAIN_ID 只是隔離不是安全」)。


1. 它在解什麼

DDS 預設明文 + 自動發現,任何同 domain 的節點都能收發。DDS-Security 是 OMG 的規範,定義 5 個 SPI(Service Plugin Interface);ROS2 用其中前三個:

ROS_DOMAIN_ID、VLAN 只是隔離;這套才是真正的「認證 + 加密 + 授權」。

2. 怎麼設定

SROS2 設定流程:① create_keystore(含 CA)② create_enclave(每程序的 identity 憑證)③ generate_policy→create_permission(permissions.p7s + governance.p7s,都要 CA 簽)④ 設環境變數(KEYSTORE/ENABLE/STRATEGY=Enforce)⑤ 跑節點,rmw_fastrtps 自動做認證+加密+ACL

五個步驟(CLI 以 Humble 為準,子命令用底線):

# ① 建 keystore(裡面含一組 CA 根憑證,之後簽所有節點/權限)
ros2 security create_keystore demo_keystore

# ② 為每個程序建一個 enclave(身分):產出 identity 憑證 cert.pem + 私鑰 key.pem
ros2 security create_enclave demo_keystore /talker_listener/talker
ros2 security create_enclave demo_keystore /talker_listener/listener

# ③ 產授權與策略(都會用 keystore 的 CA 簽章)
#    先從跑起來的系統蒐集 policy,再產 permissions
ros2 security generate_policy policy.xml
ros2 security create_permission demo_keystore /talker_listener/talker policy.xml
#    (或 generate_artifacts 一次把多個 enclave 的 governance + permissions 都產好)

# ④ 設環境變數,啟用安全
export ROS_SECURITY_KEYSTORE=$PWD/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce      # 找不到安全檔就拒絕啟動(Permissive 會裸跑)

# ⑤ 照常跑節點 —— DDS-Security plugin 自動載入 enclave,做認證+加密+ACL
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

跑起來後,節點間的通訊就是雙向認證 + 加密 + 依 permissions 限 topic,全部由 DDS 層自動處理,應用程式碼不用改。

3. 兩個關鍵簽章檔

設定產出兩種 XML,都必須由 keystore 的 CA 簽章(簽完是 .p7s(PKCS#7 簽章格式:把原始內容與簽章包在一起的標準容器)):

4. 注意事項

來源