MQTT Güvenliği

MQTT Erişim Kontrol Listeleri (ACL): Kavramlar ve Tasarım

MQTT erişim kontrol listelerinin ne olduğu, Mosquitto gibi broker'ların topic düzeyinde okuma ve yazma kurallarını nasıl ifade ettiği, reddedilen işlemlerin nasıl davrandığı ve yetkilendirmenin basit kalması için topic namespace'lerinin nasıl tasarlanacağı.

Bir cihazın kendi telemetri topic'ine yazmasına ve yalnızca kendi komut topic'ini okumasına izin veren MQTT ACL diyagramı
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 ACL (erişim kontrol listesi), bir broker'ın kimliği doğrulanmış hangi istemcinin hangi topic'lere yayın yapabileceğine veya abone olabileceğine karar vermek için kullandığı kurallar bütünüdür. Bu yazı kavramları açıklıyor, bunların Mosquitto kullanan gerçek bir broker yapılandırmasında nasıl göründüğünü gösteriyor, bir istemci reddedildiğinde ne olduğunu anlatıyor ve ister ayrıntılı ACL'ler ister tenant düzeyinde izolasyon kullanın, yetkilendirmeyi basit tutan topic tasarım kalıplarını sunuyor.

Kimlik Doğrulama ve Yetkilendirme

İkisi kolayca karıştırılır ve broker'lar bunları farklı aşamalarda ele alır:

  • Kimlik doğrulama (authentication) "Sen kimsin?" sorusunu yanıtlar. CONNECT anında bir kez, kullanıcı adı ve şifre, istemci sertifikası veya token ile gerçekleşir. Ayrıntılar için MQTT kullanıcı adı şifre doğrulama yazısına bakın.
  • Yetkilendirme (authorization) "Ne yapabilirsin?" sorusunu yanıtlar. Her SUBSCRIBE'da ve broker'a bağlı olarak her PUBLISH'te kontrol edilir. ACL'ler bunu ifade etmenin en yaygın yoludur.

Hiçbir yetkilendirme kuralı olmayan, kimliği doğrulanmış bir istemci genellikle broker'ının veya tenant'ının izin verdiği her şeyi okuyup yazabilir. ACL'ler bunu kullanıcı, client ID veya rol bazında daraltır.

Bir MQTT ACL Kuralı Neleri İçerir?

Broker hangi sözdizimini kullanırsa kullansın, her kural aynı öğeleri birleştirir:

Öğe Örnekler
Özne Bir kullanıcı adı, bir client ID, bir rol veya "herkes"
Eylem Okuma (abone olma ve alma), yazma (yayınlama) veya her ikisi
Topic filtresi factory/line1/#, devices/+/cmd, devices/%u/#
Karar İzin ver veya reddet

Kurallar her işlemin topic'iyle eşleştirilir. Abonelikler için birçok broker istenen filtrenin kendisini kontrol eder; böylece devices/sensor-01/# okumasına izin verilen bir istemci, daha geniş bir devices/# aboneliğini kontrolden kaçıramaz.

Mosquitto MQTT ACL Örneği

Mosquitto, dosya tabanlı ACL'si kısa ve okunabilir olduğu için kullanışlı bir referanstır. Kimlik doğrulama ve ACL dosyası mosquitto.conf içinde etkinleştirilir:

# mosquitto.conf
listener 8883
certfile /etc/mosquitto/certs/server.crt
keyfile  /etc/mosquitto/certs/server.key
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl

ACL dosyasının kendisi:

# /etc/mosquitto/acl

# Herhangi bir "user" satırından önceki kurallar anonim istemcilere uygulanır (burada yok)

# Tüm telemetriyi okuyan ve komut gönderen bir backend servisi
user backend
topic read  factory/+/+/telemetry/#
topic write factory/+/+/cmd/#

# Yalnızca okuyabilen bir pano
user dashboard
topic read factory/#

# Pattern kuralları her kullanıcıya uygulanır.
# %u = kullanıcı adı, %c = client ID
pattern write factory/+/%c/telemetry/#
pattern read  factory/+/%c/cmd/#
pattern write factory/+/%c/status

