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:
- Servidor RabbitMQ Instalado: O broker deve estar em execução.
- 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. - O Nome Correto do Vhost: As permissões são escopadas por host virtual.
/,/prodeprodnã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
guestdeliberadamente: o usuário padrãoguesté 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_permissionselist_user_permissionsapó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.