# 오픈 네트워크에서의 최소 보안 구성

#### 문제 제기: 오픈 네트워크 환경과 ROS2 통신

오픈 네트워크(Open Network)에서 ROS2를 활용할 때는 악의적 사용자가 시스템 내부로 침투하거나, 데이터 전송 과정을 도청(Sniffing)·변조(Tampering)할 위험에 노출될 가능성이 매우 높다. 이러한 환경에서 ROS2 노드 간 메시지 교환은 UDP 기반의 DDS(데이터 분산 서비스)를 주로 이용하므로, 일반적인 TCP 기반 암호화 보안 기법으로 충분히 보호되지 않을 수 있다. 따라서 DDS-Security 표준에 기반한 ROS2 기본 보안 구성 요소와 더불어, 네트워크 레벨에서의 최소한의 방어 기법을 함께 적용해야 한다.

#### 보안 목표 정의

ROS2 환경에서 오픈 네트워크상 통신을 보호하기 위해 다음과 같은 보안 목표를 설정한다.

1. **인증(Authentication)** 통신을 시도하는 참여자(노드, 사용자 등)가 신뢰할 만한 존재임을 확인한다.
2. **무결성(Integrity)** 송신한 메시지가 전송 과정에서 변조되지 않았음을 보장한다.
3. **기밀성(Confidentiality)** 메시지의 내용을 허가되지 않은 자가 열람하지 못하도록 보호한다.
4. **추적성(Traceability)** 특정 노드 또는 사용자에 의한 작업 이력을 확인 가능하도록 한다.

#### DDS-Security 사용을 위한 최소 설정

ROS2에서 DDS-Security 표준을 사용하기 위해서는 각 노드가 보안 관련 파일(정책 파일, 인증서, 키)을 갖춰야 하며, DDS 구현체에서 보안 플러그인을 활성화해야 한다. 최소 설정을 위해서는 크게 다음과 같은 파일이 필요하다.

* **Governance 파일**: 보안 정책 전반을 정의한다.
* **Permissions 파일**: 각 도메인 혹은 노드에 부여할 권한(읽기/쓰기 등)을 정의한다.
* **키·인증서 파일**: X.509 인증서와 개인키 등을 포함한다.

**SROS2를 통한 자동 생성**

ROS2의 보안 툴셋인 SROS2를 사용하면, 기본 템플릿을 활용해 위의 파일을 자동으로 생성할 수 있다. 예를 들어 다음 명령은 새로운 키 스토어(keystore)를 생성한다.

```bash
# keystore 생성
ros2 security create_keystore my_keystore
```

이후 노드별 인증서, 권한 파일 등을 생성하려면 다음과 같은 명령을 사용한다.

```bash
# 노드별 파일 생성
ros2 security create_key my_keystore /my_robot_node
ros2 security create_key my_keystore /my_sensor_node
```

이렇게 생성된 `governance.xml`, `permissions.xml`, `.pem` 등의 파일들이 DDS-Security 기반 통신을 위한 최소 보안 구성을 제공한다.

#### 네트워크 레벨 보안: 방화벽과 포트 제어

오픈 네트워크에서는 DDS가 사용하는 포트와 프로토콜에 대한 방화벽 설정을 통한 접근 통제가 필수적이다.

* **기본 포트 범위 제한**: DDS에서 동적으로 할당되는 포트를 최소 개수로 한정한다. 예를 들어 Fast DDS 사용 시 `ROS_DISCOVERY_SERVER` 환경 변수를 이용해 중앙 집중형 디스커버리를 적용하면 포트 사용 범위를 보다 간소화할 수 있다.
* **포트 필터링**: 방화벽(예: iptables, ufw 등)을 통해 DDS 통신(기본적으로 UDP)만 허용하고 그 외 트래픽은 차단한다. 특히 ROS2 상에서 필요 없는 TCP 포트나 기타 UDP 포트는 닫아 놓아야 한다.

예시로 `ufw`를 사용해 허용 포트를 설정할 때는 다음과 같이 명령을 실행할 수 있다.

```bash
sudo ufw allow 7400:7500/udp
sudo ufw allow 53/udp
sudo ufw enable
```

#### 키 분배와 인증서 관리 전략

ROS2 노드가 증가할수록, 각 노드에 대한 인증서(또는 공개키/개인키 쌍)를 관리하기가 점점 복잡해진다. 오픈 네트워크 상에서 효율적인 키 관리를 위해 다음과 같은 전략을 취할 수 있다.

* 중앙 집중형 키 스토어 운영:
  * 모든 노드가 접근할 수 있는 안전한 서버(혹은 보안 리포지토리)에 키 자료를 저장한다.
  * 노드가 실행될 때, 안전한 채널(TLS)을 통해 키 스토어로부터 해당 노드 인증서와 키를 내려받는다.
* 자동화 스크립트 사용:
  * SROS2 툴을 사용하는 자동화 배포 스크립트를 작성하여 신규 노드 생성 시 필요한 인증서·권한 파일을 자동 생성·배포한다.
* 주기적 갱신(rotate) 정책:
  * 인증서 또는 키의 유효 기간 만료 전에 자동으로 신규 발급하여 보안성을 유지한다.

#### 침입 탐지와 시스템 로깅

오픈 네트워크 환경에서 ROS2를 운용할 때, DDS-Security와 방화벽 설정만으로 완전한 방어를 보장하기는 어렵다. 실제 침투 공격이 발생할 경우, 적시에 침입을 감지하고 로그를 확보해야 후속 조치(사후 분석, 포렌식 등)가 가능하다.

