본문 바로가기

정보보호

SROS2 설치하고 테스트 수행하기

728x90

오늘은 sros2를 설치하고 테스트를 수행하는 방법에 대해 알아본다.

이 글을 보러 왔다면, sros2가 무엇인지는 알테니 설명은 스킵하겠다.

sros2는 처음에는 까다로워 보이지만, 설치 방법만 잘 따라오면 충분히 설치할 수 있다.
논문으로는 sros2가 나와있지만, 정작 이것을 설치하는 방법에 대한 글은 찾아볼 수가 없다.

계속 쓰려다가 귀찮아서, 이제서야 작성을 해본다.

본 튜토리얼은 리눅스를 기반으로 작성하며, Windows 및 MacOS는 아래 주소를 참고하기 바란다.

근데 OS 특성에 따른 명령어가 조금 변할 뿐, 설치하는 과정은 세 OS가 거의 동일하다.

설치하기

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

참고자료

728x90