Bu kurallarla cnc-07 client ID'siyle bağlanan bir cihaz factory/line2/cnc-07/telemetry/spindle topic'ine yayın yapabilir ve factory/line2/cnc-07/cmd/stop mesajını alabilir, ancak başka bir makinenin komutlarını okuyamaz veya başka bir makine adına yayın yapamaz. Pattern kuralları, cihaz başına bir giriş gerektirmeden binlerce cihaza ölçeklenir; client ID'yi topic yoluna koymanın temel nedeni de budur. Mosquitto ayrıca topic deny satırlarını ve roller ile gruplar içeren bir dinamik güvenlik eklentisini destekler; Mosquitto dokümantasyonu her ikisini de ele alır.

Dosyayı düzenledikten sonra broker'ı yeniden yükleyin, ardından test edin:

# İzin verilir: cnc-07 kendi telemetrisini yayınlar
mosquitto_pub -h localhost -p 8883 --cafile ca.crt -V mqttv5 \
  -i cnc-07 -u cnc-07 -P "$PW" -t 'factory/line2/cnc-07/telemetry/spindle' -m 1200 -q 1

# Reddedilir: cnc-07, cnc-08 adına yayın yapar
mosquitto_pub -h localhost -p 8883 --cafile ca.crt -V mqttv5 \
  -i cnc-07 -u cnc-07 -P "$PW" -t 'factory/line2/cnc-08/telemetry/spindle' -m 1200 -q 1

Bir İstemci Reddedildiğinde Ne Olur?

Reddedilen işlemler her zaman belirgin bir hata üretmez; ACL sorunlarının hata ayıklamasının bu kadar zor olmasının nedeni budur.

İşlem MQTT 3.1.1 MQTT 5.0
SUBSCRIBE reddedildi SUBACK dönüş kodu 0x80 (başarısız) SUBACK reason code 0x87 Not authorized
PUBLISH QoS 0 reddedildi Sessizce düşürülür Sessizce düşürülür
PUBLISH QoS 1/2 reddedildi Genellikle onaylanır ve düşürülür PUBACK/PUBREC 0x87 taşıyabilir, broker'a bağlı

Pratik hata ayıklama ipuçları:

  1. SUBACK kodlarını her zaman inceleyin. Birçok kütüphane bunları bir callback'te sunar; başlangıçta günlüğe kaydedin.
  2. Test ederken MQTT 5 ve QoS 1 kullanın. Onaylardaki reason code'lar retleri görünür kılar.
  3. Cihazın kimliğiyle test edin. Bir yönetici hesabıyla test etmek, cihazın kuralları hakkında hiçbir şey kanıtlamaz.
  4. Broker günlüğünü kontrol edin. Çoğu broker reddedilen yayınları ve abonelikleri debug düzeyinde günlüğe kaydeder.

Basit Yetkilendirme için Topic Namespace Tasarımı

İyi ACL'ler iyi topic'lerle başlar. Kimlik ve yön topic yolunda görünürse kurallar birkaç kalıba iner. Görünmezse uzun bir özel durumlar listesiyle karşı karşıya kalırsınız.

Kimliği Yola Koyun

Client ID'yi veya cihaz ID'sini sabit bir seviyeye ekleyin: factory/<line>/<deviceId>/.... %c gibi pattern kuralları yalnızca kimlik tam bir topic seviyesi olduğunda çalışır.

Yönleri Ayırın

Yukarı akan veri ve aşağı akan komutlar için ayrı dallar kullanın: .../telemetry, .../status, .../cmd. Cihazlar ilk ikisinde yazma, üçüncüsünde okuma yetkisi alır.

Tenant'ları veya Müşterileri En Üstte Ayırın

Bir broker birden fazla müşteriye hizmet veriyorsa müşteriyi ilk seviye yapın: <tenant>/.... Böylece her tenant'ın kimlik bilgileri tek bir alt ağaçla sınırlanır.

Paylaşılan Veriyi Açıkça Adlandırılmış Bir Dalda Tutun

Tüm cihazlara yayınlanan yapılandırma, cihazlar için salt okunur erişimle broadcast/... veya config/... altına gider.

MQTT topic hiyerarşisi örnekleri yazısı bu ilkeler üzerine kurulmuş eksiksiz ağaçlar gösterir.

ACL Tasarımı Kontrol Listesi

  1. Varsayılan olarak reddedin; yalnızca her rolün ihtiyaç duyduğuna izin verin.
  2. Cihazlara kendi telemetri ve durum topic'lerinde yazma, kendi komutlarında okuma yetkisi verin, başka hiçbir şey vermeyin.
  3. Panolara salt okunur erişim verin.
  4. Backend servislerine komut dallarında yazma yetkisi verin ve bu kimlik bilgilerini kimin tuttuğunu denetleyin.
  5. Bir cihaz kimlik bilgisine asla # vermeyin.
  6. Kural dosyasını veya rol tanımlarını sürüm kontrolünde tutun ve değişiklikleri gözden geçirin.
  7. Her değişiklikten sonra her rolü gerçek kimlik bilgileriyle test edin.

