Dela via


Konfigurera Auktorisering för MQTT-asynkronisering

Viktigt!

Den här sidan innehåller instruktioner för att hantera Azure IoT Operations-komponenter med hjälp av Kubernetes-distributionsmanifest, som finns i förhandsversion. Den här funktionen har flera begränsningar och bör inte användas för produktionsarbetsbelastningar.

Juridiska villkor för Azure-funktioner i betaversion, förhandsversion eller som av någon annan anledning inte har gjorts allmänt tillgängliga ännu finns i kompletterande användningsvillkor för Microsoft Azure-förhandsversioner.

Auktoriseringsprinciper avgör vilka åtgärder klienterna kan utföra på asynkron meddelandekö, till exempel att ansluta, publicera eller prenumerera på ämnen. Konfigurera MQTT-asynkron meddelandekö så att den använder en eller flera auktoriseringsprinciper med BrokerAuthorization-resursen. Varje BrokerAuthorization-resurs innehåller en lista med regler som anger huvudnamn och resurser för auktoriseringsprinciperna.

Om du vill länka en BrokerListener-resurs till en BrokerAuthorization-resurs anger du authorizationRef fältet i ports inställningen för BrokerListener-resursen. På samma sätt som BrokerAuthentication kan BrokerAuthorization-resursen länkas till flera BrokerListener-portar. Auktoriseringsprinciperna gäller för alla länkade lyssnarportar. Det finns en viktig skillnad jämfört med BrokerAuthentication:

Viktigt!

Om konfigurationen BrokerAuthorization ska gälla för en lyssnarport måste minst en BrokerAuthentication-resurs också vara länkad till lyssnarporten.

Mer information om BrokerListener finns i BrokerListener-resurs.

Auktoriseringsregler

Om du vill konfigurera auktorisering skapar du en BrokerAuthorization-resurs i ditt Kubernetes-kluster. Följande avsnitt innehåller exempel på hur du konfigurerar auktorisering för klienter som använder användarnamn, attribut, X.509-certifikat och Kubernetes-tjänstkontotoken (SAT). En lista över tillgängliga inställningar finns i API-referensen för auktorisering av asynkronisering.

I följande exempel visas hur du skapar en BrokerAuthorization-resurs med hjälp av både användarnamn och attribut.

  1. I Azure Portal går du till din IoT Operations-instans.

  2. Under Komponenter väljer du MQTT Broker.

  3. Välj fliken Auktorisering .

  4. Välj en befintlig autentiseringsprincip eller skapa en ny genom att välja Skapa auktoriseringsprincip.

    Skärmbild som visar hur du använder Azure Portal för att skapa auktoriseringsregler för asynkron meddelandekö.

Med den här auktoriseringen för asynkronisering kan klienter med klient-ID:t temperature-sensor eller humidity-sensor, eller klienterna med attributen organization, med värdena contoso och city, och med värdet seattle, göra följande:

  • Anslut till asynkron meddelandekö.
  • Publicera meddelanden till telemetriämnen som är begränsade till deras klient-ID:n och organisation. Till exempel:
    • temperature-sensor kan publicera till /telemetry/temperature-sensor och /telemetry/contoso.
    • humidity-sensor kan publicera till /telemetry/humidity-sensor och /telemetry/contoso.
    • some-other-username kan publicera till /telemetry/contoso.
  • Prenumerera på ämnen som är begränsade till /commands/ organisationen. Till exempel:
    • temperature-sensor kan prenumerera på /commands/contoso.
    • some-other-username kan prenumerera på /commands/contoso.

Använda ett användarnamn för auktorisering

Om du vill använda MQTT-användarnamnet för auktorisering anger du dem som en matris under principals.usernames. Beroende på autentiseringsmetoden kanske användarnamnet inte verifieras:

  • Kubernetes SAT: Användarnamnet ska inte användas för auktorisering eftersom det inte har verifierats för MQTTv5 med förbättrad autentisering.
  • X.509: Användarnamnet matchar det gemensamma namnet (CN) från ett certifikat och kan användas för auktoriseringsregler.
  • Anpassad: Användarnamn ska endast användas för auktoriseringsregler om anpassad autentisering validerar användarnamnet.

Om du vill förhindra säkerhetsproblem använder du MQTT-användarnamnet för auktorisering endast när det kan verifieras.

Begränsa åtkomsten ytterligare baserat på klient-ID

