Administrando Usuários e Permissões no RabbitMQ: Um Guia de Linha de Comando

Domine os comandos `rabbitmqctl` para gerenciamento robusto de usuários e permissões no RabbitMQ. Este guia abrangente fornece instruções passo a passo sobre como criar novos usuários, atribuir funções de administrador ou aplicativo usando tags, definir permissões granulares de host virtual (ler/escrever/configurar) e revogar acesso com segurança, garantindo administração controlada via linha de comando.

Administrando Usuários e Permissões no RabbitMQ: Um Guia de Linha de Comando

As permissões do RabbitMQ são fáceis de acertar quase completamente. Um usuário pode existir e ainda assim não conseguir publicar. Um usuário pode ter a tag management e ainda assim não ter acesso ao vhost da aplicação. Uma regex ampla pode acidentalmente permitir que um serviço crie filas que deveria apenas consumir. A maioria dos problemas de permissão vem da confusão entre três ideias separadas: usuários, tags e permissões de vhost.

Este guia usa rabbitmqctl para o fluxo de trabalho comum de administração de usuários: criar usuários, atribuir tags, definir permissões de vhost, verificar acesso, rotacionar senhas e remover acesso de forma limpa.

Pré-requisitos

Antes de prosseguir, certifique-se de ter o seguinte:

  1. Servidor RabbitMQ Instalado: O broker deve estar em execução.
  2. Acesso ao rabbitmqctl: Você precisa de acesso administrativo ao nó ou cluster. Os comandos são comumente executados em um nó RabbitMQ, embora o uso remoto da CLI seja possível quando o ambiente está configurado para isso.
  3. O Nome Correto do Vhost: As permissões são escopadas por host virtual. /, /prod e prod não são intercambiáveis.

Gerenciando Usuários com rabbitmqctl

A ferramenta rabbitmqctl usa a família de comandos user_* para todas as operações relacionadas a usuários. É crucial entender que os usuários do RabbitMQ são distintos dos usuários do sistema operacional.

1. Listando Usuários Existentes

Para ver quem tem acesso atualmente ao broker, use o comando list_users:

rabbitmqctl list_users

Exemplo de Saída:

Listing users ...
user: guest   tags: [administrator]
user: app_prod tags: [policymaker]

2. Criando um Novo Usuário

Ao configurar uma nova conta de serviço ou administrador, você deve criar o usuário e atribuir uma senha inicial.

Para criar um usuário chamado api_user com uma senha inicial:

rabbitmqctl add_user api_user 'substitua-por-uma-senha-longa-e-aleatoria'

Evite colocar senhas reais de produção no histórico do shell. Em sistemas automatizados, prefira seu gerenciador de segredos e o mecanismo de provisionamento que sua plataforma já usa.

3. Modificando Tags de Usuário (Funções)

As tags de usuário definem funções predefinidas que concedem capacidades administrativas específicas. As tags mais comuns são administrator, policymaker e management.

  • administrator: pode gerenciar usuários, permissões, vhosts, políticas e configurações de cluster.
  • policymaker: pode gerenciar políticas e parâmetros para vhosts onde o usuário tem acesso.
  • management: pode fazer login na interface/API de gerenciamento, mas as permissões de vhost ainda controlam quais recursos o usuário pode usar.
  • monitoring: pode visualizar informações de gerenciamento, útil para contas de observabilidade.

Visualizando Tags Atuais

Use list_user_tags para ver as funções atuais:

rabbitmqctl list_user_tags api_user

Definindo Tags

Para atribuir a tag management ao api_user:

rabbitmqctl set_user_tags api_user management

set_user_tags substitui a lista de tags do usuário exatamente pelas tags que você fornece. Para dar ambas as tags administrator e policymaker, inclua ambas no mesmo comando:

rabbitmqctl set_user_tags api_user administrator policymaker

Removendo Tags

Para remover todas as tags de um usuário:

rabbitmqctl set_user_tags api_user

Algumas versões do RabbitMQ também fornecem clear_user_tags. Verifique rabbitmqctl help clear_user_tags na sua versão instalada antes de usá-lo em scripts.

4. Alterando a Senha de um Usuário

Se as credenciais precisarem ser rotacionadas, use o comando change_password:

rabbitmqctl change_password api_user novasenha123

5. Excluindo um Usuário

Para remover completamente um usuário e revogar todo o acesso associado:

rabbitmqctl delete_user api_user

Aviso: Excluir o usuário guest é geralmente recomendado em ambientes de produção por razões de segurança, embora exija a criação de um novo usuário administrador primeiro.

