GNU/Linux >> Belajar Linux >  >> Ubuntu

Cara Memasang dan Mengamankan Mosquitto MQTT Messaging Broker di Ubuntu 20.04

Mosquitto adalah broker pesan sumber terbuka yang menggunakan Transport Telemetri Antrian Pesan (MQTT ) Protokol. Protokol ini dirancang untuk menyediakan komunikasi ringan ke Internet of Things (IoT ) perangkat. Biasanya digunakan untuk pelacakan GPS kendaraan, otomatisasi rumah, sensor lingkungan, dan pengumpulan data skala besar.

Protokol MQTT berjalan di atas model TCP/IP. Menjadi ringan, jejak kodenya yang kecil memungkinkan Anda membuat aplikasi untuk perangkat dengan sumber daya minimal. Itu bergantung pada model terbitkan/berlangganan. Dalam model ini, klien terhubung ke server Mosquitto, yang bertindak sebagai perantara untuk mengirim informasi ke klien lain yang berlangganan saluran.

Dalam tutorial ini, Anda akan menginstal Mosquitto dan mengatur broker untuk menggunakan SSL untuk melindungi komunikasi.

Prasyarat

  • Server Ubuntu 20.04 dengan pengguna non-root dengan hak istimewa sudo.
  • Nama domain (myqtt.example.com ) menunjuk ke server Anda.

Langkah 1 - Instal Server dan Klien Nyamuk

Ubuntu dikirimkan dengan Mosquitto versi 1.6 yang lebih lama. Untuk menginstal versi terbaru, tambahkan repositori resmi Mosquitto.

$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa

Instal server Mosquitto dan klien.

$ sudo apt install mosquitto mosquitto-clients

Periksa status server.

$ sudo systemctl status mosquitto
? mosquitto.service - Mosquitto MQTT Broker
     Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago
       Docs: man:mosquitto.conf(5)
             man:mosquitto(8)
   Main PID: 119694 (mosquitto)
      Tasks: 1 (limit: 2274)
     Memory: 1.0M
     CGroup: /system.slice/mosquitto.service
             ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Jan 25 09:18:39 <userid> systemd[1]: Starting Mosquitto MQTT Broker...
Jan 25 09:18:40 <userid> systemd[1]: Started Mosquitto MQTT Broker.

Langkah 2 - Konfigurasikan Otentikasi Kata Sandi MQTT

Mosquitto dilengkapi dengan utilitas untuk menghasilkan file kata sandi yang disebut mosquitto_passwd . Mosquitto menyimpan semua konfigurasi di /etc/mosquitto direktori.

Jalankan perintah berikut untuk menghasilkan file kata sandi terenkripsi di /etc/mosquitto/passwd untuk nama pengguna username . Masukkan kata sandi pilihan Anda.

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username
Password:
Reenter password:

Selanjutnya, buat default.conf file di bawah /etc/mosquitto/conf.d direktori dan buka untuk diedit.

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

Tempel baris berikut untuk menentukan lokasi file kata sandi. Jika Anda menghilangkan bidang pendengar, itu akan selalu terhubung secara anonim, terlepas dari konfigurasinya.

listener 1883
password_file /etc/mosquitto/passwd

Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.

Mulai ulang server Mosquitto untuk menerapkan perubahan.

$ sudo systemctl restart mosquitto

Langkah 3 - Uji Klien Nyamuk

Tergantung pada kasus penggunaan, Anda dapat menggunakan klien Mosquitto untuk mengirim dan menerima pesan tentang topik yang berbeda. Klien adalah pelanggan atau penerbit.

Langkah selanjutnya adalah berlangganan topik. Dalam protokol MQTT, topik mengacu pada string yang digunakan oleh server/broker untuk memfilter pesan untuk klien yang terhubung. Berikut adalah beberapa contoh topik yang dapat Anda gunakan dalam aplikasi otomatisasi rumah.

  • rumah/lampu/ruang duduk
  • rumah/lampu/dapur
  • rumah/lampu/kamar_master
  • rumah/lampu/kamar tidur anak

Untuk berlangganan suatu topik, jalankan mosquitto_sub -t perintah diikuti oleh topik. Misalnya, untuk berlangganan home/lights/kitchen topik, jalankan perintah berikut.

$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"

Jangan tutup jendela yang ada. Buka jendela terminal baru untuk memublikasikan pesan ke home/lights/kitchen topik menggunakan perintah berikut.

$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"

Kembali ke jendela terminal pertama, dan Anda akan menerima ON muatan.

ON

Selanjutnya, kirim kode OFF pesan tentang topik yang sama dari terminal kedua.

$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"

Terminal pertama akan menampilkan pesan yang baru diterbitkan.

ON
OFF

Jika Anda mencoba mengirim komentar yang tidak diautentikasi, itu akan gagal. Misalnya, coba perintah berikut.

$ mosquitto_sub -t "home/lights/sitting_room"
Connection error: Connection Refused: not authorised.

Tidak disarankan, tetapi Anda perlu menambahkan baris berikut ke /etc/mosquitto/conf.d/default.conf file jika Anda ingin menjalankan perintah tanpa otentikasi.

allow_anonymous true

Langkah 4 - Instal SSL

Untuk menginstal sertifikat SSL menggunakan Let's Encrypt, kita perlu mengunduh alat Certbot. Kami akan menggunakan penginstal paket Snapd untuk itu.

Instal penginstal Snap.

$ sudo apt install snapd

Pastikan versi Snapd Anda terbaru.

$ sudo snap install core 
$ sudo snap refresh core

Instal Certbot.

$ sudo snap install --classic certbot

Gunakan perintah berikut untuk memastikan bahwa perintah Certbot berjalan dengan membuat tautan simbolis ke /usr/bin direktori.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Buat sertifikat SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com

Perintah di atas akan mengunduh sertifikat ke /etc/letsencrypt/live/mqtt.example.com direktori di server Anda.

Buat grup Diffie-Hellman sertifikat.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Buat direktori root web tantangan untuk pembaruan otomatis Let's Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Buat Pekerjaan Cron untuk memperbarui SSL. Ini akan berjalan setiap hari untuk memeriksa sertifikat dan memperbarui jika diperlukan. Untuk itu, buat dulu file /etc/cron.daily/certbot-renew dan buka untuk diedit.

$ sudo nano /etc/cron.daily/certbot-renew

Tempelkan kode berikut.

#!/bin/sh
certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/

Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.

Ubah izin pada file tugas agar dapat dieksekusi.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Langkah 5 - Konfigurasikan SSL MQTT

Sekarang setelah kita memiliki sertifikat SSL, kita perlu memberikan akses Mosquitto kepada mereka. Untuk ini, kita perlu menyalin sertifikat ke lokasi di mana Nyamuk dapat mengaksesnya.

$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.key

Ubah kepemilikan /etc/mosquitto/certs direktori ke mosquitto yang dibuat pengguna selama penginstalan.

$ sudo chown mosquitto: /etc/mosquitto/certs

Langkah selanjutnya untuk mengaktifkan enkripsi SSL untuk Nyamuk adalah menentukan lokasi sertifikat SSL. Buka file konfigurasi untuk diedit.

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

Tempelkan kode berikut di akhir file.

. . .
listener 8883
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

Simpan file dengan menekan Ctrl + X dan memasukkan Y ketika diminta. Pastikan untuk meninggalkan baris baru di akhir file.

listener 8883 bagian mengatur pendengar terenkripsi. Ini adalah port standar untuk MQTT + SSL, disebut sebagai MQTTS. Empat baris berikutnya menentukan lokasi file SSL.

Mulai ulang Mosquitto untuk memperbarui pengaturan.

$ sudo systemctl restart mosquitto

Anda perlu memperbarui firewall untuk mengizinkan koneksi ke port 8883.

$ sudo ufw allow 8883

Selanjutnya, kita perlu menguji fungsionalitas menggunakan mosquitto_pub perintah.

$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD

Seperti yang Anda lihat, kami telah menyertakan parameter tambahan tertentu, termasuk nomor port dan jalur ke sertifikat SSL. Kapan pun Anda perlu menggunakan SSL, Anda harus selalu menentukan nama host lengkap, yaitu mqtt.example.com bukannya localhost jika tidak, itu akan memberikan kesalahan.

Anda juga perlu menambahkan --capath arahan setiap saat. Ini memberitahu klien Mosquitto untuk mencari sertifikat root yang diinstal oleh sistem operasi.

Langkah 6 - Konfigurasi Pembaruan SSL

Certbot akan secara otomatis memperbarui sertifikat Anda sebelum kedaluwarsa. Tetapi perlu diberitahu untuk menyalin sertifikat yang diperbarui ke /etc/mosquitto/certs direktori dan mulai ulang layanan Mosquitto.

Kita akan melakukannya dengan membuat skrip shell. Buat file mosquitto-copy.sh di /etc/letsencrypt/renewal-hooks/deploy direktori.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Tempelkan kode berikut di dalamnya. Ganti nilai MY_DOMAIN variabel dengan domain Anda. ${RENEWED_LINEAGE} variabel menunjuk ke /etc/letsencrypt/live/mqtt.example.com direktori selama pembaruan.

