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: 

Introdução

Como instalar o Mosquitto

Como abrir o Diretório do Mosquitto

Executando o Mosquitto

Como criar um Subscriber Mosquitto

Como criar um Publisher Mosquitto

Mensagem Criptografada

Segurança por Autenticação

Como baixar e instalar o Notepad++

Criando Autenticação MQTT por Login e Senha

Segurança MQTT pelo ACL

Conclusão



Introdução

           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:

https://mosquitto.org/

e clicamos em “download page” para irmos até a página de realização do download do arquivo.

Dowload Mosquitto 1

            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.
Download Mosquitto 2

            Ao término do download, abrimos o arquivo.exe

Download Mosquitto 3
            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”.

Download mosquitto 4

            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.  
Download mosquitto 5

            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”.

Download mosquitto 6
            Finalize a instalação clicando em “Finish

 

Download Mosquitto 7

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.

Broker 1
           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>

Broker 2
           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>
Broker 3
           Ao acessar o diretório desejado, vamos visualizar informações desse diretório digitando “dir” e dando enter.

Broker 4
           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

mosquitto.conf
           O "mosquitto.exe" é o arquivo executável do Mosquitto.

mosquitto.exe
           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

mosquitto_passwd
           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

mosquitto_pub
           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


mosquitto_sub


Executando o Mosquitto

            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.

erro vcruntime140.dll

 


           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


vcruntime140 1

           Depois de clicar, complete o captcha e abra a tela para selecionar a versão de download, selecione a versão mais atual.

vcruntime140 2
           Abra o arquivo.zip, encaminhe o arquivo direto para a pasta do Mosquitto e clique em “ok”.

vcruntime140 3
           Vá até a sua pasta Mosquitto para conferir o arquivo vcruntime140.dll

vcruntime140 4
           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.

mosquitto.exe funcionando   
           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.

mosquitto.exe verbouse
          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:

table_sub1table_sub2table_sub3

            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:

Subscribe 1
           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"

Subscribe 2

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.

tabela publisher 1Tabela publisher 2Tabela publisher 3

           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"

Publisher

 

           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...

Publisher e broker
           Por fim, no prompt do Subscriber é possível ver a mensagem em seu destino final.

Prompt de comando MQTT

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:

Criptografia de César

           Com o uso da chave cinco, teríamos na cifra de César: 

Criptografia de César 2
           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.

Site para criptografia de César
            Agora que criamos nossa mensagem criptografada, enviaremos para o Subscriber através do Publisher.
Criptografia de César
           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"
Criptografia de César

           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

Criptografia site Code Beautify
           Em seguida, definimos o modo de criptografia
Criptografia site Code Beautify
           Feito isso, escolhemos uma chave (se deixarmos sem chave, o site cria uma aleatória) e em seguida digitamos nossa mensagem.
Criptografia pelo Code Beautify
           E por fim, clicamos em “Encrypt” e obtemos nossa mensagem criptografada.
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.

Baixando notepad++
           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.
Installer notepad++

           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”.

notepad++

           Selecione o idioma do seu Notepad++ e clique em “OK

notepad++ idioma

           Em seguida, será sugerido que você feche os outros programas, clique em “próximo

Notepad++ instalação
            Serão apresentados os Acordos de Licença, clique em “Eu Concordo

Termos de uso Notepad++
            Selecione a pasta destino do programa e clique em “próximo

Local de instalação Notepad++
           Escolha os componentes do Notepad++ que você deseja instalar e clique em “próximo

Notepad++ componentes

 

           Finalize a instalação clicando em “Instalar
Instalar notepad++

Criando Au
tenticaçã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:

mosquitto.conf
           Clique no arquivo com o botão direito do mouse e selecione a opção de editar com o Notepad++
Edith with notepad++

           Depois de abrir, digite "Ctrl+F" para realizar uma busca pela palavra “allow_anonymous
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.
allow_anonymous false
           Finalizado, clique em salvar
Save
           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

mosquitto.conf no prompt
           A mensagem de não autorizado também está no Subscriber

conexão não autorizada
           E no Publisher conseguimos ver que não estamos autorizados quando tentamos realizar alguma publicação
Publisher não autorizado
           Agora precisaremos configurar os usuários do nosso Broker Mosquitto. Ao entrar na pasta Mosquitto, é possível ver um arquivo chamado mosquitto_passwdprecisaremos 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.

senha mqtt
           Seu arquivo com o usuário e a senha será criado e estará disponível na pasta mosquitto.

 

senhas mosquitto
           Ao abrir o arquivo, você verá o seu usuário e a senha criptografada.
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

password_file
           Descomente essa função e encaminhe-a para o seu arquivo .txt
password_file
            Feito isso, salve o arquivo
            Abra novamente o prompt de comando do Broker e execute o novo arquivo de configuração, dessa forma:

mosquitto.conf

           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.

Subscriber mqtt autenticação
           Estabelecendo conexão, faremos o mesmo com o Publisher

Nova conexão autenticada mqtt
           Ao enviar a mensagem, podemos conferir o estado do Broker e o recebimento pelo nosso Subscriber
mqtt com broker, publisher e subscriber autenticados

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++

criar um ACL
           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.

ACL exemplo

           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". 
modificações no ACL
aclfile
           Em seguida, abriremos novamente o mosquitto.conf no Notepad++ e buscaremos por acl_file até encontrarmos o comentário semelhante ao demonstrado.

acl_file
           Depois de encontrar, tiraremos a cerquilha (#), incluiremos o endereço do nosso arquivo ACL e clicaremos em salvar.
acl_file
           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". 
usuários mqtt
            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.
senhas criptografadas mqtt
           Abra o prompt do Broker e execute novamente o mosquitto.exe com as configurações atualizadas e no modo verbouse (-v)
configuração atualizada          
           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".
Tecnico_Tecnico

           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.

Supervisor_Tecnico
           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. 
Supervisor_Supervisor
           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.

Engenheiro_Engenheiro

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 :)