Aracılığıyla paylaş


Öğretici: Azure IoT İşlemleri MQTT aracısı ile TLS, X.509 istemci kimlik doğrulaması ve öznitelik tabanlı erişim denetimi (ABAC) yetkilendirmesi

Bu öğretici, TLS şifrelemesi ve X.509 istemci kimlik doğrulaması ile Azure IoT İşlemleri MQTT aracısını ayarlama konusunda size yol gösterir. Hem aracı hem de istemciler için sertifika oluşturmaya yönelik adım adım yönergeler ve betikler içerir. Öğreticide, MQTT aracısını istemci ve aracı için farklı kök sertifika yetkilileriyle (CA) yapılandırma işlemi açıklanmaktadır. Ayrıca, istemci sertifika zincirini temel alan öznitelik tabanlı erişim denetimi (ABAC) yetkilendirme ilkesi ayarlamayı da kapsar. Son olarak, öğretici, kurulumun doğru çalıştığından emin olmak için çeşitli senaryoları test etmek için Sivrisinek istemcisini kullanır.

Öğretici, Azure IoT İşlemleri'nin Fabrikam tarafından üretilen cihazlarla birlikte contoso fabrikasına yüklendiği bir ortamın benzetimini gerçekleştirir. TLS ve X.509 kimlik doğrulamasının çalışmasını sağlamak için:

  • Contoso fabrikasında yüklü Olan Azure IoT İşlemleri MQTT aracısı Fabrikam kök CA'ya güvenmelidir
  • Termostatlar gibi Fabrikam algılayıcılarının Contoso kök CA'ya güvenmesi gerekir
  • Her varlığın doğru kök CA tarafından verilen kendi yaprak sertifikası olmalıdır

Sunucu ve istemci tarafı sertifika yetkilisi köklerinin güven ilişkisini gösteren diyagram.

Önkoşullar

Bu öğreticiyi izlemek için şunları yapmanız gerekir:

İpucu

Bu gereksinimleri karşılamak için hızlı başlangıç kod alanı'nı kullanın. Hızlı başlangıç kod alanı, bu bileşenleri kullanıma sunarak kurulum işlemini basitleştirir.

Ayrıca, ortak anahtar şifrelemesi ve kök CA, özel anahtar ve ara sertifikalar gibi terimler hakkında bilgi sahibi olun.

İsteğe bağlı: Yerine gerçek bir ana bilgisayar adı veya IP adresi kullanın localhost

Bu öğreticiyi basit tutmak için MQTT aracısına erişmek için kullanırız localhost . Bu yaklaşım, aracının sunucu sertifikasının, aracıya erişmek için kullanılan konak adıyla eşleşen bir Konu Alternatif Adı 'na (SAN) sahip olmasını sağlar. localhost SAN zaten doğru ayarlandığından kullanımı kurulumu basitleştirir.

Gerçek dünya senaryosunda, yerine aracının localhost ana bilgisayar adını veya dış IP'sini kullanır ve ağ üzerindeki başka bir cihazdan aracıya bağlanırsınız. Bu durumda, sunucu sertifikasını oluştururken doğru ana bilgisayar adını veya IP adresini belirlemeniz ve SAN olarak kullanmanız gerekir:

  • Ana bilgisayar adı veya IP adresi zaten biliniyorsa (örneğin, bir DNS kaydı veya statik IP aracılığıyla), sunucu sertifikasını oluştururken SAN olarak kullanın. Ardından, yerine bu ana bilgisayar adını veya IP'yi kullanarak aracıya bağlanın localhost.
  • Ana bilgisayar adı veya IP adresi henüz bilinmiyorsa, dış IP adresini belirlemek için bir yer tutucu hizmeti kullanabilirsiniz:
    1. Kullanılmayan bir bağlantı noktasında LoadBalancer hizmetini oluşturun (8080 gibi):
      kubectl create service loadbalancer placeholder-service --tcp=8080:8080
      
    2. Dış IP'yi alın:
      kubectl get svc placeholder-service
      
    3. Dış IP:
      • gibi 192.168.X.X bir değer gösterir: Sunucu sertifikasını ve gizli dizisini oluştururken BU IP'yi SAN olarak kullanın. Ardından, yerine bu IP'yi kullanarak aracıya localhostbağlanın.
      • Gösterir <pending> : Kullandığınız Kubernetes dağıtımı, otomatik olarak dış IP atamayı desteklemiyor olabilir. Dış IP'yi bulmak için, dağıtım ve konak ortamınıza yönelik Kubernetes belgelerindeki adımları izleyin. Ağ kurulumuna bağlı olarak bağlantı noktası iletmeyi veya VPN'yi de yapılandırmanız gerekebilir.
    4. Dış IP'yi belirledikten sonra yer tutucu hizmetini silin:
      kubectl delete svc placeholder-service
      