Gerenciando Permissões de Host Virtual

As permissões no RabbitMQ são definidas por Host Virtual (vhost). Um vhost atua como um namespace para filas, exchanges e bindings. Por padrão, o RabbitMQ tem um vhost raiz chamado /.

1. Listando Vhosts

Primeiro, identifique os vhosts disponíveis:

rabbitmqctl list_vhosts

2. Definindo Permissões para um Usuário em um VHost

O comando set_permissions é o mais crítico para a segurança da aplicação. Ele concede a um usuário direitos para configurar, ler ou escrever recursos dentro de um vhost específico.

Sintaxe: rabbitmqctl set_permissions -p <vhost> <usuário> <configurar> <escrever> <ler>

Os valores de permissão são expressões regulares. .* significa todos os nomes de recursos. ^$ significa nenhum nome de recurso.

Exemplo: Concedendo Acesso Total a um VHost Específico

Se quisermos que app_prod tenha acesso total (Configurar, Ler, Escrever) apenas ao /prod_vhost:

rabbitmqctl set_permissions -p /prod_vhost app_prod "^.*" "^.*" "^.*"
Permissão Significado Uso Típico
Configurar Criar, excluir ou modificar filas, exchanges e bindings que correspondem à regex. Implantadores ou aplicativos que declaram sua própria topologia.
Escrever Publicar em exchanges correspondentes. Produtores.
Ler Consumir de filas correspondentes. Consumidores.

Exemplo: Restringindo um Usuário Apenas para Publicação

Um padrão comum para produtores de firehose é restringi-los apenas a escrever:

# Usuário 'publisher' pode escrever, mas não pode configurar ou ler mensagens em /analytics_vhost
rabbitmqctl set_permissions -p /analytics_vhost publisher "^$" "^events\\." "^$"

Esse exemplo permite publicar em exchanges cujos nomes começam com events.. Não permite que o usuário configure topologia ou consuma mensagens.

Exemplo: Restringindo um Consumidor

# Pode ler de filas que começam com worker. mas não pode publicar ou configurar
rabbitmqctl set_permissions -p /jobs worker_consumer "^$" "^$" "^worker\."

Permissões com regex são poderosas, mas também fáceis de ampliar demais. Se suas filas são nomeadas prod.orders.created e staging.orders.created no mesmo vhost, uma regex como .*orders.* pode cobrir mais do que o pretendido. Vhosts separados geralmente são mais limpos do que limites complexos de regex.

3. Limpando Permissões

Para remover completamente todas as permissões que um usuário tem em um vhost específico, use clear_permissions:

rabbitmqctl clear_permissions -p /prod_vhost app_prod

4. Listando Permissões do Usuário

Para verificar as permissões concedidas em um vhost:

rabbitmqctl list_permissions -p /prod_vhost

Para ver todas as permissões atribuídas a um usuário em todos os vhosts:

rabbitmqctl list_user_permissions app_prod

Melhores Práticas para Administração de Usuários

  • Use o princípio do menor privilégio: produtores geralmente precisam de permissão de escrita, consumidores geralmente precisam de permissão de leitura, e apenas proprietários de topologia precisam de permissão de configuração.
  • Use vhosts dedicados: separe ambientes e inquilinos com vhosts em vez de tentar resolver tudo com regexes.
  • Lide com guest deliberadamente: o usuário padrão guest é limitado ao localhost por padrão. Muitas equipes de produção o excluem após criar uma conta de administrador real.
  • Automatize o estado desejado: mantenha a configuração de usuários, vhosts e permissões na automação de implantação para que um broker reconstruído não dependa de memória.
  • Verifique após alterações: execute list_users, list_permissions e list_user_permissions após cada alteração em produção.

Uma configuração prática de aplicação geralmente se parece com isso:

rabbitmqctl add_vhost /orders
rabbitmqctl add_user orders_publisher 'substitua-por-segredo'
rabbitmqctl add_user orders_worker 'substitua-por-segredo'

rabbitmqctl set_permissions -p /orders orders_publisher "^$" "^orders\\." "^$"
rabbitmqctl set_permissions -p /orders orders_worker "^$" "^$" "^orders\\."

rabbitmqctl list_user_permissions orders_publisher
rabbitmqctl list_user_permissions orders_worker

Isso mantém as credenciais de publicação e consumo separadas. Se uma senha de worker vazar, ela não pode publicar novas mensagens. Se uma senha de publisher vazar, ela não pode drenar filas. Essa separação é simples, mas é um dos hábitos de segurança mais úteis do RabbitMQ.