Controle de acesso para clientes MQTT
O controle de acesso permite gerenciar a autorização de clientes para publicar ou assinar tópicos, usando um modelo de controle de acesso baseado em função. Dada a enorme escala de ambientes IoT, atribuir permissão para cada cliente para cada tópico é incrivelmente tedioso. O recurso de agente MQTT da Grade de Eventos do Azure enfrenta esse desafio de escala agrupando clientes e tópicos em grupos de clientes e espaços de tópicos.
Os principais componentes do modelo de controle de acesso são:
Um cliente representa o dispositivo ou aplicativo que precisa publicar e/ou assinar tópicos MQTT.
Um grupo de clientes é um conjunto de clientes que precisam do mesmo acesso para publicar e/ou assinar o mesmo conjunto de tópicos MQTT. O grupo de clientes representa o principal no modelo RBAC.
Um espaço de tópico representa vários tópicos por meio de um conjunto de modelos de tópico. Os modelos de tópico são uma extensão dos filtros MQTT que suportam variáveis, juntamente com os curingas MQTT. Cada espaço de tópico representa os tópicos que o mesmo conjunto de clientes precisa usar para se comunicar. O espaço de tópico representa o recurso no modelo RBAC.
Uma associação de permissão concede acesso a um grupo de clientes específico para publicar ou assinar os tópicos representados por um espaço de tópico específico. A associação de permissão representa a função no modelo RBAC.
Exemplos:
Os exemplos a seguir detalham como configurar o modelo de controle de acesso com base nos requisitos a seguir.
Exemplo 1:
Uma fábrica tem várias áreas com cada área, incluindo máquinas que precisam se comunicar umas com as outras. No entanto, máquinas de outras áreas da fábrica não podem se comunicar com eles.
Cliente | Função | Filtro de tópico/tópico |
---|---|---|
Area1_Machine1 | Editor | áreas/área1/máquinas/máquina1 |
Area1_Machine2 | Subscritor | áreas/área1/máquinas/ # |
Area2_Machine1 | Editor | áreas/área2/máquinas/máquina1 |
Area2_Machine2 | Subscritor | áreas/área2/máquinas/ # |
Configuração
- Crie um recurso de cliente para cada máquina.
- Crie um grupo de clientes para as máquinas de cada área de fábrica.
- Crie um espaço de tópico para cada área representando os tópicos sobre os quais as máquinas da área se comunicam.
- Crie duas associações de permissão para o grupo de clientes de cada área publicar e assinar o espaço de tópico da área correspondente.
Cliente | Grupo de Clientes | Vinculação de permissão | Espaço Tópico |
---|---|---|---|
Area1_Machine1 | Area1Máquinas | Área1-Pub | Area1Messages -Modelo de tópico: áreas/área1/máquinas/ # |
Area1_Machine2 | Area1Máquinas | Área1-Sub | Area1Messages -Modelo de tópico: áreas/área1/máquinas/ # |
Area2_Machine1 | Area2Máquinas | Área2-Pub | Area2Messages -Modelo de tópico: áreas/área2/máquinas/ # |
Area2_Machine2 | Area2Máquinas | Área2-Sub | Area2Messages -Modelo de tópico: áreas/área2/máquinas/ # |
Exemplo 2:
Vamos supor um requisito extra para o exemplo anterior: cada área tem clientes de gerenciamento junto com as máquinas, e as máquinas não devem ter acesso para publicar caso alguma delas seja comprometida. Por outro lado, os clientes de gerenciamento precisam de acesso de publicação para enviar comandos para as máquinas e assinar acesso para receber telemetria das máquinas.
Cliente | Função | Filtro de tópico/tópico |
---|---|---|
Area1_Machine1 | Editor | áreas/área1/máquinas/máquina1 |
Subscritor | áreas/área1/mgmt/ # | |
Area1_Mgmt1 | Editor | áreas/área1/mgmt/máquina1 |
Subscritor | áreas/área1/máquinas/ # | |
Area2_Machine1 | Editor | áreas/área2/máquinas/máquina1 |
Subscritor | áreas/área2/mgmt/ # | |
Area2_ Mgmt1 | Editor | áreas/área2/mgmt/máquina1 |
Subscritor | áreas/área2/máquinas/ # |
Configuração:
- Crie recursos de cliente para cada máquina e cliente de gerenciamento.
- Crie dois Grupos de Clientes por área: um para o cliente de gerenciamento e outro para as máquinas.
- Crie dois Espaços de Tópicos para cada área: um representando tópicos de telemetria e outro representando tópicos de comandos.
- Crie duas Ligações de Permissão para que os clientes de gerenciamento de cada área publiquem nos comandos Espaço de Tópicos e assinem o Espaço de Tópicos de telemetria.
- Crie duas Ligações de Permissão para as máquinas de cada área para assinar os comandos Espaço de Tópicos e publicar no Espaço de Tópicos de telemetria.
Cliente | Grupo de Clientes | Vinculação de permissão | Filtro de tópico/tópico |
---|---|---|---|
Area1_Machine1 | Area1Máquinas | Area1Máquinas-Pub | Area1Telemetry -Modelo de tópico: áreas/área1/máquinas/ # |
Área1Máquinas-Sub | Area1Commands -Modelo de tópico: areas/area1/mgmt/ # | ||
Area1_MgmtClient1 | Área1Mgmt | Area1Mgmt-Pub | Area1Commands -Modelo de tópico: areas/area1/mgmt/ # |
Área1Mgmt-Sub | Area1Telemetry -Modelo de tópico: áreas/área1/máquinas/ # | ||
Area2_Machine1 | Area2Máquinas | Area2Máquinas-Pub | Area2Telemetry -Modelo de tópico: áreas/área2/máquinas/ # |
Area2Máquinas-Sub | Area2Commands -Modelo de tópico: areas/area2/mgmt/ # | ||
Area2_ MgmtClient1 | Área2Mgmt | Area2Mgmt-Pub | Area2Commands -Modelo de tópico: areas/area2/mgmt/ # |
Área2Mgmt-Sub | Area2Telemetry -Modelo de tópico: áreas/área2/máquinas/ # |
Controle de acesso granular
O controle de acesso granular permite controlar a autorização de cada cliente dentro de um grupo de clientes para publicar ou assinar seu próprio tópico. Esse controle de acesso granular é obtido usando variáveis em modelos de tópico.
Embora um grupo de clientes possa ter acesso a um determinado espaço de tópico com todos os seus modelos de tópico, as variáveis dentro dos modelos de tópico permitem que você controle a autorização de cada cliente dentro desse grupo de clientes para publicar ou assinar seu próprio tópico. Por exemplo, se o grupo de clientes "machines" incluir dois clientes: "machine1" e "machine2". Usando variáveis, você pode permitir que apenas machine1 publique sua telemetria somente no tópico MQTT "machines/machine1/telemetry" e "machine2" publique mensagens no tópico MQTT "machines/machine2/telemetry".
As variáveis representam nomes de autenticação de cliente ou atributos de cliente. Durante a comunicação com o broker MQTT, cada cliente substituiria a variável no tópico MQTT por um valor substituído. Por exemplo, a variável ${client.authenticationName} seria substituída pelo nome de autenticação de cada cliente: machine1, machine2, etc. O broker MQTT permitiria o acesso apenas aos clientes que têm um valor substituído que corresponde ao seu nome de autenticação ou ao valor do atributo especificado.
Por exemplo, considere a seguinte configuração:
- Grupo de clientes: Máquinas
- Espaço tópico: MáquinasTelemetria
- Modelo de tópico "machines/${client.authenticationName}/telemetry".
- Vinculação de permissão: grupo de clientes: máquinas; espaço temático: máquinasTelemetria; Permissão: editor
Com essa configuração, somente o cliente com nome de autenticação de cliente "machine1" pode publicar no tópico "machines/machine1/telemetry", e somente a máquina com nome de autenticação de cliente "machine 2" pode publicar no tópico "machines/machine2/telemetry", e assim por diante. Assim, machine2 não pode publicar informações falsas em nome de machine1, mesmo que tenha acesso ao mesmo espaço de tópico, e vice-versa.
Passos seguintes:
Saiba mais sobre autorização e autenticação: