보안 인증서 개념

ROS2에서는 보안 기능을 지원하기 위해 보안 인증서를 사용하여 노드 간 통신을 보호한다. 인증서는 노드와 노드 간의 신뢰성을 보장하고, 통신 중 발생할 수 있는 도청 및 데이터 변조를 방지한다. 이를 위해 X.509 표준의 인증서를 사용하며, 각 노드는 이 인증서를 통해 자신의 신뢰성을 증명하게 된다.

인증서 구조

보안 인증서는 일반적으로 다음과 같은 필수적인 정보들을 포함한다:

이 외에도 다양한 확장 필드들이 추가될 수 있으며, 이는 통신 환경에 따라 달라질 수 있다.

인증서 생성 절차

ROS2의 보안 시스템에서 보안 인증서를 생성하려면 SROS2 도구를 사용한다. 이 도구는 ROS2의 보안 기능을 활성화하고, 인증서를 생성하여 배포할 수 있는 기능을 제공한다. 보안 인증서를 생성하는 과정은 다음과 같이 단계별로 진행된다:

1. 인증서 생성에 필요한 파일 준비

먼저 인증서 생성을 위한 기본 파일들을 준비해야 한다. 이를 위해 keystore 디렉터리를 생성하고, 그 안에서 인증서 파일들을 관리한다. 다음은 keystore 디렉터리와 기본 파일을 생성하는 명령이다:

# keystore 디렉터리 생성
ros2 security create_keystore <keystore_directory>

이 명령을 실행하면 keystore 디렉터리 내부에 루트 인증서, 개인 키, 신뢰할 수 있는 인증서 등 다양한 파일이 생성된다. 이 파일들은 추후 각 노드에 할당될 보안 인증서들의 기반이 된다.

2. 인증서 발급 요청 및 서명

발급할 보안 인증서는 노드에 대한 신원을 확인하고, CA(인증 기관)가 이를 승인하는 과정을 거친다. 이 과정에서 인증서 서명 요청(CSR)이 필요하다. CSR은 노드의 공개 키와 노드의 정보가 포함된 데이터 패키지로, 이 패키지를 CA에 전달하여 서명을 요청한다.

CSR을 생성하는 명령은 다음과 같다:

# 노드를 위한 인증서 서명 요청(CSR) 생성
ros2 security create_key <keystore_directory> <node_name>

이 명령을 실행하면, 해당 노드를 위한 개인 키와 CSR이 생성된다. 이 CSR을 사용하여 CA는 노드를 위한 인증서를 서명한다.

3. CA의 서명을 통한 인증서 발급

인증서 서명 요청(CSR)이 생성되면, CA가 해당 요청을 승인하고 서명하여 인증서를 발급한다. SROS2에서는 CA 역할을 하는 인증서를 자동으로 생성할 수 있다. 다음 명령을 통해 CA가 노드의 CSR을 서명하고 인증서를 발급한다:

# CA가 노드의 CSR 서명
ros2 security sign_key <keystore_directory> <node_name>

이 과정을 통해 해당 노드의 공개 키와 주체 정보가 포함된 인증서가 발급되며, 노드는 이제 이 인증서를 사용하여 보안 통신을 시작할 준비가 된다.

4. 노드에 인증서 배포

각 노드에 보안 인증서를 배포하기 위해서는 인증서 파일을 해당 노드가 접근할 수 있는 위치에 저장해야 한다. 이 과정에서 keystore에 저장된 인증서, 개인 키, 신뢰할 수 있는 인증서 등의 파일을 각 노드의 작업 환경에 복사한다.

인증서 배포는 다음과 같은 단계를 거쳐 이루어진다:

  1. 노드의 작업 환경 설정: 인증서를 읽어들일 수 있도록 ROS2 노드의 환경 변수를 설정한다.
  2. 보안 파일 배포: keystore 디렉터리에 저장된 인증서와 관련 파일들을 각 노드의 보안 경로로 복사한다.

배포 과정은 ROS2에서 제공하는 SROS2 도구를 통해 간단히 관리할 수 있으며, 이를 통해 인증서를 효율적으로 배포할 수 있다.

5. 인증서의 유효성 검증

