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ö för att använda en eller flera auktoriseringsprinciper med BrokerAuthorization-resursen. Varje BrokerAuthorization-resurs innehåller en lista med regler som anger huvudnamn och resurser för auktoriseringsprinciperna.
Länka BrokerAuthorization till BrokerListener
Om du vill länka en BrokerListener 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 dock en viktig skillnad jämfört med BrokerAuthentication:
Viktigt!
Om konfigurationen BrokerAuthorization ska gälla för en lyssnarport måste minst en BrokerAuthentication 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 både användarnamn och attribut:
I Azure Portal navigerar du till din IoT Operations-instans.
Under Komponenter väljer du MQTT Broker.
Välj fliken Auktorisering .
Välj en befintlig autentiseringsprincip eller skapa en ny genom att välja Skapa auktoriseringsprincip.
Med den här auktoriseringen för asynkronisering kan klienter med klient-ID temperature-sensor
eller humidity-sensor
, eller klienter med attribut organization
med värde contoso
och city
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å kommandon som omfattas av deras organisation. Till exempel:
temperature-sensor
kan prenumerera på/commands/contoso
.some-other-username
kan prenumerera på/commands/contoso
.
Använda 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 dock inte verifieras:
- Kubernetes SAT – Användarnamn bör inte användas för auktorisering eftersom det inte har verifierats för MQTTv5 med förbättrad autentisering.
- X.509 – Användarnamnet matchar CN från certifikatet 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 bara MQTT-användarnamnet för auktorisering av asynkron meddelandekö när det kan verifieras.
Begränsa åtkomsten ytterligare baserat på klient-ID
Eftersom fältet principals
är ett logiskt ELLER kan du ytterligare begränsa åtkomsten baserat på klient-ID 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 dess 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
. Genom att lägga till fältet clientIds
är det bara klienter med klient-ID:t som börjar med building22
eller building23
kan ansluta. Detta säkerställer inte bara att klienten har rätt attribut utan även att klient-ID:t matchar det förväntade mönstret.
Auktorisera klienter som använder X.509-autentisering
Klienter som använder X.509-certifikat för autentisering kan ha behörighet 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
Om du bara vill skapa auktoriseringsprinciper baserat på klientcertifikatets eget namn (CN) skapar du regler baserat på CN.
Om en klient till exempel har ett certifikat med ämne CN = smart-lock
är smart-lock
dess 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-sat
kö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-sat
behöver du inte ange en clientId
eller username
. 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 Broker tillhandahåller ett tillståndsarkiv som klienter kan använda för att lagra tillstånd. Tillståndsarkivet kan också konfigureras för hög tillgänglighet.
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-koordinatorn 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 medwrite
och båda medreadwrite
. - Åtkomstnivå krävs.
- Läsåtkomstnivå innebär åtgärderna
get
för ochkeynotify
. - Skrivåtkomstnivå innebär åtgärderna
set
,del
ochvdel
.
Fältet keyType
anger typ av nyckelmatchning.
pattern
för att använda mönstermatchning i globformatstring
för att göra exakt matchning, till exempel när en nyckel innehåller tecken som annars kan matchas som ett mönster (*
,?
,[0-9]
)binary
för att matcha en binär nyckel
Fältet keys
anger vilka nycklar som ska matchas. Nycklarna kan anges som mönster i Glob-format , 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
Auktoriseringsresurser för auktorisering kan uppdateras 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
- I Azure Portal navigerar du till din IoT Operations-instans.
- Under Komponenter väljer du MQTT Broker.
- Välj den koordinatorlyssnare som du vill redigera i listan.
- På den port som 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 en publicering nekas, tar klienten emot PUBACK utan fel eftersom protokollversionen inte stöder returfelkod. MQTTv5 returnerar PUBACK med orsakskod 135 (inte auktoriserad) när publicering nekas.