Configurar a autorização do broker MQTT
Importante
Esta página inclui instruções para gerenciar componentes do Azure IoT Operations usando manifestos de implantação do Kubernetes, que está em visualização. Esse recurso é fornecido com várias limitações e não deve ser usado para cargas de trabalho de produção.
Veja Termos de Utilização Complementares da Pré-visualizações do Microsoft Azure para obter os termos legais que se aplicam às funcionalidades do Azure que estão na versão beta, na pré-visualização ou que ainda não foram lançadas para disponibilidade geral.
As políticas de autorização determinam quais ações os clientes podem executar no broker, como conectar, publicar ou assinar tópicos. Configure o broker MQTT para usar uma ou várias políticas de autorização com o recurso BrokerAuthorization . Cada recurso BrokerAuthorization contém uma lista de regras que especificam os principais e recursos para as políticas de autorização.
Link BrokerAuthorization para BrokerListener
Para vincular um BrokerListener a um recurso BrokerAuthorization, especifique o authorizationRef
ports
campo na configuração do recurso BrokerListener. Semelhante a BrokerAuthentication, o recurso BrokerAuthorization pode ser vinculado a várias portas BrokerListener . As políticas de autorização aplicam-se a todas as portas de ouvinte vinculadas. No entanto, há uma diferença fundamental em comparação com BrokerAuthentication:
Importante
Para que a configuração BrokerAuthorization se aplique a uma porta de ouvinte, pelo menos uma BrokerAuthentication também deve estar vinculada a essa porta de ouvinte.
Para saber mais sobre o BrokerListener, consulte Recurso BrokerListener.
Regras de autorização
Para configurar a autorização, crie um recurso BrokerAuthorization no cluster do Kubernetes. As seções a seguir fornecem exemplos de como configurar a autorização para clientes que usam nomes de usuário, atributos, certificados X.509 e SATs (Service Account Tokens) do Kubernetes. Para obter uma lista das configurações disponíveis, consulte a referência da API de autorização do broker.
O exemplo a seguir mostra como criar um recurso BrokerAuthorization usando nomes de usuário e atributos:
No portal do Azure, navegue até sua instância de Operações IoT.
Em Componentes, selecione MQTT Broker.
Selecione a guia Autorização .
Escolha uma política de autenticação existente ou crie uma nova selecionando Criar política de autorização.
Esta autorização de broker permite que clientes com IDs de temperature-sensor
cliente ou humidity-sensor
, ou clientes com atributos organization
com valor contoso
e city
com valor seattle
, possam:
- Conecte-se ao corretor.
- Publique mensagens em tópicos de telemetria com escopo com suas IDs de cliente e organização. Por exemplo:
temperature-sensor
pode publicar em/telemetry/temperature-sensor
e/telemetry/contoso
.humidity-sensor
pode publicar em/telemetry/humidity-sensor
e/telemetry/contoso
.some-other-username
pode publicar em/telemetry/contoso
.
- Inscreva-se em tópicos de comandos com escopo com sua organização. Por exemplo:
temperature-sensor
pode subscrever o/commands/contoso
.some-other-username
pode subscrever o/commands/contoso
.
Usando nome de usuário para autorização
Para usar o nome de usuário MQTT para autorização, especifique-os como uma matriz em principals.usernames
. No entanto, dependendo do método de autenticação, o nome de usuário pode não ser verificado:
- Kubernetes SAT - O nome de usuário não deve ser usado para autorização porque não é verificado para MQTTv5 com autenticação aprimorada.
- X.509 - O nome de utilizador corresponde ao CN do certificado e pode ser utilizado para regras de autorização.
- Personalizado - O nome de usuário só deve ser usado para regras de autorização se a autenticação personalizada validar o nome de usuário.
Para evitar problemas de segurança, use apenas o nome de usuário MQTT para autorização do broker quando ele puder ser verificado.
Limite ainda mais o acesso com base no ID do cliente
Como o campo é um OR lógico, você pode restringir ainda mais o principals
acesso com base na ID do cliente adicionando o clientIds
campo ao brokerResources
campo. Por exemplo, para permitir que clientes com IDs de cliente que começam com seu número de construção se conectem e publiquem telemetria em tópicos com escopo com sua construção, use a seguinte configuração:
Nas regras de autorização do broker para sua política de autorização, use a seguinte configuração:
[
{
"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"
}
]
}
}
]
Aqui, se o clientIds
não fosse definido sob o Connect
método, um cliente com qualquer ID de cliente poderia se conectar, desde que tivesse o building
atributo definido como building22
ou building23
. Ao adicionar o clientIds
campo, somente clientes com IDs de cliente que começam com building22
ou building23
podem se conectar. Isso garante não apenas que o cliente tenha o atributo correto, mas também que o ID do cliente corresponda ao padrão esperado.
Autorizar clientes que usam autenticação X.509
Os clientes que usam certificados X.509 para autenticação podem ser autorizados a acessar recursos com base nas propriedades X.509 presentes em seu certificado ou em seus certificados emissores na cadeia.
Usando atributos
Para criar regras com base nas propriedades do certificado de um cliente, sua autoridade de certificação raiz ou autoridade de certificação intermediária, defina os atributos X.509 no recurso BrokerAuthorization . Para obter mais informações, consulte Atributos de certificado.
Com o nome comum do assunto do certificado do cliente como nome de usuário
Para criar políticas de autorização com base apenas no CN (nome comum) da entidade do certificado do cliente , crie regras baseadas no CN.
Por exemplo, se um cliente tiver um certificado com assunto CN = smart-lock
, seu nome de usuário será smart-lock
. A partir daí, crie políticas de autorização normalmente.
Autorizar clientes que usam tokens de conta de serviço do Kubernetes
Os atributos de autorização para SATs são definidos como parte das anotações da Conta de Serviço. Por exemplo, para adicionar um atributo de autorização nomeado group
com valor authz-sat
, execute o comando:
kubectl annotate serviceaccount mqtt-client aio-broker-auth/group=authz-sat
As anotações de atributos devem começar para aio-broker-auth/
distingui-las de outras anotações.
Como o aplicativo tem um atributo de autorização chamado authz-sat
, não há necessidade de fornecer um clientId
ou username
. O recurso BrokerAuthorization correspondente usa esse atributo como uma entidade de segurança, por exemplo:
Nas regras de autorização do Broker para sua política de autorização, use a seguinte configuração:
[
{
"brokerResources": [
{
"clientIds": [],
"method": "Connect",
"topics": []
},
{
"clientIds": [],
"method": "Publish",
"topics": [
"odd-numbered-orders"
]
},
{
"clientIds": [],
"method": "Subscribe",
"topics": [
"orders"
]
}
],
"principals": {
"attributes": [
{
"group": "authz-sat"
}
]
}
}
]
Para saber mais com um exemplo, consulte Configurar a política de autorização com o Dapr Client.
Armazenamento de estado
O broker MQTT fornece um armazenamento de estado que os clientes podem usar para armazenar o estado. O armazenamento de estado também pode ser configurado para ser altamente disponível.
Para configurar a autorização para clientes que usam o armazenamento de estado, forneça as seguintes permissões:
- Permissão para publicar no tópico de armazenamento de
$services/statestore/_any_/command/invoke/request
valor de chave do sistema - Permissão para se inscrever no tópico de resposta (definido durante a publicação inicial como um parâmetro)
<response_topic>/#
Chaves de armazenamento de estado
O armazenamento de estado é acessado através do broker MQTT no tópico statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke
.
Como os clientes têm acesso ao tópico, você pode especificar chaves e níveis de acesso na stateStoreResources
seção da configuração do broker brokerResources
MQTT.
O stateStoreResources
formato da seção consiste em nível de acesso, um indicador de padrão e o padrão.
Inclua a stateStoreResources
seção nas regras da sua política de autorização.
"stateStoreResources": [
{
"method": "", // Values: read, write, readwrite
"keyType": "", //Values: string, pattern, binary. Default is pattern
"keys": [
// List of patterns to match
]
},
]
O method
campo especifica o nível de acesso.
- O acesso de leitura é especificado com
read
, acesso de gravação comwrite
, e ambos comreadwrite
. - O nível de acesso é obrigatório.
- O nível de acesso de leitura implica as ações de
get
ekeynotify
. - O nível de acesso de gravação implica as ações de
set
,del
evdel
.
O keyType
campo especifica o tipo de correspondência de chaves.
pattern
Para usar a correspondência de padrões de estilo globstring
para fazer a correspondência exata, por exemplo, quando uma chave contém caracteres que poderiam ser correspondidos como um padrão (*
,?
,[0-9]
)binary
para corresponder a uma chave binária
O keys
campo especifica as chaves a serem correspondidas. As chaves podem ser especificadas como padrões de estilo Glob , substituições de token ou cadeias de caracteres exatas.
- Exemplos de estilo Glob :
colors/*
: Todas as teclas sob o prefixo "colors/"number[0-9]
: Qualquer chave de "número0" a "número9"char?
: Qualquer tecla com prefixo "char" e um sufixo de um único dígito, como "charA"*
: Acesso total a todas as chaves.
- As chaves de armazenamento de estado também suportam a substituição de token quando o tipo de chave é
pattern
e chaves são reservadas para essa finalidade. Exemplos de substituição de tokens:clients/{principal.clientId}/*
usernames/{principal.username}/*
rooms/{principal.attributes.room}/*
Aqui está um exemplo de como você pode criar seus recursos de armazenamento de estado:
Nas regras de autorização do Broker para sua política de autorização, adicione uma configuração semelhante:
[
{
"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"
]
}
]
}
]
Autorização de atualização
Os recursos de autorização do broker podem ser atualizados em tempo de execução sem reinicialização. Todos os clientes conectados no momento da atualização da política são desconectados. A alteração do tipo de política também é suportada.
kubectl edit brokerauthorization my-authz-policies
Desativar autorização
- No portal do Azure, navegue até sua instância de Operações IoT.
- Em Componentes, selecione MQTT Broker.
- Selecione o ouvinte do broker que você deseja editar na lista.
- Na porta que você deseja desabilitar a autorização, selecione Nenhuma na lista suspensa de autorização.
Publicação não autorizada no MQTT 3.1.1
Com o MQTT 3.1.1, quando uma publicação é negada, o cliente recebe o PUBACK sem erro porque a versão do protocolo não suporta o código de erro de retorno. MQTTv5 retorna PUBACK com código de razão 135 (Não autorizado) quando a publicação é negada.