Eftersom fältet principals är logiskt ORkan du ytterligare begränsa åtkomsten baserat på klient-ID:t genom att lägga till fältet clientIds i fältet brokerResources . Om du till exempel vill tillåta klienter med klient-ID:n som börjar med deras byggnadsnummer att ansluta och publicera telemetri till ämnen som är begränsade till deras byggnad använder du följande konfiguration:

Använd följande konfiguration i auktoriseringsreglerna för auktoriseringshanteraren för din auktoriseringsprincip:

[
  {
    "brokerResources": [
      {
        "clientIds": [
          "{principal.attributes.building}*"
        ],
        "method": "Connect",
        "topics": []
      },
      {
        "clientIds": [],
        "method": "Publish",
        "topics": [
          "sensors/{principal.attributes.building}/{principal.clientId}/telemetry"
        ]
      }
    ],
    "principals": {
      "attributes": [
        {
          "building": "building22"
        },
        {
          "building": "building23"
        }
      ]
    }
  }
]

Här, om clientIds inte har angetts under Connect metoden, kan en klient med något klient-ID ansluta så länge attributet har building angetts till building22 eller building23. När du lägger till fältet clientIds är det bara klienter med klient-ID:t som börjar med building22 eller building23 kan ansluta. Den här beteckningen säkerställer att klienten har rätt attribut och att klient-ID:t matchar det förväntade mönstret.

Auktorisera klienter som använder X.509-autentisering

Du kan auktorisera klienter som använder X.509-certifikat för autentisering för att komma åt resurser baserat på X.509-egenskaper som finns på deras certifikat eller deras utfärdande certifikat i kedjan.

Använda attribut

Om du vill skapa regler baserat på egenskaper från en klients certifikat, dess rotcertifikatutfärdare eller mellanliggande certifikatutfärdare definierar du X.509-attributen i BrokerAuthorization-resursen. Mer information finns i Certifikatattribut.

Med klientcertifikatets eget namn som användarnamn

Skapa auktoriseringsprinciper baserat på klientcertifikatets ämnes-CN genom att skapa regler baserat på CN.

Om en klient till exempel har ett certifikat med ämnet CN = smart-lockär smart-lockdess användarnamn . Därifrån skapar du auktoriseringsprinciper som vanligt.

Auktorisera klienter som använder Kubernetes-tjänstkontotoken

Auktoriseringsattribut för SAT anges som en del av anteckningarna för tjänstkontot. Om du till exempel vill lägga till ett auktoriseringsattribut med namnet group med värdet authz-satkör du kommandot:

kubectl annotate serviceaccount mqtt-client aio-broker-auth/group=authz-sat

Attributanteckningar måste börja med aio-broker-auth/ för att skilja dem från andra anteckningar.

Eftersom programmet har ett auktoriseringsattribut med namnet authz-satbehöver du inte ange ett clientId eller username -värde. Motsvarande BrokerAuthorization-resurs använder det här attributet som huvudnamn, till exempel:

Använd följande konfiguration i auktoriseringsreglerna för auktoriseringshanteraren för din auktoriseringsprincip:

[
  {
    "brokerResources": [
      {
        "clientIds": [],
        "method": "Connect",
        "topics": []
      },
      {
        "clientIds": [],
        "method": "Publish",
        "topics": [
          "odd-numbered-orders"
        ]
      },
      {
        "clientIds": [],
        "method": "Subscribe",
        "topics": [
          "orders"
        ]
      }
    ],
    "principals": {
      "attributes": [
        {
          "group": "authz-sat"
        }
      ]
    }
  }
]

Mer information om ett exempel finns i Konfigurera auktoriseringsprincip med Dapr-klienten.

Tillståndslager

MQTT-koordinatorn tillhandahåller ett tillståndsarkiv som klienter kan använda för att lagra tillstånd. Du kan också konfigurera tillståndsarkivet så att det är mycket tillgängligt.

Ange följande behörigheter för att konfigurera auktorisering för klienter som använder tillståndsarkivet:

  • Behörighet att publicera till ämnet för systemnyckelns värdelager $services/statestore/_any_/command/invoke/request
  • Behörighet att prenumerera på svarsämnet (anges under den första publiceringen som en parameter) <response_topic>/#

Tillståndsarkivnycklar

