Açıkta kalan MQTT broker'lar, internetin herhangi bir yerinden, çoğu zaman düz 1883 portunda ve kimlik doğrulaması olmadan bağlantı kabul eden sunuculardır. Bu yazı, bir saldırganın veya meraklı bir yabancının böyle bir broker'da neler görüp yapabileceğini, kendi broker'larınızdan birinin açıkta olup olmadığını nasıl kontrol edeceğinizi ve bunu nasıl düzelteceğinizi açıklıyor. Sonunda kısa bir denetim kontrol listesine ve test verisi ile üretim verisinin nereye ait olduğuna dair net bir kurala sahip olacaksınız.
Açıkta Kalan MQTT Broker'lar Neden Ortaya Çıkmaya Devam Ediyor?
MQTT basit olacak şekilde tasarlandı. Varsayılan bir broker kurulumu genellikle TCP 1883 portunu dinler ve bazı eski veya geliştirme odaklı yapılandırmalar kutudan çıktığı hâliyle anonim bağlantılara izin verir. Bu bir dizüstü bilgisayarda mükemmeldir, herkese açık IP adresine sahip bir bulut sanal makinesinde ise tehlikelidir.
Güvenlik araştırmacıları ve internete bağlı servisleri indeksleyen arama motorları, 1883 portunda yanıt veren ve kimlik bilgisi olmadan bağlantı kabul eden çok sayıda broker'ı defalarca raporladı. Arkalarındaki kalıp genellikle aynıdır:
- Bir geliştirici prototipi çalıştırmak için bir sanal makinede Mosquitto veya başka bir broker başlatır.
- Saha cihazlarının ulaşabilmesi için bulut güvenlik duvarı veya güvenlik grubu 1883'e "geçici olarak" açılır.
- Cihazlara hiçbir zaman kimlik bilgisi verilmediği için anonim erişim etkin kalır.
- Prototip sessizce üretime dönüşür.
Bu adımların hiçbiri tek başına riskli görünmez. Birlikte ise herkesin okuyup yazabildiği bir mesaj yolu oluştururlar.
Açık Bir Broker Neleri Açığa Çıkarır?
Riski anlamak için bir MQTT broker'ın ne yaptığını hatırlayın: yayınlanan her mesajı eşleşen her aboneye yönlendirir. Herkes bağlanabiliyorsa herkes abone olabilir ve çok seviyeli wildcard #, broker'ın işlediği her topic'le eşleşir.
| Maruziyet | Pratikte anlamı | Tipik etki |
|---|---|---|
# ile her şeyi okumak |
Tüm telemetri, durum mesajları ve retained değerler bilinmeyen bir istemciye akar | Konum, doluluk, üretim verisi ve iç ana bilgisayar adı sızıntıları |
| Retained mesajlar | Her topic'teki son değer abone olunduğu anda iletilir | Boşta duran bir sistem bile tüm topic ağacını ve bilinen son durumunu ele verir |
| Herhangi bir topic'e yayın yapmak | Yetkisiz istemciler komut veya sahte telemetri gönderebilir | Cihazlar sahte komutlara göre hareket eder; panolar yanlış veri gösterir |
$SYS topic'leri |
Broker istatistikleri ve bazen istemci bilgileri | Saldırıları hedeflemeye yardımcı olan sürüm, yük ve istemci sayılarını açığa çıkarır |
| Payload'larda kimlik bilgileri | Bazı sistemler yapılandırma, token veya Wi-Fi bilgilerini yayınlar | Diğer sistemlere yanal hareket |
| Kaynak istismarı | Yabancılar broker'ı ücretsiz altyapı olarak kullanır | Bant genişliği maliyetleri, hizmet kalitesinde düşüş, barındırılan içerik için hukuki risk |
Yazma tarafı çoğu zaman hafife alınır. Akıllı bir röle home/garage/door/set topic'ine abone oluyorsa ve broker anonim yayıncıları kabul ediyorsa, kapıyı broker'ı bulan kişi kontrol eder. Endüstriyel ortamlarda aynı kalıp set değerlerini ve makine komutlarını etkiler. MQTT güvenliğinin şifreleme kadar yetkilendirmeyle de ilgili olmasının nedeni budur.
Hiçbir Saldırı Olmadan Bilgi Sızıntıları
Zarar oluşması için kötü niyet gerekmez. acme/plant2/line4/press7/fault gibi bir topic ağacı, bir rakibe tesis yerleşiminizi anlatır. Retained mesajlar firmware sürümlerini içerebilir; bu da bilinen hatalara sahip cihazları arayan herkesin işine yarar. Hata ayıklama topic'leri genellikle stack trace'ler, IP adresleri veya tam yapılandırma dökümleri taşır. Güvenli varsayım, açık bir broker'a yayınlanan her şeyin herkese açık olduğudur.
Kendi Broker'ınızın Açıkta Olup Olmadığını Nasıl Kontrol Edersiniz?
Yalnızca size ait olan veya test etmeye açıkça yetkili olduğunuz broker'ları test edin. Buradaki amaç, kendi yapılandırmanızı bir internet tarayıcısının göreceği şekilde dışarıdan doğrulamaktır.
Bu kontrolleri şirket veya bulut ağınızın dışındaki bir ağdan, örneğin bir mobil erişim noktasından çalıştırın:
# 1. Düz MQTT portuna internetten erişilebiliyor mu?
nc -vz your-broker.example.com 1883
# 2. Anonim bağlantı kabul ediyor mu? (yalnızca kendi broker'ınız)
mosquitto_sub -h your-broker.example.com -p 1883 -i audit-anon-check -t 'audit/probe' -W 5 -v
# 3. TLS portu geçerli bir sertifika sunuyor mu?
openssl s_client -connect your-broker.example.com:8883 -servername your-broker.example.com </dev/null | head -20
Sonuçları şöyle yorumlayın:
ncportun açık olduğunu bildiriyorsa ve düz MQTT'yi herkese açık sunmayı amaçlamadıysanız, güvenlik duvarında kapatın.mosquitto_sub"not authorised" hatasıyla başarısız olmak yerine bağlanıp bekliyorsa anonim erişim etkindir. Devre dışı bırakın.- Sertifika kendinden imzalıysa, süresi dolmuşsa veya ana bilgisayar adıyla eşleşmiyorsa, istemciler ya başarısız olur ya da daha kötüsü doğrulamayı atlayacak şekilde yapılandırılmıştır.
Broker yapılandırmanızı da doğrudan gözden geçirin. Örneğin Mosquitto 2.x'te allow_anonymous false ve bir şifre ya da kimlik doğrulama eklentisi olmayan bir listener kırmızı bayraktır. 8083 ve 9001 gibi portlardaki, sıklıkla unutulan WebSocket listener'ları dahil her listener'ı kontrol edin.
Açıkta Kalan Bir MQTT Broker Nasıl Düzeltilir?
Bu adımları sırayla izleyin. İlk üçü riskin büyük kısmını bir öğleden sonra içinde ortadan kaldırır.
- Her listener'da kimlik doğrulamayı zorunlu kılın. Cihaz veya servis başına benzersiz bir kullanıcı adı ve şifre ya da bir istemci sertifikası verin. Paylaşılan kimlik bilgileri iptali imkânsız kılar. MQTT kullanıcı adı ve şifre ile kimlik doğrulama rehberi pratik kurulumu ele alır.
- 1883 portunu internete kapatın. Düz MQTT'yi localhost veya özel bir ağ için tutun ve yalnızca 8883'te TLS'i (tarayıcıların erişmesi gerekiyorsa güvenli WebSocket'i) dışarıya açın.
- Güvenilir bir CA'dan alınmış sertifikayla TLS'i etkinleştirin. İstemciler sunucu sertifikasını ve ana bilgisayar adını doğrulamalıdır. İstemci ve broker ayarları için MQTT TLS yapılandırması yazısına bakın.
- Her kimliğin neye yayın yapıp abone olabileceğini kısıtlayın. Kendi barındırdığınız bir broker'da, bir sıcaklık sensörünün
#topic'ine abone olamaması veya komut yayınlayamaması için ACL'ler kullanın. MQTT ACL rehberi yaygın kalıpları gösterir. - Hassas verileri payload'lardan ve retained topic'lerden kaldırın. Artık ihtiyaç duymadığınız retained mesajları, topic'e boş bir retained mesaj yayınlayarak temizleyin.
- Limitler uygulayın. Tek bir istemcinin broker'ı tüketememesi için bağlantıları, mesaj boyutunu ve mesaj hızını sınırlayın.
- Yama yapın ve izleyin. Broker sürümünü güncel tutun ve tekrarlanan başarısız girişleri takip edin.
Bu liste tek seferlik bir düzeltmeden çok süregelen bir iş gibi geliyorsa, bunun nedeni gerçekten öyle olmasıdır. Ekiplerin internete açık bir sunucuyu kendileri işletmek yerine bir yönetilen MQTT broker'a geçmesinin ana nedenlerinden biri de budur.
Herkese Açık Test Broker'ları ve Özel Broker'lar
Yanlışlıkla açıkta kalan bir broker ile bilinçli olarak herkese açık bir broker arasında önemli bir fark vardır. Herkese açık bir test broker'ı açık olacak şekilde tasarlanmıştır: herkes bağlanabilir, herkes abone olabilir ve herkes verinin görünür olduğunu bilir. Öğrenme ve hızlı denemeler için bir araçtır.
ConnectMQ, broker.connectmq.com adresinde böyle bir broker çalıştırır. Boş olmayan, benzersiz herhangi bir client ID ile anonim istemcileri kabul eder ve istemci başına mesaj başına 64 KB, saniyede 10 mesaj ve 10 abonelik gibi temkinli limitler uygular. Bu da onu kod denemek için ideal kılar:
mosquitto_sub -h broker.connectmq.com -p 1883 -i demo-sub-7f3a -t 'connectmq/demo/7f3a/#' -v
mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-pub-7f3a -t 'connectmq/demo/7f3a/hello' -m 'test message'
Kural basittir: herkese açık MQTT test broker'ı yalnızca test verisi içindir. Herhangi bir herkese açık broker'a asla gerçek müşteri verisi, kimlik bilgileri, konumlar veya gerçek ekipmanlar için kontrol komutları yayınlamayın. Denemelerinizin başkalarınınkiyle çakışmaması için connectmq/demo/<random-id>/ gibi benzersiz bir topic öneki kullanın.
Projeniz denemelerin ötesine geçtiğinde, kimlik doğrulama ve TLS içeren özel bir broker'a ihtiyaç duyar. ConnectMQ'da bir tane oluşturduğunuzda oluşturulmuş kimlik bilgileri alırsınız ve client ID'ler bu kimlik bilgilerine bağlıdır; dolayısıyla sızan bir client ID tek başına bağlanmak için yeterli değildir.
Yönetilen Bir Broker Neyi Değiştirir?
Barındırılan bir servise geçmek sizi otomatik olarak güvenli kılmaz, ancak maruziyetin en yaygın nedenlerini ortadan kaldırır. Özel bir ConnectMQ broker'ında:
- Bağlantılar portalda oluşturulan kullanıcı adı ve şifreyi gerektirir.
- 8883 portunda TLS ve 8084'te güvenli WebSocket, Let's Encrypt sertifikasıyla sunulur; böylece istemciler özel CA dosyaları olmadan sunucuyu doğrulayabilir.
- Çok kiracılı kümede tenant'lar birbirinden izole edilir.
- Plan başına kotalar, flood koruması ve tekrarlanan başarısız girişlerden sonra IP engelleme kötüye kullanımı sınırlar.
Kendi tarafınız yine size aittir: cihazlardaki kimlik bilgilerini koruyun, üretimde TLS kullanın ve topic'leri bilgi sızdırmayacak şekilde tasarlayın. Seçeneklere genel bir bakış için bulut MQTT broker rehberi dağıtım modellerini karşılaştırır, MQTT güvenliği en iyi uygulamaları yazısı da istemci tarafını derinlemesine ele alır.
Hızlı Denetim Kontrol Listesi
İşlettiğiniz her broker için bu listeyi kullanın:
- Bilinçli olarak herkese açık değilse hiçbir listener anonim bağlantı kabul etmez.
- 1883 portuna internetten erişilemez; herkese açık uç noktalarda TLS zorunludur.
- Her cihaz veya servisin kendi kimlik bilgileri vardır ve bunları nasıl iptal edeceğinizi bilirsiniz.
- İstemciler sunucu sertifikasını ve ana bilgisayar adını doğrular.
- Herkese açık test broker'larında hiçbir sır, kişisel veri veya kontrol topic'i yayınlanmaz.
- Retained mesajlar, bir yabancının okumasını istemeyeceğiniz hiçbir şey içermez.
- Bağlantı, boyut ve hız limitleri yapılandırılmıştır.
- Başarısız girişler görünürdür ve tekrarlanan başarısızlıklar engellenir.
Özel Bir ConnectMQ Broker ile Başlayın
Prototipiniz bugün açık bir broker'da çalışıyorsa en hızlı çözüm onu özel bir broker'a taşımaktır. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz Serverless planında bir broker oluşturun, oluşturulan kimlik bilgilerini kopyalayın ve istemcilerinizi 8883 portunda mqtts:// kullanacak şekilde değiştirin. Test kodunuz broker.connectmq.com üzerinde çalışmaya devam ederken üretim verisi gizli kalır.
Sık Sorulan Sorular
1883 portu her zaman güvensiz mi?
1883 portu şifrelenmemiş MQTT taşır; bu yüzden kimlik bilgileri ve payload'lar düz metin olarak iletilir. Localhost veya izole bir ağda kabul edilebilir, ancak internete açık uç noktalar 8883'te TLS kullanmalıdır.
Yabancıların broker'ımı okuyup okumadığını nasıl anlarım?
Kimlik doğrulama olmadan bunu güvenilir şekilde anlayamazsınız, çünkü herhangi bir istemci sessizce # topic'ine abone olabilir. İnternete açık anonim bir broker'ı zaten açığa çıkmış kabul edin ve taşıdığı tüm sırları yenileyin.
Projem için broker.connectmq.com kullanmak güvenli mi?
Hassas olmayan verilerle öğrenme ve test için güvenlidir. Tasarım gereği herkese açık olduğundan oraya yayınlanan her şey başkaları tarafından okunabilir; bu yüzden üretim sistemleri kimlik bilgileri kullanan özel bir broker kullanmalıdır.
Anonim erişimi devre dışı bırakmak tüm saldırıları durdurur mu?
Hayır, ancak en kolay olanını ortadan kaldırır. Gerçek koruma için kimlik doğrulamayı TLS, istemci başına yetkilendirme, limitler ve yamalarla birleştirin.



