MQTT kiracı izolasyonu, bir müşterinin başka bir müşterinin mesajlarını asla okuyamamasını, yazamamasını veya yavaşlatamamasını garanti eden şeydir. Bu yazıda mantıksal ve fiziksel izolasyon arasındaki farkı, gürültülü komşu korumasının nasıl çalıştığını, hangi hata senaryolarını test etmeniz gerektiğini ve her müşteri için doğru ayrım seviyesini nasıl seçeceğinizi öğreneceksiniz.
Kiracı İzolasyonu Neden Önemlidir?
Ürününüz farklı müşterilere ait cihazları bağlıyorsa, broker onların verilerini yan yana tutuyor demektir. Gereğinden fazla eşleşen bir joker karakterli abonelik, paylaşılan bir kimlik bilgisi veya bir client ID çakışması gibi tek bir hata, bir müşterinin telemetrisini diğerine açabilir ya da hatalı davranan bir filonun herkesin hizmetini bozmasına yol açabilir. Bu olayları müşterilere açıklamak zordur ve temizlemek pahalıdır.
İzolasyonun üç boyutu vardır ve iyi bir tasarım üçünü de ele alır:
- Gizlilik. Bir kiracı başka bir kiracının mesajlarını, retained değerlerini veya oturum verilerini okuyamaz.
- Bütünlük. Bir kiracı başka bir kiracının topic'lerine yayın yapamaz veya oturumlarını ele geçiremez.
- Erişilebilirlik. Bir kiracı, diğerlerinin zarar göreceği kadar kapasite tüketemez.
Mantıksal ve Fiziksel İzolasyon
Mantıksal İzolasyon
Mantıksal izolasyonda kiracılar aynı broker süreçlerini ve makinelerini paylaşır, onları birbirinden yazılım ayırır. Her kiracının kendi kimlikleri ve kendi topic alanı vardır; kiracı başına kotalar kaynak kullanımını sınırlar. Paylaşımlı bulut hizmetlerinin çoğu bu şekilde çalışır ve dikkatle uygulandığında gizlilik ve bütünlük için güçlü bir sınırdır.
Sınırı, fiziksel kaynakların yine de havuzlanmasıdır. Kotalar gürültülü bir komşunun etkisini sınırlar; ancak paylaşımlı bir kümedeki kiracı, diğer herkesten bağımsız kapasite garantileri alamaz.
Fiziksel İzolasyon
Fiziksel izolasyonda bir kiracı kendi kümesini alır: ayrı süreçler, ayrı makineler ve çoğu zaman ayrı ağ uç noktaları. Başka bir müşterinin yaptığı hiçbir şey onun CPU'suna, belleğine veya bağlantılarına dokunamaz. Kapasite havuzlanmak yerine ayrıldığı için daha pahalıdır ve provizyonlanması daha uzun sürer.
Bir adım ötesi, bu dedicated kümeyi müşterinin kendi bulut hesabına yerleştirmektir; bu da altyapının kendisinin sahipliğini ekler. Bu, BYOC MQTT broker yazısında anlatılan kendi bulutunuzu getirin modelidir.
| İzolasyon seviyesi | Başkalarıyla paylaşılan | Neye karşı korur | Tipik tercih |
|---|---|---|---|
| Yalnızca topic öneki (zorunlu kılınmamış) | Her şey | Yalnızca kazara karışıklık | Tek sahipli dahili uygulamalar |
| Mantıksal, kiracı başına broker kimliği | Donanım, süreçler | Veri sızıntıları, kimlik taklidi, sınırlandırılmış gürültülü komşular | Çoğu SaaS müşterisi, prototipler |
| Fiziksel, dedicated küme | Broker düzeyinde hiçbir şey | Gürültülü komşuları tamamen | Büyük filolar, katı SLA'lar, mevzuata tabi müşteriler |
| Fiziksel, müşteri hesabında | Hiçbir şey; altyapı müşteriye ait | Altyapı sahipliği gereksinimleri | Veri kontrolü ve uyumluluk politikaları |
Uygulamada Gürültülü Komşu Koruması
Gürültülü komşular nadiren kötü niyetlidir. Olağan nedenler sıradandır:
- Hata durumunda hemen yeniden bağlanan ve bir bağlanma fırtınası yaratan firmware.
- Gecikme olmadan sıkı bir döngüde yayın yapan bir test betiği.
- Küçük JSON beklenen yerlere gönderilen görüntüler gibi aşırı büyük payload'lar.
- Hiç abonelikten çıkmayan bir client'ın oluşturduğu binlerce abonelik.
Etkili koruma, client ve kiracı düzeyinde çalışır: bağlantılar, mesaj hızı, payload boyutu ve abonelikler için üst sınırlar; tekrarlanan başarısız oturum açma denemelerinden sonra adreslerin engellenmesi ve client'a net geri bildirim. MQTT 5'te 0x97 (Quota exceeded) reason code'u, client'a bir yayının veya bağlantının neden reddedildiğini tam olarak söyler. MQTT broker bağlantı kotalarının client tasarımını nasıl etkilediği hakkında daha fazla bilgi edinin.
Temel Kimliktir
İzolasyon en hızlı kimlik katmanında çöker. Şu kurallara uyun:
- Kimlik bilgilerini kiracılar arasında asla paylaşmayın. Her müşteri kendi kimlik bilgilerini alır; ideal olarak her cihaz da öyle.
- Client ID'leri kimlik bilgilerine bağlayın. MQTT'de aynı client ID ile yapılan ikinci bir bağlantı ilkini düşürür. Client ID'ler kimliklere bağlı değilse, bir kiracı diğerinin ID'lerini yeniden kullanarak onu aksatabilir.
- Her yerde TLS kullanın. Herkese açık bir ağda düz TCP üzerinden gönderilen kimlik bilgileri ele geçirilebilir. Canlı ortamda varsayılan 8883 veya 8084 portu olmalıdır.
- Gizli anahtarları yenileyin. Cihazların yeni kimlik bilgilerini nasıl alacağı dahil, rotasyonu ilk günden planlayın.
MQTT güvenliği en iyi uygulamaları rehberi bu kontrolleri daha derinlemesine ele alır.
İzolasyonunuzu Test Etmek
İzolasyonun çalıştığını varsaymayın; doğrulayın. Minimal bir test planı:
- A kiracısının kimlik bilgileriyle bir client bağlayın ve
#'e abone olun. B kiracısından yayın yapın. A kiracısı hiçbir şey almamalıdır. - A kiracısının kimlik bilgileriyle B kiracısının client ID'sini kullanarak bağlanmayı deneyin. Broker bunu reddetmelidir.
- B kiracısı olarak retained message'lar yayınlayın, ardından A kiracısı olarak aynı topic adına abone olun. Hiçbir retained message gelmemelidir.
- A kiracısından bağlantı veya hız limitini aşın. B kiracısının gecikmesinin ve bağlantılarının etkilenmediğini doğrulayın.
- Tek bir adresten A kiracısı için tekrar tekrar başarısız oturum açma denemesi yapın. Engellemenin B kiracısına değil, o adrese uygulandığını doğrulayın.
İşte 1. test için paho-mqtt 2.x kullanan küçük bir Python betiği. Başka bir client B kiracısının bilgileriyle yayın yaparken bunu A kiracısının bilgileriyle çalıştırın.
import ssl
import time
import paho.mqtt.client as mqtt
received = []
def on_connect(client, userdata, flags, reason_code, properties):
print("Tenant A connected:", reason_code)
client.subscribe("#", qos=0)
def on_message(client, userdata, msg):
received.append(msg.topic)
print("Unexpected message:", msg.topic)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID",
protocol=mqtt.MQTTv5)
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set(cert_reqs=ssl.CERT_REQUIRED)
client.on_connect = on_connect
client.on_message = on_message
client.connect("YOUR_BROKER_HOST", 8883, keepalive=30)
client.loop_start()
time.sleep(60) # bu süre içinde B kiracısından yayın yapın
client.loop_stop()
print("Isolation OK" if not received else f"Leak: {len(received)} messages")
Kendi broker'ınızda elbette kendi kiracınızın trafiğini görürsünüz; bu yüzden bu testi kendine ait yayıncısı olmayan bir kiracıyla çalıştırın.
ConnectMQ Kiracıları Nasıl İzole Eder?
ConnectMQ, plana bağlı olarak farklı güçlerde izolasyon uygular:
- Serverless (Free ve Paid). Broker'lar çok kiracılı izolasyonla bir kümeyi paylaşır. Her broker'ın otomatik oluşturulmuş kimlik bilgileri, bu kimlik bilgilerine bağlı client ID'leri ve plan başına kotaları vardır; örneğin ücretsiz planda 25'e, ücretli planda 1.000'e kadar bağlantı. Flood koruması ve tekrarlanan başarısız oturum açma denemelerinden sonra IP engelleme paylaşımlı kümeyi korur.
- Dedicated. Broker'ınız izole bir kümede çalışır; böylece kapasitesini başka hiçbir müşteri paylaşmaz.
- BYOC. Broker sizin kendi bulut hesabınızda çalışır ve ConnectMQ tarafından yönetilir.
- Self Managed Enterprise. Platformu kendisi işleten kuruluşlar için.
broker.connectmq.com adresindeki herkese açık test broker'ı bilinçli olarak izolasyonun tam tersidir: demo alanı herkes tarafından okunabilir ve yalnızca denemeler için tasarlanmıştır. Öğrenmek için kullanın, müşteri verileri için asla kullanmayın. Ücretsiz herkese açık MQTT broker sayfası limitlerini listeler.
Doğru Seviyeyi Seçmek
Teknik olarak neyin mümkün olduğundan değil, müşterilerinizin ve sözleşmelerinizin neyi gerektirdiğinden başlayın:
- Müşteri verisi yok, yalnızca öğrenme: herkese açık broker.
- Kendi ürününüz, tüm verilerin tek sahibi: özel bir Serverless broker.
- Olağan gereksinimlere sahip çok sayıda müşteri: müşteri başına bir izole broker veya kendi arka ucunuzda ayrımı sıkı şekilde zorunlu kılınan paylaşımlı bir broker.
- Kapasite garantisi veya mevzuat ihtiyacı olan müşteriler: Dedicated veya BYOC.
SaaS ürünlerinin bu seçenekleri nasıl birleştirdiğini görmek için IoT SaaS için MQTT yazısına bakın.
ConnectMQ ile Başlayın
Kredi kartı gerekmeden app.connectmq.com adresindeki ücretsiz Serverless planında dakikalar içinde izole bir broker oluşturun. Bir müşteri daha güçlü garantilere ihtiyaç duyduğunda, onu aynı client koduyla Dedicated bir kümeye veya BYOC'ye taşıyın. Yönetilen MQTT broker genel bakışı ve bulut MQTT broker rehberi planları daha ayrıntılı açıklar.
Sık Sorulan Sorular
Mantıksal ve fiziksel MQTT izolasyonu arasındaki fark nedir?
Mantıksal izolasyon, kiracıları paylaşımlı makinelerde yazılımla ayrı tutar; fiziksel izolasyon ise bir kiracıya kendi kümesini verir. Fiziksel izolasyon gürültülü komşu etkilerini de tamamen ortadan kaldırır.
Paylaşımlı bir broker'daki başka bir müşteri mesajlarımı okuyabilir mi?
Sağlayıcı kiracıları doğru şekilde izole ediyorsa hayır. Her kiracının kendi kimlik bilgileri ve topic alanı olmalıdır; bunu bir joker karakterli abonelik testiyle doğrulayabilirsiniz.
Bir kiracı kotasını aştığında ne olur?
Broker fazladan bağlantıyı veya mesajı reddeder. MQTT 5 client'ları 0x97 gibi bir reason code alır; böylece geri çekilip nedeni loglayabilirler.
Herkese açık test broker'ı izole mi?
Hayır. broker.connectmq.com'un herkese açık alanı herkes tarafından okunabilir ve yalnızca test amaçlıdır.



