Yeni kurulmuş bir Mosquitto 2.x, anonim uzak client’ları reddeder; bu iyi bir başlangıçtır — ancak broker’ı gerçekten kullanabilmek için üç katmana ihtiyacınız var: kimlik doğrulama (siz kimsiniz?), yetkilendirme (hangi topic’lere erişebilirsiniz?) ve şifreleme (ağdaki biri bunu okuyabilir mi?). Mosquitto’da bunlar parola dosyası, ACL dosyası ve bir TLS listener’ıdır. Bu rehber üçünü de adım adım kuruyor.
Broker henüz kurulu değilse Mosquitto kurulumu ya da Docker’da çalıştırma rehberiyle başlayın. Aşağıdaki yollar Linux paket kurulumunu varsayar; Docker’da /etc/mosquitto/ yerine /mosquitto/config/ kullanın.
1. mosquitto_passwd ile parola dosyası oluşturun
mosquitto_passwd kullanıcı adlarını salt’lı parola hash’leriyle saklar (asla düz metin olarak değil). Dosyayı ilk kullanıcıyla oluşturun, ardından diğerlerini ekleyin:
# -c YENİ bir dosya oluşturur ve mevcut dosyanın üzerine yazar — yalnızca ilk kullanıcı için
sudo mosquitto_passwd -c /etc/mosquitto/passwd alice
# kullanıcı ekleme veya güncelleme (parolayı sorar)
sudo mosquitto_passwd /etc/mosquitto/passwd sensor-01
# etkileşimsiz, örn. provisioning script'lerinde
sudo mosquitto_passwd -b /etc/mosquitto/passwd bob 'S3cure-pass'
# kullanıcı silme
sudo mosquitto_passwd -D /etc/mosquitto/passwd bobPaylaşılan makinelerde -b kullanmaktan kaçının: parola shell geçmişinize ve süreç listesine düşer. Dosyayı yalnızca broker okuyabilecek şekilde kilitleyin:
sudo chown mosquitto:mosquitto /etc/mosquitto/passwd
sudo chmod 0700 /etc/mosquitto/passwdŞimdi broker’a bu dosyayı kullanmasını söyleyin:
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwdsudo systemctl restart mosquitto
# "not authorised" hatasıyla başarısız olmalı
mosquitto_pub -h localhost -t test -m hi
# başarılı olmalı
mosquitto_pub -h localhost -u alice -P 'your-password' -t test -m hi2. ACL dosyasıyla topic’leri kısıtlayın
Tek başına bir parola dosyası, kimliği doğrulanmış her kullanıcının tüm topic’leri okuyup yazmasına izin verir. ACL dosyası bunu sınırlar. acl_file ayarlandığı anda açıkça izin verilmeyen her şey reddedilir.
# --- pattern rules apply to every authenticated client ---
# each device may read and write only below its own username
pattern readwrite devices/%u/#
# each client may read its own command topic, keyed by client ID
pattern read commands/%c
# --- user-specific rules ---
user alice
topic readwrite #
user dashboard
topic read devices/#
topic write commands/+
user sensor-01
topic write telemetry/sensor-01/#| Direktif | Anlamı |
|---|---|
user <name> | Ardından gelen topic satırları bu kullanıcı adına uygulanır |
topic [read|write|readwrite|deny] <filter> | Erişim verir (deny ile engeller); + ve # wildcard’ları kullanılabilir. Erişim tipi belirtilmezse readwrite kabul edilir |
pattern [access] <filter> | Tüm client’lara uygulanır; %u kullanıcı adıyla, %c client ID ile değiştirilir |
Parola dosyasının yanında etkinleştirin:
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/aclİki davranış insanları sıkça şaşırtır. Birincisi, yasaklı bir topic’e yapılan publish MQTT 3.1.1’de sessizce düşürülür — client hiçbir hata görmez (MQTT 5 client’ları QoS 1/2 PUBACK’te bir reason code alır). İkincisi, yasaklı bir abonelik SUBACK’te reddedilir ve birçok client kütüphanesi bunu size göstermez. “Mesajlar bir türlü gelmiyor” durumunda önce ACL’i kontrol edin ve hata ayıklarken broker’ı log_type all ile çalıştırın. devices/+/# gibi bir filtrenin gerçekte hangi topic’leri kapsadığını görmek için topic eşleştiriciyi kullanın.
3. Trafiği TLS ile şifreleyin
TLS olmadan kullanıcı adları, parolalar ve payload’lar ağ üzerinden düz metin olarak geçer. Yaygın kullanım, 8883 portunda TLS üzerinden MQTT’dir (bkz. MQTT portları). Bir sertifikaya, onun private key’ine ve — self-signed kurulumlarda — CA sertifikasına ihtiyacınız var.
# MQTT over TLS
listener 8883
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
# cafile is only needed for self-signed / private CA chains or client certificates
# cafile /etc/mosquitto/certs/ca.crt
# Secure WebSockets for browser clients
listener 8884
protocol websockets
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.keyTLS çalıştıktan sonra kimlik bilgilerinin oradan sızmaması için düz listener 1883’ü kaldırın veya firewall ile kapatın (ya da listener 1883 127.0.0.1 ile localhost’a bağlayın). Client sertifikalarını zorunlu kılmak (mutual TLS) için listener’a cafile ve require_certificate true ekleyin; ayrıca use_identity_as_username true eklemek, ACL açısından sertifikanın CN’sini kullanıcı adı yapar.
Bir client’tan test edin:
# public CA (e.g. Let's Encrypt): use the system trust store
mosquitto_sub -h mqtt.example.com -p 8883 --capath /etc/ssl/certs \
-u alice -P 'your-password' -t 'devices/#' -v
# self-signed / private CA
mosquitto_sub -h mqtt.example.com -p 8883 --cafile ca.crt \
-u alice -P 'your-password' -t 'devices/#' -v-h ile verilen host adı sertifikanın CN/SAN değeriyle eşleşmelidir, aksi halde doğrulama başarısız olur. Daha fazla CLI seçeneği için mosquitto_pub/sub kopya kağıdına bakın.
Let’s Encrypt sertifikası kullanmak
Herkese açık olarak güvenilen bir sertifika, client’ların özel bir CA dosyasına ihtiyaç duymaması anlamına gelir. Broker host adınız için certbot ile bir sertifika alın (HTTP challenge için 80 portunun erişilebilir olması gerekir), ardından Mosquitto’yu live dosyalarına yönlendirin:
listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/fullchain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pemcert.pemdeğilfullchain.pemkullanın — client’ların ara (intermediate) sertifikaya ihtiyacı var.mosquittokullanıcısının key’i okuyabilmesi gerekir; varsayılan olarak/etc/letsencryptyalnızca root tarafından okunabilir. Birçok kurulum, dosyaları bir certbot deploy hook’u ile/etc/mosquitto/certs/içine kopyalar ve sahipliği orada ayarlar.- Sertifikalar birkaç ayda bir yenilenir. Broker’ın yeni sertifikayı alması için deploy hook’una
systemctl reload mosquittoekleyin.
Hepsini bir araya getirmek
listener 1883 127.0.0.1
listener 8883
certfile /etc/mosquitto/certs/fullchain.pem
keyfile /etc/mosquitto/certs/privkey.pem
listener 8884
protocol websockets
certfile /etc/mosquitto/certs/fullchain.pem
keyfile /etc/mosquitto/certs/privkey.pem
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/aclElle düzenlemek yerine bu dosyayı mosquitto.conf oluşturucu ile üretebilirsiniz. Büyük resim için — client ID politikaları, hız sınırları, izleme — MQTT güvenliği için en iyi uygulamalar yazısını okuyun; client’lar “not authorised” hatasıyla başarısız olmaya başlarsa bağlantı hataları rehberi her kodu açıklar.
Sıkça sorulan sorular
Mosquitto parola dosyasını yeniden başlatmadan nasıl yeniden yüklerim?
Broker’a bir SIGHUP gönderin; örneğin sudo systemctl reload mosquitto ya da broker PID’siyle kill -HUP. Mosquitto SIGHUP aldığında parola dosyasını ve ACL dosyasını yeniden okur, böylece mevcut client’lar bağlı kalır.
Mosquitto ACL dosyasında %u ne anlama gelir?
Bir pattern satırında %u bağlanan client’ın kullanıcı adıyla, %c ise client ID’siyle değiştirilir. pattern readwrite devices/%u/# her kullanıcının yalnızca kendi adı altındaki topic’lere erişmesini sağlar.
Mosquitto Let’s Encrypt sertifikası kullanabilir mi?
Evet. certfile’ı fullchain.pem’e, keyfile’ı privkey.pem’e yönlendirin, mosquitto kullanıcısının bu dosyaları okuyabildiğinden emin olun ve her yenilemeden sonra broker’ı reload edin. Client’lar bu durumda sunucuyu sistemin CA deposuyla doğrular.