Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/douglaszuqueto/mosquitto-auth-plugin
Plugin para Autenticação e Autorização de usuários no Mosquitto integrado ao banco de dados PostgreSQL
https://github.com/douglaszuqueto/mosquitto-auth-plugin
golang iot mosquitto mosquitto-auth-plugin mqtt postgresql
Last synced: 24 days ago
JSON representation
Plugin para Autenticação e Autorização de usuários no Mosquitto integrado ao banco de dados PostgreSQL
- Host: GitHub
- URL: https://github.com/douglaszuqueto/mosquitto-auth-plugin
- Owner: douglaszuqueto
- License: mit
- Created: 2018-04-24T01:14:07.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2018-04-27T16:03:10.000Z (almost 7 years ago)
- Last Synced: 2024-11-14T21:36:47.529Z (3 months ago)
- Topics: golang, iot, mosquitto, mosquitto-auth-plugin, mqtt, postgresql
- Language: Go
- Homepage: https://github.com/douglaszuqueto/mosquitto-auth-plugin
- Size: 61.5 KB
- Stars: 4
- Watchers: 3
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Mosquitto Auth Plugin - PostgreSQL
Plugin para Autenticação e Autorização de usuários no Mosquitto
## Índice
- [Introdução](#introducao)
- [Dependências](#dependencias)
- [Build](#build)
- [Standalone](#standalone)
- [Docker](#docker)
- [Configuração](#configuracao)
- [Geral](#geral)
- [PostgreSQL](#postgresql)
- [PostgreSQL](#postgresql)
- [Instalar](#instalar)
- [Configurar](#configurar)
- [Estrutura](#estrutura)
- [Script](#script)
- [Integrando](#integrando)
- [Exemplo de configuração](#exemplocompleto-de-configuração)## Introdução
Este plugin é originado do projeto [Mosquitto Go Auth](https://github.com/iegomez/mosquitto-go-auth) com uma diferença do mesmo ser adaptado para atender demandas mais especificas em conjunto com o Broker MQTT Mosquitto.
## Dependências
As depedências serão instaladas de acordo com o cenário que você escolher. Portanto irei me basear na distro **Ubuntu**.
Em resumo você terá 2 dependências principais:
* Go(golang)
* Ferramentas para compilação## Build
### Standalone
* Arquitetura X64
* Arquitetura ARM (Raspberry PI)### Docker
* Arquitetura X64
## Configuração
### Geral
### PostgreSQL
## PostgreSQL
Como o plugin é fortemente atrelado ao Banco de dados, se faz necessário a criação do ecossistema base para funcionamento - "podendo" ser adaptado de acordo com o cenário do projeto.
### Instalar
Para começar, você precisa ao mínimo ter o **PostgreSQL** instalado em sua máquina(desktop, docker, raspberry, servidor...). Recomendo também alguma interface gŕafica para manipulação do banco de dados - eu, particularmente estou usando o **PgAdmin4**.
### Configurar
Depois de ter instalado o serviço, não se esqueça de configurar algumas coisas que se faz necessário no postgres.
* Liberar acesso remoto;
* Definição de senha para o usuário default;### Estrutura
![img](https://raw.githubusercontent.com/douglaszuqueto/mosquitto-auth-plugin/master/.github/mosquitto-auth-plugin.png)
### Script
Nos 2 próximos tópicos será mostrado a estrutura base referente ao que é necessário para o correto funcionamento no que tange a **Atenticação e Autorização** de usuários e seus devidos tópicos.
Fica a sua escolha qual **database** utilizar. Você pode colocar dentro do banco que já vem pré-criado - *postgres*, mas também pode criar um de sua preferência ou até mesmo embarcar no mesmo database de seu projeto.
Outra escolha opcional é a questão do **schema** a ser utilizado. Como padrão do postgres deixei no *public*, mas você pode criar um chamado **mqtt** por exemplo - em meu projeto, é esta estrutura que eu sigo. Deixo abaixo a estrutura que pretendo adotar no projeto [controle de acesso](https://github.com/douglaszuqueto/controle-de-acesso)
* Database: controle-de-acesso
* Schema: mqtt
* Table: user
* Table: aclCaso mude o schema, não esqueça de estar mudando o schema nos scripts abaixo.
De *CREATE TABLE public."user"* por **CREATE TABLE seu_schema."user"**
#### Tabela user
```sql
-- Table: public."user"-- DROP TABLE public."user";
CREATE TABLE public."user"
(
id bigint NOT NULL DEFAULT nextval('test_user_id_seq'::regclass),
username character varying(100) COLLATE pg_catalog."default" NOT NULL,
password character varying(200) COLLATE pg_catalog."default" NOT NULL,
is_admin boolean NOT NULL,
CONSTRAINT test_user_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;ALTER TABLE public."user"
OWNER to postgres;
```#### Tabela ACL
```sql
-- Table: public.acl-- DROP TABLE public.acl;
CREATE TABLE public.acl
(
id bigint NOT NULL DEFAULT nextval('test_acl_id_seq'::regclass),
topic character varying(200) COLLATE pg_catalog."default" NOT NULL,
rw integer NOT NULL,
client_id character varying COLLATE pg_catalog."default",
state smallint NOT NULL DEFAULT 1,
id_user bigint,
CONSTRAINT test_acl_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;ALTER TABLE public.acl
OWNER to postgres;
```## Integrando
Para ocorrer a devida integração, você terá de adicionar algumas linhas no arquivo de configuração do seu broker mosquitto e depois adequar os valores de acordo
com o cenário que você possui.Segue abaixo uma tabela referente a todas opçoes possíveis de configuração:
| Option | default | Mandatory | Meaning |
| -------------- | ----------------- | :---------: | ------------------------ |
| pg_host | localhost | | hostname/address
| pg_port | 5432 | | TCP port
| pg_user | | Y | username
| pg_password | | Y | password
| pg_dbname | | Y | database name
| pg_userquery | | Y | SQL for users
| pg_superquery | | N | SQL for superusers
| pg_aclquery | | N | SQL for ACLs
| pg_sslmode | disable | N | SSL/TLS mode.
| pg_sslcert | | N | SSL/TLS Client Cert.
| pg_sslkey | | N | SSL/TLS Client Cert. Key
| pg_sslrootcert | | N | SSL/TLS Root Cert**Observação:** Todas opções listadas acima levam o prefixo auth_opt_. Ou seja, cada opção deverá ficar no seginte formato: **auth_opt_pg_host**.
### Exemplo(completo) de configuração
```
# Configurationsallow_anonymous false
log_type error
log_type warning
log_type notice
log_type information
log_type debug# MQTT
listener 1883
# MQTT Websockets
listener 8083
protocol websocketsauth_plugin /mosquitto-auth-plugin/go-auth.so
auth_opt_backends postgres
auth_opt_log_level debugauth_opt_pg_host postgres
auth_opt_pg_port 5432
auth_opt_pg_dbname controle-de-acesso
auth_opt_pg_user postgres
auth_opt_pg_password root
auth_opt_pg_userquery select password from mqtt."user" where username = $1 limit 1
auth_opt_pg_superquery select count(*) from mqtt."user" where username = $1 and is_admin = true
auth_opt_pg_aclquery SELECT a.topic FROM mqtt."acl" a INNER JOIN mqtt."user" u ON u.id = a.id_user WHERE (u.username = $1) AND a.rw >= $2```
## Referências
* [Mosquitto Auth Plug](https://github.com/jpmens/mosquitto-auth-plug)
* [Mosquitto Go Auth](https://github.com/iegomez/mosquitto-go-auth)