MQTT Güvenliği

MQTT Kullanıcı Adı ve Şifre ile Kimlik Doğrulama Rehberi

Kullanıcı adı ve şifrenin MQTT CONNECT paketinde nasıl taşındığı, neden her zaman TLS ile birlikte kullanılması gerektiği, broker'ların hatalı kimlik bilgilerini nasıl reddettiği ve yönetilen bir broker'da cihaz başına kimlik bilgilerinin nasıl yönetileceği.

Bir cihazın TLS tüneli üzerinden broker'a kimlik bilgileri gönderdiği MQTT kullanıcı adı şifre doğrulaması illüstrasyonu
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

MQTT kullanıcı adı ve şifre ile kimlik doğrulama, bir istemcinin kimliğini broker'a kanıtlamasının en yaygın yoludur ve aynı zamanda en sık yanlış yapılandırılan yöntemdir. Bu rehberde kimlik bilgilerinin CONNECT paketinde tam olarak nasıl taşındığını, neden yalnızca TLS içinde güvenli olduklarını, yanlış olduklarında hangi reason code'ları aldığınızı ve cihaz başına bir kimlik bilgisi setinin nasıl yönetileceğini göreceksiniz.

Kimlik Bilgileri CONNECT Paketinde Nasıl Taşınır?

Her MQTT oturumu istemciden gelen bir CONNECT paketiyle başlar. Değişken başlığı bağlantı bayraklarını içerir; bunlardan ikisi User Name Flag ve Password Flag'dir. Bu bayraklar ayarlandığında payload, client ID'den ve isteğe bağlı Will mesajından hemen sonra kullanıcı adını UTF-8 metin, şifreyi ise ikili veri olarak taşır.

CONNECT
  Protocol name:    MQTT
  Protocol level:   5 (MQTT 5.0) or 4 (MQTT 3.1.1)
  Connect flags:    username=1, password=1, clean start=1
  Keep alive:       60
  Payload:
    Client ID:      sensor-0042
    Username:       YOUR_USERNAME
    Password:       YOUR_PASSWORD   <- raw bytes, not hashed

MQTT katmanında hash, challenge veya şifreleme yoktur. Şifre olduğu gibi gönderilir. 1883 portundaki TCP akışını okuyabilen herkes, bir paket yakalama aracıyla şifreyi saniyeler içinde okuyabilir.

Bilinmesi gereken birkaç protokol detayı:

  • MQTT 3.1.1'de şifre yalnızca bir kullanıcı adı da gönderiliyorsa gönderilebilir. MQTT 5.0 bunu gevşetti ve şifrenin tek başına gönderilmesine izin verdi, ancak çoğu broker hâlâ ikisini birden bekler.
  • Şifre alanı ikili olduğundan token'lar dahil rastgele baytlar taşıyabilir. MQTT JWT kimlik doğrulama gibi token tabanlı yöntemler aynı alanı bu şekilde yeniden kullanır.
  • MQTT 5.0 ayrıca challenge-response mekanizmaları için bir Authentication Method özelliği ve AUTH paketleri aracılığıyla gelişmiş kimlik doğrulamayı tanımlar. Kullanıcı adı ve şifre ise yaygın temel olmaya devam eder.

Şifrelerle Birlikte TLS Neden Zorunludur?

Şifre ağda düz metin olarak geçtiği için, güvenilmeyen herhangi bir ağda TLS olmadan MQTT kullanıcı adı ve şifre ile kimlik doğrulama, hiç kimlik doğrulama olmamasından pek de iyi değildir. TLS, CONNECT paketi dahil tüm oturumu şifreler ve istemcinin kimlik bilgilerini toplayan bir sahtekârla değil gerçek broker'la konuştuğunu doğrulamasını sağlar.

Port Taşıma Kimlik bilgileri için güvenli mi?
1883 Düz TCP üzerinden MQTT Hayır, şifre hatta görünür
8883 TLS üzerinden MQTT Evet, sertifika doğrulamasıyla
8083 WebSocket üzerinden MQTT Hayır
8084 Güvenli WebSocket üzerinden MQTT (/mqtt) Evet

ConnectMQ'da kimlik bilgisi gönderdiğiniz her durumda cihazlar ve servisler için 8883, tarayıcılar için 8084 portunu kullanın. Broker, masaüstü ve sunucu işletim sistemlerindeki standart CA paketleri tarafından güvenilen bir Let's Encrypt sertifikası sunar. Gömülü istemcilerin kök CA'yı firmware'e dahil etmesi gerekir; bu adımı MQTT TLS yapılandırması rehberi ele alır.

Sertifikayı da doğrulayın. Doğrulamayı devre dışı bırakmak (insecure, setInsecure(), rejectUnauthorized: false) size pasif dinlemeye karşı şifreleme sağlar, ancak bağlantıyı araya girip kendi sertifikasını sunan bir saldırgana karşı hiçbir koruma sağlamaz.

Kullanıcı Adı ve Şifre ile Bağlanmak

Örnekler, portalda bir broker oluşturduğunuzda aldığınız YOUR_USERNAME, YOUR_PASSWORD ve YOUR_CLIENT_ID yer tutucularını kullanır. Henüz bir broker kurmadıysanız bulut MQTT broker rehberi barındırma seçeneklerini adım adım anlatır.

Python (paho-mqtt 2.x)

import os
import ssl
import paho.mqtt.client as mqtt

HOST = os.environ.get("MQTT_HOST", "YOUR_BROKER_HOST")
USERNAME = os.environ["MQTT_USERNAME"]   # asla kaynak kontrolüne sabit olarak yazmayın
PASSWORD = os.environ["MQTT_PASSWORD"]
CLIENT_ID = os.environ["MQTT_CLIENT_ID"]

def on_connect(client, userdata, flags, reason_code, properties):
    if reason_code.is_failure:
        print("Rejected:", reason_code)   # ör. Bad user name or password
        client.disconnect()
        return
    print("Authenticated")
    client.publish(f"devices/{CLIENT_ID}/status", "online", qos=1, retain=True)

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                     client_id=CLIENT_ID, protocol=mqtt.MQTTv5)
client.username_pw_set(USERNAME, PASSWORD)
client.tls_set(cert_reqs=ssl.CERT_REQUIRED)
client.on_connect = on_connect
client.connect(HOST, 8883, keepalive=60)
client.loop_forever()

Komut Satırı

mosquitto_pub -h YOUR_BROKER_HOST -p 8883 \
  --cafile /etc/ssl/certs/ca-certificates.crt \
  -i YOUR_CLIENT_ID -u YOUR_USERNAME -P "$MQTT_PASSWORD" \
  -t 'devices/YOUR_CLIENT_ID/status' -m online -V mqttv5

Şifreyi komut satırına yazmak yerine bir ortam değişkeninden okuyun; aksi takdirde kabuk geçmişine ve süreç listelerine düşer.

Kimlik Bilgileri Yanlış Olduğunda Ne Olur?

Broker, CONNECT'e bir CONNACK ile yanıt verir. Kod, sorunun kimlik bilgilerinde mi yoksa yetkilendirmede mi olduğunu söyler:

Durum MQTT 3.1.1 CONNACK MQTT 5.0 reason code
Kabul edildi 0x00 0x00 Success
Client ID reddedildi 0x02 Identifier rejected 0x85 Client Identifier not valid
Yanlış kullanıcı adı veya şifre 0x04 Bad user name or password 0x86 Bad User Name or Password
Geçerli kimlik bilgileri, izin yok 0x05 Not authorized 0x87 Not authorized

Ayrıntılı sorun giderme adımları MQTT bağlantısı reddedildi: not authorized yazısında yer alıyor. Her istemci için iki pratik kural geçerlidir:

  1. Sıkı bir döngüde hemen yeniden denemeyin. Yanlış kimlik bilgileri kendiliğinden düzelmez ve birçok broker hızlı başarısızlıkları saldırı olarak değerlendirir. ConnectMQ, tekrarlanan başarısız girişlerden sonra IP adreslerini engeller; bu nedenle broker'ı bombardımana tutan yanlış yapılandırılmış bir filo kendi kendini kilitleyebilir.
  2. Jitter ile üstel geri çekilme (exponential backoff) kullanın ve kimlik doğrulama hatalarını ağ hatalarından ayrı olarak günlüklerde veya cihaz durumunda gösterin.

Cihaz Başına Kimlik Bilgileri: Neden ve Nasıl?

Çoğu projenin başladığı kestirme yol, her cihaza gömülmüş tek bir ortak kullanıcı adı ve şifredir. İlk gün çalışır, sonrasında ise sorun çıkarır:

  • Sızdırılan tek bir cihaz tüm filoyu açığa çıkarır.
  • Hepsini yeniden flaşlamadan tek bir cihazın erişimini iptal edemezsiniz.
  • Günlükler hangi cihazın sorun çıkardığını söyleyemez.

Cihaz başına kimlik bilgileri bu üç sorunu da çözer. Kendi barındırdığınız bir Mosquitto broker'da bir şifre dosyası tutarsınız:

# Dosyayı ilk kullanıcıyla oluşturun, ardından -c olmadan diğerlerini ekleyin
mosquitto_passwd -c /etc/mosquitto/passwd sensor-0001
mosquitto_passwd /etc/mosquitto/passwd sensor-0002
# mosquitto.conf
listener 8883
certfile /etc/mosquitto/certs/server.crt
keyfile  /etc/mosquitto/certs/server.key
allow_anonymous false
password_file /etc/mosquitto/passwd

Dosya şifrelerin kendisini değil, tuzlanmış hash'lerini saklar ve değişikliklerden sonra broker'ın yeniden yüklenmesi gerekir. Bunu kendiniz işletmek, TLS sertifikasını yenilemeyi ve dosyayı örnekler arasında senkronize tutmayı da gerektirir.

ConnectMQ'da Cihaz Başına Kimlik Bilgileri

