웹사이트 검색

Ubuntu 16.04에서 Mosquitto MQTT 메시징 브로커를 설치하고 보호하는 방법


소개

MQTT는 \사물 인터넷\ 장치에 가벼운 게시/구독 통신을 제공하도록 설계된 M2M(Machine-to-Machine) 메시징 프로토콜입니다. 일반적으로 차량, 가정 자동화, 환경 센서 네트워크 및 유틸리티의 지리적 추적 플릿에 사용됩니다. 스케일 데이터 수집.

Mosquitto는 널리 사용되는 MQTT 서버(또는 MQTT 용어로 브로커)로 커뮤니티 지원이 뛰어나고 설치 및 구성이 쉽습니다.

이 튜토리얼에서는 Mosquitto를 설치하고, Let’s Encrypt에서 SSL 인증서를 검색하고, 암호로 보호된 MQTT 통신을 보호하기 위해 SSL을 사용하도록 브로커를 설정합니다.

전제 조건

이 튜토리얼을 시작하기 전에 다음이 필요합니다.

  • 이 Ubuntu 16.04 서버 설정 자습서에 자세히 설명된 대로 루트가 아닌 sudo 사용 사용자 및 기본 방화벽 설정이 있는 Ubuntu 16.04 서버
  • DigitalOcean으로 호스트 이름을 설정하는 방법에 따라 서버를 가리키는 도메인 이름. 이 자습서에서는 전체적으로 mqtt.example.com을 사용합니다.

1단계 - Mosquitto 설치

Ubuntu 16.04에는 기본 소프트웨어 리포지토리에 상당히 최신 버전의 Mosquitto가 있습니다. 루트가 아닌 사용자로 로그인하고 apt-get을 사용하여 Mosquitto를 설치합니다.

  1. sudo apt-get install mosquitto mosquitto-clients

기본적으로 Ubuntu는 설치 후 Mosquitto 서비스를 시작합니다. 기본 구성을 테스트해 보겠습니다. 방금 설치한 Mosquitto 클라이언트 중 하나를 사용하여 브로커의 주제를 구독합니다.

주제는 메시지를 게시하고 구독하는 라벨입니다. 계층 구조로 정렬되어 있으므로 예를 들어 sensors/outside/tempsensors/outside/humidity를 가질 수 있습니다. 주제를 정렬하는 방법은 귀하와 귀하의 필요에 달려 있습니다. 이 자습서 전체에서 간단한 테스트 항목을 사용하여 구성 변경 사항을 테스트합니다.

서버에 다시 로그인하면 두 개의 터미널이 나란히 있습니다. 새 터미널에서 mosquitto_sub를 사용하여 테스트 항목을 구독합니다.

  1. mosquitto_sub -h localhost -t test

-h는 MQTT 서버의 호스트 이름을 지정하는 데 사용되며 -t는 주제 이름입니다. mosquitto_sub가 메시지 도착을 기다리고 있기 때문에 ENTER를 누른 후 출력이 표시되지 않습니다. 다른 터미널로 다시 전환하고 메시지를 게시합니다.

  1. mosquitto_pub -h localhost -t test -m "hello world"

mosquitto_pub에 대한 옵션은 mosquitto_sub와 동일하지만 이번에는 추가 -m 옵션을 사용하여 메시지를 지정합니다. ENTER를 누르면 다른 터미널에 hello world 팝업이 표시됩니다. 첫 번째 MQTT 메시지를 보냈습니다!

두 번째 터미널에서 CTRL+C를 입력하여 mosquitto_sub를 종료하되 서버에 대한 연결은 열어 둡니다. 5단계에서 다른 테스트에 다시 사용할 것입니다.

다음으로 새로운 Let’s Encrypt 클라이언트인 Certbot을 사용하여 SSL로 설치를 보호합니다.

2단계 - Let’s Encrypt 인증서를 위한 Certbot 설치

Let’s Encrypt는 자동화된 API를 통해 무료 SSL 인증서를 제공하는 새로운 서비스입니다. API와 통신할 수 있는 많은 클라이언트가 있으며 Ubuntu는 기본 리포지토리에 공식 클라이언트를 포함하지만 약간 구식이며 필요한 중요한 기능이 하나 부족합니다.

대신 Ubuntu PPA 또는 개인 패키지 아카이브에서 공식 클라이언트를 설치합니다. 보다 최신이거나 더 모호한 소프트웨어를 패키징하는 대체 리포지토리입니다. 먼저 저장소를 추가합니다.

  1. sudo add-apt-repository ppa:certbot/certbot

