MQTT 네트워크에서 2FA를 사용하려면 어떻게해야합니까?


12

가능한 경우 새 장치를 브로커에 연결할 때 2FA (이중 인증)를 사용하려면 어떻게해야합니까?

더 쉬운 것처럼 보이기 때문에 두 번째 요소는 먼저 소프트웨어 솔루션이 될 수 있지만 하드 토큰을 도입하는 방법에 대한 아이디어를 환영합니다 (RFID).

장치가 첫 번째 연결에서만 인증해야하고 서버가 "오래된"클라이언트를 기억하는 것이 합리적입니다.

아이디어가 비정상적이거나 적합하지 않을 수 있습니다. 나쁜 아이디어 인 경우 이유를 알려주세요.


장치가 하나의 장치 이므로 2FA를 수행 할 수 있다고 생각하는 방법을 알려주 시겠습니까?
Goufalite

@Goufalite 예를 들어 새 장치를 설치할 때 인증 중에 사용될 키를 수동으로 제공해야합니다 (예 : RFID 태그로). 소프트웨어 2FA의 경우 새 키가 개인 키 서버와 같은 소프트 토큰을 요청할 수있는 가정에 어떤 서비스가 설치되어 있는지 알 수 없습니다.
Bence Kaulics

답변:


8

브로커 프록시 또는 웹 서버가 필요합니다 ...

우선, 특정 주제 ( , ...)를 사용하여 2FA를 수행하려면 브로커에 연결된 인증 서비스가 절대적으로 필요합니다 /auth/RFID. 그러면 클라이언트가 정보를 게시 할 수 있습니다 (아래 참조).

여기서 볼 수있는 첫 번째 문제는이 주제를 구독 한 사람은 누구나 해당 주제의 정보를 읽을 있지만 주제를 잠글 수 있다는 것입니다 !

그런 다음 모든 장치에 정보를 게시하도록 지시 (강제) 할 수 있습니다 /proxy/mytopic. 인증 서비스는 mqtt의 clientId 기능을 사용하여이 주제에서 전송 된 메시지가 이전에 2FA를 사용한 인증 된 장치에서 온 것인지 확인한 후 장치 대신 /proxyout/mytopic페이로드의 장치 ID 를 사용 하여 자체 메시지를 게시 할 수 있습니다 .

MQTT가 대량 게시에 관한 것이기 때문에 문제는 인증 된 경우 메시지 받을 수있는 장치를 검사 하는 것입니다. 인증 서비스에는 인증 된 장치 목록이 있어야하고 수신 가능한지 확인해야합니다. 다시 한 번, 페이로드 암호화 및 암호 해독 장치 쪽 ...

내 솔루션이 MQTT 기능보다 과잉이라고 생각합니다. 따라서 소켓이나 웹 서버를 사용해야합니다 ...


@ tim3in 늦게 응답해서 죄송합니다. 결국 이것은 2,5 년 전의 대답이었습니다 ... 아마도 상황이 바뀌었고 이것은 일반적인 아키텍처 제안 일뿐입니다. 솔루션으로 POC를 했습니까?
Goufalite

나는 그것을 계획했다. 그것을 검토 할 수 있습니까?
tim3in

7

다가오는 MQTT v5 스펙은 AUTH제어 패킷에 대한 지원을 추가하여 챌린지 / 응답 인증을 허용합니다. MQTT v5가 아직 확정되지 않았기 때문에 지원이 여전히 변경 될 수 있지만 AUTH가 어떤 형태로 남아 있거나이를 사용하여 2FA를 추가 할 수 있다고 가정하는 것이 합리적입니다.

OASIS MQTT위원회 문서 페이지 에서 사양의 현재 작업 초안을 볼 수 있습니다 .


5

사양에 따라 연결 메시지는 선택적으로 사용자 이름과 암호를 제공 할 수 있습니다. 브로커 어딘가에 저장된 ACL에 대해 유효성이 검증됩니다. 이것이 바로 악용 할 수있는 첫 번째 인증 요소입니다. 인증이 진행되면 브로커의 CONNACK 메시지가 응답합니다.

인증 인 경우 두 번째 요소를 구현하려면 다른 요소와 함께 사용자 지정 연결 메시지를 보내는 것이 가장 좋습니다. 이 경우 CONNACK 메시지는 두 번째 인증 요소의 성공 또는 실패를 나타냅니다. 따라서 브로커와 클라이언트는 사양 이상으로 사용자 정의 메시지를 구현해야합니다.


4

MQTT 네트워크에서 2FA를 달성하기 위해 브로커에 연결된 다음 인증 서비스를 작성했습니다.

  1. ID 검증기
  2. 토큰 생성기
  3. 토큰 검증기

MQTT 클라이언트가 SSL / TLS를 통해 브로커에 연결하면 먼저 고유 ID를 device_id 주제에 공개하고 , ID 검증기는 인증 된 클라이언트인지 확인한 후 토큰 생성기를 호출하여 토큰을 생성하고 잠긴 주제 device_token 에 토큰을 공개합니다 .

클라이언트 장치는이 토큰을 가져 와서 verify_token 주제에 추가로 게시합니다 . 토픽이 verify_token에 게시 되 자마자 토큰 검증기는 토픽 device_tokenverify_token 의 값 이 일치하는 경우 장치 ID를 확인 된 장치 풀에 추가하고 장치 게시 데이터를 허용합니다. 이는 검증 된 장치 만 토픽에 연결되어 데이터를 게시하므로 보안이 향상됩니다.

또한 MQTT_KEEPALIVE 구성 옵션을 사용하여 디바이스 풀에 클라이언트 디바이스를 유지하고 디바이스 풀에 추가 된 디바이스가 다시 확인되지 않도록하는 데이터가 전송되거나 수신되지 않을 때 클라이언트를 활성 상태로 유지했습니다. 그러나 보안을 위해 24 시간마다 2FA로 기기를 고정했습니다.


3
올바른 클라이언트 만 토큰을 얻는 것이 어떻게 안전합니까?
Helmar

@Helmar는 고유 한 clientID 와 별도의 주제를 사용하여 장치 등록시 사전 정의 된 각 클라이언트에 대한 토큰을 저장합니다. 클라이언트는 실제로이 주제를 구독합니다. 확인을 위해 토큰을 다시 게시하면 토큰 데이터와 함께 ID를 추가하여 검증자가이 토큰을 게시 한 클라이언트를 알 수 있습니다. clientid는 데이터베이스의 서버에서 동일한 id를 등록한 후 디바이스 측의 Secure Element 를 사용하여 보호 될 수 있습니다 .
tim3in 2016 년

@ Helmar 당신은 이것에 의견을 추가 하시겠습니까? 내 솔루션에 대한 모든 사람들의 의견을 부탁드립니다.
tim3in 2016 년

2
예, 그러나 모든 토큰 응답을보기 위해 '#'에 가입하지 못하게하는 것
hardillb

토큰 반응이있는 @hardillb 주제는 Goufalite가 언급 한대로 잠겨 있습니다. 따라서 미리 설정된 장치 만 볼 수 있습니다. 등록 단계에서 장치는 특정 주제에 바인딩되며 각 장치는 토큰 응답에 대해 별도의 주제를 할당했습니다.
tim3in 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.