ConnectMQ ile kimlik bilgilerini broker sizin için oluşturur. Portalda bir broker oluşturduğunuzda bir kullanıcı adı, şifre ve client ID alırsınız; client ID, verilen kimlik bilgilerine bağlıdır. Bu bağlama önemlidir: çalınan bir şifre rastgele bir client ID ile kullanılamaz ve iki cihaz, aynı bağlı kimlik için yarışacakları için tek bir kimlik bilgisi setini sessizce paylaşamaz.

Yönetilen bir broker'da önerilen uygulamalar:

  1. Her cihaz veya servis için ayrı bir kimlik bilgisi seti verin ve hangi fiziksel cihazın hangi client ID'yi taşıdığını kaydedin.
  2. Şifreyi kaynak kodda değil, cihazdaki korumalı depolamada saklayın. Bkz. cihazlarda MQTT kimlik bilgilerini güvenli tutmak.
  3. Yalnızca 8883 veya 8084 portundan, sertifika doğrulamasıyla bağlanın.
  4. Değişikliğe hazırlıklı olun: kimlik bilgisi yenileme rehberi, bir filo genelinde kimlik bilgilerini kesinti olmadan nasıl değiştireceğinizi gösterir.

Tenant'lar birbirinden izole edilmiştir; bu nedenle broker'ınız için verilen kimlik bilgileri yalnızca broker'ınızın trafiğine erişim sağlar. Kotalar ve flood koruması plan bazında uygulanır; bu da ele geçirilmiş tek bir istemcinin verebileceği zararı sınırlar.

Kullanıcı Adı ve Şifre ile Diğer Yöntemlerin Karşılaştırması

Yöntem Güçlü yanı Zayıf yanı
TLS üzerinden kullanıcı adı ve şifre Basit, her istemci kütüphanesi tarafından desteklenir Statik sır; saklanması ve yenilenmesi gerekir
İstemci sertifikaları (mTLS) Güçlü kimlik, hatta paylaşılan sır yok İşletilmesi gereken sertifika yaşam döngüsü ve PKI
Şifre alanında JWT Kısa ömürlü, claim taşır Bir token yayıncısı ve cihazlarda saat senkronizasyonu gerekir

Çoğu filo için doğrulanmış TLS üzerinden cihaz başına benzersiz şifreler sağlam bir temeldir. MQTT güvenliği en iyi uygulamaları rehberi, bunun üzerine eklenen katmanları ele alır.

ConnectMQ ile Başlayın

Şifre dosyalarıyla ve sertifika yenilemeleriyle uğraşmayın. ConnectMQ'nun sunduğu barındırılan MQTT broker, 8883 ve 8084 portlarında TLS, client ID'lere bağlı oluşturulmuş kimlik bilgileri ve tekrarlanan başarısız girişler için IP engelleme sağlar. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun.

Sık Sorulan Sorular

MQTT kullanıcı adı ve şifre ile kimlik doğrulama güvenli mi?

Sertifika doğrulamalı TLS ve cihaz başına benzersiz şifrelerle kullanıldığında çoğu kurulum için yeterince güvenlidir. 1883 portunda düz TCP üzerinden ise şifre, trafiği yakalayabilen herkes tarafından görülebilir.

MQTT şifreyi şifreler mi?

Hayır. MQTT şifreyi CONNECT içinde ham baytlar olarak gönderir. Şifreleme yalnızca bağlantıyı saran TLS katmanından gelir.

Herkese açık broker'a kullanıcı adı ve şifre ile bağlanabilir miyim?

broker.connectmq.com adresindeki herkese açık test broker'ı, boş olmayan ve benzersiz herhangi bir client ID ile anonim bağlantıları kabul eder. Kimliği doğrulanmış, özel trafik için kendi broker'ınızı oluşturun ve oluşturulan kimlik bilgilerini kullanın.

0x86 ile 0x87 arasındaki fark nedir?

0x86, kullanıcı adının veya şifrenin yanlış olduğu anlamına gelir. 0x87 ise kimlik bilgilerinin anlaşıldığı, ancak istemcinin bağlanmasına veya işlemi yapmasına izin verilmediği anlamına gelir.

İlgili yazılar

MQTT Kimlik Bilgileri Kesintisiz Nasıl Yenilenir?

Bir filo genelinde MQTT kullanıcı adı ve şifrelerini yenilemek için adım adım çift kimlik bilgisi stratejisi: yeni kimlik bilgisini hazırlayın, geri dönüş seçeneğiyle geçiş yapın, doğrulayın ve ancak ondan sonra eskisini iptal edin.

6 dk okuma

MQTT Kimlik Bilgilerini Gömülü Cihazlarda Güvenle Saklamak

ESP32 ve Linux cihazlarda MQTT kullanıcı adı ve şifrelerini korumanın yollarına pratik bir karşılaştırma; şifrelenmiş NVS ve flash şifrelemeden secure element'lere ve TPM destekli systemd kimlik bilgilerine kadar.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.