Bu yöntem, sunucu sertifikasının dış IP adresiyle eşleşmesini sağlayarak MQTT aracısı için güvenli erişim sağlar.

Sunucu tarafı sertifikaları ve tam zincir hazırlama

İlk olarak, sunucu tarafı kök CA'sı oluşturun. Bu CA, daha sonra oluşturulan istemci tarafı kök CA'dan ayrıdır. Ayrımı net tutmak için sunucu tarafındaki her şeyi "Contoso" olarak adlandırıyoruz. Sonraki adımları kolaylaştırmak için özel anahtarı şifreleme parolasını atlıyoruz. Bu uygulama yalnızca bir öğretici ayarında kabul edilebilir.

step certificate create "Contoso Root CA" \
contoso_root_ca.crt contoso_root_ca.key \
--profile root-ca \
--no-password --insecure

Ardından, bu kök CA tarafından imzalanan bir ara CA oluşturun.

step certificate create "Contoso Intermediate CA 1" \
contoso_intermediate_ca.crt contoso_intermediate_ca.key \
--profile intermediate-ca \
--ca ./contoso_root_ca.crt --ca-key ./contoso_root_ca.key \
--no-password --insecure

Son olarak, MQTT aracı aracının aracı ön ucu için bir sunucu sertifikası imzalamak için bu ara CA'yı kullanın. Burada, localhost öğretici için kullanılan Konu Alternatif Adı (SAN) yer alır.

step certificate create mqtts-endpoint \
mqtts-endpoint.crt mqtts-endpoint.key \
--profile leaf \
--ca ./contoso_intermediate_ca.crt --ca-key ./contoso_intermediate_ca.key \
--bundle \
--san localhost \
--not-after 2400h --no-password --insecure

bayrağıyla --bundle , sunucu sertifikası imzalama ara sertifikasıyla birlikte gelir. TLS el sıkışması, paketin tüm zinciri doğrulamasını gerektirir.

İstemci tarafı sertifikalarını ve tam zinciri hazırlama

Benzer şekilde, Fabrikam ve ara CA için kök CA'yı oluşturun.

step certificate create --profile root-ca "Fabrikam Root CA" \
fabrikam_root_ca.crt fabrikam_root_ca.key \
--no-password --insecure
step certificate create "Fabrikam Intermediate CA 1" \
fabrikam_intermediate_ca.crt fabrikam_intermediate_ca.key \
--profile intermediate-ca \
--ca ./fabrikam_root_ca.crt --ca-key ./fabrikam_root_ca.key \
--no-password --insecure

Ardından termostat, higrometre, ısıtıcı ve ampul için istemci sertifikaları oluşturun.

# Create a client certificate for the thermostat
step certificate create thermostat thermostat.crt thermostat.key \
--ca ./fabrikam_intermediate_ca.crt --ca-key ./fabrikam_intermediate_ca.key --bundle \
--not-after 2400h --no-password --insecure

