오늘은 sros2를 설치하고 테스트를 수행하는 방법에 대해 알아본다.
이 글을 보러 왔다면, sros2가 무엇인지는 알테니 설명은 스킵하겠다.
sros2는 처음에는 까다로워 보이지만, 설치 방법만 잘 따라오면 충분히 설치할 수 있다.
논문으로는 sros2가 나와있지만, 정작 이것을 설치하는 방법에 대한 글은 찾아볼 수가 없다.
계속 쓰려다가 귀찮아서, 이제서야 작성을 해본다.
본 튜토리얼은 리눅스를 기반으로 작성하며, Windows 및 MacOS는 아래 주소를 참고하기 바란다.
근데 OS 특성에 따른 명령어가 조금 변할 뿐, 설치하는 과정은 세 OS가 거의 동일하다.
- Windows: https://github.com/ros2/sros2/blob/rolling/SROS2_Windows.md
- MacOS: https://github.com/ros2/sros2/blob/rolling/SROS2_MacOS.md
설치하기
ROS2 설치
ROS2는 설치하는 방법이 잘 설명되어 있어, 공식문서를 찾아 설치하면 된다.
바이너리 버전이든, 패키지 관리자로 설치하든, 상관 없다.
openssl 설치
sudo apt update && sudo apt install libssl-dev
colcon으로 빌드하기
여기서는 DDS에 대하여 SECURITY 모드를 켜주면서 빌드하는 과정이 되겠다.
colcon build --symlink-install --cmake-args -DSECURITY=ON --packages-select fastdds rmw_fastrtps_cpp rmw_fastrtps_dynamic_cpp rmw_fastrtps_shared_cpp
[Optional] RTI Connext DDS 에 대한 추가 설정
참고: RTI DDS는 따로 openssl을 설치해야 한다. 즉, Ubuntu에서 설치할 수 있는 openssl 1.1.0 버전은 지원하지 않는다고 한다.
RTI Connext DDS를 사용하는 경우에는, 아래와 같이 명령어를 추가로 실행해야 한다.
source ~/rti/rti_connext_dds-5.3.1/resource/scripts/rtisetenv_x64Linux3gcc5.4.0.bash'
혹은 alias를 이용해, 일종의 단축어를 생성할 수 있다.
alias rti='. ~/rti/rti_connext_dds-5.3.1/resource/scripts/rtisetenv_x64Linux3gcc5.4.0.bash'
같은 기기에서 Demo 실행해보기
Keystore와 Key, Certificates 생성하기
ros2 security create_keystore [Keystore 이름]
ros2 security create_keystore demo_keystore
Key와 Certificates를 생성하기
ros2 security create_enclave [Keystore 이름] [생성할 위치]
ros2 security create_enclave demo_keystore /talker_listener/talker
ros2 security create_enclave demo_keystore /talker_listener/listener
sros2에 대한 환경변수 설정
아래 환경변수가 설정되어야, sros2가 정상적으로 작동한다.
~/.bashrc 등에 환경변수를 등록하면, 쉘이 켜질 때 실행하므로 편리해진다.
ROS_SECURITY_ENABLE 변수를 false로 설정하면, sros2가 아닌 일반 ros2로 실행하게 된다.
export ROS_SECURITY_KEYSTORE=[Keystore 위치]
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
실행 중 DDS 변경하기
ROS2에서는 실행 중 DDS를 바꾸는 것을 허용한다고 한다. 아래 명령어 중 하나를 입력하면 된다.
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp # or
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp # or
export RMW_IMPLEMENTATION=rmw_connextdds
Demo 실행하기
아래 명령어를 실행할 경우, 두 노드가 통신하는 내용이 암호화되어 전달된다.
ros2 run [demo_nodes_py | demo_nodes_cpp] [talker | listener] --ros-args --enclave [키 생성 위치]
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
ros2 run demo_nodes_py listener --ros-args --enclave /talker_listener/listener
[Optional] CLI에서 Secure 시스템 다루기
CLI 환경/명령어에서 sros2 환경에 접근할 수 있다고 한다.
아래 환경변수를 설정하면 된다고 한다.
export ROS_SECURITY_ENCLAVE_OVERRIDE=[키 생성 위치]
export ROS_SECURITY_ENCLAVE_OVERRIDE=/talker_listener/listener
아래는 명령어에 대한 실행 예시이다:
# 명령어
ros2 node list --no-daemon --spin-time 4
# 실행결과
/talker
# 명령어
ros2 topic list --no-daemon --spin-time 4
# 실행결과
/chatter
/parameter_events
/rosout
# 명령어
ros2 topic echo /chatter --spin-time 4
# 실행결과
[INFO] [1714897092.882384995] [rcl]: Found security directory: /root/sros2_demo/demo_keystore/enclaves/talker_listener/listener
data: 'Hello World: 257'
---
data: 'Hello World: 258'
---
다른 기기에서 Demo 실행해보기
실험 대상
2대의 기기에서 Demo를 실행한다. 이 때, 원격지는 talker, 로컬은 listener로 설정하여 Demo를 실행한다.
원격지의 파일 저장 위치 생성
ssh [원격지에서 키를 저장할 폴더 생성]
ssh "mkdir -p ~/sros2_demo/demo_keystore/enclaves/talker_listener"
원격지로 키를 옮김
cd [원격지에서 키를 저장할 폴더]
scp -r [키 이름] [ssh 주소].[원격지의 사용자 이름]:[키를 저장할 폴더]
cd ~/sros2_demo/demo_keystore/enclaves/talker_listener
scp -r talker oldschool.local:~/sros2_demo/demo_keystore/enclaves/talker_listener
Demo를 실행
# 원격지에서 실행
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
# 로컬에서 실행
ros2 run demo_nodes_py listener --ros-args --enclave /talker_listener/listener
Access Control
위에서 살펴본 Demo는 인증과 암호화만을 진행하여, 인증받은 모든 노드가 Publish/Subscribe 할 수 있다고 한다.
따라서, Access Control을 통해, 노드의 통신을 통제할 수 있다. 예를 들어, 하나의 노드가 Publish 만을 할 수 있다면, 다른 노드는 Subscribe 만을 할 수 있도록 조정할 수 있다는 것이다.
여기서는 sros2에서 기본으로 제공한 파일을 기반으로 설명하겠다.
sample policy file 받기
sudo apt update && sudo apt install git
cd ~/sros2_demo
git clone https://github.com/ros2/sros2.git /tmp/sros2
XML permission files 생성
ros2 security create_permission demo_keystore /talker_listener/talker /tmp/sros2/sros2/test/policies/sample.policy.xml
ros2 security create_permission demo_keystore /talker_listener/listener /tmp/sros2/sros2/test/policies/sample.policy.xml
Demo 실행하기
ros2 run demo_nodes_cpp talker --ros-args -e /talker_listener/talker
ros2 run demo_nodes_py listener --ros-args -e /talker_listener/listener
# (XML permission files 에서) chatter 이외의 정책을 Subscribe 할 수 없도록 되어 있어, 이 명령어는 실행되지 않음
ros2 run demo_nodes_py listener --ros-args -r chatter:=not_chatter -e /talker_listener/listener
Certificate Revocation Lists
Certificate Revocation Lists 불러오기 / 새 인증서 파일 생성하기
몇몇 상황에서는 인증서를 취소해야 하는 경우가 생긴다. 이를 위해, Certificate Revocation Lists에서는 인증 정보를 보여준다.
cd ~/sros2_demo/demo_keystore
cat > crl_openssl.conf << EOF
# OpenSSL configuration for CRL generation
[ ca ]
default_ca = CA_default
[ CA_default ]
database = index.txt
crlnumber = crlnumber
default_days = 365 # how long to certify for
default_crl_days = 30 # how long before next CRL
default_md = default # use public key default MD
preserve = no # keep passed DN ordering
[ crl_ext ]
# CRL extensions.
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
# issuerAltName=issuer:copy
authorityKeyIdentifier = keyid:always,issuer:always
EOF
echo 00 > crlnumber
touch index.txt
openssl ca -revoke enclaves/talker_listener/listener/cert.pem -keyfile private/identity_ca.key.pem -cert public/identity_ca.cert.pem -config crl_openssl.conf
openssl ca -gencrl -keyfile private/identity_ca.key.pem -cert public/identity_ca.cert.pem -out public/crl.pem -config crl_openssl.conf
새로운 인증서를 Link 하기
ln -s ../../../public/crl.pem enclaves/talker_listener/talker
Demo 실행하기
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
# listener는 응답하지 않음 -> talker의 인증서가 변경되었기 때문. -> 바뀐 talker 인증서를 listener에게 옮겨줘야 함.
ros2 run demo_nodes_py listener --ros-args --enclave /talker_listener/listener
참고자료
'정보보호' 카테고리의 다른 글
[Practical Car Hacking CTF Teaser] "Volkswagen CAN Checksum" Write-up (0) | 2025.04.04 |
---|---|
정보보호 컨퍼런스 순위 정리 (2) | 2024.11.01 |