* 침입 탐지 시스템(IDS) 연동
  * 네트워크 트래픽과 시스템 로그를 실시간으로 모니터링하는 IDS를 도입한다.
  * 예: [Snort](https://www.snort.org/), Suricata 등
  * ROS2 트래픽 특성을 반영한 규칙(Rule) 기반 설정이 필요할 수 있다.
* 호스트 기반 침입 탐지 시스템(HIDS) 운영
  * 각 ROS2 노드가 설치된 OS 내부에서 시스템 콜, 파일 무결성 등을 모니터링한다.
  * 예: OSSEC, Wazuh 등
  * ROS2 노드 파일(설정, 인증서) 접근 패턴에 대한 정상·비정상 시나리오를 정의해둔다.
* 시스템 로깅 및 중앙집중형 분석
  * 각 노드의 Syslog 혹은 journald 로그를 중앙 서버(예: Elasticsearch, Splunk 등)로 모아 상관분석(Correlation)을 수행한다.
  * ROS2 프로세스(노드) 충돌, 권한 오류, DDS 보안 플러그인 예외 등을 모두 로깅해 추후 침입 분석에 활용한다.

#### 네트워크 세분화와 세그먼테이션

네트워크를 물리적·논리적으로 분리해 공격 표면(attack surface)을 줄이는 것은 ROS2 통신 보호에 있어서도 매우 중요한 전략이다.

* VLAN 활용
  * ROS2 노드가 위치한 VLAN과 외부 네트워크(인터넷) VLAN을 분리한다.
  * DMZ 구역에 브리지 노드를 두고, 외부와 내부 사이를 중계하게 하여 내부 노드가 직접 오픈 인터넷에 노출되지 않도록 한다.
* 서브넷 분할
  * 로봇 제어용 서브넷, 센서 데이터용 서브넷, 관리·운영용 서브넷 등을 나누어 운영한다.
  * 서브넷 간 트래픽은 게이트웨이(또는 라우터)에서 제한적으로만 라우팅하거나 방화벽 규칙을 별도로 둔다.

#### VPN 및 IPsec 기반 추가 암호화

DDS-Security 플러그인을 통한 ROS2 토픽 단위 암호화가 어렵거나, 다른 시스템과 혼합 환경(예: ROS2 외 장비와 통신)이 있는 경우, 네트워크 레벨에서 VPN, IPsec 등을 활용해 전체 트래픽을 암호화하는 방법을 고려할 수 있다.

* VPN
  * 오픈소스 VPN(OpenVPN, WireGuard 등)을 통해 노드 간 가상 사설 네트워크를 구성한다.
  * 이때, VPN 구간은 TLS 또는 ChaCha20 같은 암호화 방식을 통해 보호된다.
  * 로봇이 밖에서 원격 접속할 때는 반드시 VPN 구간을 통해 접속하도록 한다.
* IPsec
  * OS 레벨(IP 스택)에 IPsec을 적용해 UDP/TCP 트래픽을 전송 계층에서 암호화·인증한다.
  * ROS2 DDS 트래픽뿐 아니라 기타 서비스(SSH, HTTP 등) 전체가 보호되는 장점이 있다.

#### 최소 실행 권한과 시스템 하드닝

ROS2 노드가 구동되는 운영체제 자체의 취약점을 줄이는 하드닝도 필수적이다.

* 최소 권한 원칙
  * ROS2 노드 실행 계정에 불필요한 sudo 권한을 부여하지 않는다.
  * 파일 시스템 접근 권한(읽기/쓰기)을 엄격하게 제한한다.
* AppArmor/SELinux 적용
  * ROS2 노드 실행 바이너리에 대해 접근 가능한 디렉터리, 네트워크 소켓 등을 제한한다.
  * 보안 정책 프로파일을 “허용(allow)” 기반이 아닌 “차단(deny) 기본” 모드로 설정해두는 것을 권장한다.
* 패키지 및 의존성 관리
  * ROS2 패키지 업데이트 및 OS 보안 패치를 정기적으로 수행한다.
  * 사용하지 않는 ROS2 패키지·라이브러리는 제거해 공격 표면을 최소화한다.

#### 문제 제기: 오픈 네트워크 환경과 ROS2 통신

오픈 네트워크(Open Network)에서 ROS2를 활용할 때는 악의적 사용자가 시스템 내부로 침투하거나, 데이터 전송 과정을 도청(Sniffing)·변조(Tampering)할 위험에 노출될 가능성이 매우 높다. 이러한 환경에서 ROS2 노드 간 메시지 교환은 UDP 기반의 DDS(데이터 분산 서비스)를 주로 이용하므로, 일반적인 TCP 기반 암호화 보안 기법만으로는 충분히 보호되지 않을 수 있다. 따라서 DDS-Security 표준에 기반한 ROS2 기본 보안 구성 요소와 더불어, 네트워크 레벨에서의 최소한의 방어 기법을 함께 적용해야 한다.

#### 보안 목표 정의

ROS2 환경에서 오픈 네트워크상 통신을 보호하기 위해 다음과 같은 보안 목표를 설정한다.

1. **인증(Authentication)** 통신을 시도하는 참여자(노드, 사용자 등)가 신뢰할 만한 존재임을 확인한다.
2. **무결성(Integrity)** 송신한 메시지가 전송 과정에서 변조되지 않았음을 보장한다.
3. **기밀성(Confidentiality)** 메시지의 내용을 허가되지 않은 자가 열람하지 못하도록 보호한다.
4. **추적성(Traceability)** 특정 노드 또는 사용자에 의한 작업 이력을 확인 가능하도록 한다.

#### DDS-Security 사용을 위한 최소 설정

ROS2에서 DDS-Security 표준을 사용하기 위해서는 각 노드가 보안 관련 파일(정책 파일, 인증서, 키)을 갖춰야 하며, DDS 구현체에서 보안 플러그인을 활성화해야 한다. 최소 설정을 위해서는 크게 다음과 같은 파일이 필요하다.

* **Governance 파일**: 보안 정책 전반을 정의한다.
* **Permissions 파일**: 각 도메인 혹은 노드에 부여할 권한(읽기/쓰기 등)을 정의한다.
* **키·인증서 파일**: X.509 인증서와 개인키 등을 포함한다.

**SROS2를 통한 자동 생성**

ROS2의 보안 툴셋인 SROS2를 사용하면, 기본 템플릿을 활용해 위의 파일을 자동으로 생성할 수 있다. 예를 들어 다음 명령은 새로운 키 스토어(keystore)를 생성한다.

```bash
# keystore 생성
ros2 security create_keystore my_keystore
```

이후 노드별 인증서, 권한 파일 등을 생성하려면 다음과 같은 명령을 사용한다.

```bash
# 노드별 파일 생성
ros2 security create_key my_keystore /my_robot_node
ros2 security create_key my_keystore /my_sensor_node
```

이렇게 생성된 `governance.xml`, `permissions.xml`, `.pem` 등의 파일들이 DDS-Security 기반 통신을 위한 최소 보안 구성을 제공한다.

#### 네트워크 레벨 보안: 방화벽과 포트 제어

오픈 네트워크에서는 DDS가 사용하는 포트와 프로토콜에 대한 방화벽 설정을 통한 접근 통제가 필수적이다.

* **기본 포트 범위 제한** DDS에서 동적으로 할당되는 포트를 최소 개수로 한정한다. 예를 들어 Fast DDS 사용 시 `ROS_DISCOVERY_SERVER` 환경 변수를 이용해 중앙 집중형 디스커버리를 적용하면 포트 사용 범위를 보다 간소화할 수 있다.
* **포트 필터링** 방화벽(예: iptables, ufw 등)을 통해 DDS 통신(기본적으로 UDP)만 허용하고 그 외 트래픽은 차단한다. 특히 ROS2 상에서 필요 없는 TCP 포트나 기타 UDP 포트는 닫아 놓아야 한다.

예시로 `ufw`를 사용해 허용 포트를 설정할 때는 다음과 같이 명령을 실행할 수 있다.

```bash
sudo ufw allow 7400:7500/udp
sudo ufw allow 53/udp
sudo ufw enable
```

#### 키 분배와 인증서 관리 전략

ROS2 노드가 증가할수록, 각 노드에 대한 인증서(또는 공개키/개인키 쌍)를 관리하기가 점점 복잡해진다. 오픈 네트워크 상에서 효율적인 키 관리를 위해 다음과 같은 전략을 취할 수 있다.

* 중앙 집중형 키 스토어 운영
  * 모든 노드가 접근할 수 있는 안전한 서버(혹은 보안 리포지토리)에 키 자료를 저장한다.
  * 노드가 실행될 때, 안전한 채널(TLS)을 통해 키 스토어로부터 해당 노드 인증서와 키를 내려받는다.
* 자동화 스크립트 사용
  * SROS2 툴을 사용하는 자동화 배포 스크립트를 작성하여 신규 노드 생성 시 필요한 인증서·권한 파일을 자동 생성·배포한다.
* 주기적 갱신(rotate) 정책
  * 인증서 또는 키의 유효 기간 만료 전에 자동으로 신규 발급하여 보안성을 유지한다.

#### 침입 탐지와 시스템 로깅

오픈 네트워크 환경에서 ROS2를 운용할 때, DDS-Security와 방화벽 설정만으로 완전한 방어를 보장하기는 어렵다. 실제 침투 공격이 발생할 경우, 적시에 침입을 감지하고 로그를 확보해야 후속 조치(사후 분석, 포렌식 등)가 가능하다.

* 침입 탐지 시스템(IDS) 연동
  * 네트워크 트래픽과 시스템 로그를 실시간으로 모니터링하는 IDS를 도입한다.
  * 예: [Snort](https://www.snort.org/), Suricata 등
  * ROS2 트래픽 특성을 반영한 규칙(Rule) 기반 설정이 필요할 수 있다.
* 호스트 기반 침입 탐지 시스템(HIDS) 운영
  * 각 ROS2 노드가 설치된 OS 내부에서 시스템 콜, 파일 무결성 등을 모니터링한다.
  * 예: OSSEC, Wazuh 등
  * ROS2 노드 파일(설정, 인증서) 접근 패턴에 대한 정상·비정상 시나리오를 정의해둔다.
* 시스템 로깅 및 중앙집중형 분석
  * 각 노드의 Syslog 혹은 journald 로그를 중앙 서버(예: Elasticsearch, Splunk 등)로 모아 상관분석(Correlation)을 수행한다.
  * ROS2 프로세스(노드) 충돌, 권한 오류, DDS 보안 플러그인 예외 등을 모두 로깅해 추후 침입 분석에 활용한다.

#### 네트워크 세분화와 세그먼테이션

네트워크를 물리적·논리적으로 분리해 공격 표면(attack surface)을 줄이는 것은 ROS2 통신 보호에 있어서도 매우 중요한 전략이다.

* VLAN 활용
  * ROS2 노드가 위치한 VLAN과 외부 네트워크(인터넷) VLAN을 분리한다.
  * DMZ 구역에 브리지 노드를 두고, 외부와 내부 사이를 중계하게 하여 내부 노드가 직접 오픈 인터넷에 노출되지 않도록 한다.
* 서브넷 분할
  * 로봇 제어용 서브넷, 센서 데이터용 서브넷, 관리·운영용 서브넷 등을 나누어 운영한다.
  * 서브넷 간 트래픽은 게이트웨이(또는 라우터)에서 제한적으로만 라우팅하거나 방화벽 규칙을 별도로 둔다.

#### VPN 및 IPsec 기반 추가 암호화

DDS-Security 플러그인을 통한 ROS2 토픽 단위 암호화가 어렵거나, 다른 시스템과 혼합 환경(예: ROS2 외 장비와 통신)이 있는 경우, 네트워크 레벨에서 VPN, IPsec 등을 활용해 전체 트래픽을 암호화하는 방법을 고려할 수 있다.

* VPN
  * 오픈소스 VPN(OpenVPN, WireGuard 등)을 통해 노드 간 가상 사설 네트워크를 구성한다.
  * 이때, VPN 구간은 TLS 또는 ChaCha20 같은 암호화 방식을 통해 보호된다.
  * 로봇이 밖에서 원격 접속할 때는 반드시 VPN 구간을 통해 접속하도록 한다.
* IPsec
  * OS 레벨(IP 스택)에 IPsec을 적용해 UDP/TCP 트래픽을 전송 계층에서 암호화·인증한다.
  * ROS2 DDS 트래픽뿐 아니라 기타 서비스(SSH, HTTP 등) 전체가 보호되는 장점이 있다.

#### 최소 실행 권한과 시스템 하드닝

ROS2 노드가 구동되는 운영체제 자체의 취약점을 줄이는 하드닝도 필수적이다.

* 최소 권한 원칙
  * ROS2 노드 실행 계정에 불필요한 sudo 권한을 부여하지 않는다.
  * 파일 시스템 접근 권한(읽기/쓰기)을 엄격하게 제한한다.
* AppArmor/SELinux 적용
  * ROS2 노드 실행 바이너리에 대해 접근 가능한 디렉터리, 네트워크 소켓 등을 제한한다.
  * 보안 정책 프로파일을 “허용(allow)” 기반이 아닌 “차단(deny) 기본” 모드로 설정해두는 것을 권장한다.
* 패키지 및 의존성 관리
  * ROS2 패키지 업데이트 및 OS 보안 패치를 정기적으로 수행한다.
  * 사용하지 않는 ROS2 패키지·라이브러리는 제거해 공격 표면을 최소화한다.
