RabbitMQ-Benutzer und -Berechtigungen verwalten: Eine Kommandozeilen-Anleitung

Meistern Sie die `rabbitmqctl`-Befehle für eine robuste Benutzer- und Berechtigungsverwaltung in RabbitMQ. Diese umfassende Anleitung bietet Schritt-für-Schritt-Anleitungen zum Erstellen neuer Benutzer, Zuweisen von Administrator- oder Anwendungsrollen mithilfe von Tags, Festlegen feingranularer virtueller Host-Berechtigungen (Lesen/Schreiben/Konfigurieren) und sicheren Entziehen von Zugriffen – für eine kontrollierte Verwaltung über die Kommandozeile.

RabbitMQ-Benutzer und -Berechtigungen verwalten: Eine Kommandozeilen-Anleitung

RabbitMQ-Berechtigungen sind leicht fast richtig einzustellen. Ein Benutzer kann existieren und dennoch nicht veröffentlichen können. Ein Benutzer kann das management-Tag haben und dennoch keinen Zugriff auf den Anwendungs-Vhost haben. Ein zu weit gefasster regulärer Ausdruck kann versehentlich einem Dienst erlauben, Warteschlangen zu erstellen, von denen er nur konsumieren sollte. Die meisten Berechtigungsprobleme entstehen durch die Verwechslung von drei separaten Konzepten: Benutzer, Tags und Vhost-Berechtigungen.

Diese Anleitung verwendet rabbitmqctl für den üblichen Benutzerverwaltungs-Workflow: Benutzer erstellen, Tags zuweisen, Vhost-Berechtigungen festlegen, Zugriff überprüfen, Passwörter rotieren und Zugriff sauber entfernen.

Voraussetzungen

Stellen Sie vor dem Fortfahren sicher, dass Folgendes vorhanden ist:

  1. RabbitMQ-Server installiert: Der Broker muss ausgeführt werden.
  2. rabbitmqctl-Zugriff: Sie benötigen administrativen Zugriff auf den Knoten oder Cluster. Befehle werden üblicherweise auf einem RabbitMQ-Knoten ausgeführt, obwohl die entfernte CLI-Nutzung möglich ist, wenn die Umgebung dafür konfiguriert ist.
  3. Der korrekte Vhost-Name: Berechtigungen sind pro virtuellem Host begrenzt. /, /prod und prod sind nicht austauschbar.

Benutzerverwaltung mit rabbitmqctl

Das rabbitmqctl-Tool verwendet die user_*-Befehlsfamilie für alle benutzerbezogenen Operationen. Es ist entscheidend zu verstehen, dass RabbitMQ-Benutzer von Betriebssystem-Benutzern zu unterscheiden sind.

1. Vorhandene Benutzer auflisten

Um zu sehen, wer aktuell Zugriff auf den Broker hat, verwenden Sie den Befehl list_users:

rabbitmqctl list_users

Beispielausgabe:

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

2. Einen neuen Benutzer erstellen

Beim Einrichten eines neuen Dienstkontos oder Administrators müssen Sie den Benutzer erstellen und ein anfängliches Passwort zuweisen.

Um einen Benutzer namens api_user mit einem anfänglichen Passwort zu erstellen:

rabbitmqctl add_user api_user 'replace-with-a-long-random-password'

Vermeiden Sie es, echte Produktionspasswörter in der Shell-Historie zu hinterlegen. Bevorzugen Sie in automatisierten Systemen Ihren Secret Manager und den Bereitstellungsmechanismus, den Ihre Plattform bereits verwendet.

3. Benutzer-Tags (Rollen) ändern

Benutzer-Tags definieren vordefinierte Rollen, die spezifische administrative Fähigkeiten gewähren. Die häufigsten Tags sind administrator, policymaker und management.

  • administrator: kann Benutzer, Berechtigungen, Vhosts, Richtlinien und clusterweite Einstellungen verwalten.
  • policymaker: kann Richtlinien und Parameter für Vhosts verwalten, auf die der Benutzer Zugriff hat.
  • management: kann sich in die Verwaltungsoberfläche/API einloggen, aber Vhost-Berechtigungen steuern weiterhin, welche Ressourcen der Benutzer nutzen kann.
  • monitoring: kann Verwaltungsinformationen anzeigen, nützlich für Observability-Konten.

Aktuelle Tags anzeigen

Verwenden Sie list_user_tags, um die aktuellen Rollen zu sehen:

rabbitmqctl list_user_tags api_user

Tags setzen

Um das management-Tag an api_user zuzuweisen:

rabbitmqctl set_user_tags api_user management

set_user_tags ersetzt die Tag-Liste des Benutzers genau mit den von Ihnen angegebenen Tags. Um sowohl Administrator- als auch Policymaker-Tags zu vergeben, geben Sie beide im selben Befehl an:

rabbitmqctl set_user_tags api_user administrator policymaker

Tags entfernen

Um alle Tags von einem Benutzer zu entfernen:

rabbitmqctl set_user_tags api_user

Einige RabbitMQ-Versionen bieten auch clear_user_tags an. Überprüfen Sie rabbitmqctl help clear_user_tags auf Ihrer installierten Version, bevor Sie es in Skripten verwenden.

4. Passwort eines Benutzers ändern

Wenn Anmeldeinformationen rotiert werden müssen, verwenden Sie den Befehl change_password:

rabbitmqctl change_password api_user newsecurepass123

5. Einen Benutzer löschen

Um einen Benutzer vollständig zu entfernen und alle zugehörigen Zugriffe zu widerrufen:

rabbitmqctl delete_user api_user

