Objetivo
Dando continuidade ao nosso estudo sobre MQTT, iniciado em Introdução ao MQTT, no qual entendemos o que é o Protocolo MQTT, suas vantagens, forma de comunicação, QoS- Qualidade da mensagem, declaração de tópicos, o que é a Last Will, Clean, Retain, como fazer Sessões Persistentes, como baixar e utilizar o Broker Mosquitto e o Cliente MQTTBox. Se você não viu o nosso tutorial anterior, é recomendado que você o veja, pois agora passaremos para uma fase mais avançada de estudo do protocolo. Esse tutorial está dividido nos seguintes tópicos:
Como abrir o Diretório do Mosquitto
Como criar um Subscriber Mosquitto
Como criar um Publisher Mosquitto
Como baixar e instalar o Notepad++
Criando Autenticação MQTT por Login e Senha
No estudo anterior aprendemos alguns conceitos básicos sobre o MQTT e utilizamos um Broker online e gratuito chamado Mosquitto para a realização de testes, no entanto para um projeto finalizado é interessante utilizarmos uma host local por questões de segurança, já que é possível que qualquer usuário utilizando o teste do Mosquitto consiga visualizar os dados que estamos enviando para os tópicos ao assinar o tópico com #, que relembrando, assina todos os tópicos do Broker. Para evitar que isso ocorra, precisamos criar o nosso próprio Broker com host local, outrossim, também é interessante aprendermos a criptografar esses dados e pedir a autenticação do cliente, dessa forma, o nível de segurança do projeto aumenta consideravelmente.
Mesmo que o seu projeto seja simples e não exija tanta segurança, é extremamente importante fazer uso de um Broker local depois de realizar os devidos testes no Broker de teste do Mosquitto, justificarei a afirmação com o seguinte exemplo:
Imagine que você tem um projeto simples de monitoramento de uma lâmpada, você só quer receber um sinal 1 para indicar que a lâmpada está ligada, e 0 para indicar que a mesma encontra-se desligada, você utilizou o host de teste como aprendemos no tutorial anterior. Então um usuário cliente do Mosquitto, que também está na host: test.mosquitto.org, assinou “#” e começou a visualizar todas as publicações e os respectivos tópicos do Broker, ele achou o seu tópico e resolveu postar “1” no mesmo, nesse momento a sua lâmpada estava desligada, mas esse usuário fez você acreditar que a lâmpada estava ligada e prejudicou sua monitoração, interferindo no levantamento de dados. De entendimento da importância do Broker local e de conhecimento da teoria fundamental para compreensão do MQTT, explicado em Introdução ao MQTT, seguiremos com a demonstração prática.
Como instalar o Mosquitto
O Mosquitto é um intermediário de mensagens de código aberto que implementa as versões 5.0, 3.1.1 e 3.1 do protocolo MQTT, ele age como Broker e possui um host que pode ser utilizado para teste, como citado acima, ou ele pode ser baixado e configurado de acordo com as preferências do cliente no que tange exigências e segurança.
Primeiramente acessamos o site:
e clicamos em “download page” para irmos até a página de realização do download do arquivo.
Feito isso, clicamos no modelo de arquivo que queremos baixar de acordo com o nosso sistema operacional, eu baixei a versão mosquito-1.6.8-install-windows-x64.exe.
Ao término do download, abrimos o arquivo.exe
Aparecerá uma permissão no seu monitor, clique em “Sim” para confirmar e prosseguir com a instalação. Em seguida aparecerá uma mensagem de aviso, recomendando que outros programas sejam fechados antes de prosseguir com a instalação, clique em “next”.
Em seguida selecionamos os componentes que desejamos instalar, a tela será aberta com files (arquivos) e service (serviço) selecionados, tire a seleção de service e prossiga clicando em “next”, não queremos que o Mosquitto seja instalado como um serviço do Windows pois vamos realizar as configurações manualmente.
Ao prosseguir, escolheremos uma pasta de destino para o Mosquitto, crie um nome de pasta na raiz C:\, eu criei a pasta CC_Mosquitto, em seguida clique em “Install”.
Finalize a instalação clicando em “Finish”
Como abrir o Diretório do Mosquitto
Para criarmos um Broker, intermédio de comunicação entre Publisher e Subscriber, é necessário primeiramente acessarmos o Prompt de Comando do computador, para fazer isso, vá até a barra de executar e digite “cmd”, em seguida, abra o Prompt de Comando.
Depois de abrir o Prompt, devemos acessar a pasta que criamos, para isso precisamos realizar saltos entre os diretórios, eu quero chegar em C:\CC_Mosquitto>
Para realizar esses saltos devemos utilizar “cd..” para voltar em um, ou “cd Nome_do_Diretorio” para avançar para um determinado diretório, dessa forma:
C:\Users\lucas>cd..
C:\Users>cd..
C:\cd CC_Mosquitto
C:\CC_Mosquitto>
Ao acessar o diretório desejado, vamos visualizar informações desse diretório digitando “dir” e dando enter.
Fazendo isso, é possível visualizar todos os arquivos dentro da pasta CC_Mosquitto, junto com seus respectivos tamanhos em bytes, daremos devida atenção aos principais arquivos.
O arquivo demarcado “mosquito.conf” se diz respeito às configurações do Mosquitto, esse arquivo pode ser alocado para qualquer lugar, desde que seja possível ser lido pelo Mosquitto. Se abrirmos o arquivo em questão, como faremos mais adiante, é possível notar que todas as linhas são comentadas, pois todas são iniciadas por "#", para uso de determinada função basta que os comentários sejam retirados. Sua fundamentação está disponível de forma mais detalhada em:
https://mosquitto.org/man/mosquitto-conf-5.html
O "mosquitto.exe" é o arquivo executável do Mosquitto.
O "mosquitto_passwd.exe" é a ferramenta de gerenciamento de senhas do broker Mosquitto, com ele é possível criar usuários e senhas de autenticação do broker, para mais informações, acesse:
https://mosquitto.org/man/mosquitto_passwd-1.html
Outro arquivo que trabalharemos é o "mosquito_pub.exe", ele é o nosso Publisher, sua configuração básica prevê que ele publique uma única mensagem em um tópico e em seguida se desconecte do broker, mais detalhes disponíveis em:
https://mosquitto.org/man/mosquitto_pub-1.html
Igualmente importante, temos o "mosquito_sub.exe", como o nome sugere, é o Subscriber do projeto, ele assina tópicos e imprime na tela as mensagens recebidas pelo Broker. Maiores informações podem ser encontradas em:
https://mosquitto.org/man/mosquitto_sub-1.html
Agora iremos executar o Mosquitto, digite “mosquito.exe” no seu prompt, note que no meu caso ocorreu um problema na hora de executar, ele não encontrou o arquivo VCRUNTIME140.dll, clique em “ok” até que o aviso suma.
Caso o mesmo ocorra com você, siga o processo para baixar a VCRUNTIME140.dll, caso o contrário, pule essa etapa.
Acesse o site:
https://www.dllme.com/dll/files/vcruntime140_dll.htmle clique em “Download vcruntime140.dll”
Depois de clicar, complete o captcha e abra a tela para selecionar a versão de download, selecione a versão mais atual.
Abra o arquivo.zip, encaminhe o arquivo direto para a pasta do Mosquitto e clique em “ok”.
Vá até a sua pasta Mosquitto para conferir o arquivo vcruntime140.dll
Prosseguindo com a execução do Mosquitto, volte para o Prompt de Comando e digite novamente “mosquitto.exe”, o programa vai ser executado, no entanto você não verá nada sendo aberto ou alterado no Prompt. Para saber se seu Broker está funcionando, tente digitar alguma coisa no Prompt, se não for possível, é porque o seu programa está em execução.
Agora que sabemos que está tudo certo, vamos ativar o modo verbose do programa, isso permitirá que vejamos o que está acontecendo com ele durante o processo de execução. Tecle "Ctrl+C" para parar o programa, em seguida digite “mosquitto.exe -v” para executá-lo no modo verbose.
Com isso descobrimos que o Mosquitto está rodando na porta padrão, 1883.
Deixe essa janela prompt em aberto porque ela será reservada para o monitoramento do Broker.
Como criar um Subscriber Mosquitto
Como explicado mais detalhadamente no tutorial anterior, Subscriber é um cliente subscrito em um tópico, a partir do momento que um cliente se inscreve em um ou mais tópicos, ele passa a receber as mensagens publicadas nos mesmos.
Primeiramente veremos os comandos pertinentes a execução do Subscriber pelo Prompt, esses são:
Criaremos nosso Subscriber com as principais configurações para o seu uso:
Primeiramente abriremos um novo Prompt de Comando, sem fechar o prompt já aberto. Faremos o mesmo processo de digitar “..cd” até atingir o diretório desejado, e com o diretório nulo, acrescentaremos a pasta Mosquitto, assim como fizemos no prompt anterior:
Em seguida executaremos o "mosquitto_sub" e definiremos suas características, eu coloquei o host (-h) como host local, a porta (-p) como a padrão de 1883 e realizei a inscrição no tópico (-t) “teste”.
C:\CC_Mosquitto>mosquitto_sub -h localhost -p 1883 -t "seu_topico"
Como criar um Publisher Mosquitto
No tutorial anterior foi explicado de forma detalhada que um Publisher é um cliente que publica uma mensagem em um tópico, essa sendo encaminhada para todos os subscritos desse tópico. Vale ressaltar que um cliente não fica limitado a apenas uma função, esse pode atuar como subscriber e publisher de um mesmo tópico.
Para criarmos o Publisher teremos que fazer um processo semelhante ao que fizemos para criar o Subscriber, deixarei uma tabela com os comandos que podem ser utilizados nas configurações do Publisher.
Criaremos um Publisher com as configurações necessárias para a publicação de uma mensagem, abra mais um Prompt de comando, sem fechar os outros dois, e mude o diretório como já fizemos anteriormente, em seguida acesse o arquivo "mosquitto_pub" com as devidas configurações de publicação.
Definiremos o host (-h) como local, a porta (-p) como 1883, publicaremos no tópico (-t) que nos inscrevemos como o Subscriber, no meu caso o tópico é “teste”, e em seguida definiremos a mensagem (-m) que será encaminhada.
C:\CC_Mosquitto>mosquitto_pub -h localhost -p 1883 -t "seu_topico" -m "insira sua mensagem"
Ao enviarmos a mensagem pelo cliente Publisher, conseguimos ver o Broker transmitindo essa mensagem pelo prompt que reservamos ao monitoramento do Broker. Note que também são dadas informações sobre a mensagem, como tópico, qualidade da mensagem (QoS), se está com retain, tamanho em bytes...
Por fim, no prompt do Subscriber é possível ver a mensagem em seu destino final.
Mensagem Criptografada
Existem diversas formas de garantir a segurança de uma mensagem encaminhada, uma dessas formas é através da criptografia.
A criptografia é uma ferramenta indispensável para proteger informações e dados que estão sendo enviados, derivada do grego "kryptos", que significa “oculto”, a sua origem é datada de cerca de 2000 a.C, com a prática da comunicação por hieróglifos, estes consistiam em pictogramas complexos cujo entendimento se destinava apenas a elite. O primeiro uso da cifra moderna foi realizado por Júlio César, o mesmo criou a conhecida cifra de César, por medo de suas mensagens serem descobertas, o sistema de comunicação partia do princípio de um caractere ser substituído por três caracteres a sua frente, ou seja, o “A” era substituído pelo “D”, o “L” pelo “O” e assim por diante, a chave de César era três, mas através da cifra de César é possível gerar diversas mensagens anônimas, apenas alterando a chave. Por exemplo, se a chave da minha criptografia for 5, eu vou trocar o caractere por 5 caracteres a frente dele, dessa forma:
Com o uso da chave cinco, teríamos na cifra de César:
Uma forma de gerar a cifra de César de forma automática é através do seguinte site:
https://md5decrypt.net/en/Caesar/
Basta colocar a sua chave de codificação desejada, a mensagem e clicar em "Encrypt", farei isso para criar a minha mensagem criptografada, usarei a chave 11.
Agora que criamos nossa mensagem criptografada, enviaremos para o Subscriber através do Publisher.
Conhecendo a chave de segurança, será possível descriptografá-la no mesmo site que utilizamos para criptografar, copie a mensagem recebida pelo Subscriber, cole no site e clique em "Decrypt"
Também é possível utilizar outros tipos de criptografia, o site a seguir conta com uma ferramenta que possibilita a criação de diversos textos criptografados.
https://codebeautify.org/encrypt-decrypt
Para isso, escolhemos o tipo de criptografia que vamos utilizar
Em seguida, definimos o modo de criptografia
Feito isso, escolhemos uma chave (se deixarmos sem chave, o site cria uma aleatória) e em seguida digitamos nossa mensagem.
E por fim, clicamos em “Encrypt” e obtemos nossa mensagem criptografada.
Para enviar a mensagem realizamos o mesmo processo que fizemos para enviar a cifra de César.
Segurança por Autenticação
Uma outra medida de Segurança é a autenticação, com essa forma, é possível controlar o acesso para que uma mensagem só seja lida/publicada por usuários autenticados. Essa autenticação pode ser feita através da criação de um usuário com login e senha, da forma que mostraremos mais adiante.
Como baixar e instalar o Notepad++
Para edição do código vamos utilizar o Notepad++, caso você já tenha esse programa, pule a etapa.
Baixaremos o programa no site oficial:
https://notepad-plus-plus.org/downloads/
Selecione a versão desejada do programa, sugerimos que você baixe a última versão, que é a que se encontra mais ao topo da página.
Ao clicar na versão desejada, você será encaminhado para uma página, selecione o tipo de arquivo compatível com o seu processador e clique em installer para baixar a versão executável.
Clique no arquivo baixado para prosseguir com a instalação, uma tela será aberta perguntando se o arquivo pode realizar as mudanças necessárias em seu computador, clique em “Sim”.
Selecione o idioma do seu Notepad++ e clique em “OK”
Em seguida, será sugerido que você feche os outros programas, clique em “próximo”
Serão apresentados os Acordos de Licença, clique em “Eu Concordo”
Selecione a pasta destino do programa e clique em “próximo”
Escolha os componentes do Notepad++ que você deseja instalar e clique em “próximo”
Finalize a instalação clicando em “Instalar”
Criando Autenticação MQTT por Login e Senha
Para realizarmos as mudanças no que tange a exigência de autenticação por parte do Broker, é necessário mexermos na programação do arquivo mosquitto.conf que está em nossa pasta do Mosquitto, por isso precisamos do Notepad++, ele permite a alteração da programação através de um bloco de notas voltado para edição de programas.
Procuraremos nossa pasta Mosquitto, ao encontra-la, abriremos o arquivo mosquitto.conf no Notepad++, da seguinte forma:
Clique no arquivo com o botão direito do mouse e selecione a opção de editar com o Notepad++
Depois de abrir, digite "Ctrl+F" para realizar uma busca pela palavra “allow_anonymous”
Ao encontrar, tire a cerquilha, a # faz a função ser um comentário, tiraremos porque queremos habilitar a mesma, também trocaremos true (verdadeiro) por false (falso), pois não queremos que seja permitido que o cliente entre de forma anônima.
Finalizado, clique em salvar
Abra novamente o prompt de comando do Broker e digite “Ctrl+C” para parar, depois de parar o Broker, faremos ele executar com a nova configuração que realizamos, para isso, digite para executar o mosquitto, em conjunto com o –v, o –c e o novo arquivo de configuração, da forma mostrada abaixo, perceba que nossos clientes serão desconectados por não estarem autenticados.
No Broker conseguimos visualizar os clientes desconectados
A mensagem de não autorizado também está no Subscriber
E no Publisher conseguimos ver que não estamos autorizados quando tentamos realizar alguma publicação
Agora precisaremos configurar os usuários do nosso Broker Mosquitto. Ao entrar na pasta Mosquitto, é possível ver um arquivo chamado mosquitto_passwd, precisaremos executar esse arquivo, faremos isso pelo próprio prompt de comando que reservamos para o broker.
Digitaremos “Ctrl+C” para parar o Broker novamente, executaremos o arquivo de senhas e criaremos (-c) um novo arquivo de texto (.txt) com o nome “senha” e com o nosso usuário “curtocircuito”.
Ao fazermos isso será exigido que digitemos uma senha para esse usuário, ao digitar a senha, a mesma não aparecerá no prompt, terminando de digitar pressione enter para digitar novamente e em seguida enter para confirmar.
Seu arquivo com o usuário e a senha será criado e estará disponível na pasta mosquitto.
Ao abrir o arquivo, você verá o seu usuário e a senha criptografada.
Abra novamente o arquivo de configuração com o Notepad++, ao abrir pressione “Ctrl+F” e faça uma busca por “password_file”
Descomente essa função e encaminhe-a para o seu arquivo .txt
Feito isso, salve o arquivo
Abra novamente o prompt de comando do Broker e execute o novo arquivo de configuração, dessa forma:
Depois de executar, vamos ir para o prompt do Subscriber e realizar a autenticação, vamos realizar aqueles comandos de conexão, com o acréscimo do usuário (-u) e da password (-P) que criamos.
Estabelecendo conexão, faremos o mesmo com o Publisher
Ao enviar a mensagem, podemos conferir o estado do Broker e o recebimento pelo nosso Subscriber
Segurança MQTT pelo ACL
Além das formas já citadas, também podemos definir autorizações de publicação e leitura através da Lista de Controle de Acesso (ACL), com essa lista é possível personalizar o acesso de cada usuário individualmente ou por grupo, por exemplo, eu posso dar a permissão para o usuário “Supervisor_Tecnico” para apenas ler, para o “Tecnico” apenas postar, e para o “Engenheiro” de ler e de postar em um mesmo tópico.
Usaremos os comandos:
read: usuário que pode apenas ler dados
write: usuário que pode apenas publicar dados
readwrite: usuário que pode publicar e ler dados
Para configurar nosso ACL temos que procurar pelo arquivo aclfile.example dentro da pasta mosquitto, ao acharmos clicamos com o direito do mouse e escolhemos editar com o Notepad++
Ao abrir podemos observar anotações que nos dizem exatamente o que cada trecho define, sendo o primeiro responsável pelas configurações para usuários anônimos, o segundo para usuários citados e o terceiro para todos os usuários.
Faremos uma configuração baseada no exemplo que eu dei acima, incluiremos também usuários anônimos e clientes no geral e salvaremos como "aclfile.txt".
Em seguida, abriremos novamente o mosquitto.conf no Notepad++ e buscaremos por acl_file até encontrarmos o comentário semelhante ao demonstrado.
Depois de encontrar, tiraremos a cerquilha (#), incluiremos o endereço do nosso arquivo ACL e clicaremos em salvar.
Dessa forma é criado um ACL com informações mais específicas referente a permissão de cada usuário, agora criaremos os usuários definidos no ACL pelo prompt que estamos utilizando para monitorar o Broker. Primeiramente, pare a execução do mosquitto.exe digitando "Ctrl + C", e em seguida crie novos usuários assim como fizemos para criar o usuário "curtocircuito".
Para confirmar se os usuários foram criados, vamos voltar para a pasta do Mosquitto e abrir o arquivo "senhas.txt" que já havíamos criado.
Abra o prompt do Broker e execute novamente o mosquitto.exe com as configurações atualizadas e no modo verbouse (-v)
Agora faremos alguns testes para saber se os usuários estão com permissões de acordo com o ACL que criamos.
Primeiro eu criei um Subscriber "Tecnico" e um Publisher "Tecnico", de acordo com o meu ACL, o usuário em questão só tem permissão para escrever (write), em razão disso, ele publica e o subscrito de mesmo user não consegue visualizar a mensagem, ou seja, o técnico só consegue atuar como Publisher no tópico "dados".
Em um outro exemplo, no qual temos o "Tecnico" novamente como Publisher e o "Supervisor_Tecnico" como Subscriber, é possível ver que a mensagem foi enviada e o subscrito a recebeu, pois o supervisor possui permissão para ler (read) nesse tópico.
A situação é diferente quando temos um "Supervisor_Tecnico" como Publisher e outro "Supervisor_Tecnico" como Subscriber, a mensagem do Publisher não é encaminhada ao Subscriber, pois o usuário "Supervisor_Tecnico" conta com permissão apenas para ler (read), ou seja, a mensagem não é encaminhada para ninguém inscrito no tópico, porque o Supervisor Técnico foi configurado para atuar apenas como Subscriber nesse tópico.
O "Engenheiro" é um usuário especial, pois ele conta com permissão para ler e escrever (readwrite) no tópico "dados", então o mesmo pode atuar como Publisher e Subscriber, em razão disso, ele pode publicar uma mensagem como Publisher e receber essa mesma mensagem como Subscriber.
Conclusão
Com as medidas de segurança apresentadas, é possível realizar a comunicação de forma extremamente segura com o uso do MQTT, sendo a medida de autenticação a mais aconselhável delas, pois com a autenticação é possível customizar usuários e permissões de subscriber e publisher, no entanto, a criptografia também age de forma eficaz, já que a mesma criptografa as informações transmitidas e é com base nesse método de criptografia que sites HTTP passaram a ser HTTPS, no qual explicaremos de forma minuciosa no tutorial posterior, sobre certificações de segurança de site.
Abraços, Equipe Curto Circuito :)
estou com uma duvida, tenho alguns dispositivos que tem os mesmos topicos, so muda o serial number de cada, como eu faço para por o SN 5050 ser visto apenas pelo usuario engenheiro por exemplo, no dispositivo estou colocando o endereço do broker e as credenciais do engenheiro.
Grato
Para restringir o acesso a tópicos específicos no MQTT, baseado em usuários ou grupos de usuários, como no seu caso, o engenheiro, você pode utilizar o controle de acesso baseado em tópicos (Topic-Based Access Control). Isso pode ser feito configurando as permissões no seu broker MQTT.
O mosquitto deve estar configurado para suportar autenticação e autorização. Após isso, você deve criar arquivos de credenciais e ACL. Com eles você consegue definir usuário e senha e também quem pode publicar ou se inscrever em um tópico especifico.
Um exemplo:
user engenheiro
topic readwrite dispositivos/5050/#
user usuario_comum
topic readwrite dispositivos/+/status
topic read dispositivos/+/dados