Administration des utilisateurs et des permissions RabbitMQ : Guide en ligne de commande

Maîtrisez les commandes `rabbitmqctl` pour une gestion robuste des utilisateurs et des permissions dans RabbitMQ. Ce guide complet fournit des instructions étape par étape pour créer de nouveaux utilisateurs, attribuer des rôles d'administrateur ou d'application à l'aide de balises, définir des permissions granulaires sur les hôtes virtuels (lecture/écriture/configuration) et révoquer l'accès en toute sécurité, garantissant une administration contrôlée via la ligne de commande.

Administration des utilisateurs et des permissions RabbitMQ : Guide en ligne de commande

Les permissions RabbitMQ sont faciles à configurer presque correctement. Un utilisateur peut exister et être toujours incapable de publier. Un utilisateur peut avoir la balise management et n'avoir aucun accès au vhost de l'application. Une regex trop large peut accidentellement permettre à un service de créer des files d'attente qu'il ne devrait que consommer. La plupart des problèmes de permissions proviennent de la confusion entre trois concepts distincts : les utilisateurs, les balises et les permissions des vhosts.

Ce guide utilise rabbitmqctl pour le flux de travail courant d'administration des utilisateurs : créer des utilisateurs, attribuer des balises, définir des permissions de vhost, vérifier l'accès, faire pivoter les mots de passe et supprimer proprement l'accès.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  1. RabbitMQ Server installé : Le broker doit être en cours d'exécution.
  2. Accès à rabbitmqctl : Vous devez disposer d'un accès administratif au nœud ou au cluster. Les commandes sont généralement exécutées sur un nœud RabbitMQ, bien que l'utilisation de l'interface CLI à distance soit possible lorsque l'environnement est configuré pour cela.
  3. Le nom correct du vhost : Les permissions sont limitées par hôte virtuel. /, /prod et prod ne sont pas interchangeables.

Gestion des utilisateurs avec rabbitmqctl

L'outil rabbitmqctl utilise la famille de commandes user_* pour toutes les opérations liées aux utilisateurs. Il est crucial de comprendre que les utilisateurs RabbitMQ sont distincts des utilisateurs du système d'exploitation.

1. Lister les utilisateurs existants

Pour voir qui a actuellement accès au broker, utilisez la commande list_users :

rabbitmqctl list_users

Exemple de sortie :

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

2. Créer un nouvel utilisateur

Lors de la configuration d'un nouveau compte de service ou d'un administrateur, vous devez créer l'utilisateur et attribuer un mot de passe initial.

Pour créer un utilisateur nommé api_user avec un mot de passe initial :

rabbitmqctl add_user api_user 'remplacer-par-un-long-mot-de-passe-aleatoire'

Évitez de placer de vrais mots de passe de production dans l'historique du shell. Dans les systèmes automatisés, préférez votre gestionnaire de secrets et le mécanisme de provisionnement que votre plateforme utilise déjà.

3. Modifier les balises utilisateur (rôles)

Les balises utilisateur définissent des rôles prédéfinis qui accordent des capacités administratives spécifiques. Les balises les plus courantes sont administrator, policymaker et management.

  • administrator : peut gérer les utilisateurs, les permissions, les vhosts, les politiques et les paramètres à l'échelle du cluster.
  • policymaker : peut gérer les politiques et les paramètres pour les vhosts auxquels l'utilisateur a accès.
  • management : peut se connecter à l'interface utilisateur/API de gestion, mais les permissions du vhost contrôlent toujours les ressources que l'utilisateur peut utiliser.
  • monitoring : peut consulter les informations de gestion, utile pour les comptes d'observabilité.

Voir les balises actuelles

Utilisez list_user_tags pour voir les rôles actuels :

rabbitmqctl list_user_tags api_user

Définir des balises

Pour attribuer la balise management à api_user :

rabbitmqctl set_user_tags api_user management

set_user_tags remplace la liste des balises de l'utilisateur par exactement les balises que vous fournissez. Pour donner à la fois les balises administrateur et policymaker, incluez les deux dans la même commande :

rabbitmqctl set_user_tags api_user administrator policymaker

Supprimer des balises

Pour supprimer toutes les balises d'un utilisateur :

rabbitmqctl set_user_tags api_user

Certaines versions de RabbitMQ fournissent également clear_user_tags. Vérifiez rabbitmqctl help clear_user_tags sur votre version installée avant de l'utiliser dans un script.

4. Changer le mot de passe d'un utilisateur

Si les informations d'identification doivent être renouvelées, utilisez la commande change_password :

rabbitmqctl change_password api_user newsecurepass123

5. Supprimer un utilisateur

Pour supprimer complètement un utilisateur et révoquer tout accès associé :

rabbitmqctl delete_user api_user

