Öğ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
Önkoşullar
Bu öğreticiyi izlemek için şunları yapmanız gerekir:
- 8883 numaralı bağlantı noktası için bağlantı noktası iletmenin etkinleştirildiği bir Kubernetes kümesi.
- Mevcut bir yük dengeleyici dinleyicisi olmadan dağıtılan Azure IoT İşlemleri.
- Kubernetes gizli dizileri ve yapılandırma eşlemeleri oluşturmak için kümeye Kubectl erişimi.
- Erişim için Kubernetes kümesiyle aynı makinede çalışan MQTT iletilerini yayımlamak ve bunlara abone olmak için
localhost
Mosquitto istemcisi. kullanmamaklocalhost
için bkz . İsteğe bağlı: Bölüm yerinelocalhost
gerçek bir ana bilgisayar adı veya IP adresi kullanma. - Sertifika oluşturmak için CLI adımı.
İ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:
- Kullanılmayan bir bağlantı noktasında LoadBalancer hizmetini oluşturun (8080 gibi):
kubectl create service loadbalancer placeholder-service --tcp=8080:8080
- Dış IP'yi alın:
kubectl get svc placeholder-service
- 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ıyalocalhost
bağ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.
- gibi
- Dış IP'yi belirledikten sonra yer tutucu hizmetini silin:
kubectl delete svc placeholder-service
- Kullanılmayan bir bağlantı noktasında LoadBalancer hizmetini oluşturun (8080 gibi):
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.
Azure portalında IoT İşlemleri örneğinize gidin.
Bileşenler'in altında MQTT Aracısı'ni seçin.
Kimlik Doğrulaması sekmesini seçin.
Kimlik doğrulama ilkesi oluştur'u seçin.
İlke adı olarak girin
x509-auth
.Yöntem ekle'yi seçerek yeni bir yöntem ekleyin.
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.
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" } } } }
Değişiklikleri kaydetmek için Uygula'yı ve ardından Ekle'yi seçin.
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.
Azure portalında IoT İşlemleri örneğinize gidin.
Bileşenler'in altında MQTT Aracısı'ni seçin.
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. 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 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
girinUygula ve Dinleyici oluştur'u seçin.
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.crt
kö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.
Azure portalında IoT İşlemleri örneğinize gidin.
Bileşenler'in altında MQTT Aracısı'ni seçin.
Yetkilendirme sekmesini seçin.
Yetkilendirme ilkesi oluştur'u seçin.
İlke adı olarak girin
abac-authz
.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" ] } ] } ]
Değişiklikleri kaydetmek için Ekle'yi seçin.
Ardından, MQTT aracı dinleyicisini yeni yetkilendirme ilkesini kullanacak şekilde güncelleştirin.
- Dinleyiciler sekmesini seçin.
- mqtts-endpoint dinleyicisini seçin.
- Bağlantı noktaları>8883>Yetkilendirme'nin altında abac-authz öğesini seçin.
- Kaydet'i seçin.
İ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/humidity
yayı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_group
olduğ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/temperature
izin 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/heartbeat
ile 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/temperature
devam 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 lightbulb
iletileri 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=fabrikam
eşlenen bir CN = Fabrikam Intermediate CA 1
ara sertifikaya sahip olduğundan lightbulb
yayımlama başarılı olur. Bu özniteliğe sahip istemciler üzerinde health/heartbeat
yayı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.
- Azure portalında IoT İşlemleri örneğinize gidin.
- Bileşenler'in altında MQTT Aracısı'ni seçin.
- Dinleyiciler sekmesini seçin.
- mqtts-endpoint dinleyicisinin yanındaki onay kutusunu seçin.
- Sil'i seçin.
- Silme işlemini onaylayın.
- Kimlik Doğrulaması sekmesini seçin.
- x509-auth öğesinin yanındaki onay kutusunu seçin.
- Sil'i seçin.
- Silme işlemini onaylayın.
- Yetkilendirme sekmesini seçin.
- abac-authz öğesinin yanındaki onay kutusunu seçin.
- Sil'i seçin.
- 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