# Create a client certificate for the hygrometer
step certificate create hygrometer hygrometer.crt hygrometer.key \
--ca ./fabrikam_intermediate_ca.crt --ca-key ./fabrikam_intermediate_ca.key --bundle \
--not-after 2400h --no-password --insecure

# Create a client certificate for the heater
step certificate create heater heater.crt heater.key \
--ca ./fabrikam_intermediate_ca.crt --ca-key ./fabrikam_intermediate_ca.key --bundle \
--not-after 2400h --no-password --insecure

# Create a client certificate for the lightbulb
step certificate create lightbulb lightbulb.crt lightbulb.key \
--ca ./fabrikam_intermediate_ca.crt --ca-key ./fabrikam_intermediate_ca.key --bundle \
--not-after 2400h --no-password --insecure

Kubernetes'i yapılandırma

Yeni oluşturulan sunucu sertifikasını ve özel anahtarı bir Kubernetes gizli dizisine aktarın. Bu gizli dizi, daha sonra MQTT aracısı için bir TLS dinleyicisi yapılandırmak için kullanılır.

kubectl create secret tls broker-server-cert -n azure-iot-operations \
--cert mqtts-endpoint.crt \
--key mqtts-endpoint.key

Ayrıca Fabrikam (istemci tarafı) kök CA'sını içerecek bir yapılandırma eşlemesi oluşturun. MQTT aracısına X.509 kimlik doğrulaması için güvenmesi için bu yapılandırma eşlemesi gereklidir.

kubectl create configmap fabrikam-ca -n azure-iot-operations \
--from-file=client_ca.pem=fabrikam_root_ca.crt

MQTT aracısını yapılandırma

Sonraki adımlarda MQTT aracısı TLS şifrelemesi ve X.509 istemci kimlik doğrulaması ile yapılandırılır. Öğretici, MQTT aracısını yapılandırmak için Azure portalını kullanır.

Kimlik Doğrulaması

İstemcilerin Fabrikam kök CA'sı tarafından verilen X.509 sertifikalarını kullanarak kimlik doğrulaması yapmalarına izin vermek için Fabrikam kök CA sertifikasına güvenen ve istemci sertifikalarını ABAC yetkilendirme öznitelikleriyle eşleyen bir kimlik doğrulama ilkesi oluşturun.

  1. Azure portalında IoT İşlemleri örneğinize gidin.

  2. Bileşenler'in altında MQTT Aracısı'ni seçin.

  3. Kimlik Doğrulaması sekmesini seçin.

  4. Kimlik doğrulama ilkesi oluştur'u seçin.

  5. İlke adı olarak girin x509-auth.

  6. Yöntem ekle'yi seçerek yeni bir yöntem ekleyin.

  7. Açılan listeden X.509 yöntem türünü seçin ve ardından Yöntemi yapılandırmak için Ayrıntılar ekle'yi seçin.

  8. X.509 kimlik doğrulama ayrıntıları bölmesinde Fabrikam güvenilen CA sertifikası ConfigMap adını fabrikam-ca ve özniteliklerini belirtin.

    {
      "trustedClientCaCert": "fabrikam-ca",
      "authorizationAttributes": {
        "thermostat": {
          "subject": "CN = thermostat",
          "attributes": {
            "group": "thermostat_group"
          }
        },
        "hygrometer": {
          "subject": "CN = hygrometer",
          "attributes": {
            "group": "hygrometer_group"
          }
        },
        "intermediate": {
          "subject": "CN = Fabrikam Intermediate CA 1",
          "attributes": {
            "manufacturer": "fabrikam"
          }
        }
      }
    }
    
  9. Değişiklikleri kaydetmek için Uygula'yı ve ardından Ekle'yi seçin.

Azure portalını kullanarak MQTT aracısı X.509 kimlik doğrulama yönteminin nasıl oluşturulacağını gösteren ekran görüntüsü.

