Compartilhar via


Controle de acesso para clientes MQTT

O controle de acesso permite que você gerencie a autorização dos clientes para publicação ou assinatura em tópicos, usando um modelo de controle de acesso baseado em função. Dada a enorme escala de ambientes de IoT, atribuir uma permissão a cada cliente e a cada tópico é incrivelmente monótono. O recurso de agente MQTT da Grade de Eventos do Azure resolve esse desafio de escala por meio do agrupamento de 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 o aplicativo que precisa publicação e/ou assinatura em tópicos MQTT.

Um grupo de clientes é um conjunto de clientes que precisa do mesmo acesso para publicação e/ou assinatura no mesmo conjunto de tópicos MQTT. O grupo de clientes representa a entidade de segurança no modelo RBAC.

Um espaço de tópico representa vários tópicos por meio de um conjunto de modelos de tópicos. Os modelos de tópicos são uma extensão de filtros MQTT que dão suporte a variáveis, acompanhado dos 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 permite acesso a um grupo de clientes específico para publicação ou assinatura nos 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.

Diagram of the access control model.

Exemplos:

Os exemplos a seguir fornecem detalhes de como configurar o modelo de controle de acesso de acordo com os requisitos a seguir.

Exemplo 1:

Uma fábrica tem várias áreas, com cada área incluindo computadores que precisam se comunicar entre si. No entanto, os computadores de outras áreas da fábrica não têm permissão para se comunicar com eles.

Cliente Função Tópico/Filtro de tópico
Area1_Machine1 Publisher areas/area1/machines/machine1
Area1_Machine2 Subscriber areas/area1/machines/#
Area2_Machine1 Publisher areas/area2/machines/machine1
Area2_Machine2 Subscriber areas/area2/machines/#

Configuração

  • Crie um recurso de cliente para cada computador.
  • Crie um grupo de clientes para os computadores de cada área da fábrica.
  • Crie um espaço de tópico para cada área que representa os tópicos nos quais os computadores da área se comunicam.
  • Crie duas associações de permissão para publicação e assinatura do grupo de clientes de cada área no espaço de tópico da área correspondente.
Cliente Grupo de clientes Associação de permissão Espaço de tópico
Area1_Machine1 Area1Machines Area1-Pub Area1Messages – Modelo de tópico: areas/area1/machines/#
Area1_Machine2 Area1Machines Area1-Sub Area1Messages – Modelo de tópico: areas/area1/machines/#
Area2_Machine1 Area2Machines Area2-Pub Area2Messages – Modelo de tópico: areas/area2/machines/#
Area2_Machine2 Area2Machines Area2-Sub Area2Messages – Modelo de tópico: areas/area2/machines/#

Exemplo 2:

Vamos considerar um requisito extra para o exemplo anterior: cada área tem clientes de gerenciamento acompanhado dos computadores, e os computadores não devem ter acesso para publicação caso algum deles seja comprometido. Por outro lado, os clientes de gerenciamento precisam ter acesso para publicação para enviar comandos aos computadores e acesso para assinatura para receber a telemetria dos computadores.

Cliente Função Tópico/Filtro de tópico
Area1_Machine1 Publisher areas/area1/machines/machine1
Subscriber areas/area1/mgmt/#
Area1_Mgmt1 Publisher areas/area1/mgmt/machine1
Subscriber areas/area1/machines/#
Area2_Machine1 Publisher areas/area2/machines/machine1
Subscriber areas/area2/mgmt/#
Area2_ Mgmt1 Publisher areas/area2/mgmt/machine1
Subscriber areas/area2/machines/#

Configuração:

  • Crie recursos de cliente para cada computador e cliente de gerenciamento.
  • Crie dois grupos de clientes por área: um para o cliente de gerenciamento e outro para os computadores.
  • Crie dois espaços de tópicos para cada área: um representando os tópicos de telemetria e o outro representando os tópicos de comandos.
  • Crie duas associações de permissão para que os clientes de gerenciamento de cada área façam publicações no espaço de tópico de comandos e assinem o espaço de tópico de telemetria.
  • Crie duas associações de permissão para que os computadores de cada área assinem o espaço de tópico de comandos e façam publicações no espaço de tópico de telemetria.
Cliente Grupo de clientes Associação de permissão Tópico/Filtro de tópico
Area1_Machine1 Area1Machines Area1Machines-Pub Area1Telemetry – Modelo de tópico: areas/area1/machines/ #
Area1Machines-Sub Area1Commands – Modelo de tópico: areas/area1/mgmt/#
Area1_MgmtClient1 Area1Mgmt Area1Mgmt-Pub Area1Commands – Modelo de tópico: areas/area1/mgmt/#
Area1Mgmt-Sub Area1Telemetry – Modelo de tópico: areas/area1/machines/ #
Area2_Machine1 Area2Machines Area2Machines-Pub Area2Telemetry – Modelo de tópico: areas/area2/machines/#
Area2Machines-Sub Area2Commands – Modelo de tópico: areas/area2/mgmt/#
Area2_ MgmtClient1 Area2Mgmt Area2Mgmt-Pub Area2Commands – Modelo de tópico: areas/area2/mgmt/#
Area2Mgmt-Sub Area2Telemetry – Modelo de tópico: areas/area2/machines/#

Controle de acesso granular

O controle de acesso granular permite controlar a autorização de cada cliente em um grupo de clientes para publicação ou assinatura em um tópico próprio. Esse controle de acesso granular é obtido por meio de variáveis em modelos de tópicos.

Embora um grupo de clientes possa ter acesso a determinado espaço de tópico com todos os modelos de tópicos, as variáveis dentro dos modelos de tópicos permitem controlar a autorização de cada cliente dentro desse grupo de clientes para publicação ou assinatura em um tópico próprio. Por exemplo, se o grupo de clientes “machines” incluir dois clientes: “machine1” e “machine2”. Usando variáveis, você pode permitir que machine1 publique a telemetria somente no tópico MQTT “machines/machine1/telemetry”" e que “machine2” publique mensagens no tópico MQTT “machines/machine2/telemetry".

As variáveis representam nomes de autenticação do cliente ou atributos do cliente. Durante a comunicação com agente MQTT, cada cliente substituirá 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 agente MQTT permitiria o acesso somente aos clientes que têm um valor substituído que corresponda ao nome de autenticação ou ao valor do atributo especificado.

Por exemplo, considere a seguinte configuração:

  • Grupo de clientes: Machines
  • Espaço de tópico: MachinesTelemetry
    • Modelo de tópico: "machines/${client.authenticationName}/telemetry".
  • Associação de permissão: grupo de clientes: machines; espaço de tópico: machinesTelemetry; Permissão: editor

Com essa configuração, somente o cliente com o nome de autenticação do cliente “machine1” pode fazer publicações no tópico "machines/machine1/telemetry e somente o computador com o nome de autenticação do cliente “machine 2” pode fazer publicações no tópico "machines/machine2/telemetry", etc. Assim, o machine2 não pode publicar informações falsas em nome do machine1, mesmo que tenha acesso ao mesmo espaço de tópico e vice-versa.

Diagram of the granular access control example.

Próximas etapas:

Saiba mais sobre a autorização e a autenticação: