MQTT 서버 보안성 강화하기

잘못된 설정 바로잡기

안녕하세요? 에어릭스 환경시스템 사업부 개발팀장 이상훈입니다. 이번에는 MQTT Broker서버의 보안성을 강화하는 것에 대한 주제로 포스팅을 하게 되었습니다. 이미 보안에 대한 문제점이 있는 것은 오래전부터 인지하고 있었으나, 그 동안 여러가지 긴급한 문제들을 대응하다보니 빠르게 조치를 취하지 못했습니다.

다행히 올해 5월부터 수행하고 있는 클린팩토리 정부R&D과제를 통해서 기존 에어릭스의 스마트팩토리 솔루션들이 가지고 있던 문제점들을 대대적으로 개선할 수 있는 기회를 가지게 되었습니다.

그 중에서도 가장 우선적으로 개선된 부분이 MQTT Broker서버의 보안성 강화인데, 이번 포스팅을 통해서 그 과정을 정리해보기로 했습니다.

문제점


저희 에어릭스에서는 주로 MQTT 프로토콜을 사용하여 제조현장에 설치된 센서나 PLC로부터 데이터를 수집하고 있습니다. 데이터를 수집하기 위해서 사내에 MQTT Broker가 설치된 서버도 운영하고 있습니다.

MQTT Broker 서버가 에어릭스의 스마트팩토리 시스템에서 중추적인 역할을 하고 있다는 것은 부인할 수 없는 사실일 것입니다. 하지만 문제는 이렇게 중요한 MQTT Broker 서버를 그 어떤 보안 매커니즘도 없이 개방된 인터넷 공간에 활짝 공개해놓고 사용하고 있다는 점입니다.

보호되지 않는 MQTT Broker서버에 대한 외부 공격이 데이터 유출을 유발하고, 시스템의 통제권을 빼앗아 이와 연동된 설비나 다른 시스템을 위험에 빠트릴 수도 있습니다.
뉴스 기사에서도 이미 여러차례 이런 문제점들이 지적된 것을 찾아볼 수 있었습니다. 그런 점에서 보면 에어릭스 뿐만 아니라 IoT기술을 사용하고 있는 대다수 업체들이 가지고 있는 만연한 문제일지도 모르겠습니다.

에어릭스에 입사하기 전에 17년 이상을 임베디드 보안 소프트웨어를 개발하던 업무를 해왔던 제 입장에서는 크나큰 위험요소로 느껴지는 것이 당연할지도 모르겠습니다.

사실 MQTT Broker 자체의 보안에는 큰 문제가 있습니다. 보안이라는 것 자체를 생각하지 않고, 오직 동작에만 충실한 나머지 제대로된 설정을 하지 않고 사용하고 있는 대다수 업체들의 잘못인 것입니다.

제약사항


  • 개방된 인터넷망에서 MQTT Broker 서버를 계속 운영해야 함.
  • 회사 경영진으로부터 고가의 보안장비를 구입할 예산을 승인받는 것은 거의 불가능함.
  • 사내 개발자들의 보안기술에 대한 이해도가 부족함.

Image Alt github

해결과정


위와 같은 제약사항이 존재하는 상태에서 MQTT Broker서버의 보안성을 강화하기 위해서 아래와 같은 조치를 취했습니다.

1.익명접속 금지 및 ACL(Access Control List) 관리

사용자 계정과 비밀번호의 확인없이 접속을 허용하는 익명접속을 더 이상 허용하지 않도록 MQTT Broker서버의 설정을 변경하였습니다. 익명접속을 허용한 상태에서 개방된 인터넷망에서 MQTT Broker서버를 사용하는 것은 집에서 인터넷 공유기의 Password를 설정하지 않은 상태에서 사용하는 것과 마찮가지로 다양한 보안 위협에 그대로 노출될 수 있습니다. 충분하지는 않겠지만 익명접속을 허용하지 않고, 사용자 계정과 비밀번호를 확인하도록 하는 것만으로도 1차적인 방어선을 갖출 수 있습니다.