Dinleyici

Kimlik doğrulama ilkesi uygulanarak X.509 kimlik doğrulama ilkesini kullanan bir dinleyici oluşturun. Ayrıca, X.509 kimlik doğrulaması TLS gerektirdiğinden dinleyiciyi daha önce oluşturulan Contoso sunucu sertifikasını ve özel anahtarı kullanacak şekilde yapılandırın.

  1. Azure portalında IoT İşlemleri örneğinize gidin.

  2. Bileşenler'in altında MQTT Aracısı'ni seçin.

  3. LoadBalancer>Oluştur için MQTT aracı dinleyicisini seçin. Aşağıdaki ayarları girin:

    Ayar Tanım
    Ad mqtts-endpoint girin.
    Service name Kubernetes hizmetinin adı. Dinleyici adını hizmet adı mqtts-endpoint olarak kullanmak için boş bırakın.
    Hizmet türü LoadBalancer zaten seçili.
  4. Bağlantı Noktaları'nın altında, ilk bağlantı noktası için aşağıdaki ayarları girin:

    Ayar Açıklama
    Bağlantı noktası Enter 8883
    Kimlik Doğrulaması x509-auth'u seçin
    Yetkilendirme Yok’u seçin
    Protokol MQTT'yi seçin
    TLS Ekle'yi seçin
  5. TLS yapılandırma bölmesinde aşağıdaki ayarları girin:

    Ayar Açıklama
    TLS Modu El ile'yi seçin
    Verenin adı broker-server-cert girin
  6. Uygula ve Dinleyici oluştur'u seçin.

TLS bağlantı noktasıyla dinleyici ayarlamaya yönelik Azure portal yöntemini gösteren ekran görüntüsü.

Bir veya iki mqtts-endpoint dakika sonra LoadBalancer hizmeti oluşturulur.

$ kubectl get service mqtts-endpoint -n azure-iot-operations
NAME             TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
mqtts-endpoint   LoadBalancer   10.43.28.140   XXX.XX.X.X    8883:30988/TCP   104s

Dış IP'yi kullanmak yerine öğretici için kullanırız localhost .

İpucu

Codespace yapılandırması 8883 için bağlantı noktası iletmeyi otomatik olarak ayarlar. Diğer ortamları ayarlamak için bkz . Bağlantı noktası iletmeyi kullanma.

TLS üzerinden ileti yayımlamak için tek bir Mosquito istemcisi kullanma

Sertifika dosyalarıyla aynı klasörden: contoso_root_ca.crt, thermostat.crt, ve thermostat.key, bir ileti yayımlamak için Mosquito istemcisini kullanın. Bayrak --cafile contoso_root_ca.crt , Sivrisinek'in sunucu sertifikası doğrulamasını gerçekleştirmesine yöneliktir.

mosquitto_pub -t "example/topic" -m "example temperature measurement" -i thermostat \
-q 1 -V mqttv5 -d \
-h localhost \
--key thermostat.key \
--cert thermostat.crt \
--cafile contoso_root_ca.crt

Yayımlama başarılı olur çünkü Mosquito, 'de fabrikam_root_ca.crtkök salmış bir istemci sertifikası kullanır. Daha önce oluşturulan kimlik doğrulama ilkesi nedeniyle MQTT aracısı bu sertifikaya x509-auth güvenir. Ayrıca, MQTT aracısı şu anda kimliği doğrulanmış istemcilerin herhangi bir konuya yayımlamasına izin verir.

Client thermostat sending CONNECT
Client thermostat received CONNACK (0)
Client thermostat sending PUBLISH (d0, q1, r0, m1, 'example/topic', ... (31 bytes))
Client thermostat received PUBACK (Mid: 1, RC:0)
Client thermostat sending DISCONNECT

X.509 kullanarak birden çok istemci için MQTT konularına yetkilendirmeyi yapılandırma

