Konfigurowanie autoryzacji brokera MQTT
Ważne
Ta strona zawiera instrukcje dotyczące zarządzania składnikami operacji usługi Azure IoT przy użyciu manifestów wdrażania platformy Kubernetes, które są w wersji zapoznawczej. Ta funkcja jest udostępniana z kilkoma ograniczeniami i nie powinna być używana w przypadku obciążeń produkcyjnych.
Zobacz Dodatkowe warunki użytkowania wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta lub wersji zapoznawczej albo w inny sposób nie zostały jeszcze wydane jako ogólnie dostępne.
Zasady autoryzacji określają, jakie akcje mogą wykonywać klienci na brokerze, takie jak łączenie, publikowanie lub subskrybowanie tematów. Skonfiguruj brokerA MQTT tak, aby używał jednego lub wielu zasad autoryzacji za pomocą zasobu BrokerAuthorization. Każdy zasób BrokerAuthorization zawiera listę reguł określających podmioty zabezpieczeń i zasoby zasad autoryzacji.
Aby połączyć zasób BrokerListener z zasobem BrokerAuthorization, określ authorizationRef
pole w ports
ustawieniu zasobu BrokerListener. Podobnie jak w przypadku brokeraAuthentication, zasób BrokerAuthorization może być połączony z wieloma portami BrokerListener. Zasady autoryzacji dotyczą wszystkich połączonych portów odbiornika. Istnieje jedna kluczowa różnica w porównaniu z elementem BrokerAuthentication:
Ważne
Aby konfiguracja BrokerAuthorization miała zastosowanie do portu odbiornika, co najmniej jeden zasób BrokerAuthentication musi być również połączony z tym portem odbiornika.
Aby dowiedzieć się więcej o brokerlistener, zobacz Zasób BrokerListener.
Aby skonfigurować autoryzację, utwórz zasób BrokerAuthorization w klastrze Kubernetes. W poniższych sekcjach przedstawiono przykłady konfigurowania autoryzacji dla klientów korzystających z nazw użytkowników, atrybutów, certyfikatów X.509 i tokenów kont usługi Kubernetes (SATs). Aby uzyskać listę dostępnych ustawień, zobacz dokumentację interfejsu API autoryzacji brokera .
W poniższym przykładzie pokazano, jak utworzyć zasób BrokerAuthorization przy użyciu nazw użytkowników i atrybutów.
W witrynie Azure Portal przejdź do wystąpienia operacji IoT.
W obszarze Składniki wybierz pozycję Broker MQTT.
Wybierz kartę Autoryzacja.
Wybierz istniejące zasady uwierzytelniania lub utwórz nowe, wybierając pozycję Utwórz zasady autoryzacji.
Ta autoryzacja brokera umożliwia klientom z identyfikatorami temperature-sensor
klienta lub humidity-sensor
, lub klientów z atrybutami organization
, z wartościami contoso
i city
, i z wartością seattle
, do:
- Nawiąż połączenie z brokerem.
- Publikowanie komunikatów w tematach telemetrii o określonym zakresie przy użyciu identyfikatorów klientów i organizacji. Na przykład: .
-
temperature-sensor
program może publikować w plikach/telemetry/temperature-sensor
i/telemetry/contoso
. -
humidity-sensor
program może publikować w plikach/telemetry/humidity-sensor
i/telemetry/contoso
. -
some-other-username
program może publikować w programie/telemetry/contoso
.
-
-
/commands/
Subskrybuj tematy objęte zakresem swojej organizacji. Na przykład: .-
temperature-sensor
program może subskrybować usługę/commands/contoso
. -
some-other-username
program może subskrybować usługę/commands/contoso
.
-
Aby użyć nazwy użytkownika MQTT do autoryzacji, określ je jako tablicę w obszarze principals.usernames
. W zależności od metody uwierzytelniania nazwa użytkownika może nie zostać zweryfikowana:
- Kubernetes SAT: Nazwa użytkownika nie powinna być używana do autoryzacji, ponieważ nie jest weryfikowana pod kątem MQTTv5 z rozszerzonym uwierzytelnianiem.
- X.509: Nazwa użytkownika jest zgodna z nazwą pospolitą (CN) z certyfikatu i może służyć do reguł autoryzacji.
- Niestandardowe: nazwa użytkownika powinna być używana tylko dla reguł autoryzacji, jeśli uwierzytelnianie niestandardowe weryfikuje nazwę użytkownika.
Aby zapobiec problemom z zabezpieczeniami, użyj nazwy użytkownika MQTT do autoryzacji brokera tylko wtedy, gdy można go zweryfikować.
principals
Ponieważ pole jest logiczneOR
, można dodatkowo ograniczyć dostęp na podstawie identyfikatorów klientów, dodając clientIds
pole do brokerResources
pola. Aby na przykład zezwolić klientom z identyfikatorami klientów rozpoczynającymi się od numeru kompilacji w celu nawiązania połączenia i opublikowania danych telemetrycznych w tematach o określonym zakresie w budynku, użyj następującej konfiguracji:
W regułach autoryzacji brokera dla zasad autoryzacji użyj następującej konfiguracji:
[
{
"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"
}
]
}
}
]
W tym miejscu, jeśli parametr clientIds
nie został ustawiony w metodzie Connect
, klient z dowolnym identyfikatorem klienta może nawiązać połączenie, building
o ile atrybut ma ustawiony na building22
wartość lub building23
. Po dodaniu clientIds
pola tylko klienci z identyfikatorami klientów rozpoczynającymi się od building22
lub building23
mogą się łączyć. To oznaczenie gwarantuje, że klient ma prawidłowy atrybut i że identyfikator klienta jest zgodny z oczekiwanym wzorcem.
Można autoryzować klientów korzystających z certyfikatów X.509 do uwierzytelniania w celu uzyskania dostępu do zasobów na podstawie właściwości X.509 znajdujących się na ich certyfikacie lub certyfikatów wystawiających łańcuch.
Aby utworzyć reguły na podstawie właściwości na podstawie certyfikatu klienta, jego głównego urzędu certyfikacji lub pośredniego urzędu certyfikacji, zdefiniuj atrybuty X.509 w zasobie BrokerAuthorization. Aby uzyskać więcej informacji, zobacz Atrybuty certyfikatu.
Aby utworzyć zasady autoryzacji na podstawie tylko nazwy CN podmiotu certyfikatu klienta , utwórz reguły na podstawie nazwy CN.
Jeśli na przykład klient ma certyfikat z tematem CN = smart-lock
, jego nazwa użytkownika to smart-lock
. Z tego miejsca utwórz zasady autoryzacji w zwykły sposób.
Atrybuty autoryzacji dla sieci SAN są ustawiane jako część adnotacji konta usługi. Aby na przykład dodać atrybut autoryzacji o nazwie group
z wartością authz-sat
, uruchom polecenie :
kubectl annotate serviceaccount mqtt-client aio-broker-auth/group=authz-sat
Adnotacje atrybutów muszą zaczynać się od aio-broker-auth/
, aby odróżnić je od innych adnotacji.
Ponieważ aplikacja ma atrybut autoryzacji o nazwie authz-sat
, nie ma potrzeby podawania clientId
wartości lub username
. Odpowiedni zasób BrokerAuthorization używa tego atrybutu jako podmiotu zabezpieczeń, na przykład:
W regułach autoryzacji brokera dla zasad autoryzacji użyj następującej konfiguracji:
[
{
"brokerResources": [
{
"clientIds": [],
"method": "Connect",
"topics": []
},
{
"clientIds": [],
"method": "Publish",
"topics": [
"odd-numbered-orders"
]
},
{
"clientIds": [],
"method": "Subscribe",
"topics": [
"orders"
]
}
],
"principals": {
"attributes": [
{
"group": "authz-sat"
}
]
}
}
]
Aby dowiedzieć się więcej na przykładzie, zobacz Konfigurowanie zasad autoryzacji za pomocą klienta dapr.
Broker MQTT udostępnia magazyn stanów, którego klienci mogą używać do przechowywania stanu. Magazyn stanów można również skonfigurować tak, aby był wysoce dostępny.
Aby skonfigurować autoryzację dla klientów korzystających z magazynu stanów, podaj następujące uprawnienia:
- Uprawnienie do publikowania w temacie magazynu
$services/statestore/_any_/command/invoke/request
wartości klucza systemu - Uprawnienie do subskrybowania tematu odpowiedzi (ustawionego podczas początkowego publikowania jako parametru)
<response_topic>/#
Dostęp do magazynu stanów jest uzyskiwany za pośrednictwem brokera MQTT w temacie statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke
.
Ponieważ klienci mają dostęp do tematu, można określić klucze i poziomy dostępu w stateStoreResources
sekcji konfiguracji brokera brokerResources
MQTT.
Format stateStoreResources
sekcji składa się z poziomu dostępu, wskaźnika wzorca i wzorca.
Uwzględnij sekcję stateStoreResources
w regułach zasad autoryzacji.
"stateStoreResources": [
{
"method": "", // Values: read, write, readwrite
"keyType": "", //Values: string, pattern, binary. Default is pattern
"keys": [
// List of patterns to match
]
},
]
Pole method
określa poziom dostępu:
- Dostęp do odczytu jest określony za pomocą polecenia
read
. Dostęp do zapisu jest określony za pomocą poleceniawrite
. Dostęp do odczytu i zapisu jest określony za pomocą poleceniareadwrite
. - Wymagany jest poziom dostępu.
- Poziom dostępu do odczytu oznacza akcje i
get
keynotify
. - Poziom dostępu do zapisu oznacza akcje
set
,del
ivdel
.
Pole keyType
określa typ dopasowania klucza:
-
pattern
: służy do dopasowywania wzorców w stylu globu. -
string
: Służy do dokładnego dopasowania, na przykład, gdy klucz zawiera znaki, które mogą być inaczej dopasowane jako wzorzec (*
,?
,[0-9]
). -
binary
: służy do dopasowywania klucza binarnego.
Pole keys
określa klucze, które mają być zgodne. Klucze można określić jako wzorce w stylu globu, podstawianie tokenów lub dokładne ciągi.
Przykłady stylu globu:
-
colors/*
: Wszystkie klucze pod prefiksem "kolory/" -
number[0-9]
: Dowolny klucz z "number0" do "number9" -
char?
: dowolny klucz z prefiksem "char" i sufiksem pojedynczej cyfry, na przykład "charA" -
*
: Pełny dostęp do wszystkich kluczy
-
Klucze magazynu stanów obsługują również podstawianie tokenów, gdy typ klucza to
pattern
i nawiasy klamrowe są zarezerwowane do tego celu. Przykłady podstawiania tokenów:clients/{principal.clientId}/*
usernames/{principal.username}/*
rooms/{principal.attributes.room}/*
Oto przykład tworzenia zasobów magazynu stanów.
W regułach autoryzacji brokera dla zasad autoryzacji dodaj podobną konfigurację:
[
{
"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"
]
}
]
}
]
Zasoby autoryzacji brokera można aktualizować w czasie wykonywania bez ponownego uruchamiania. Wszyscy klienci połączeni w momencie aktualizacji zasad są rozłączone. Zmiana typu zasad jest również obsługiwana.
kubectl edit brokerauthorization my-authz-policies
- W witrynie Azure Portal przejdź do wystąpienia operacji IoT.
- W obszarze Składniki wybierz pozycję Broker MQTT.
- Wybierz odbiornik brokera, który chcesz edytować z listy.
- Na porcie, na którym chcesz wyłączyć autoryzację, wybierz pozycję Brak z listy rozwijanej autoryzacji.
W przypadku protokołu MQTT 3.1.1 po odmowie publikowania klient otrzymuje kod PUBACK bez błędu, ponieważ wersja protokołu nie obsługuje zwracania kodu błędu. Funkcja MQTTv5 zwraca kod PUBACK z kodem przyczyny 135 (nieautoryzowanym) podczas odmowy publikowania.