Rehberler

Mosquitto’yu Güvenli Hale Getirin: Parolalar, ACL’ler ve TLS

Mosquitto broker’ı adım adım güvenli hale getirin: mosquitto_passwd ile parola dosyası oluşturun, %u ve %c ile ACL kuralları yazın, 8883’te TLS’i açın.

Güncellendi · 8 dk okuma

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:

Kullanıcı oluşturma
# -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 bob

Paylaşı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:

bash
sudo chown mosquitto:mosquitto /etc/mosquitto/passwd
sudo chmod 0700 /etc/mosquitto/passwd

Şimdi broker’a bu dosyayı kullanmasını söyleyin:

/etc/mosquitto/conf.d/secure.conf
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
Test edin
sudo 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 hi

2. 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.

/etc/mosquitto/acl
# --- 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/#
DirektifAnlamı
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:

/etc/mosquitto/conf.d/secure.conf
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.

/etc/mosquitto/conf.d/tls.conf
# 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.key

TLS ç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:

bash
# 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:

ini
listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/fullchain.pem
keyfile  /etc/letsencrypt/live/mqtt.example.com/privkey.pem
  • cert.pem değil fullchain.pem kullanın — client’ların ara (intermediate) sertifikaya ihtiyacı var.
  • mosquitto kullanıcısının key’i okuyabilmesi gerekir; varsayılan olarak /etc/letsencrypt yalnı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 mosquitto ekleyin.

Hepsini bir araya getirmek

/etc/mosquitto/conf.d/secure.conf
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/acl

Elle 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.