ESP8266'yı port yönlendirmesi olmadan denetlemek: giden bir MQTT yolu
İnternetten erişilebilen bir broker, ev cihazının kendi açtığı bir bağlantı üzerinden denetlenmesini sağlar. Bunun TLS belleği, konular ve yeniden oynatma için neyi değiştirdiği.
Cihaz, port yönlendirmesi ve genel adresi olmayan bir ev yönlendiricisinin arkasında duruyor ve yine de yapılandırmayı saniyeler içinde almak zorunda. Hile, güvenlik duvarındaki bir delik değil. Cihazın ulaşabildiği bir broker'a doğru dışarı açtığı ve broker'ın mesajları aynı kurulmuş yol üzerinden geri gönderdiği bir bağlantı. İnsanların bu tasarımda sevdiği her özellik ve içindeki her tuzak bu tersine çevirmeden geliyor.
NAT'tan gerçekte ne geçer
Cihaz broker'a bir TCP bağlantısı açtığında, ev yönlendiricisi bir eşleme oluşturur ve akış sürdüğü sürece onu canlı tutar. O akıştaki yanıtlar cihaza geri döner çünkü eşleme zaten vardır. Broker eve doğru hiçbir şey başlatmaz, bu yüzden yönlendiricinin reddetmesi gereken istenmeyen bir gelen paket yoktur. Bütün ağ argümanı budur ve bu yaklaşımın denetlemediğiniz ağlarda çalışmasının nedeni de budur.
Cihaz bağlantıyı canlı tutmalı ya da yeniden kurmalıdır; mimari sabitlendikten sonra bu, güvenilirlik sorusuna dönüşür.
Broker konuları yönlendirir, HTTP'ye proxy'lik yapmaz
MQTT yayınlama ve abone olma alışverişlerini tanımlar: cihaz okumasına izin verilen bir konu filtresine abone olur ve yetkili bir denetleyici eşleşen bir konuya yayınlar. Broker yayınları aboneliklerle eşleştirir ve kopyaları teslim eder. Tarayıcı isteğinin ne olduğunu bilmez ve cihazın web sunucusuna bir HTTP GET iletmez. Mevcut ürün yazılımı yalnızca HTTP konuşuyorsa, broker tasarımı bir uygulama değişikliği ya da bilinçli bir çeviri bileşeni gerektirir.
Konu adları da yetkilendirme değildir. Çoğu broker istemci başına erişim denetim listelerini destekler ve cihazlar tek bir küresel ad alanını paylaşmak yerine kendi yayınlama ve abonelik ağaçlarıyla sınırlandırılmalıdır.
Cihaz kaynakları TLS'in biçimini belirler
ESP8266 sınırlı RAM'e sahiptir ve TLS el sıkışması onun yaptığı en pahalı iştir. Arduino çekirdeği BearSSL'i tam da bu kısıt yüzünden sağlar ve bir CA'yı doğrulamak ile parmak izini sabitlemek arasındaki seçim hem bellek ayak izini hem de başka bir ad için geçerli sertifikaya sahip bir saldırganın yapabileceklerini değiştirir. Yığın izin verdiğinde broker'ın CA'sını doğrulamak daha güçlü seçenektir. Yük boyutu da önemlidir: MQTT istemcisi bir tampon tutar ve ondan büyük mesajlar tampon bilinçli olarak artırılmadıkça sessizce kesilir.
Keepalive ve soket zaman aşımları aynı bütçenin parçasıdır, çünkü ölü bir bağlantıyı hiç fark etmeyen bir istemci hata bildirmeden komut almayı durdurur.
Isıran mesaj semantiği
Saklanan bir mesaj broker tarafından depolanır ve daha sonraki eşleşen abonelere teslim edilir; bu, güncel durum için mükemmel, tek seferlik komutlar için tehlikelidir: yeniden bağlanan cihaz dünkü komutu yeniymiş gibi alabilir. QoS 1 en az bir kez teslimi garanti eder, bu yüzden yinelenenler normaldir ve uygulama tekrara dayanıklı olmalıdır, ideal olarak reddedebileceği bir tanımlayıcı veya zaman damgasıyla. Son vasiyet, cihaz düştüğünde size bir durum sinyali verir, ama yalnızca bağlantı asılı kalmak yerine gerçekten başarısız olursa.
Temiz oturum davranışı, siz yokken broker'ın aboneliklerinizi tutup tutmayacağını belirler ve buradaki hata, bazı cihazların her yeniden bağlanmadan sonra ilk mesajı kaçırmasının nedenidir.
TLS, broker'a kadar olan kesimi korur. Broker işletmecisine karşı uçtan uca yük şifrelemesi değildir; o, onun üzerinden yayınladığınız her şeyi okuyabilir.
Yaşam döngüsünü sınırlayın ve zararsız verilerle test edin
Yeniden bağlanmayı sıkı bir yeniden deneme döngüsü yerine geri çekilmeyle planlayın, oturum kalıcı değilse açıkça yeniden abone olun ve bağlantı sonucunu günlüğe kaydedin ki sessiz çevrimdışı cihaz kanıt bıraksın. Yeniden bağlanma yolunu hiçbir şey yapmayan örnek yüklerle test edin, çünkü bir komut kanalının ilk üretim testi gerçek bir komut olmamalıdır. Ardından eski saklanan mesajın yeniden bağlanmada ne yaptığını doğrulayın ve bu davranışın her konu için kabul edilebilir olup olmadığına karar verin.
Böyle yapıldığında tasarım bir gelen ağ gereksinimini kaldırır ve cihaz yazılımını, broker ilkesini ve mesaj semantiğini gizli varsayımlar yerine görünür iş olarak bırakır.