Skip to content

Plugin para Autenticação e Autorização de usuários no Mosquitto integrado ao banco de dados PostgreSQL

License

Notifications You must be signed in to change notification settings

douglaszuqueto/mosquitto-auth-plugin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mosquitto Auth Plugin - PostgreSQL

Plugin para Autenticação e Autorização de usuários no Mosquitto

Índice

Introdução

Este plugin é originado do projeto 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

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

  • Database: controle-de-acesso
    • Schema: mqtt
      • Table: user
      • Table: acl

Caso 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

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

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

# Configurations

allow_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 websockets

auth_plugin /mosquitto-auth-plugin/go-auth.so

auth_opt_backends postgres
auth_opt_log_level debug

auth_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

About

Plugin para Autenticação e Autorização de usuários no Mosquitto integrado ao banco de dados PostgreSQL

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published