Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Политики авторизации определяют действия, которые клиенты могут выполнять на брокере, например подключение, публикация или подписка на разделы. Настройте брокер MQTT для использования одной или нескольких политик авторизации с ресурсом BrokerAuthorization. Каждый ресурс BrokerAuthorization содержит список правил, определяющих субъекты и ресурсы для политик авторизации.
Как оцениваются правила
- Политики только разрешающие. Если правило явно не разрешает действие в отношении ресурса для субъекта, в действии отказано.
- Правило определяется тремя факторами: основными субъектами (участниками), действием (операции подключения/публикации/подписки или операций хранилища состояний), а также ресурсом (темами или ключами).
- Элементы внутри правила сопоставляются с использованием логического ИЛИ. Например, любое указанное имя пользователя, clientId или сопоставление атрибутов предоставляет доступ к ресурсам в правиле.
Подстановка токенов и подстановочные знаки
- Для тем и ключей можно использовать подстановку токенов для создания правил, которые адаптируются для каждого клиента:
{principal.username},{principal.clientId}, и{principal.attributes.<attributeName>}. - Подстановочные знаки
+и#в темах MQTT поддерживаются вbrokerResources.topics. - При использовании подстановки токенов в теме, токен должен быть единственным текстом в соответствующем сегменте пути. Например,
clients/{principal.clientId}/#допустимо, аclient-{principal.clientId}/#— нет. - Действия подключения не должны включать разделы.
Связывание BrokerAuthorization с BrokerListener
Чтобы связать ресурс BrokerListener с ресурсом BrokerAuthorization, укажите authorizationRef поле в ports параметре ресурса BrokerListener. Аналогично BrokerAuthentication, ресурс BrokerAuthorization можно связать с несколькими портами BrokerListener. Политики авторизации применяются ко всем связанным портам прослушивателя. Существует одно ключевое различие по сравнению с BrokerAuthentication:
Внимание
Для применения конфигурации BrokerAuthorization к порту прослушивателя необходимо также связать по крайней мере один ресурс BrokerAuthentication с этим портом прослушивателя.
Дополнительные сведения о BrokerListener см. в ресурсе BrokerListener.
Правила авторизации
Чтобы настроить авторизацию, создайте ресурс BrokerAuthorization в кластере Kubernetes. В следующих разделах приведены примеры настройки авторизации для клиентов, использующих имена пользователей, атрибуты, сертификаты X.509 и маркеры учетных записей службы Kubernetes (SATs). Для получения списка доступных параметров см. справочник API Авторизация брокера.
В следующем примере показано, как создать ресурс BrokerAuthorization с помощью имени пользователя и атрибутов.
В портал Azure перейдите к экземпляру Операций Интернета вещей.
В разделе "Компоненты" выберите MQTT Broker.
Перейдите на вкладку Authorization (Авторизация).
Выберите существующую политику проверки подлинности или создайте новую, выбрав "Создать политику авторизации".
Эта авторизация брокера позволяет клиентам с идентификаторами клиента temperature-sensor или humidity-sensor, или клиентам с атрибутами organization, со значениями contoso и city, и со значением seattle:
- Подключитесь к брокеру.
- Публикуйте сообщения в темах в пределах их идентификаторов клиентов и организации. Например:
-
temperature-sensorможет публиковаться в/sensor/temperature-sensorи/sensor/contoso. -
humidity-sensorможет публиковаться в/sensor/humidity-sensorи/sensor/contoso. -
some-other-usernameможет публиковаться в/sensor/contoso.
-
- Подпишитесь на
/commands/разделы, связанные с их организацией. Например:-
temperature-sensorможет подписаться на/commands/contoso. -
some-other-usernameможет подписаться на/commands/contoso.
-
Использование имени пользователя для авторизации
Чтобы использовать имя пользователя MQTT для авторизации, укажите их как массив в разделе principals.usernames. В зависимости от метода проверки подлинности имя пользователя может быть не проверено:
- Kubernetes SAT: имя пользователя не должно использоваться для авторизации, так как оно не проверено для MQTTv5 с расширенной проверкой подлинности.
- X.509: имя пользователя соответствует общему имени (CN) из сертификата и может использоваться для правил авторизации.
- Custom: Имя пользователя должно использоваться только для правил авторизации, если пользовательский метод аутентификации подтверждает имя пользователя.
Чтобы предотвратить проблемы с безопасностью, используйте имя пользователя MQTT для авторизации брокера только если его можно подтвердить.
Подсказка
Чтобы требовать, чтобы имя пользователя MQTT соответствовало идентификатору клиента, используйте замену токенов:
principals:
usernames:
- "{principal.clientId}"
Дальнейшее ограничение доступа на основе идентификатора клиента
principals Так как поле является логическимOR, вы можете дополнительно ограничить доступ на основе идентификаторов клиентов, добавив clientIds поле в brokerResources поле. Например, чтобы разрешить клиентам с идентификаторами, начинающимися с их номера здания, подключаться и публиковать в темах, связанных с их зданием, используйте следующую конфигурацию:
В правилах авторизации брокера для вашей политики используйте следующую конфигурацию:
[
{
"brokerResources": [
{
"clientIds": [
"{principal.attributes.building}*"
],
"method": "Connect",
"topics": []
},
{
"clientIds": [],
"method": "Publish",
"topics": [
"sensors/{principal.attributes.building}/{principal.clientId}/sensor"
]
}
],
"principals": {
"attributes": [
{
"building": "building22"
},
{
"building": "building23"
}
]
}
}
]
Здесь, если параметр clientIds не установлен в методе Connect, клиент с любым идентификатором может подключиться, пока атрибут building установлен в building22 или building23. При добавлении clientIds поля только клиенты с идентификаторами клиентов, которые начинаются с building22 или building23 могут подключаться. Это обозначение гарантирует, что клиент имеет правильный атрибут и что идентификатор клиента соответствует ожидаемому шаблону.
Авторизация клиентов, использующих проверку подлинности X.509
Вы можете авторизовать клиентов, которые используют сертификаты X.509 для проверки подлинности, для доступа к ресурсам на основе свойств X.509, присутствующих либо в их сертификатах, либо в сертификатах их удостоверяющих центров вверх по цепочке.
Использование атрибутов
Чтобы создать правила на основе свойств сертификата клиента, его корневого ЦС или промежуточного ЦС, определите атрибуты X.509 в ресурсе BrokerAuthorization. Дополнительные сведения см. в разделе "Атрибуты сертификата".
С общим именем субъекта клиентского сертификата в качестве имени пользователя
Чтобы создать политики авторизации только на основе субъекта сертификата клиента, создайте правила на основе CN.
Например, если у клиента есть сертификат с субъектом CN = smart-lock, его имя пользователя — smart-lock. После этого создайте политики авторизации как обычные.
Авторизовать клиентов, использующих токены учетной записи службы Kubernetes
Атрибуты авторизации для SAT задаются как часть аннотаций учетной записи службы. Например, чтобы добавить атрибут авторизации с именем group значения authz-sat, выполните команду:
kubectl annotate serviceaccount mqtt-client aio-broker-auth/group=authz-sat
Аннотации атрибутов должны начинаться с aio-broker-auth/, чтобы отличать их от других аннотаций.
Так как у приложения есть атрибут authz-satавторизации, нет необходимости предоставлять clientId или username значение. Соответствующий ресурс BrokerAuthorization использует этот атрибут в качестве принципала, например:
В правилах авторизации брокера для вашей политики аутентификации используйте следующую конфигурацию:
[
{
"brokerResources": [
{
"clientIds": [],
"method": "Connect",
"topics": []
},
{
"clientIds": [],
"method": "Publish",
"topics": [
"odd-numbered-orders"
]
},
{
"clientIds": [],
"method": "Subscribe",
"topics": [
"orders"
]
}
],
"principals": {
"attributes": [
{
"group": "authz-sat"
}
]
}
}
]
Дополнительные сведения см. в статье Настройка политики авторизации с помощью Dapr Client.
Хранилище состояний
Брокер MQTT предоставляет хранилище состояний, которое клиенты могут использовать для хранения состояния. Вы также можете настроить хранилище состояний для высокой доступности.
Чтобы настроить авторизацию для клиентов, использующих хранилище состояний, предоставьте разрешения для разделов протокола и ключей:
- Публикация запросов в:
statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke - Подпишитесь на тему ответа, которую вы задали при публикации, обычно:
clients/{principal.clientId}/services/statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke/response/#. - Предоставьте доступ к ключу в
stateStoreResourcesсоответствии с приведенными ниже рекомендациями.
Ключи хранилища состояний
Доступ к хранилищу состояний осуществляется через брокер MQTT по теме statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke.
Так как клиенты имеют доступ к разделу, вы можете указать ключи и уровни доступа в stateStoreResources разделе конфигурации брокера brokerResources MQTT.
Формат stateStoreResources раздела состоит из уровня доступа, индикатора шаблона и шаблона.
stateStoreResources Включите раздел в правила политики авторизации.
"stateStoreResources": [
{
"method": "", // Values: read, write, readwrite
"keyType": "", //Values: string, pattern, binary. Default is pattern
"keys": [
// List of patterns to match
]
},
]
Поле method указывает уровень доступа:
- Доступ для чтения указан как
read. Спецификация прав на запись с помощьюwrite. Для чтения и записи доступ указан сreadwrite. - Требуется уровень доступа.
- Уровень доступа для чтения подразумевает действия
getиkeynotify. - Уровень доступа записи подразумевает действия
set,del, а такжеvdel.
Поле keyType указывает тип сопоставления ключей:
-
pattern: используется для сопоставления шаблонов в стиле glob. -
string: используется для точного сопоставления, например, если ключ содержит символы, которые могут быть сопоставлены в противном случае как шаблон (*, ,?).[0-9] -
binary: используется для сопоставления двоичного ключа.
Поле keys указывает ключи, которые будут соответствовать. Ключи можно указать в виде шаблонов в стиле glob, подстановок маркеров или точных строк.
Примеры стилей Glob:
-
colors/*: все ключи под префиксом "цвета/" -
number[0-9]: любой ключ от "number0" до "number9" -
char?: любой ключ с префиксом char и суффиксом одной цифры, например charA. -
*: полный доступ ко всем ключам
-
Ключи хранилища состояний также поддерживают подстановку маркеров, когда тип ключа —
pattern, а фигурные скобки используются специально для этой цели. Примеры подстановки токенов:clients/{principal.clientId}/*usernames/{principal.username}/*rooms/{principal.attributes.room}/*
Ниже приведен пример того, как вы можете описывать или проектировать ресурсы хранилища состояний.
В правилах авторизации брокера для политики авторизации добавьте аналогичную конфигурацию:
[
{
"brokerResources": [
{
"clientIds": [
"{principal.attributes.building}*"
],
"method": "Connect"
},
{
"method": "Publish",
"topics": [
"sensors/{principal.attributes.building}/{principal.clientId}/sensor/*"
]
},
{
"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"
]
}
]
}
]
Обновление авторизации
Вы можете обновлять ресурсы авторизации брокера во время выполнения без перезапуска. Все клиенты, подключенные во время обновления политики, отключены. Изменение типа политики также поддерживается.
kubectl edit brokerauthorization my-authz-policies
Поведение кэширования
Чтобы сократить издержки на авторизацию в темах с высокой пропускной способностью, включите кэширование в памяти с помощью authorizationPolicies.cache: Enabled.
- Решения кэшируются на основе кортежа клиента, действия и ресурса. Повторяющиеся операции попали в кэш.
- Высоковариативные ресурсы (например, уникальные сегменты тем в каждом сообщении) снижают коэффициент попадания в кэш.
- Кэш растет по мере увеличения числа уникальных кортежей. Контролируйте память на предмет очень высокой активности изменений.
Отключение авторизации
- В портал Azure перейдите к экземпляру Операций Интернета вещей.
- В разделе "Компоненты" выберите MQTT Broker.
- Выберите слушателя брокера, которого вы хотите изменить из списка.
- На порту, в котором требуется отключить авторизацию, выберите "Нет " в раскрывающемся списке авторизации.
Несанкционированная публикация в MQTT 3.1.1
При отклонении публикации MQTT 3.1.1 клиент получает PUBACK без ошибки, так как версия протокола не поддерживает возврат кода ошибки. MQTTv5 возвращает PUBACK с кодом причины 135 (не разрешено), если публикация запрещена.
Устранение неполадок
Проверка правил
- Просмотрите ваш BrokerAuthorization YAML/JSON на наличие проблем с схемой.
- Проверьте выходные данные при применении конфигурации; Ошибки схемы сообщаются сервером API.
- Установите журналы pod интерфейсного компонента на
debugилиtrace, перезапустите pod, и проверьте наличие записей, помеченныхauthz, которые показывают синтаксический анализ и применяемые правила.
Примеры исправных журналов (сокращенные):
<7>2025-02-10T16:28:31.986Z aio-broker-frontend-0 [mq@311 tid="1" module="authz"] - adding broker config ... and store config ...
<6>2025-02-10T16:28:31.986Z aio-broker-frontend-0 [mq@311 tid="1"] - starting broker authorization engine with basic rules. Cache enabled: true
<7>2025-02-10T16:28:31.987Z aio-broker-frontend-0 [mq@311 tid="1" module="authz"] - set broker authorization engine data: {"rules":[{...}]}
Операции брокера MQTT
Пример публикации запрещен:
<7>2025-02-10T16:32:19.398Z aio-broker-frontend-0 [mq@311 tid="15" module="authz"] - checking authorization for {"action":"publish","clientId":"test-publisher","topic":"test"}
<7>2025-02-10T16:32:19.411Z aio-broker-frontend-0 [mq@311 tid="15" module="authz"] - publish from client 'test-publisher' was denied ... reason_code: NotAuthorized
Операции хранилища состояний
Пример ошибки: отказано в доступе.
<7>2025-02-10T16:41:31.314Z aio-broker-frontend-0 [mq@311 tid="8" module="authz"] - checking authorization for {"action":"get","clientId":"statestore-cli","key":"dGVzdA=="}
<7>2025-02-10T16:41:31.322Z aio-broker-frontend-0 [mq@311 tid="8" module="authz"] - cached new authorization result ...: Denied("no rule matched")