ROS 2 筆記整理
簡介
ROS 2 跟 ROS 1 相比一個最大差異是有完整實作 security 的功能,我們稱之為 SROS。
ROS 2 的 security 其實是基於 DDS 的 security 來實作的,主要包含下面三種 DDS 功能:
- 加密(encryption)
- 認證(authentication)
- 存取控制(access control)
DDS Security 有三種設定檔案,而這些也同樣被 SROS 所繼承:
- identity: 認證身份的工具,public/private key
- permission: 權限設定,可以存取哪些 topic
- governance: 設定 global 的安全策略,所有 node 都必須要遵守
基於此之上,SROS 有兩個概念來包含這些檔案: keystore 和 enclave
- keystore: 存放 global 的設定和 CA 的 public & private key
- enclave: 「安全飛地」的概念,一個 keystore 內可以有多個 enclave,有獨立的 config 和 key,確保不會受到彼此影響
除此之外,SROS 會大量使用到 ros2 security
這個 command
使用方法
Talker & Listener
這邊講解初步的 SROS 使用方法
- 先產生 SROS 的工作空間,我們後續的 certificate 和 key 都會放在這裡
- 設定 ROS 2 Jazzy 的環境,並且使用 Cyclone DDS
- 產生 demo_keys 這個 keystore,值得注意的是 SROS 的操作都是用 CLI 的方式,也就是
ros2 security
- 執行完後會產生如下的目錄架構
- enclaves: 底下的 xml 是 security 的相關設定(例如哪些功能要加密之類),而 p7s 則為了確保 xml 不被竄改的簽名。
- private: 存放 CA 的 private key,之後的憑證產生都需要由 CA 來簽核,驗證身份
- public: 存放 CA 的憑證(public key)
- 產生給 talker 這個 node 所需的資源 (key, certificate等等)
- 會在 enclaves 下產生出一個相對應的資料夾
cert.pem
: talker 的公開憑證
key.pem
: talker 的 private key
governance.p7s
: 對應到 global 的設定,可以檢查自己的設定使否違反 global 的內容
identity_ca.cert.pem
: 對應到 global 的 CA 憑證,可以用來驗證其他人的合法性
permissions_ca.cert.pem
: 對應到 global 的 CA 憑證,用來驗證其他人 permission.p7s 的身分
permissions.p7s
: 用來防止 permissions.xml 被竄改的簽名
permissions.xml
: 紀錄這個 node 有哪些權限
- 最後就是要設定 SROS 的環境變數
- ROS_SECURITY_KEYSTORE: SROS 的 keystore 放哪邊,也就是我們前面產生的檔案
- ROS_SECURITY_ENABLE: 是否要啟動 SROS
- ROS_SECURITY_STRATEGY: security 的嚴格程度。Enforce 代表一定要有 security 檔案才能執行,其他則是沒有就走一般非安全的方式。
- 開始執行
- 記住一定要加上
--ros-args --enclave
,它會去找相對應的 key 和 certificate
roscli
如果我們要讓 ros2 topic list
之類的 CLI 工具可以連接 SROS,那還需要做如下設定
- 執行 CLI 工具,注意要使用 daemon,因為 daemon 可能不是在有 SROS 的環境下啟動
policy
目前只有 Authenication 和 Encryption 兩種功能,如果要有 Access Control 的話,首先要修改 permission。
SROS 工具提供我們從好讀易懂的 policy 設定檔轉換成 permission 的能力
詳細可以參考官方教學
- (Optional) 除了抓現有的 policy 檔案,你也可以從既有的 ROS graph 產生
- 使用該 policy 來產生出
permission.xml
- 你可以比較前後在 enclaves 資料夾中的
permissions.xml
差異
- 你可以在
policies/talker_listener.policy.xml
加上 <topic>not_chatter</topic>
再試試
governance
- 重新在 enclaves 產生
permisssions.p7s
Limitations
- 之前 Cyclone DDS 的 foxy package 並沒有包含 security 功能,只能從 source code build
- 目前不同的 DDS 實作是無法互相用 SROS 通訊的
實際應用
可探討問題
- 如何把現在非加密的 ROS 2 轉換成加密
- 如何使用 security log
參考資料