동의하려면 ENTER를 눌러야 합니다. 그런 다음 패키지 목록을 업데이트하여 새 리포지토리의 패키지 정보를 가져옵니다.

  1. sudo apt-get update

마지막으로 certbot이라는 공식 Let’s Encrypt 클라이언트를 설치합니다.

  1. sudo apt-get install certbot

이제 certbot이 설치되었으므로 이를 실행하여 인증서를 가져오겠습니다.

3단계 - Certbot 실행

certbot은 도메인 제어를 증명하기 위해 Let’s Encrypt API에서 발행한 암호화 문제에 응답해야 합니다. 이를 위해 포트 80(HTTP) 및/또는 443(HTTPS)을 사용합니다. 포트 80만 사용하므로 이제 해당 포트에서 들어오는 트래픽을 허용하겠습니다.

  1. sudo ufw allow http
Output
Rule added

이제 Certbot을 실행하여 인증서를 얻을 수 있습니다. --standalone 옵션을 사용하여 Certbot에게 자체적으로 HTTP 챌린지 요청을 처리하도록 지시하고 --standalone-supported-challenges http-01는 통신을 제한합니다. 80 포트로. -d는 인증서를 원하는 도메인을 지정하는 데 사용되며 certonly는 다른 구성 단계를 수행하지 않고 인증서만 검색하도록 Certbot에 지시합니다.

  1. sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com

명령을 실행할 때 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 표시됩니다. 이렇게 하면 프로세스가 성공했으며 인증서가 저장된 위치를 알려주는 메시지가 표시됩니다.

우리는 우리의 인증서를 가지고 있습니다. 이제 만료가 임박했을 때 Certbot이 자동으로 갱신하는지 확인해야 합니다.

4단계 - Certbot 자동 갱신 설정

Let’s Encrypt의 인증서는 90일 동안만 유효합니다. 이는 사용자가 인증서 갱신 프로세스를 자동화하도록 권장하기 위한 것입니다. 만료되는 인증서를 확인하고 자동으로 갱신하려면 정기적으로 실행되는 명령을 설정해야 합니다.

갱신 확인을 매일 실행하기 위해 주기적 작업 실행을 위한 표준 시스템 서비스인 cron을 사용합니다. 우리는 crontab이라는 파일을 열고 편집하여 cron에게 해야 할 일을 알려줍니다.

  1. sudo crontab -e

텍스트 편집기를 선택하라는 메시지가 표시됩니다. 즐겨찾기를 선택하면 도움말 텍스트가 포함된 기본 crontab이 표시됩니다. 파일 끝에 다음 줄을 붙여넣은 다음 저장하고 닫습니다.

. . .
15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"

이 줄의 15 3 * * * 부분은 "매일 오전 3:15에 다음 명령 실행\을 의미합니다. Certbot의 갱신 명령은 모든 인증서를 확인합니다. 시스템에 설치하고 30일 이내에 만료되도록 설정된 항목을 업데이트합니다. --noninteractive는 Certbot이 사용자 입력을 기다리지 않도록 지시합니다.

--post-hook \systemctl restart mosquitto\는 인증서가 갱신된 경우에만 Mosquitto를 다시 시작하여 새 인증서를 선택합니다. 이 post-hook 기능은 이전 버전의 Let’s Encrypt 클라이언트에 없는 기능이며 기본 Ubuntu 리포지토리 대신 PPA에서 설치한 이유입니다. 이것이 없으면 인증서가 실제로 업데이트되지 않더라도 매일 Mosquitto를 다시 시작해야 합니다. MQTT 클라이언트가 자동으로 다시 연결되도록 구성해야 하지만 이유 없이 매일 중단하지 않는 것이 좋습니다.

이제 자동 인증서 갱신이 모두 설정되었으므로 더 안전한 Mosquitto 구성으로 돌아갑니다.

5단계 - MQTT 암호 구성

비밀번호를 사용하도록 Mosquitto를 구성해 보겠습니다. Mosquitto에는 mosquitto_passwd라는 특수 암호 파일을 생성하는 유틸리티가 포함되어 있습니다. 이 명령은 지정된 사용자 이름에 대한 암호를 입력하라는 메시지를 표시하고 결과를 /etc/mosquitto/passwd에 저장합니다.

  1. sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

이제 Mosquitto에 대한 새 구성 파일을 열고 이 암호 파일을 사용하여 모든 연결에 로그인을 요구하도록 지시합니다.

  1. sudo nano /etc/mosquitto/conf.d/default.conf

그러면 빈 파일이 열립니다. 다음을 붙여넣습니다.