Avertissement : La suppression de l'utilisateur guest est généralement recommandée dans les environnements de production pour des raisons de sécurité, bien qu'elle nécessite d'abord la création d'un nouvel utilisateur administrateur.

Gestion des permissions des hôtes virtuels

Les permissions dans RabbitMQ sont définies par hôte virtuel (vhost). Un vhost agit comme un espace de noms pour les files d'attente, les échanges et les liaisons. Par défaut, RabbitMQ a un vhost racine nommé /.

1. Lister les vhosts

Tout d'abord, identifiez les vhosts disponibles :

rabbitmqctl list_vhosts

2. Définir les permissions pour un utilisateur sur un vhost

La commande set_permissions est la plus critique pour la sécurité des applications. Elle accorde à un utilisateur les droits de configurer, lire ou écrire des ressources dans un vhost spécifique.

Syntaxe : rabbitmqctl set_permissions -p <vhost> <utilisateur> <configurer> <écrire> <lire>

Les valeurs de permission sont des expressions régulières. .* signifie tous les noms de ressources. ^$ signifie aucun nom de ressource.

Exemple : Accorder un accès complet à un vhost spécifique

Si nous voulons que app_prod ait un accès CRUD complet (Configurer, Lire, Écrire) uniquement sur /prod_vhost :

rabbitmqctl set_permissions -p /prod_vhost app_prod "^.*" "^.*" "^.*"
Permission Signification Utilisation typique
Configurer Créer, supprimer ou modifier des files d'attente, des échanges et des liaisons correspondant à la regex. Déployeurs ou applications qui déclarent leur propre topologie.
Écrire Publier sur des échanges correspondants. Producteurs.
Lire Consommer à partir de files d'attente correspondantes. Consommateurs.

Exemple : Restreindre un utilisateur à la publication uniquement

Un modèle courant pour les producteurs de flux est de les restreindre à l'écriture uniquement :

# L'utilisateur 'publisher' peut écrire mais ne peut pas configurer ni lire de messages dans /analytics_vhost
rabbitmqctl set_permissions -p /analytics_vhost publisher "^$" "^events\\." "^$"

Cet exemple permet de publier sur des échanges dont les noms commencent par events.. Il ne permet pas à l'utilisateur de configurer la topologie ni de consommer des messages.

Exemple : Restreindre un consommateur

# Peut lire à partir de files d'attente commençant par worker. mais ne peut pas publier ni configurer
rabbitmqctl set_permissions -p /jobs worker_consumer "^$" "^$" "^worker\\."

Les permissions par regex sont puissantes, mais elles sont aussi faciles à élargir excessivement. Si vos files d'attente sont nommées prod.orders.created et staging.orders.created dans le même vhost, une regex comme .*orders.* pourrait couvrir plus que prévu. Des vhosts séparés sont généralement plus propres que des limites de regex complexes.

3. Effacer les permissions

Pour supprimer complètement toutes les permissions qu'un utilisateur a sur un vhost spécifique, utilisez clear_permissions :

rabbitmqctl clear_permissions -p /prod_vhost app_prod

4. Lister les permissions d'un utilisateur

Pour vérifier les permissions accordées sur un vhost :

rabbitmqctl list_permissions -p /prod_vhost

Pour voir toutes les permissions attribuées à un utilisateur sur tous les vhosts :

rabbitmqctl list_user_permissions app_prod

Meilleures pratiques pour l'administration des utilisateurs

  • Utiliser le moindre privilège : les producteurs ont généralement besoin d'une permission d'écriture, les consommateurs d'une permission de lecture, et seuls les propriétaires de topologie ont besoin d'une permission de configuration.
  • Utiliser des vhosts dédiés : séparez les environnements et les locataires avec des vhosts au lieu d'essayer de tout résoudre avec des regex.
  • Gérer guest délibérément : l'utilisateur guest par défaut est limité à localhost par défaut. De nombreuses équipes de production le suppriment après avoir créé un véritable compte administrateur.
  • Scripter l'état souhaité : conservez la configuration des utilisateurs, des vhosts et des permissions dans l'automatisation du déploiement afin qu'un broker reconstruit ne dépende pas de la mémoire.
  • Vérifier après les modifications : exécutez list_users, list_permissions et list_user_permissions après chaque modification en production.

Une configuration pratique d'application ressemble souvent à ceci :

rabbitmqctl add_vhost /orders
rabbitmqctl add_user orders_publisher 'remplacer-par-secret'
rabbitmqctl add_user orders_worker 'remplacer-par-secret'

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

Cela maintient les informations d'identification de publication et de consommation séparées. Si un mot de passe de worker fuit, il ne peut pas publier de nouveaux messages. Si un mot de passe de publisher fuit, il ne peut pas vider les files d'attente. Cette séparation est simple, mais c'est l'une des habitudes de sécurité RabbitMQ les plus utiles.