Este código tem a finalidade de realizar a configuração de segurança dinâmica do Broker Mosquitto. Utilizando a segurança dinâmica é possível criar usuários, grupos, permissões sem a necessidade de reiniciar o Broker. Para mais informações sobre o funcionamento da segurança dinâmica do mosquitto acesse Mosquitto Documentation
Do que você precisa para utilizar o projeto
Instalar o Mosquitto: Link para download
Estas instruções permitirão que você utilize o projeto e configure a segurança do seu Broker Mosquitto.
Este arquivo se encontra na pasta de instalação do Mosquitto.
Inclua o seguinte no arquivo mosquitto.conf:
Para Linux/BSD:
allow_anonymous false
per_listener_settings false
plugin <path>/mosquitto_dynamic_security.so
plugin_opt_config_file <path>/dynamic-security.json
Para Windows:
allow_anonymous false
per_listener_settings false
plugin <path>\mosquitto_dynamic_security.dll
plugin_opt_config_file <path>\dynamic-security.json
Obs.: path é o caminho da pasta de instalação do Mosquitto. Por exemplo, se o Mosquitto foi instalado em Documents em um Windows o comando seria:
plugin_opt_config_file c:\Users\fulano\Documents\mosquitto\dynamic-security.json
Abrir o terminal, navegar até a pasta de instalação do Mosquitto e executar o comando:
mosquitto_ctrl dynsec init <path>\dynamic-security.json <admin-user>
admin-user é o nome do usuário admin desejado. Será solicitado que seja digitado a senha desejada para o usuário
Com o terminal aberto na pasta de instalação do mosquitto execute o seguinte comando:
mosquitto -c <path>\mosquitto.conf -v
Com o Mosquitto rodando, configurar o acesso padrão para que todo client criado posteriormente já inicie com as permissões bloqueadas. Para isso serão necessários os seguintes comandos (lembrar de estar com o terminal aberto na pasta de instalação do Mosquitto)
mosquitto_ctrl -u <usuário> -P <password> -h <hostname> -p <port> dynsec setDefaultACLAccess publishClientSend deny
mosquitto_ctrl -u <usuário> -P <password> -h <hostname> -p <port> dynsec setDefaultACLAccess publishClientReceive deny
mosquitto_ctrl -u <usuário> -P <password> -h <hostname> -p <port> dynsec setDefaultACLAccess subscribe deny
mosquitto_ctrl -u <usuário> -P <password> -h <hostname> -p <port> dynsec setDefaultACLAccess unsubscribe deny
onde:
usuário - Usuário admin criado no passo 2 password - Password do usuário admin criado no passo 2 hostname - Hostname no Mosquitto (por exemplo localhost) port - porta (a porta padrão do Mosquitto é 1883)
Baixar o arquivo MosquittoDynSec.jar da pasta jar. Inserir no classPath do projeto desejado.
Para projetos com maven
Inserir no repositório local do maven com o seguinte comando:
mvn install:install-file -Dfile=<path da pasta onde foi baixado o arquivo>/MosquittoDynSec.jar -DgroupId=com.dougFSilva -DartifactId=mosquittoDynSec -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true
Então adicionar no pom.xml da seguinte forma:
<dependency>
<groupId>com.dougFSilva</groupId>
<artifactId>mosquittoDynSec</artifactId>
<version>1.0.0</version>
</dependency>
String uri = "tcp://localhost:1883";
String username = "admin";
String password = "admin123";
String clientId = "";
DynSecPublisher publisher = new DynSecPublisher(uri, username, password, clientId);
DynSecClient client = new DynSecClient("client10", "passwordClient10");
publisher.addCommand(client.createCommand())
.publish();
DynSecRole role = new DynSecRole("role0");
publisher.addCommand(role.createCommand())
.publish();
DynSecACL acl = new DynSecACL(ACLType.PUBLISH_CLIENT_RECEIVE, "tópico0", true);
publisher.addCommand(role.addRoleACLCommand(acl))
.publish();
publisher.addCommand(client.addRoleCommand(role))
.publish();
DynSecPublisher publisher = new DynSecPublisher();
DynSecClient client = new DynSecClient("client10", "passwordClient10");
DynSecRole role = new DynSecRole("role0");
DynSecACL acl = new DynSecACL(ACLType.PUBLISH_CLIENT_RECEIVE, "tópico0", true);
publisher.addCommand(client.createCommand())
.addCommand(role.createCommand())
.addCommand(role.addRoleACLCommand(acl))
.addCommand(client.addRoleCommand(role))
.publish();
Também é possível criar grupos, adicionar uma role a um grupo e incluir clients nesse grupo. Veja o exemplo a seguir:
DynSecPublisher publisher = new DynSecPublisher();
DynSecGroup group = new DynSecGroup("group10");
DynSecRole role = new DynSecRole("role10");
DynSecClient client = new DynSecClient("client10", "passwordClient10");
DynSecACL acl = new DynSecACL(ACLType.PUBLISH_CLIENT_RECEIVE, "tópico10", true);
publisher.addCommand(group.createCommand())
.addCommand(role.createCommand())
.addCommand(client.createCommand())
.addCommand(role.addRoleACLCommand(acl))
.addCommand(group.addRoleCommand(role))
.addCommand(group.addClientCommand(client))
.publish(); // publica
Para os demais comandos possíveis e informações, veja em Java-Mosquitto-DynamicSecurity-javadoc
- Spring boot
- Dependências: org.eclipse.paho e com.google.gson
- Douglas Ferreira da Silva