ConnectMQ'da Yetkilendirme

ConnectMQ topic başına ACL sağlamaz. ConnectMQ'da izolasyon tenant düzeyinde çalışır: her müşterinin broker trafiği diğer tüm tenant'lardan izole edilir, kimlik bilgileri broker başına oluşturulur ve client ID'ler verilen kullanıcı adı ve şifreye bağlanır; böylece bir istemci başka bir istemcinin kimliğini sahiplenemez. Plan başına kotalar, flood koruması ve tekrarlanan başarısız girişlerden sonra IP engelleme, hatalı davranan bir istemcinin yapabileceklerini sınırlar.

Bunun tasarım açısından anlamı:

  • Güvenlik sınırınız olarak ayrı broker'lar kullanın. İki istemci grubu birbirinin verisini asla görmemeliyse, topic kurallarına güvenmek yerine onları farklı broker'lara yerleştirin. Bu sınırın fiziksel de olması gerektiğinde Dedicated plan size izole bir küme sağlar.
  • Güvenilmeyen istemcileri broker'dan uzak tutun. Tarayıcı kullanıcıları ve üçüncü taraflar, broker kimlik bilgilerini tutan ve onlar adına neyin yayınlanacağına karar veren backend'inizle konuşmalıdır.
  • Topic'leri ACL'ler ileride gelebilecekmiş gibi tasarlayın. Yolda kimlik bulunması ve ayrı komut dalları şimdi hiçbir maliyet getirmez ve sistemin bir kısmını topic kuralları olan bir broker'a taşırsanız seçeneklerinizi açık tutar.
  • Komutları cihazda doğrulayın. Bir cihaz, broker'ın yetkilendirmeyi nasıl yaptığından bağımsız olarak, harekete geçmeden önce bir komutun doğru biçimlendirilmiş ve beklenen bir komut olduğunu kontrol etmelidir.

Tenant izolasyonu ile topic disiplininin bu birleşimi birçok filoyu iyi kapsar. Projeniz tek bir paylaşılan namespace içinde cihaz başına topic kısıtlamaları gerektiriyorsa, sistemin o kısmı için topic düzeyinde ACL destekleyen bir broker planlayın. Daha geniş bir bakış için MQTT güvenliği en iyi uygulamaları ve MQTT güvenli mi yazılarına bakın.

ConnectMQ ile Başlayın

Cihazlarınızı tenant izolasyonu, TLS, client ID'lere bağlı oluşturulmuş kimlik bilgileri ve başarısız girişler için IP engelleme sunan bir barındırılan MQTT broker üzerinde çalıştırın. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve topic tasarımlarınızı önce herkese açık MQTT test broker'ı üzerinde prototipleyin.

Sık Sorulan Sorular

MQTT ACL nedir?

Bir broker'a hangi kullanıcıların veya istemcilerin hangi topic filtrelerine yayın yapabileceğini ya da abone olabileceğini söyleyen bir kurallar listesidir. İstemcinin kimliği doğrulandıktan sonra kontrol edilir.

ConnectMQ topic başına ACL destekliyor mu?

Hayır. ConnectMQ tenant'ları birbirinden izole eder ve client ID'leri verilen kullanıcı adı ve şifre kimlik bilgilerine bağlar, ancak bir broker içinde topic başına okuma ve yazma kuralları uygulamaz.

Reddedilen yayınım neden hata döndürmüyor?

MQTT 3.1.1'de broker'ın reddedilen bir yayını bildirmesinin bir yolu yoktur; bu yüzden sessizce düşürülür. MQTT 5 broker'ları QoS 1 ve 2 onaylarında 0x87 reason code'unu döndürebilir.

ACL kuralları kullanıcı adını mı yoksa client ID'yi mi kullanmalı?

Cihaz başına benzersiz olan ve istemci tarafından serbestçe seçilemeyen tanımlayıcıyı kullanın. Broker client ID'leri kimlik bilgilerine bağlıyorsa ikisi de çalışır; aksi takdirde kullanıcı adını tercih edin.

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