Tillståndsarkivet nås via MQTT-asynkron meddelandekö i ämnet statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke. Eftersom klienter har åtkomst till ämnet kan du ange nycklar och åtkomstnivåer under stateStoreResources avsnittet i MQTT-koordinatorkonfigurationen brokerResources .

Avsnittsformatet stateStoreResources består av åtkomstnivå, en mönsterindikator och mönstret.

Inkludera avsnittet stateStoreResources i reglerna för din auktoriseringsprincip.

"stateStoreResources": [
  {
    "method": "", // Values: read, write, readwrite 
    "keyType": "", //Values: string, pattern, binary. Default is pattern
    "keys": [
      // List of patterns to match
    ]
  },
]

Fältet method anger åtkomstnivå:

  • Läsåtkomst anges med read. Skrivåtkomst anges med write. Läs- och skrivåtkomst anges med readwrite.
  • Åtkomstnivå krävs.
  • Läsåtkomstnivå innebär åtgärderna get för och keynotify.
  • Skrivåtkomstnivå innebär åtgärderna set, deloch vdel.

Fältet keyType anger typen av nyckelmatchning:

  • pattern: Används för mönstermatchning i globformat.
  • string: Används för att göra exakta matchningar, till exempel när en nyckel innehåller tecken som annars kan matchas som ett mönster (*, ?, [0-9]).
  • binary: Används för att matcha en binär nyckel.

Fältet keys anger vilka nycklar som ska matchas. Du kan ange nycklarna som mönster i globformat, tokenersättningar eller exakta strängar.

  • Exempel på Glob-format:

    • colors/*: Alla nycklar under prefixet "colors/"
    • number[0-9]: Valfri nyckel från "number0" till "number9"
    • char?: Valfri nyckel med prefixet "char" och ett suffix med en siffra, till exempel "charA"
    • *: Fullständig åtkomst till alla nycklar
  • Tillståndslagringsnycklar stöder även tokenersättning när nyckeltypen är pattern och klammerparenteser är reserverade för detta ändamål. Exempel på tokenersättning:

    • clients/{principal.clientId}/*
    • usernames/{principal.username}/*
    • rooms/{principal.attributes.room}/*

Här är ett exempel på hur du kan skapa dina tillståndslagerresurser.

Lägg till en liknande konfiguration i auktoriseringsreglerna för auktoriseringshanteraren för din auktoriseringsprincip:

[
  {
    "brokerResources": [
      {
        "clientIds": [
          "{principal.attributes.building}*"
        ],
        "method": "Connect"
      },
      {
        "method": "Publish",
        "topics": [
          "sensors/{principal.attributes.building}/{principal.clientId}/telemetry/*"
        ]
      },
      {
        "method": "Subscribe",
        "topics": [
          "commands/{principal.attributes.organization}"
        ]
      }
    ],
    "principals": {
      "attributes": [
        {
          "building": "17",
          "organization": "contoso"
        }
      ],
      "usernames": [
        "temperature-sensor",
        "humidity-sensor"
      ]
    },
    "stateStoreResources": [
      {
        "method": "Read",
        "keyType": "Pattern",
        "keys": [
          "myreadkey",
          "myotherkey?",
          "mynumerickeysuffix[0-9]",
          "clients/{principal.clientId}/*"
        ]
      },
      {
        "method": "ReadWrite",
        "keyType": "Binary",
        "keys": [
          "xxxxxxxxxxxxxxxxxxxx"
        ]
      }
    ]
  }
]

Uppdatera auktorisering

Du kan uppdatera auktoriseringsresurser för asynkrona auktoriseringar vid körning utan omstart. Alla klienter som är anslutna vid tidpunkten för uppdateringen av principen är frånkopplade. Det finns också stöd för att ändra principtypen.

kubectl edit brokerauthorization my-authz-policies

Inaktivera auktorisering

  1. I Azure Portal går du till din IoT Operations-instans.
  2. Under Komponenter väljer du MQTT Broker.
  3. Välj den koordinatorlyssnare som du vill redigera i listan.
  4. På porten där du vill inaktivera auktorisering väljer du Ingen i listrutan auktorisering.

Obehörig publicering i MQTT 3.1.1

Med MQTT 3.1.1, när publicering nekas, får klienten PUBACK utan fel eftersom protokollversionen inte stöder returfelkod. MQTTv5 returnerar PUBACK med orsakskod 135 (inte auktoriserad) när publicering nekas.