allow_anonymous false
password_file /etc/mosquitto/passwd

allow_anonymous false는 인증되지 않은 모든 연결을 비활성화하고 password_file 행은 Mosquitto에게 사용자 및 암호 정보를 찾을 위치를 알려줍니다. 파일을 저장하고 종료합니다.

이제 Mosquitto를 다시 시작하고 변경 사항을 테스트해야 합니다.

  1. sudo systemctl restart mosquitto

비밀번호 없이 메시지 게시 시도:

  1. mosquitto_pub -h localhost -t "test" -m "hello world"

메시지가 거부되어야 합니다.

Output
Connection Refused: not authorised. Error: The connection was refused.

암호로 다시 시도하기 전에 두 번째 터미널 창으로 다시 전환하고 이번에는 사용자 이름과 암호를 사용하여 '테스트' 항목을 구독합니다.

  1. mosquitto_sub -h localhost -t test -u "sammy" -P "password"

연결되어 앉아 메시지를 기다려야 합니다. 주기적으로 테스트 메시지를 보내므로 이 터미널을 열어두고 튜토리얼의 나머지 부분에 연결된 상태로 둘 수 있습니다.

이제 다시 사용자 이름과 암호를 사용하여 다른 터미널로 메시지를 게시합니다.

  1. mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"

메시지는 1단계와 같이 진행되어야 합니다. Mosquitto에 암호 보호 기능을 성공적으로 추가했습니다. 불행히도 우리는 인터넷을 통해 암호화되지 않은 암호를 보내고 있습니다. 다음에 Mosquitto에 SSL 암호화를 추가하여 문제를 해결할 것입니다.

6단계 - MQTT SSL 구성

SSL 암호화를 활성화하려면 Let’s Encrypt 인증서가 저장된 위치를 Mosquitto에 알려야 합니다. 이전에 시작한 구성 파일을 엽니다.

  1. sudo nano /etc/mosquitto/conf.d/default.conf

파일 끝에 다음을 붙여넣고 이미 추가한 두 줄은 그대로 둡니다.

. . .
listener 1883 localhost

listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

구성에 두 개의 개별 리스너 블록을 추가하고 있습니다. 첫 번째 리스너 1883 localhost는 지금까지 연결한 포트 1883에서 기본 MQTT 리스너를 업데이트합니다. 1883은 암호화되지 않은 표준 MQTT 포트입니다. 줄의 localhost 부분은 Mosquitto가 이 포트를 localhost 인터페이스에만 바인딩하도록 지시하므로 외부에서 액세스할 수 없습니다. 어쨌든 외부 요청은 방화벽에 의해 차단되었을 것이지만 명시하는 것이 좋습니다.

리스너 8883은 포트 8883에서 암호화된 리스너를 설정합니다. MQTTS라고도 하는 MQTT + SSL의 표준 포트입니다. 다음 세 줄 certfile, cafilekeyfile은 모두 암호화된 연결을 설정하기 위해 Mosquitto가 적절한 Let’s Encrypt 파일을 가리키도록 합니다.

파일을 저장하고 종료한 다음 Mosquitto를 다시 시작하여 설정을 업데이트합니다.

  1. sudo systemctl restart mosquitto

포트 8883에 대한 연결을 허용하도록 방화벽을 업데이트합니다.

  1. sudo ufw allow 8883
Output
Rule added

이제 SSL에 대한 몇 가지 다른 옵션과 함께 mosquitto_pub를 사용하여 다시 테스트합니다.

  1. mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "sammy" -P "password"

localhost 대신 전체 호스트 이름을 사용하고 있습니다. SSL 인증서가 mqtt.example.com에 대해 발급되었기 때문에 localhost에 대한 보안 연결을 시도하면 다음과 같은 오류가 발생합니다. 호스트 이름이 인증서 호스트 이름과 일치하지 않습니다(둘 다 동일한 Mosquitto 서버를 가리키고 있음에도 불구하고).

--capath /etc/ssl/certs/mosquitto_pub에 대해 SSL을 활성화하고 루트 인증서를 찾을 위치를 알려줍니다. 이들은 일반적으로 운영 체제에 의해 설치되므로 Mac OS, Windows 등의 경로는 다릅니다. mosquitto_pub는 루트 인증서를 사용하여 Mosquitto 서버의 인증서가 Let's Encrypt 인증 기관에서 제대로 서명되었는지 확인합니다. . mosquitto_pubmosquitto_sub는 이 옵션(또는 유사한 --cafile 옵션) 없이 SSL 연결을 시도하지 않는다는 점에 유의해야 합니다. 8883의 표준 보안 포트에 연결하고 있습니다.

