Delen via


Zelfstudie: VERIFICATIE van TLS, X.509-client en abac-autorisatie (op kenmerken gebaseerd toegangsbeheer) met Azure IoT Operations MQTT-broker

In deze zelfstudie wordt u begeleid bij het instellen van de Azure IoT Operations MQTT-broker met TLS-versleuteling en X.509-clientverificatie. Het bevat stapsgewijze instructies en scripts voor het maken van certificaten voor zowel de broker als clients. In de zelfstudie wordt uitgelegd hoe u de MQTT-broker configureert met verschillende basiscertificeringsinstanties (CA's) voor de client en broker. Het omvat ook het instellen van een op kenmerken gebaseerd toegangsbeheerbeleid (ABAC) op basis van de clientcertificaatketen. Ten slotte gebruikt de zelfstudie de Mug-client om verschillende scenario's te testen om ervoor te zorgen dat de installatie correct werkt.

In de zelfstudie wordt een omgeving gesimuleerd waarin Azure IoT Operations is geïnstalleerd in een Contoso-fabriek, met apparaten die zijn vervaardigd door Fabrikam. Tls- en X.509-verificatie werken als volgende:

  • Azure IoT Operations MQTT-broker, geïnstalleerd in een Contoso-fabriek, moet de fabrikam-basis-CA vertrouwen
  • Fabrikam-sensoren, zoals thermostaten, moeten de basis-CA van Contoso vertrouwen
  • Elke entiteit moet een eigen bladcertificaat hebben dat is uitgegeven door de juiste basis-CA

Diagram met de vertrouwensrelatie van de basiscertificaten aan de server en clientzijde.

Vereisten

U hebt het volgende nodig om deze zelfstudie te volgen:

Tip

Gebruik de quickstart-coderuimte om aan deze vereisten te voldoen. De quickstart-coderuimte vereenvoudigt het installatieproces door deze onderdelen uit het vak te leveren.

Daarnaast is kennis van openbare-sleutelcryptografie en termen zoals basis-CA, persoonlijke sleutel en tussenliggende certificaten nuttig.

Optioneel: gebruik een echte hostnaam of IP-adres in plaats van localhost

Om deze zelfstudie eenvoudig te houden, gebruiken localhost we om toegang te krijgen tot de MQTT-broker. Deze methode zorgt ervoor dat het servercertificaat van de broker een SAN (Subject Alternative Name) heeft die overeenkomt met de hostnaam die wordt gebruikt voor toegang tot de broker. Het gebruik localhost vereenvoudigt de installatie omdat het SAN al correct is ingesteld.

In een praktijkscenario gebruikt u de hostnaam of het externe IP-adres van de broker in plaats van localhost dat u er verbinding mee maakt vanaf een ander apparaat in het netwerk. In dit geval moet u de juiste hostnaam of het juiste IP-adres bepalen en gebruiken als san bij het maken van het servercertificaat:

  • Als de hostnaam of het IP-adres al bekend is (bijvoorbeeld via een DNS-record of statisch IP-adres), gebruikt u deze als san bij het maken van het servercertificaat. Maak vervolgens verbinding met de broker met behulp van die hostnaam of IP in plaats van localhost.
  • Als de hostnaam of het IP-adres nog niet bekend is, kunt u een tijdelijke aanduidingsservice gebruiken om het externe IP-adres te bepalen:
    1. Maak de LoadBalancer-service op een poort die niet wordt gebruikt (zoals 8080):
      kubectl create service loadbalancer placeholder-service --tcp=8080:8080
      
    2. Haal het externe IP-adres op:
      kubectl get svc placeholder-service
      
    3. Als het externe IP-adres:
      • Geeft een waarde weer zoals 192.168.X.X : gebruik dat IP-adres als san bij het maken van het servercertificaat en geheim. Maak vervolgens verbinding met de broker via dat IP-adres in plaats van localhost.
      • Toont <pending> : de Kubernetes-distributie die u gebruikt, biedt mogelijk geen ondersteuning voor het automatisch toewijzen van een extern IP-adres. Volg de stappen in de Kubernetes-documentatie voor uw distributie- en hostomgeving om het externe IP-adres te vinden. Mogelijk moet u ook port forwarding of een VPN configureren, afhankelijk van de netwerkinstallatie.
    4. Nadat u het externe IP-adres hebt bepaald, verwijdert u de tijdelijke aanduiding voor de service:
      kubectl delete svc placeholder-service
      

Deze methode zorgt ervoor dat het servercertificaat overeenkomt met het externe IP-adres, waardoor beveiligde toegang tot de MQTT-broker mogelijk is.

Certificaten aan serverzijde en volledige keten voorbereiden

Maak eerst een basis-CA aan de serverzijde. Deze CA staat los van de basis-CA aan de clientzijde die later wordt gemaakt. Om de scheiding duidelijk te houden, noemen we alles aan de serverzijde Contoso. Om latere stappen gemakkelijker te maken, slaan we het wachtwoord voor het versleutelen van de persoonlijke sleutel over. Deze procedure is alleen acceptabel in een zelfstudie-instelling.

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

Maak vervolgens een tussenliggende CA die is ondertekend door deze basis-CA.

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

Gebruik ten slotte deze tussenliggende CA om een servercertificaat te ondertekenen voor de brokerfront-end van de MQTT-broker. localhost Hier ziet u de alternatieve naam voor onderwerp (SAN) die wordt gebruikt voor de zelfstudie.

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

Met de --bundle vlag wordt het servercertificaat gebundeld met het tussenliggende handtekeningcertificaat. Tls-handshake vereist dat de bundel de volledige keten controleert.

Certificaten aan clientzijde en volledige keten voorbereiden

Maak op dezelfde manier de basis-CA voor Fabrikam en de tussenliggende CA.

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

Genereer vervolgens clientcertificaten voor een thermostaat, hygrometer, verwarming en gloeilamp.

# 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 configureren

Importeer het zojuist gegenereerde servercertificaat en de persoonlijke sleutel in een Kubernetes-geheim. Dit geheim wordt later gebruikt om een TLS-listener voor MQTT Broker te configureren.

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

Maak ook een configuratietoewijzing die de basis-CA fabrikam (client-side) bevat. Deze configuratietoewijzing is vereist voor MQTT-broker om deze te vertrouwen voor X.509-verificatie.

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

MQTT-broker configureren

De volgende stappen configureren de MQTT-broker met TLS-versleuteling en X.509-clientverificatie. In de zelfstudie wordt Azure Portal gebruikt om de MQTT-broker te configureren.

Verificatie

Als u clients wilt toestaan om te verifiëren met behulp van X.509-certificaten die zijn uitgegeven door de fabrikam-basis-CA, maakt u een verificatiebeleid dat het Fabrikam-basis-CA-certificaat vertrouwt en wijst u de clientcertificaten toe aan autorisatiekenmerken voor ABAC.

  1. Navigeer in Azure Portal naar uw IoT Operations-exemplaar.

  2. Selecteer onder Onderdelen de optie MQTT Broker.

  3. Selecteer het tabblad Verificatie.

  4. Selecteer Verificatiebeleid maken.

  5. Voer bij Beleidsnaam de naam inx509-auth.

  6. Voeg een nieuwe methode toe door de methode Toevoegen te selecteren.

  7. Kies het methodetype X.509 in de vervolgkeuzelijst en selecteer Details toevoegen om de methode te configureren.

  8. Geef in het detailvenster voor X.509-verificatie de naam fabrikam-ca van het vertrouwde CA-certificaat van Fabrikam en de kenmerken op.

    {
      "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. Selecteer Toepassen en vervolgens Toevoegen om de wijzigingen op te slaan.

Schermopname van het gebruik van Azure Portal voor het maken van MQTT Broker X.509-verificatiemethode.

Listener

Maak met het verificatiebeleid een listener die gebruikmaakt van het X.509-verificatiebeleid. Aangezien X.509-verificatie TLS vereist, configureert u ook de listener voor het gebruik van het Contoso-servercertificaat en de persoonlijke sleutel die u eerder hebt gemaakt.

  1. Navigeer in Azure Portal naar uw IoT Operations-exemplaar.

  2. Selecteer onder Onderdelen de optie MQTT Broker.

  3. Selecteer MQTT Broker-listener voor LoadBalancer>Create. Geef de volgende instellingen op:

    Instelling Omschrijving
    Naam Voer mqtts-endpoint in.
    Servicenaam Naam van de Kubernetes-service. Laat leeg om de naam van de listener als servicenaam mqtts-endpoint te gebruiken.
    Servicetype LoadBalancer is al geselecteerd.
  4. Voer onder Poorten de volgende instellingen in voor de eerste poort:

    Instelling Beschrijving
    Poort Voer 8883 in
    Verificatie X509-auth kiezen
    Autorisatie Kies Geen
    Protocol MQTT kiezen
    TLS Selecteer Toevoegen
  5. Voer in het deelvenster TLS-configuratie de volgende instellingen in:

    Instelling Beschrijving
    TLS-modus Handmatig kiezen
    Naam van verlener broker-server-cert invoeren
  6. Selecteer Listener toepassen en maken.

Schermopname van de Azure Portal-methode voor het instellen van een listener met TLS-poort.

Na een paar minuten wordt de mqtts-endpoint LoadBalancer-service gemaakt.

$ 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

In plaats van het externe IP-adres te gebruiken, gebruiken localhost we deze voor de zelfstudie.

Tip

De codespace-configuratie stelt automatisch port forwarding in voor 8883. Zie Port Forwarding gebruiken om andere omgevingen in te stellen.

Eén Mug-client gebruiken om berichten via TLS te publiceren

Gebruik de Mug-client om een bericht te publiceren vanuit dezelfde map als de certificaatbestanden: contoso_root_ca.crt, thermostat.crten thermostat.key. De --cafile contoso_root_ca.crt vlag is bedoeld voor Mug om servercertificaatverificatie uit te voeren.

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

De publicatie slaagt omdat Mug gebruikmaakt van een clientcertificaat dat is geroot in fabrikam_root_ca.crt. De MQTT-broker vertrouwt dit certificaat omdat het x509-auth verificatiebeleid dat u eerder hebt gemaakt. Daarnaast staat de MQTT-broker momenteel geverifieerde clients toe om te publiceren naar elk onderwerp.

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

Autorisatie configureren voor MQTT-onderwerpen voor meerdere clients met X.509

Als u de toegang tot MQTT-onderwerpen wilt beperken op basis van de kenmerken van het clientcertificaat, maakt u een autorisatiebeleid waarmee de kenmerken van het clientcertificaat worden toegewezen aan toegestane acties voor specifieke onderwerpen.

  1. Navigeer in Azure Portal naar uw IoT Operations-exemplaar.

  2. Selecteer onder Onderdelen de optie MQTT Broker.

  3. Selecteer het tabblad Autorisatie .

  4. Selecteer Autorisatiebeleid maken.

  5. Voer bij Beleidsnaam de naam inabac-authz.

  6. Voer onder Regels de volgende regels in:

    [
      {
        "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. Selecteer Toevoegen om de wijzigingen op te slaan.

Schermopname van Azure Portal voor het instellen van een autorisatiebeleid.

Werk vervolgens de MQTT Broker-listener bij om het nieuwe autorisatiebeleid te gebruiken.

  1. Selecteer het tabblad Listeners .
  2. Selecteer de mqtts-endpoint listener.
  3. Kies onder Poort>8883-autorisatie> abac-authz.
  4. Selecteer Opslaan.

Schermopname van Azure Portal voor het koppelen van een poort aan een autorisatiebeleid.

Berichten publiceren naar een beperkt onderwerp

In deze sectie testen we het zojuist toegepaste autorisatiebeleid.

Maak eerst verbinding met thermostat het onderwerp en probeer het te telemetry/humiditypubliceren:

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

Omdat thermostat het onderdeel is van thermostat_group, dat niet is toegestaan om te publiceren naar het vochtigheidsonderwerp, mislukt het publiceren.

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.

Wijzigen in publiceren in telemetry/temperature, wat is toegestaan en de publicatie slaagt. Laat de opdracht actief.

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

Abonneren op berichten met beperkte onderwerpen

Maak in een afzonderlijke terminalsessie verbinding met heater u om u te health/heartbeatabonneren.

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

Omdat heater het abonnement niet is gemachtigd om u te abonneren op het heartbeat-onderwerp, mislukt het abonnement. Hier betekent code 135 niet geautoriseerd.

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

Schakel het abonnementsonderwerp in telemetry/temperaturewaarnaar thermostat nog steeds berichten worden verzonden.

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

Berichten worden nu heater ontvangen omdat deze is geautoriseerd met de gebruikersnaam.

Publiceer in een andere afzonderlijke terminalsessie berichten naarhealth/heartbeat:lightbulb

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

De publicatie slaagt omdat lightbulb er een tussenliggend certificaat met is toegewezen CN = Fabrikam Intermediate CA 1aan het kenmerk manufacturer=fabrikam. Clients met dat kenmerk kunnen publiceren op health/heartbeat. Wanneer de client begint met het verzenden van berichten, heater ontvangt deze eerder niets.

Resources opschonen

Als u de resources wilt opschonen die in deze zelfstudie zijn gemaakt, verwijdert u de listener en het verificatie- en autorisatiebeleid.

  1. Navigeer in Azure Portal naar uw IoT Operations-exemplaar.
  2. Selecteer onder Onderdelen de optie MQTT Broker.
  3. Selecteer het tabblad Listeners .
  4. Schakel het selectievakje in naast mqtts-endpoint listener.
  5. Selecteer Verwijderen.
  6. Bevestig de verwijdering.
  7. Selecteer het tabblad Verificatie.
  8. Schakel het selectievakje naast x509-auth in.
  9. Selecteer Verwijderen.
  10. Bevestig de verwijdering.
  11. Selecteer het tabblad Autorisatie .
  12. Schakel het selectievakje naast abac-authz in.
  13. Selecteer Verwijderen.
  14. Bevestig de verwijdering.

Verwijder ook het Kubernetes-geheim en de configuratietoewijzing.

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

Verwijder ten slotte de certificaten en sleutels die eerder zijn gegenereerd.

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