노드 간의 통신이 이루어지기 전에, 각 노드는 상대방의 인증서를 검증한다. 이 검증 과정은 CA가 발급한 신뢰할 수 있는 인증서를 바탕으로 이루어지며, 노드 간의 상호 신뢰를 형성한다. 이때, 인증서의 유효 기간과 서명 정보를 검토하여 통신이 안전하게 진행될 수 있는지를 판단한다.

검증 과정은 다음 수식에 의해 표현될 수 있다:

\mathbf{V} = \text{Verify}( \mathbf{C}, \mathbf{CA}, \mathbf{Sig} )

여기서:

인증서가 성공적으로 검증되면, 노드는 통신을 진행할 수 있으며, 실패 시 통신이 차단된다.

6. 보안 정책 설정

인증서가 성공적으로 생성되고 배포된 후, 각 노드 간의 통신에서 보안 정책을 설정할 수 있다. ROS2는 보안 프로토콜로 DDS Security를 사용하며, 이 프로토콜을 통해 각 노드의 통신 방식에 대한 세부적인 보안 설정을 할 수 있다.

보안 정책은 주로 다음과 같은 항목들로 구성된다:

이러한 보안 정책들은 policy.xml 파일에 정의되며, 각 노드가 어떤 권한을 가지고 있는지, 어떤 방식으로 통신을 진행할 수 있는지를 명확히 설정한다.

신원 확인 과정

각 노드는 통신을 시작하기 전에, 상대 노드의 신원을 확인하고 상대 노드가 신뢰할 수 있는지를 판단한다. 이를 위해 DDS Security의 신원 확인 절차가 필요하며, 이 절차는 주로 다음의 수식으로 표현된다:

\mathbf{A}_{\text{trust}} = f(\mathbf{ID}_{\text{local}}, \mathbf{ID}_{\text{remote}}, \mathbf{Cert}_{\text{remote}})

여기서:

이 과정을 통해 통신을 시작하기 전, 각 노드는 상대방의 신원을 검증하고 통신할 수 있는지를 결정하게 된다.

허가 과정

허가는 각 노드가 다른 노드와의 통신에서 접근할 수 있는 자원을 관리한다. 노드가 특정 주제(Topic)나 서비스를 사용할 수 있도록 허가되었는지 확인하는 과정은 아래의 수식으로 설명할 수 있다:

\mathbf{P}_{\text{access}} = g(\mathbf{R}_{\text{policy}}, \mathbf{R}_{\text{node}}, \mathbf{A}_{\text{trust}})

여기서:

이 수식은 노드가 통신에서 어떤 자원을 사용할 수 있을지 결정하는데 중요한 역할을 한다.

암호화

암호화는 노드 간 데이터가 안전하게 전송될 수 있도록 하는 중요한 보안 메커니즘이다. 노드 간 데이터는 대칭 키를 사용해 암호화되며, 이 키는 두 노드 간에 안전하게 공유된다. 암호화 과정은 일반적으로 다음과 같은 수식으로 표현된다:

\mathbf{E}_{\text{msg}} = \text{Encrypt}(\mathbf{M}, \mathbf{K}_{\text{shared}})
\mathbf{M} = \text{Decrypt}(\mathbf{E}_{\text{msg}}, \mathbf{K}_{\text{shared}})

여기서:

암호화 및 복호화 과정을 통해 데이터를 안전하게 주고받을 수 있으며, 외부에서 해당 데이터를 가로채거나 조작하는 것을 방지할 수 있다.

인증서의 관리와 갱신

인증서는 일정한 유효 기간을 가지고 있으며, 이 유효 기간이 만료되기 전에 인증서를 갱신해야 한다. 갱신하지 않은 인증서는 더 이상 신뢰할 수 없는 인증서로 간주되며, 노드 간의 통신이 차단될 수 있다. 인증서 갱신은 기존 인증서와 동일한 방식으로 CSR을 생성하고 CA로부터 새로운 서명을 받아 이루어진다.

갱신 과정의 수식은 다음과 같다:

\mathbf{Cert}_{\text{new}} = \text{Renew}( \mathbf{Cert}_{\text{old}}, \mathbf{CA} )

여기서:

갱신된 인증서는 새로운 유효 기간을 가지며, 노드 간의 보안 통신을 지속적으로 보호할 수 있게 된다.