MQTT konularına erişimi istemci sertifikası özniteliklerine göre kısıtlamak için, istemci sertifikası özniteliklerini belirli konularda izin verilen eylemlerle eşleyen bir yetkilendirme ilkesi oluşturun.

  1. Azure portalında IoT İşlemleri örneğinize gidin.

  2. Bileşenler'in altında MQTT Aracısı'ni seçin.

  3. Yetkilendirme sekmesini seçin.

  4. Yetkilendirme ilkesi oluştur'u seçin.

  5. İlke adı olarak girin abac-authz.

  6. Kurallar'ın altında aşağıdaki kuralları girin:

    [
      {
        "principals": {
          "attributes": [
            {
              "group": "thermostat_group"
            }
          ]
        },
        "brokerResources": [
          {
            "method": "Connect"
          },
          {
            "method": "Publish",
            "topics": [
              "telemetry/temperature"
            ]
          }
        ]
      },
      {
        "principals": {
          "attributes": [
            {
              "group": "hygrometer_group"
            }
          ]
        },
        "brokerResources": [
          {
            "method": "Connect"
          },
          {
            "method": "Publish",
            "topics": [
              "telemetry/humidity"
            ]
          }
        ]
      },
      {
        "principals": {
          "attributes": [
            {
              "manufacturer": "fabrikam"
            }
          ]
        },
        "brokerResources": [
          {
            "method": "Connect"
          },
          {
            "method": "Publish",
            "topics": [
              "health/heartbeat"
            ]
          }
        ]
      },
      {
        "principals": {
          "usernames": [
            "heater"
          ]
        },
        "brokerResources": [
          {
            "method": "Connect"
          },
          {
            "method": "Subscribe",
            "topics": [
              "telemetry/temperature",
              "telemetry/humidity"
            ]
          }
        ]
      }
    ]
    
  7. Değişiklikleri kaydetmek için Ekle'yi seçin.

Yetkilendirme ilkesi ayarlamak için Azure portalını gösteren ekran görüntüsü.

Ardından, MQTT aracı dinleyicisini yeni yetkilendirme ilkesini kullanacak şekilde güncelleştirin.

  1. Dinleyiciler sekmesini seçin.
  2. mqtts-endpoint dinleyicisini seçin.
  3. Bağlantı noktaları>8883>Yetkilendirme'nin altında abac-authz öğesini seçin.
  4. Kaydet'i seçin.

Bir bağlantı noktasını yetkilendirme ilkesine bağlamak için Azure portalını gösteren ekran görüntüsü.

İletileri kısıtlı bir konuya yayımlama

Bu bölümde, yeni uygulanan yetkilendirme ilkelerini test edeceğiz.

İlk olarak ile thermostat bağlanın ve konu başlığında telemetry/humidityyayımlamayı deneyin:

mosquitto_pub -t "telemetry/humidity" -m "example temperature measurement" -i thermostat \
-q 1 -V mqttv5 -d \
-h localhost \
--key thermostat.key \
--cert thermostat.crt \
--cafile contoso_root_ca.crt

nem konusunda yayımlanmasına izin verilmeyen öğesinin bir parçası thermostat_groupolduğundan thermostat yayımlama başarısız olur.

Client thermostat sending CONNECT
Client thermostat received CONNACK (0)
Client thermostat sending PUBLISH (d0, q1, r0, m1, 'telemetry/humidity', ... (6 bytes))
Client thermostat received PUBACK (Mid: 1, RC:135)
Warning: Publish 1 failed: Not authorized.

yayımlamaya telemetry/temperatureizin verilen ve yayımlama başarılı olacak şekilde değiştirin. Komutu çalışır durumda bırakın.

mosquitto_pub -t "telemetry/temperature" -m "example temperature measurement" -i thermostat \
-q 1 -V mqttv5 -d \
-h localhost \
--repeat 10000 \
--repeat-delay 3 \
--key thermostat.key \
--cert thermostat.crt \
--cafile contoso_root_ca.crt

