Administración de usuarios y permisos en RabbitMQ: una guía de línea de comandos
Domina los comandos `rabbitmqctl` para una gestión robusta de usuarios y permisos en RabbitMQ. Esta guía completa proporciona instrucciones paso a paso para crear nuevos usuarios, asignar roles de administrador o aplicación mediante etiquetas, establecer permisos detallados por host virtual (lectura/escritura/configuración) y revocar el acceso de forma segura, garantizando una administración controlada desde la línea de comandos.
Administración de usuarios y permisos en RabbitMQ: una guía de línea de comandos
Los permisos de RabbitMQ son fáciles de acertar casi por completo. Un usuario puede existir y aún así no poder publicar. Un usuario puede tener la etiqueta management y aún así no tener acceso al host virtual de la aplicación. Una expresión regular amplia puede permitir accidentalmente que un servicio cree colas de las que solo debería consumir. La mayoría de los problemas de permisos provienen de confundir tres ideas separadas: usuarios, etiquetas y permisos de host virtual.
Esta guía utiliza rabbitmqctl para el flujo de trabajo común de administración de usuarios: crear usuarios, asignar etiquetas, establecer permisos de host virtual, verificar el acceso, rotar contraseñas y eliminar el acceso de forma limpia.
Requisitos previos
Antes de continuar, asegúrate de tener lo siguiente:
- Servidor RabbitMQ instalado: El broker debe estar en ejecución.
- Acceso a
rabbitmqctl: Necesitas acceso administrativo al nodo o clúster. Los comandos se ejecutan comúnmente en un nodo de RabbitMQ, aunque es posible usar la CLI de forma remota cuando el entorno está configurado para ello. - El nombre correcto del host virtual: Los permisos se aplican por host virtual.
/,/prodyprodno son intercambiables.
Gestión de usuarios con rabbitmqctl
La herramienta rabbitmqctl utiliza la familia de comandos user_* para todas las operaciones relacionadas con usuarios. Es crucial entender que los usuarios de RabbitMQ son distintos de los usuarios del sistema operativo.
1. Listar usuarios existentes
Para ver quién tiene acceso actualmente al broker, usa el comando list_users:
rabbitmqctl list_users
Ejemplo de salida:
Listing users ...
user: guest tags: [administrator]
user: app_prod tags: [policymaker]
2. Crear un nuevo usuario
Al configurar una nueva cuenta de servicio o administrador, debes crear el usuario y asignar una contraseña inicial.
Para crear un usuario llamado api_user con una contraseña inicial:
rabbitmqctl add_user api_user 'reemplazar-con-una-contraseña-larga-y-aleatoria'
Evita poner contraseñas reales de producción en el historial del shell. En sistemas automatizados, prefiere tu gestor de secretos y el mecanismo de aprovisionamiento que ya utiliza tu plataforma.
3. Modificar etiquetas de usuario (roles)
Las etiquetas de usuario definen roles predefinidos que otorgan capacidades administrativas específicas. Las etiquetas más comunes son administrator, policymaker y management.
administrator: puede gestionar usuarios, permisos, hosts virtuales, políticas y configuraciones a nivel de clúster.policymaker: puede gestionar políticas y parámetros para hosts virtuales a los que el usuario tiene acceso.management: puede iniciar sesión en la interfaz de usuario/API de gestión, pero los permisos del host virtual aún controlan qué recursos puede usar el usuario.monitoring: puede ver información de gestión, útil para cuentas de observabilidad.
Ver etiquetas actuales
Usa list_user_tags para ver los roles actuales:
rabbitmqctl list_user_tags api_user
Establecer etiquetas
Para asignar la etiqueta management a api_user:
rabbitmqctl set_user_tags api_user management
set_user_tags reemplaza la lista de etiquetas del usuario exactamente con las etiquetas que proporciones. Para dar ambas etiquetas, administrador y creador de políticas, incluye ambas en el mismo comando:
rabbitmqctl set_user_tags api_user administrator policymaker
Eliminar etiquetas
Para eliminar todas las etiquetas de un usuario:
rabbitmqctl set_user_tags api_user
Algunas versiones de RabbitMQ también proporcionan clear_user_tags. Consulta rabbitmqctl help clear_user_tags en tu versión instalada antes de usarlo en scripts.
4. Cambiar la contraseña de un usuario
Si es necesario rotar las credenciales, usa el comando change_password:
rabbitmqctl change_password api_user nuevacontraseñasegura123
5. Eliminar un usuario
Para eliminar completamente a un usuario y revocar todo el acceso asociado:
rabbitmqctl delete_user api_user
Advertencia: Generalmente se recomienda eliminar el usuario
guesten entornos de producción por razones de seguridad, aunque requiere crear primero un nuevo usuario administrador.
Gestión de permisos de hosts virtuales
Los permisos en RabbitMQ se definen por host virtual (vhost). Un host virtual actúa como un espacio de nombres para colas, intercambios y enlaces. Por defecto, RabbitMQ tiene un host virtual raíz llamado /.
1. Listar hosts virtuales
Primero, identifica los hosts virtuales disponibles:
rabbitmqctl list_vhosts
2. Establecer permisos para un usuario en un host virtual
El comando set_permissions es el más crítico para la seguridad de la aplicación. Otorga a un usuario derechos para configurar, leer o escribir recursos dentro de un host virtual específico.
Sintaxis: rabbitmqctl set_permissions -p <vhost> <usuario> <configurar> <escribir> <leer>
Los valores de los permisos son expresiones regulares. .* significa todos los nombres de recursos. ^$ significa ningún nombre de recurso.
Ejemplo: Otorgar acceso completo a un host virtual específico
Si queremos que app_prod tenga acceso completo (Configurar, Leer, Escribir) solo al /prod_vhost:
rabbitmqctl set_permissions -p /prod_vhost app_prod "^.*" "^.*" "^.*"
| Permiso | Significado | Uso típico |
|---|---|---|
| Configurar | Crear, eliminar o modificar colas, intercambios y enlaces que coincidan con la expresión regular. | Desplegadores o aplicaciones que declaran su propia topología. |
| Escribir | Publicar en intercambios que coincidan. | Productores. |
| Leer | Consumir de colas que coincidan. | Consumidores. |
Ejemplo: Restringir a un usuario solo a publicar
Un patrón común para productores de flujo continuo es restringirlos solo a escribir:
# El usuario 'publisher' puede escribir pero no puede configurar ni leer mensajes en /analytics_vhost
rabbitmqctl set_permissions -p /analytics_vhost publisher "^$" "^events\\." "^$"
Ese ejemplo permite publicar en intercambios cuyos nombres comiencen con events.. No permite al usuario configurar la topología ni consumir mensajes.
Ejemplo: Restringir a un consumidor
# Puede leer de colas que comiencen con worker. pero no puede publicar ni configurar
rabbitmqctl set_permissions -p /jobs worker_consumer "^$" "^$" "^worker\\."
Los permisos con expresiones regulares son potentes, pero también es fácil que sean demasiado amplios. Si tus colas se llaman prod.orders.created y staging.orders.created en el mismo host virtual, una expresión regular como .*orders.* puede cubrir más de lo previsto. Los hosts virtuales separados suelen ser más limpios que los límites complicados con expresiones regulares.
3. Limpiar permisos
Para eliminar completamente todos los permisos que un usuario tiene en un host virtual específico, usa clear_permissions:
rabbitmqctl clear_permissions -p /prod_vhost app_prod
4. Listar permisos de usuario
Para verificar los permisos otorgados en un host virtual:
rabbitmqctl list_permissions -p /prod_vhost
Para ver todos los permisos asignados a un usuario en todos los hosts virtuales:
rabbitmqctl list_user_permissions app_prod
Mejores prácticas para la administración de usuarios
- Usa el menor privilegio: los productores generalmente necesitan permiso de escritura, los consumidores generalmente necesitan permiso de lectura, y solo los propietarios de la topología necesitan permiso de configuración.
- Usa hosts virtuales dedicados: separa entornos e inquilinos con hosts virtuales en lugar de intentar resolver todo con expresiones regulares.
- Maneja
guestdeliberadamente: el usuarioguestpredeterminado está limitado a localhost por defecto. Muchos equipos de producción lo eliminan después de crear una cuenta de administrador real. - Scriptea el estado deseado: mantén la configuración de usuarios, hosts virtuales y permisos en la automatización de despliegues para que un broker reconstruido no dependa de la memoria.
- Verifica después de los cambios: ejecuta
list_users,list_permissionsylist_user_permissionsdespués de cada cambio en producción.
Una configuración práctica de aplicación a menudo se ve así:
rabbitmqctl add_vhost /orders
rabbitmqctl add_user orders_publisher 'reemplazar-con-secreto'
rabbitmqctl add_user orders_worker 'reemplazar-con-secreto'
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
Eso mantiene separadas las credenciales de publicación y consumo. Si una contraseña de trabajador se filtra, no puede publicar nuevos mensajes. Si una contraseña de publicador se filtra, no puede drenar colas. Esa separación es simple, pero es uno de los hábitos de seguridad más útiles de RabbitMQ.