TLS 인증 취약점 분석

현재 적용된 TLS 설정은 전송 구간 암호화만 제공하며 클라이언트 인증은 수행하지 않음.

<aside>

require_certificate → 미설정 (클라이언트 인증서 검증 없음) allow_anonymous → true (ID/PW 검증 없음)

</aside>

즉 TLS 핸드셰이크만 통과하면 누구나 브로커에 접속할 수 있는 상태


mosquitto_sub 대신 Python을 선택한 이유

mosquitto_sub 실패 원인

Python ssl.CERT_NONE 성공 원인

Python의 ssl.CERT_NONE 은 인증서 관련 모든 검증을 완전히 생략한다. CA 신뢰 여부, 호스트명 일치 여부를 전혀 확인하지 않아 TLS 핸드셰이크가 통과된다.

항목 mosquitto_sub Python paho-mqtt
호스트명 검증 --insecure로 생략 가능 tls_insecure_set으로 생략 가능
CA 신뢰 검증 생략 불가 ssl.CERT_NONE으로 완전 생략 가능
결과 핸드셰이크 실패 핸드셰이크 성공

결론

mosquitto_sub 는 보안 도구로서 최소한의 안전장치를 유지하도록 설계되어 있어 CA 검증을 완전히 우회할 수 없다. 반면 Python ssl.CERT_NONE 은 모든 검증을 코드 레벨에서 제거할 수 있어 공격 도구로 활용이 가능하다.

이는 역설적으로 클라이언트 인증(mTLS)의 필요성을 증명한다. CA 검증을 우회하더라도 브로커가 클라이언트 인증서를 요구하면 접속 자체가 불가능해지기 때문이다.


개선 방식 비교

항목 (장점) ID/PW (편의성) mTLS (보안성)
무단 접속 차단 O O
무차별 대입 공격/추론 가능 여부 취약 (문자열 기반) 매우 어려움 (인증서 기반)
공격 시나리오 ID/PW만 맞으면 외부에서 접속 가능 인증서 없이는 절대 접속 불가
클라이언트 물리 강탈 대응 계정 비활성화 ACL에서 해당 기기 제거

[쳬택] mTLS + ACL