Kısıtlı konularla ilgili iletilere abone olma

Ayrı bir terminal oturumunda öğesine abone olmak için health/heartbeatile heater bağlanın.

mosquitto_sub -q 1 -t "health/heartbeat" -d -V mqttv5 \
-i heater \
-h localhost \
--key heater.key \
--cert heater.crt \
--cafile contoso_root_ca.crt

heater Sinyal konusuna abone olma yetkisi olmadığından abonelik başarısız olur. Burada kod 135 yetkilendirilmemiş anlamına gelir.

Client heater sending CONNECT
Client heater received CONNACK (0)
Client heater sending SUBSCRIBE (Mid: 1, Topic: health/heartbeat, QoS: 1, Options: 0x00)
Client heater received SUBACK
Subscribed (mid: 1): 135

Abonelik konusunu ileti göndermeye telemetry/temperaturedevam eden thermostat olarak değiştirin.

mosquitto_sub -q 1 -t "telemetry/temperature" -d -V mqttv5 \
-i heater \
-h localhost \
--key heater.key \
--cert heater.crt \
--cafile contoso_root_ca.crt

Artık heater kullanıcı adıyla yetkilendirildiği için iletiler almaya başlar.

Başka bir ayrı terminal oturumunda ile lightbulbiletileri yayımlayınhealth/heartbeat:

mosquitto_pub -q 1 -t "health/heartbeat" -m "example heartbeat" -d -V mqttv5 \
-i lightbulb \
-h localhost \
--repeat 100 \
--repeat-delay 3 \
--key lightbulb.key \
--cert lightbulb.crt \
--cafile contoso_root_ca.crt

özniteliğiyle manufacturer=fabrikameşlenen bir CN = Fabrikam Intermediate CA 1ara sertifikaya sahip olduğundan lightbulb yayımlama başarılı olur. Bu özniteliğe sahip istemciler üzerinde health/heartbeatyayımlayabilir. İstemci ileti göndermeye başladığında, heater daha önce başlatılan hiçbir şey almaz.

Kaynakları temizleme

Bu öğreticide oluşturulan kaynakları temizlemek için dinleyiciyi ve kimlik doğrulama ve yetkilendirme ilkelerini silin.

  1. Azure portalında IoT İşlemleri örneğinize gidin.
  2. Bileşenler'in altında MQTT Aracısı'ni seçin.
  3. Dinleyiciler sekmesini seçin.
  4. mqtts-endpoint dinleyicisinin yanındaki onay kutusunu seçin.
  5. Sil'i seçin.
  6. Silme işlemini onaylayın.
  7. Kimlik Doğrulaması sekmesini seçin.
  8. x509-auth öğesinin yanındaki onay kutusunu seçin.
  9. Sil'i seçin.
  10. Silme işlemini onaylayın.
  11. Yetkilendirme sekmesini seçin.
  12. abac-authz öğesinin yanındaki onay kutusunu seçin.
  13. Sil'i seçin.
  14. Silme işlemini onaylayın.

Ayrıca Kubernetes gizli dizisini ve yapılandırma eşlemesini silin.

kubectl delete secret broker-server-cert -n azure-iot-operations
kubectl delete configmap fabrikam-ca -n azure-iot-operations

Son olarak, daha önce oluşturulan sertifikaları ve anahtarları silin.

rm contoso_root_ca.crt contoso_root_ca.key contoso_intermediate_ca.crt contoso_intermediate_ca.key mqtts-endpoint.crt mqtts-endpoint.key
rm fabrikam_root_ca.crt fabrikam_root_ca.key fabrikam_intermediate_ca.crt fabrikam_intermediate_ca.key thermostat.crt thermostat.key hygrometer.crt hygrometer.key heater.crt heater.key lightbulb.crt lightbulb.key