Kurz: Ověřování klientů TLS, X.509 a autorizace řízení přístupu na základě atributů (ABAC) pomocí zprostředkovatele Azure IoT Operations MQTT
Tento kurz vás provede nastavením zprostředkovatele Azure IoT Operations MQTT pomocí šifrování TLS a ověřování klientů X.509. Obsahuje podrobné pokyny a skripty pro vytváření certifikátů pro zprostředkovatele i klienty. Tento kurz vysvětluje, jak nakonfigurovat zprostředkovatele MQTT s různými kořenovými certifikačními autoritami (CA) pro klienta a zprostředkovatele. Popisuje také nastavení zásad autorizace na základě atributu (ABAC) na základě řetězu klientských certifikátů. Nakonec tento kurz pomocí klienta Komár otestuje různé scénáře, aby se zajistilo, že nastavení funguje správně.
Tento kurz simuluje prostředí, ve kterém je v továrně Contoso nainstalované operace Azure IoT s zařízeními vyrobenými společností Fabrikam. Aby ověřování TLS a X.509 fungovalo:
- Zprostředkovatel Azure IoT Operations MQTT nainstalovaný v továrně Contoso musí důvěřovat kořenové certifikační autoritě Fabrikam.
- Senzory společnosti Fabrikam, jako jsou termostaty, musí důvěřovat kořenové certifikační autoritě společnosti Contoso.
- Každá entita musí mít vlastní listový certifikát vydaný správnou kořenovou certifikační autoritou.
Požadavky
Pokud chcete postupovat podle tohoto kurzu, potřebujete:
- Cluster Kubernetes s povoleným přesměrováním portů pro port 8883
- Operace Azure IoT nasazené bez existujícího naslouchacího procesu nástroje pro vyrovnávání zatížení
- Kubectl přístup ke clusteru za účelem vytvoření tajných kódů a konfiguračních map Kubernetes.
- Klient Mosquitto pro publikování a přihlášení k odběru zpráv MQTT spuštěných na stejném počítači jako cluster Kubernetes pro
localhost
přístup. Pokud ho nechcete používatlocalhost
, přečtěte si část Nepovinný: Použijte místolocalhost
oddílu skutečný název hostitele nebo IP adresu. - Krok rozhraní příkazového řádku pro vytvoření certifikátů
Tip
K splnění těchto požadavků použijte kódspace pro rychlý start. Codespace rychlého startu zjednodušuje proces nastavení tím, že poskytuje tyto komponenty.
Znalost kryptografie a termínů veřejného klíče, jako je kořenová certifikační autorita, privátní klíč a zprostředkující certifikáty, je navíc užitečná.
Volitelné: Použijte místo skutečného názvu hostitele nebo IP adresy skutečného hostitele. localhost
Abychom tento kurz udrželi jednoduchý, používáme localhost
k přístupu ke zprostředkovateli MQTT. Tento přístup zajišťuje, že certifikát serveru zprostředkovatele má alternativní název subjektu (SAN), který odpovídá názvu hostitele použitému pro přístup ke zprostředkovateli. Použití localhost
zjednodušuje nastavení, protože síť SAN je již správně nastavená.
V reálném scénáři byste místo zprostředkovatele použili název hostitele nebo externí IP adresu zprostředkovatele localhost
a připojili se k němu z jiného zařízení v síti. V takovém případě musíte určit správný název hostitele nebo IP adresu a použít ho jako síť SAN při vytváření certifikátu serveru:
- Pokud je název hostitele nebo IP adresa již známé (například prostřednictvím záznamu DNS nebo statické IP adresy), použijte ho jako síť SAN při vytváření certifikátu serveru. Pak se připojte ke zprostředkovateli pomocí tohoto názvu hostitele nebo IP adresy místo
localhost
. - Pokud název hostitele nebo IP adresa ještě nejsou známé, můžete k určení externí IP adresy použít zástupnou službu:
- Vytvořte službu LoadBalancer na portu, který se nepoužívá (například 8080):
kubectl create service loadbalancer placeholder-service --tcp=8080:8080
- Načtení externí IP adresy:
kubectl get svc placeholder-service
- Pokud externí IP adresa:
- Zobrazuje hodnotu jako
192.168.X.X
– tuto IP adresu použijte jako síť SAN při vytváření certifikátu serveru a tajného klíče. Pak se připojte ke zprostředkovateli pomocí této IP adresy místolocalhost
. - Zobrazuje
<pending>
– distribuce Kubernetes, kterou používáte, nemusí podporovat automatické přiřazování externí IP adresy. Pokud chcete najít externí IP adresu, postupujte podle pokynů v dokumentaci Kubernetes pro vaše distribuční a hostitelské prostředí. V závislosti na nastavení sítě možná budete muset nakonfigurovat přesměrování portů nebo síť VPN.
- Zobrazuje hodnotu jako
- Po určení externí IP adresy odstraňte zástupnou službu:
kubectl delete svc placeholder-service
- Vytvořte službu LoadBalancer na portu, který se nepoužívá (například 8080):
Tato metoda zajišťuje, že certifikát serveru odpovídá externí IP adrese, což umožňuje zabezpečený přístup ke zprostředkovateli MQTT.
Příprava certifikátů na straně serveru a úplného řetězu
Nejprve vytvořte kořenovou certifikační autoritu na straně serveru. Tato certifikační autorita je oddělená od kořenové certifikační autority na straně klienta, která se vytvoří později. Abychom zachovali přehled o oddělení, pojmenujeme všechno na straně serveru "Contoso". Abychom usnadnili pozdější kroky, přeskočíme heslo pro šifrování privátního klíče. Tento postup je přijatelný pouze v nastavení kurzu.
step certificate create "Contoso Root CA" \
contoso_root_ca.crt contoso_root_ca.key \
--profile root-ca \
--no-password --insecure
Pak vytvořte zprostředkující certifikační autoritu podepsanou touto kořenovou certifikační autoritou.
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
Nakonec použijte tuto zprostředkující certifikační autoritu k podepsání certifikátu serveru pro front-end zprostředkovatele MQTT zprostředkovatele. localhost
Tady je alternativní název subjektu (SAN) používaný pro tento kurz.
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
--bundle
S příznakem je certifikát serveru součástí podpisového zprostředkujícího certifikátu. Metoda handshake protokolu TLS vyžaduje, aby sada ověřila celý řetěz.
Příprava certifikátů na straně klienta a úplného řetězu
Podobně vytvořte kořenovou certifikační autoritu pro Fabrikam a zprostředkující certifikační autoritu.
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
Potom vygenerujte klientské certifikáty pro termostat, hygrometr, topení a žárovku.
# 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
Konfigurace Kubernetes
Naimportujte nově vygenerovaný certifikát serveru a privátní klíč do tajného kódu Kubernetes. Tento tajný klíč se používá ke konfiguraci naslouchacího procesu TLS pro zprostředkovatele MQTT později.
kubectl create secret tls broker-server-cert -n azure-iot-operations \
--cert mqtts-endpoint.crt \
--key mqtts-endpoint.key
Vytvořte také mapu konfigurace, která bude obsahovat kořenovou certifikační autoritu Fabrikam (na straně klienta). Tato mapa konfigurace se vyžaduje, aby zprostředkovatel MQTT důvěřoval ověřování X.509.
kubectl create configmap fabrikam-ca -n azure-iot-operations \
--from-file=client_ca.pem=fabrikam_root_ca.crt
Konfigurace zprostředkovatele MQTT
Další kroky nakonfigurují zprostředkovatele MQTT s šifrováním TLS a ověřováním klienta X.509. Tento kurz používá Azure Portal ke konfiguraci zprostředkovatele MQTT.
Ověřování
Pokud chcete klientům umožnit ověřování pomocí certifikátů X.509 vydaných kořenovou certifikační autoritou Fabrikam, vytvořte zásadu ověřování, která důvěřuje kořenovému certifikátu certifikační autority Fabrikam a mapuje klientské certifikáty na atributy autorizace pro ABAC.
Na webu Azure Portal přejděte k vaší instanci ioT Operations.
V části Součásti vyberte Zprostředkovatele MQTT.
Vyberte kartu Ověřování.
Vyberte Vytvořit zásady ověřování.
Jako název zásady zadejte
x509-auth
.Novou metodu přidáte výběrem možnosti Přidat metodu.
V rozevíracím seznamu zvolte typ metody X.509 a pak vyberte Přidat podrobnosti a nakonfigurujte metodu.
V podokně podrobností o ověřování X.509 zadejte název
fabrikam-ca
objektu ConfigMap důvěryhodné certifikační autority Fabrikam a atributy.{ "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" } } } }
Výběrem možnosti Použít a přidat změny uložte.
Naslouchací proces
Pomocí zásad ověřování vytvořte naslouchací proces, který používá zásady ověřování X.509. Vzhledem k tomu, že ověřování X.509 vyžaduje protokol TLS, nakonfigurujte naslouchací proces tak, aby používal certifikát serveru Contoso a privátní klíč vytvořený dříve.
Na webu Azure Portal přejděte k vaší instanci ioT Operations.
V části Součásti vyberte Zprostředkovatele MQTT.
Vyberte naslouchací proces zprostředkovatele MQTT pro vytvoření loadbalanceru>. Zadejte následující nastavení:
Nastavení Description Name Zadejte mqtts-endpoint
.Service name Název služby Kubernetes Ponechte prázdný název naslouchacího procesu jako název mqtts-endpoint
služby.Typ služby LoadBalancer už je vybraný. V části Porty zadejte následující nastavení pro první port:
Nastavení Popis Port Zadejte 8883 Ověřování Zvolte x509-auth. Autorizace Zvolte Žádná. Protokol Volba MQTT Protokol TLS Vyberte Přidat. V podokně konfigurace protokolu TLS zadejte následující nastavení:
Nastavení Popis Režim TLS Zvolit ruční Název vystavitele Zadejte broker-server-cert
Vyberte Použít a Vytvořit naslouchací proces.
Po minutě nebo dvou mqtts-endpoint
se vytvoří služba LoadBalancer.
$ 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
Místo použití externí IP adresy používáme localhost
pro tento kurz.
Tip
Konfigurace codespace automaticky nastaví přesměrování portů pro 8883. Pokud chcete nastavit jiná prostředí, přečtěte si téma Použití přesměrování portů.
Publikování zpráv přes protokol TLS pomocí jednoho klienta Komáři
Ze stejné složky jako soubory certifikátů: contoso_root_ca.crt
a thermostat.crt
thermostat.key
pomocí klienta Mosása publikujte zprávu. Příznakem --cafile contoso_root_ca.crt
je provést ověření certifikátu serveru.
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
Publikování proběhne úspěšně, protože Komár používá klientský certifikát, který je kořenem fabrikam_root_ca.crt
. Zprostředkovatel MQTT důvěřuje tomuto certifikátu, protože x509-auth
zásady ověřování vytvořené dříve. Kromě toho zprostředkovatel MQTT aktuálně umožňuje ověřeným klientům publikovat do libovolného tématu.
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
Konfigurace autorizace pro témata MQTT pro více klientů pomocí X.509
Pokud chcete omezit přístup k tématům MQTT na základě atributů klientského certifikátu, vytvořte zásadu autorizace, která mapuje atributy klientského certifikátu na povolené akce v konkrétních tématech.
Na webu Azure Portal přejděte k vaší instanci ioT Operations.
V části Součásti vyberte Zprostředkovatele MQTT.
Vyberte kartu Autorizace.
Vyberte Vytvořit zásadu autorizace.
Jako název zásady zadejte
abac-authz
.V části Pravidla zadejte následující pravidla:
[ { "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" ] } ] } ]
Výběrem možnosti Přidat uložte změny.
Potom aktualizujte naslouchací proces zprostředkovatele MQTT tak, aby používal novou zásadu autorizace.
- Vyberte kartu Naslouchací procesy.
- Vyberte naslouchací proces mqtts-endpoint .
- V části Porty>8883>Autorizace zvolte abac-authz.
- Zvolte Uložit.
Publikování zpráv do tématu s omezeným přístupem
V této části otestujeme nově použité zásady autorizace.
Nejprve se připojte thermostat
a zkuste publikovat téma telemetry/humidity
:
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
Vzhledem k tomu thermostat
, že je součástí thermostat_group
, který není povoleno publikovat do tématu vlhkosti, publikování selže.
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.
Změňte publikování na telemetry/temperature
, což je povoleno a publikování proběhne úspěšně. Nechte příkaz spuště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
Přihlášení k odběru zpráv v tématech s omezeným přístupem
V samostatné relaci terminálu se připojte k heater
odběru health/heartbeat
.
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
Vzhledem k tomu heater
, že nemá oprávnění přihlásit se k odběru tématu prezenčních signálů, předplatné selže. Kód 135 zde znamená, že není autorizovaný.
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
Přepněte téma odběru na telemetry/temperature
, do kterého thermostat
se stále odesílají zprávy.
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
Teď heater
začne přijímat zprávy, protože má autorizaci s uživatelským jménem.
V jiné samostatné relaci terminálu publikujte zprávy dolightbulb
health/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
Publikování proběhne úspěšně, protože lightbulb
má zprostředkující certifikát s CN = Fabrikam Intermediate CA 1
, který je namapován na atribut manufacturer=fabrikam
. Klienti s tímto atributem mohou publikovat na health/heartbeat
. Když klient začne posílat zprávy, heater
nezačne nic dostávat dříve.
Vyčištění prostředků
Pokud chcete vyčistit prostředky vytvořené v tomto kurzu, odstraňte naslouchací proces a zásady ověřování a autorizace.
- Na webu Azure Portal přejděte k vaší instanci ioT Operations.
- V části Součásti vyberte Zprostředkovatele MQTT.
- Vyberte kartu Naslouchací procesy.
- Zaškrtněte políčko vedle naslouchacího procesu mqtts-endpoint .
- Vyberte Odstranit.
- Potvrďte odstranění.
- Vyberte kartu Ověřování.
- Zaškrtněte políčko vedle x509-auth.
- Vyberte Odstranit.
- Potvrďte odstranění.
- Vyberte kartu Autorizace.
- Zaškrtněte políčko vedle abac-authz.
- Vyberte Odstranit.
- Potvrďte odstranění.
Odstraňte také tajný kód Kubernetes a mapu konfigurace.
kubectl delete secret broker-server-cert -n azure-iot-operations
kubectl delete configmap fabrikam-ca -n azure-iot-operations
Nakonec odstraňte certifikáty a klíče vygenerované dříve.
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