# Set which domain this script will be run for
MY_DOMAIN=mqtt.example.com
# Set the directory that the certificates will be copied to.
CERTIFICATE_DIR=/etc/mosquitto/certs

if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then
	# Copy new certificate to Mosquitto directory
	cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem
	cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key

	# Set ownership to Mosquitto
	chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

	# Ensure permissions are restrictive
	chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

	# Tell Mosquitto to reload certificates and configuration
	pkill -HUP -x mosquitto
fi

Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.

Jadikan file tersebut dapat dieksekusi.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Skrip ini akan dijalankan secara otomatis pada setiap perpanjangan sertifikat yang berhasil.

Jika Anda menjalankan Mosquitto dan server web seperti Nginx, Anda perlu menginstruksikan Certbot untuk menghentikan server sebelum memperbarui dan memulainya lagi setelah selesai. Untuk melakukannya, buka file etc/letsencrypt/renewal/mqtt.example.com.conf .

$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

Tambahkan baris berikut di akhir file. Ubah perintah sesuai dengan server web yang Anda gunakan.

pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.

Jalankan uji kering Certbot untuk memverifikasi.

$ sudo certbot renew --dry-run

Jika Anda tidak melihat kesalahan, itu berarti semuanya sudah diatur.

Langkah 7 - Konfigurasi Websockets

Anda dapat mengonfigurasi Mosquitto untuk menggunakan protokol MQTT dari dalam browser menggunakan Javascript menggunakan fungsionalitas Websockets. Untuk mengaktifkannya, buka file konfigurasi.

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

Tempel baris berikut di akhir file.

. . .
listener 8083
protocol websockets
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.

Jika Anda perhatikan, itu adalah blok yang sama dengan yang kami gunakan untuk mengaktifkan SSL kecuali untuk nomor port dan bidang protokol. 8083 adalah port yang paling umum digunakan oleh MQTT untuk berbicara menggunakan WebSockets.

Mulai ulang layanan Mosquitto.

$ sudo systemctl restart mosquitto

Buka port 8083.

$ sudo ufw allow 8083

Kita perlu menggunakan klien MQTT berbasis browser untuk menguji fungsionalitas WebSockets. Ada banyak klien yang tersedia, tetapi kami akan menggunakan klien HiveMQ Websocket untuk tujuan kami. Luncurkan klien di browser Anda, dan Anda akan melihat yang berikut ini.

Seperti yang ditunjukkan pada tangkapan layar di atas, isi bidang seperti yang ditunjukkan.

  • Host harus menjadi domain server Mosquitto Anda, mqtt.example.com.
  • Port harus 8083.
  • Bidang ID Klien dapat dibiarkan apa adanya.
  • Nama pengguna harus nama pengguna Mosquitto Anda.
  • Kata sandi harus berupa kata sandi yang Anda buat di atas.
  • Periksa SSL kotak.

Tekan tombol Hubungkan dan klien HiveMQ akan terhubung ke server Mosquitto Anda.

Setelah terhubung, masukkan home/lights/kitchen sebagai topik, masukkan pesan apa saja dan tekan Terbitkan .

Pesan akan muncul di mosquitto_sub . Anda jendela terminal mengkonfirmasikan koneksi yang berhasil.

Ini menunjukkan bahwa implementasi Websockets berhasil.

Kesimpulan

Ini menyimpulkan penyiapan kami untuk server MQTT yang aman, dilindungi kata sandi, dan terenkripsi SSL pada mesin berbasis Ubuntu 20.04. Jika Anda memiliki pertanyaan, kirimkan di komentar di bawah.


Ubuntu
  1. Cara Memasang dan Mengamankan phpMyAdmin di Ubuntu

  2. Cara Menginstal dan Mengamankan Redis di Ubuntu 20.04

  3. Cara Menginstal dan Mengamankan Redis di Ubuntu 18.04

  1. Cara Menginstal Node.js &NPM di Ubuntu 18.04 dan 20.04

  2. Cara Menginstal PHP 7.4 dan 8.0 Di Ubuntu 18.04 atau 20.04

  3. Cara Menginstal Anaconda di Ubuntu 18.04 dan 20.04

  1. Cara Menginstal dan Mengamankan phpMyAdmin dengan Apache di Ubuntu 18.04

  2. Cara Memasang dan Mengamankan Redis di Ubuntu 18.04 LTS

  3. Cara Memasang dan Mengamankan phpMyAdmin di Ubuntu 18.04 LTS