🐇 Segurança no RabbitMQ
Oi pessoal, tudo bem 😊? Hoje resolvi trazer um conteúdo sobre mensageria e como devemos pensar em segurança quando abordamos esse conteúdo! Algo muito utilizado pelos desenvolvedores, principalmente em grandes aplicações , onde é necessário utilizar filas e fazer requisições de forma assíncrona
O que é RabbitMQ?
RabbitMQ é um message broker, ou seja, um software que recebe, armazena e distribui mensagens entre sistemas de forma assíncrona. Ele permite a comunicação eficiente entre diferentes partes de uma aplicação sem que elas precisem estar diretamente conectadas.
O que são Producer e Consumer?
- Producer: Responsável por enviar mensagens para uma fila no RabbitMQ.
- Consumer: Escuta e processa mensagens dessa fila conforme chegam.
No dia a dia, RabbitMQ é usado para processar pedidos de e-commerce, notificações em tempo real, sistemas de filas de atendimento, entre outros. Ele é muito usado na comunicação entre micro serviços
Contexto de AppSec
Do ponto de vista de segurança (AppSec), é essencial proteger o RabbitMQ contra ataques como:
- DoS (Denial of Service): Envio massivo de mensagens para sobrecarregar o sistema.
- SQL Injection e XSS: Se as mensagens não forem sanitizadas corretamente, podem conter código malicioso.
- Acesso não autorizado: Sem autenticação, qualquer um poderia enviar ou consumir mensagens.
Para mitigar esses riscos, implementamos Rate Limiting, Sanitização de Mensagens e Autenticação por Token, no código a abaixo.
⚠️ Também devemos lembrar de utilizar HSTS para impedir que as informações da fila possam ser escutadas por pessoas má intencionadas
Como visualizar as filas no RabbitMQ
Após iniciar o RabbitMQ, acesse a interface de gerenciamento via navegador:
- Acesse: http://localhost:15672
- Faça login com:
- Usuário:
guest
- Senha:
guest
- Clique na aba Queues
- Encontre a fila fila_teste
- Você pode visualizar o número de mensagens pendentes e consumidas.
Podemos testar de enviar a mensagem pela interface, utilizando um Payload e recebendo no nosso consumer! Isso é ótimo para testar entre desenvolvedores diferentes e saber como que é esperada a informação da fila 😎
Você pode escolher do delivery ser persistente (gravado no disco - caso reinicie o RabbitMQ, a informação na será perdida) ou não persistente(será perdida a informação em seguida)
Agora, testando alguns conceitos de segurança ✨
O código está disponível aqui com todo o passo a passo:
Utilizei localmente, mas se fosse em produção, deveria ser trocado o IP aqui:
# Conectar ao RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
Boas práticas:
- Chamamos o código producer.py para realizar os testes com o consumer
# Limit Rate para não ocorrer DOS (negação de serviço)
# Sanitização de inputs para códigos maliciosos
# Autenticação com Token adequado
Espero que tenham gostado 👩💻