Warnung: Das Löschen des guest-Benutzers wird in Produktionsumgebungen aus Sicherheitsgründen generell empfohlen, erfordert jedoch die vorherige Erstellung eines neuen administrativen Benutzers.

Verwaltung von virtuellen Host-Berechtigungen

Berechtigungen in RabbitMQ werden auf Basis eines virtuellen Hosts (vhost) definiert. Ein Vhost fungiert als Namensraum für Warteschlangen, Austauschpunkte und Bindungen. Standardmäßig hat RabbitMQ einen Root-Vhost namens /.

1. Vhosts auflisten

Identifizieren Sie zunächst die verfügbaren Vhosts:

rabbitmqctl list_vhosts

2. Berechtigungen für einen Benutzer auf einem VHost setzen

Der Befehl set_permissions ist der wichtigste für die Anwendungssicherheit. Er gewährt einem Benutzer Rechte zum Konfigurieren, Lesen oder Schreiben von Ressourcen innerhalb eines bestimmten Vhosts.

Syntax: rabbitmqctl set_permissions -p <vhost> <benutzer> <configure> <write> <read>

Berechtigungswerte sind reguläre Ausdrücke. .* bedeutet alle Ressourcennamen. ^$ bedeutet keine Ressourcennamen.

Beispiel: Vollzugriff auf einen bestimmten VHost gewähren

Wenn wir möchten, dass app_prod vollen CRUD-Zugriff (Konfigurieren, Lesen, Schreiben) nur auf den /prod_vhost hat:

rabbitmqctl set_permissions -p /prod_vhost app_prod "^.*" "^.*" "^.*"
Berechtigung Bedeutung Typische Verwendung
Konfigurieren Erstellen, Löschen oder Ändern von Warteschlangen, Austauschpunkten und Bindungen, die dem regulären Ausdruck entsprechen. Bereitsteller oder Apps, die ihre eigene Topologie deklarieren.
Schreiben Veröffentlichen an passende Austauschpunkte. Produzenten.
Lesen Konsumieren von passenden Warteschlangen. Konsumenten.

Beispiel: Einen Benutzer auf reines Veröffentlichen beschränken

Ein häufiges Muster für Firehose-Produzenten ist die Beschränkung auf reines Schreiben:

# Benutzer 'publisher' kann schreiben, aber nicht konfigurieren oder Nachrichten in /analytics_vhost lesen
rabbitmqctl set_permissions -p /analytics_vhost publisher "^$" "^events\\." "^$"

Dieses Beispiel erlaubt das Veröffentlichen an Austauschpunkte, deren Namen mit events. beginnen. Es erlaubt dem Benutzer nicht, Topologie zu konfigurieren oder Nachrichten zu konsumieren.

Beispiel: Einen Konsumenten beschränken

# Kann von Warteschlangen lesen, die mit worker. beginnen, aber nicht veröffentlichen oder konfigurieren
rabbitmqctl set_permissions -p /jobs worker_consumer "^$" "^$" "^worker\\."

Regex-Berechtigungen sind mächtig, aber sie sind auch leicht zu weit gefasst. Wenn Ihre Warteschlangen im selben Vhost prod.orders.created und staging.orders.created heißen, könnte ein Regex wie .*orders.* mehr abdecken als beabsichtigt. Separate Vhosts sind normalerweise sauberer als komplizierte Regex-Grenzen.

3. Berechtigungen löschen

Um alle Berechtigungen, die ein Benutzer auf einem bestimmten Vhost hat, vollständig zu entfernen, verwenden Sie clear_permissions:

rabbitmqctl clear_permissions -p /prod_vhost app_prod

4. Benutzerberechtigungen auflisten

Um die auf einem Vhost gewährten Berechtigungen zu überprüfen:

rabbitmqctl list_permissions -p /prod_vhost

Um alle einem Benutzer über Vhosts hinweg zugewiesenen Berechtigungen zu sehen:

rabbitmqctl list_user_permissions app_prod

Best Practices für die Benutzerverwaltung

  • Prinzip der geringsten Privilegien anwenden: Produzenten benötigen normalerweise Schreibberechtigung, Konsumenten normalerweise Leseberechtigung, und nur Topologie-Eigentümer benötigen Konfigurationsberechtigung.
  • Dedizierte Vhosts verwenden: Trennen Sie Umgebungen und Mandanten mit Vhosts, anstatt alles mit Regex zu lösen.
  • guest bewusst behandeln: Der standardmäßige guest-Benutzer ist standardmäßig auf localhost beschränkt. Viele Produktionsteams löschen ihn, nachdem sie ein echtes Administratorkonto erstellt haben.
  • Gewünschten Zustand skripten: Halten Sie die Einrichtung von Benutzern, Vhosts und Berechtigungen in der Bereitstellungsautomatisierung fest, damit ein neu aufgebauter Broker nicht vom Gedächtnis abhängt.
  • Nach Änderungen überprüfen: Führen Sie nach jeder Änderung in der Produktion list_users, list_permissions und list_user_permissions aus.

Ein praktisches Anwendungssetup sieht oft so aus:

rabbitmqctl add_vhost /orders
rabbitmqctl add_user orders_publisher 'replace-with-secret'
rabbitmqctl add_user orders_worker 'replace-with-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

Das hält die Anmeldeinformationen für Veröffentlichen und Konsumieren getrennt. Wenn ein Worker-Passwort durchsickert, kann es keine neuen Nachrichten veröffentlichen. Wenn ein Publisher-Passwort durchsickert, kann es keine Warteschlangen leeren. Diese Trennung ist einfach, aber eine der nützlichsten RabbitMQ-Sicherheitsgewohnheiten.