본문 바로가기

개발

산업용 제어 장치에서의 인증서 처리와 OPC UA 보안 이해하기

들어가며

지금 진행 중인 프로젝트에 OPC UA Server 기능 개발 요구가 있어서 공부하게 됐다.

OPC UA(Open Platform Communications Unified Architecture)는 산업용 제어 장치들끼리 데이터를 주고받는 기능으로

인증서를 통해 장치인증과 사용자 인증을 지원한다.

먼저 인증서에 대한 내용을 공부하고, 특히 산업용 제어 장치의 인증서에 대해 정리해 보자.

 

제어장치의 인증서

현재 진행 중인 프로젝트는 PLC Device 또는 HMI Device에서 동작한다.

산업용 제어 장치는 서로 간의 통신이 항상 중요한 포인트이다. 그렇다면 통신을 맺기 전 디바이스끼리 어떻게 알아볼 수 있을까.

이때 장치의 고유 Key 값을 하는 게 인증서가 된다.

보안파트에서 항상 빠지지 않는 "개인키(Private key)"와 "공개키(Public key)" 쌍의 개념을 알고 있다고 가정한다.

PC에서 인증서를 생성한다는 것은 개인키파일과 공개키파일 2개를 생성하는 것을 의미한다. 일반적으로 .der 확장자 또는 .pem 확장자를 사용한다. 

키 파일을 만들기 위해 처음부터 프로그래밍하는 건 너무 복잡하므로 키생성도구나 라이브러리를 이용하는데 이중 가장 유명한 도구가 OpenSSL로 거의 모든 플랫폼을 지원한다.

산업제어 장치에서의 인증서

"그렇다면 제어장치에 인증서를 어떻게 넣을 것인가?" 나도 처음 생각할 때 당연하게도 잘못 생각한 부분이다.

예를 들어 나는 HMI 장치를 만들고 OPC UA로 PLC와 연결하기 위해, HMI에 인증서가 필요한 경우를 상상해 보자.

제일 쉬운 방법으로 PC에서 인증서 파일을 생성 후 HMI로 복사하는 방법을 떠올릴 수 있다.

실제로 이렇게 파일을 복사해도 동일한 파일이라 동작도 이상 없이 될 것이다.

하지만 보안규정을 엄격히 지킨다면, 개인키파일은 절대로 복사되어서는 안 된다.

쉽게 생각해 보면 복사한 순간, 개인키파일은 PC에도 있고 HMI에도 있게 되고 이는 PC에 키가 누출된 사고와 동일함을 알 수 있다.

따라서 개인키 파일은 장치에서 만들어져서 장치밖으로 나가서는 안된다는 결론에 도달한다.

장치 밖으로 나간다는 건, 키파일 복사뿐 아니라 파일 내용을 읽을 수 있는 API기능을 제공하거나, 키값을 디스플레이에 출력하는 등 모든 방식을 뜻한다.
ex) HMI에서 개인키파일을 눌러 키파일을 받아 적을 수 있는 등의 기능
결론적으로 장치 밖으로 나갈 수 있는 건 공용키 파일뿐이다.

산업제어 장치에서 인증서 생성

최우선으로 해야 하는 것을 산업용 제어 장치에 인증서를 생성하는 방법이다. 인증서를 생성하기 위한 도구를 장비에 넣어야 한다.

장비스펙에 맞춰 OpenSSL을 선택하고, 장치에 추가해 인증서를 생성할 수 있게 하자.

 

장비가 한 개만 있고 테스트하는 환경이라면, USB로 연결하고 터미널로 접속해 인증서를 생성하는 방법을 떠올릴 수 있다.

하지만 이건 장비가 켜져있어야 하고 하나하나 연결해야 한다는 한계가 있다.

따라서 장비가 처음 부팅되거나 서비스가 동작할 때 등 조건을 고려해 인증서 생성을 자동화하자.

인증서는 보통 Application에 대해 구분하는 데 사용한다. 한 장치에서 두 개의 Application이 동작한다면 인증서도 2개가 되도록 구성할 수 있다.
장치를 구분하기 위한 인증서라면, 장치별 한 개씩 인증서를 갖도록 해 깔끔하게 구성할 수 있다. 다만, 이 인증서를 통해서는 장치의 어떤 Application이 접속한 건지 알 수 없게 된다.

 

공개키파일(인증서) 사용

인증서를 생성했다면 공개키파일을 가져와 사용할 수 있다.

공개키파일을 통해 암호화를 해 산업제어 장치로 전송한다면, 개인키파일을 가지고 있는 장치만 복호화가 가능하고,

산업제어장치에서 개인키파일로 암호화를 했다면, 공개키파일이 있는 장치들만 열어볼 수 있다.

공개키파일을 어떻게 가져오는지도 고려해야 한다. USB로 연결해 파일을 복사하는 방식이나, 파일을 읽는 API를 제공하는 방법 등. 사용자가 인증서를 쓸 수 있도록 제공하자.

 

내가 사용하는 OPC UA Server 라이브러리는 인증서파일 통한 암호화와 복호화, 등록 및 관리 등을 제공한다.

연결을 시도한 OPC UA Client의 인증서(공개키)는 Rejected폴더에 저장돼서 허용하거나 확인할 수 있고,

공개키파일(인증서)을 미리 등록해 해당 인증서를 허용할 수 있다.

OPC UA Server의 인증서 관리 UI

회고

인증서 기능을 개발하면서 이렇게 까지 해야하나 생각을 많이 했다.

내가 진행중인 프로젝트는 OPC UA Server와 OPC UA Client 둘 다 제공하며 여기에 OPC UA Client 유저 인증까지 들어가 코드로 구현되면 인증서 관리 포인트가 굉장히 복잡해진다.

개념을 확실히 잡고 태스크를 나눠 작업할 때 확실히 작업속도가 빨라지고 프로그램을 정리할 수 있었다.

코드만 볼 때보다 개인키와 공개키 파일을 만들고, 복사해 가며 이것저것 사용해 볼 때 확실히 빨리 이해한 것 같다.

인증서의 경우 어떻게 무엇을 인증할 것이고 왜 쓰는지에 대한 비즈니스 로직을 최우선으로 검토하자.

 

다음 글. Issuer 인증서

인증서에 대해 공부하면서 그렇다면 모든 장비의 인증서를 하나씩 관리하는지 질문을 가졌다.

극단적인 상상으로 1000대의 HI가 OPC UA Server에 등록된다고 가정할 때 인증서 1000개를 다운로드하여 등록하거나, Trust 버튼을 1000번 눌러야 하는지 자동화할 수 있는 방법이 있는지 찾아봤다.

다행히 인증서에 포함되는 내용에 인증서 발생자(Issuer) 정보가 들어가는데, 이를 이용해 문제를 해결할 수 있어 보인다.

다음에 기회가 되면 Issuer 인증서에 대해 공부해 보자.