또한, MQTT Broker서버가 제공하는 ACL 관리 기능을 사용하도록 설정을 변경하기도 했습니다. ACL 관리 기능을 통해서 사용자 계정별로 허용된 TOPIC을 가진 메시지에만 접근(메시지 구독 or 발행)할 수 있도록 권한을 부여했습니다.

기존에는 누구나 제약없이 자유롭게 MQTT Broker서버로 발행되는 메시지를 가져갈 수 있었습니다. 하지만 이렇게 설정을 변경함으로써 이제는 사용자 계정과 비밀번호를 통해서 서버 접근 권한이 있는지 확인하고, 해당 계정에 허용된 TOPIC을 가진 메시지만 가져가도록 제어할 수 있게 되었습니다.

2.SSL(Secure Sockets Layer) 통신 프로토콜 사용

MQTT Broker서버가 SSL통신 프로토콜을 사용하여 전송 데이터를 암호화할 수 있도록 했습니다. SSL을 사용하지 않는 경우에는 평문 그대로 데이터가 전송되기 때문에 민감한 정보들이 그대로 외부에 노출될 수 있다는 문제가 있습니다.

SSL은 전송 데이터의 암호화를 위해서 비대칭키 암호화 알고리즘을 사용합니다. 서버의 키를 공개키를 클라이언트로 전달하기 위해서 신뢰할 수 있는 CA로부터 발급받은 서버 인증서가 사용됩니다. 서버 인증서를 검증하고 서버의 공개키를 추출하기 위해서는 CA인증서의 발급도 필요합니다.

하지만 제약사항에 있는 것처럼 별도의 예산을 승인받기는 어려운 상황이었기 때문에 우선은 비용이 발생하지 않는 OpenSSL을 사용해서 필요한 인증서 파일들을 생성해서 사용했습니다.

MQTT Broker서버가 SSL을 사용하여 통신을 할 수 있도록 필요한 인증서 파일들을 등록해주고, 설정을 변경했습니다.

이렇게 SSL을 사용하도록 MQTT Broker서버의 설정을 변경함으로써 데이터의 기밀성(Confidentiality)과 무결성(Integrity)을 보장받을 수 있게 되었습니다.

3.VPN(Virtual Private Network) 사용

익명접속 금지 및 ACL관리, 그리고 SSL 통신 프로토콜 사용만으로도 기존 대비 MQTT Broker서버의 보안은 한층 강화되었습니다. 하지만 이것만으로는 충분하지 않다고 생각되었습니다.

원천적으로 MQTT Broker서버가 사용하는 네트워크에 외부의 접속을 차단하고 싶었습니다. 그래서 VPN 사용을 생각했습니다. VPN을 사용하게 되면 MQTT Broker서버와 통신하는 모든 장치들 사이에는 암호화된 보안 터널이 생성되고, 이를 통해서 안전하게 데이터가 전송되게 됩니다. 개방된 인터넷망을 사용하더라도 암호화된 보안 터널을 통해서 연결되기 때문에 MQTT Broker서버와 장치가 개인 네트워크에 직접 연결된 것과 같은 효과를 가질 수 있습니다.

물론 시중에 나와있는 상용 VPN솔루션을 사용하면 더 좋은 성능과 높은 보안성을 보장받을 수도 있을 것입니다. 하지만 그럴 수 없는 상황이었기 때문에 비용이 발생하지 않는 OpenSource VPN 솔루션인 WireGuard를 채택해서 사용했습니다.

남은 이슈


보안성 강화를 위해서 여러가지 조치들을 취했는데 과연 객관적으로 어느 정도 보안성의 강화가 이루어졌는지 측정해 볼 필요가 있을 것 같습니다. 나중에 기회가 된다면 모의해킹 업체에 의뢰해서 확인해볼 예정입니다.