모든 테스트가 순조롭게 진행되면 다른 mosquitto_sub 터미널에 hello가 다시 표시되는 것을 볼 수 있습니다. 이는 서버가 완전히 설정되었음을 의미합니다! websocket과 함께 작동하도록 MQTT 프로토콜을 확장하려면 마지막 단계를 따를 수 있습니다.

7단계 - Websocket을 통한 MQTT 구성(선택 사항)

웹 브라우저 내에서 JavaScript를 사용하여 MQTT를 말하기 위해 프로토콜이 표준 웹 소켓에서 작동하도록 조정되었습니다. 이 기능이 필요하지 않은 경우 이 단계를 건너뛸 수 있습니다.

Mosqiutto 구성에 listener 블록을 하나 더 추가해야 합니다.

  1. sudo nano /etc/mosquitto/conf.d/default.conf

파일 끝에 다음을 추가합니다.

. . .
listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

포트 번호와 protocol websockets 행을 제외하면 이전 블록과 거의 동일합니다. 웹 소켓을 통한 MQTT에 대한 공식 표준화된 포트는 없지만 8083이 가장 일반적입니다.

파일을 저장하고 종료한 다음 Mosquitto를 다시 시작하십시오.

  1. sudo systemctl restart mosquitto

이제 방화벽에서 포트 8083을 엽니다.

  1. sudo ufw allow 8083

이 기능을 테스트하기 위해 공용 브라우저 기반 MQTT 클라이언트를 사용합니다. 거기에 몇 가지가 있지만 브라우저에서 Paho 클라이언트를 엽니다. 다음이 표시됩니다.

다음과 같이 연결 정보를 입력합니다.

  • 호스트는 Mosquitto 서버 mqtt.example.com의 도메인이어야 합니다.
  • 포트는 8083이어야 합니다.
  • ClientId는 기본값인 js-utility-DI1m6으로 둘 수 있습니다.
  • 경로는 기본값인 /ws로 둘 수 있습니다.
  • 사용자 이름은 Mosquitto 사용자 이름이어야 합니다. 여기서는 새미를 사용했습니다.
  • 암호는 선택한 암호여야 합니다.

나머지 필드는 기본값으로 둘 수 있습니다.

연결을 누르면 Paho 브라우저 기반 클라이언트가 Mosquitto 서버에 연결됩니다.

메시지를 게시하려면 메시지 게시 창으로 이동하여 주제를 테스트로 채우고 메시지 섹션에 메시지를 입력합니다. 그런 다음 게시를 누릅니다. 메시지는 mosquitto_sub 터미널에 표시됩니다.

결론

이제 Let’s Encrypt 서비스의 자동 갱신 SSL 인증서를 사용하여 암호로 보호되는 안전한 MQTT 서버를 설정했습니다. 이것은 당신이 꿈꾸는 모든 프로젝트를 위한 강력하고 안전한 메시징 플랫폼 역할을 할 것입니다. MQTT 프로토콜과 잘 작동하는 인기 있는 소프트웨어 및 하드웨어는 다음과 같습니다.

  • 오픈 소스 위치 추적 앱인 OwnTracks는 휴대전화에 설치할 수 있습니다. OwnTracks는 위치 정보를 MQTT 서버에 주기적으로 보고합니다. 그런 다음 위치 정보를 저장하고 지도에 표시하거나 경고를 생성하고 위치를 기반으로 IoT 하드웨어를 활성화할 수 있습니다.
  • Node-RED는 사물 인터넷을 함께 '연결'하기 위한 브라우저 기반 그래픽 인터페이스입니다. 한 노드의 출력을 다른 노드의 입력으로 드래그하고 필터를 통해, 다양한 프로토콜 간에, 데이터베이스 등으로 정보를 라우팅할 수 있습니다. MQTT는 Node-RED에서 매우 잘 지원됩니다.
  • ESP8266은 MQTT 기능을 갖춘 저렴한 Wi-Fi 마이크로컨트롤러입니다. 하나를 연결하여 온도 데이터를 주제에 게시하거나 기압 주제를 구독하고 폭풍이 올 때 부저를 울릴 수 있습니다!

이들은 MQTT 생태계에서 인기 있는 몇 가지 예에 불과합니다. 프로토콜을 말하는 훨씬 더 많은 하드웨어와 소프트웨어가 있습니다. 선호하는 하드웨어 플랫폼이나 소프트웨어 언어가 이미 있다면 MQTT 기능이 있을 것입니다. 당신의 "것들\이 서로 대화하는 것을 즐기세요!