Gestione degli utenti e dei permessi di RabbitMQ: una guida da riga di comando

Padroneggia i comandi `rabbitmqctl` per una gestione robusta di utenti e permessi in RabbitMQ. Questa guida completa fornisce istruzioni passo-passo su come creare nuovi utenti, assegnare ruoli di amministratore o applicazione tramite tag, impostare permessi granulari per virtual host (lettura/scrittura/configurazione) e revocare l'accesso in modo sicuro, garantendo un'amministrazione controllata tramite riga di comando.

Gestione degli utenti e dei permessi di RabbitMQ: una guida da riga di comando

I permessi di RabbitMQ sono facili da configurare quasi correttamente. Un utente può esistere e comunque non essere in grado di pubblicare. Un utente può avere il tag management e comunque non avere accesso al vhost dell'applicazione. Un'espressione regolare troppo ampia può accidentalmente permettere a un servizio di creare code da cui dovrebbe solo consumare. La maggior parte dei problemi di permessi deriva dalla confusione tra tre concetti separati: utenti, tag e permessi sui vhost.

Questa guida utilizza rabbitmqctl per il flusso di lavoro comune di amministrazione degli utenti: creare utenti, assegnare tag, impostare permessi sui vhost, verificare l'accesso, ruotare le password e rimuovere l'accesso in modo pulito.

Prerequisiti

Prima di procedere, assicurati di avere quanto segue:

  1. Server RabbitMQ installato: Il broker deve essere in esecuzione.
  2. Accesso a rabbitmqctl: Devi avere accesso amministrativo al nodo o al cluster. I comandi vengono solitamente eseguiti su un nodo RabbitMQ, sebbene l'uso remoto della CLI sia possibile quando l'ambiente è configurato per questo.
  3. Il nome corretto del Vhost: I permessi sono limitati per virtual host. /, /prod e prod non sono intercambiabili.

Gestione degli utenti con rabbitmqctl

Lo strumento rabbitmqctl utilizza la famiglia di comandi user_* per tutte le operazioni relative agli utenti. È fondamentale capire che gli utenti di RabbitMQ sono distinti dagli utenti del sistema operativo.

1. Elencare gli utenti esistenti

Per vedere chi ha attualmente accesso al broker, usa il comando list_users:

rabbitmqctl list_users

Esempio di output:

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

2. Creare un nuovo utente

Quando si configura un nuovo account di servizio o amministratore, è necessario creare l'utente e assegnare una password iniziale.

Per creare un utente chiamato api_user con una password iniziale:

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

Evita di inserire password di produzione reali nella cronologia della shell. Nei sistemi automatizzati, preferisci il tuo gestore di segreti e il meccanismo di provisioning già utilizzato dalla tua piattaforma.

3. Modificare i tag utente (ruoli)

I tag utente definiscono ruoli predefiniti che concedono capacità amministrative specifiche. I tag più comuni sono administrator, policymaker e management.

  • administrator: può gestire utenti, permessi, vhost, policy e impostazioni a livello di cluster.
  • policymaker: può gestire policy e parametri per i vhost a cui l'utente ha accesso.
  • management: può accedere all'interfaccia di gestione/API, ma i permessi sui vhost controllano ancora quali risorse l'utente può utilizzare.
  • monitoring: può visualizzare le informazioni di gestione, utile per account di osservabilità.

Visualizzare i tag correnti

Usa list_user_tags per vedere i ruoli attuali:

rabbitmqctl list_user_tags api_user

Impostare i tag

Per assegnare il tag management a api_user:

rabbitmqctl set_user_tags api_user management

set_user_tags sostituisce l'elenco dei tag dell'utente esattamente con i tag forniti. Per assegnare sia il tag administrator che policymaker, includili entrambi nello stesso comando:

rabbitmqctl set_user_tags api_user administrator policymaker

Rimuovere i tag

Per rimuovere tutti i tag da un utente:

rabbitmqctl set_user_tags api_user

Alcune versioni di RabbitMQ forniscono anche clear_user_tags. Controlla rabbitmqctl help clear_user_tags sulla tua versione installata prima di usarlo in script.

4. Cambiare la password di un utente

Se è necessario ruotare le credenziali, usa il comando change_password:

rabbitmqctl change_password api_user newsecurepass123

5. Eliminare un utente

Per rimuovere completamente un utente e revocare tutto l'accesso associato:

rabbitmqctl delete_user api_user

Avvertenza: Eliminare l'utente guest è generalmente raccomandato in ambienti di produzione per motivi di sicurezza, sebbene richieda prima la creazione di un nuovo utente amministratore.

Gestione dei permessi sui Virtual Host

I permessi in RabbitMQ sono definiti su base Virtual Host (vhost). Un vhost funge da spazio dei nomi per code, exchange e binding. Per impostazione predefinita, RabbitMQ ha un vhost radice chiamato /.

1. Elencare i vhost

Per prima cosa, identifica i vhost disponibili:

rabbitmqctl list_vhosts

2. Impostare i permessi per un utente su un VHost

Il comando set_permissions è il più critico per la sicurezza dell'applicazione. Concede a un utente i diritti per configurare, leggere o scrivere risorse all'interno di un vhost specifico.

Sintassi: rabbitmqctl set_permissions -p <vhost> <utente> <configura> <scrivi> <leggi>

I valori dei permessi sono espressioni regolari. .* significa tutti i nomi di risorse. ^$ significa nessun nome di risorsa.

Esempio: Concedere accesso completo a un VHost specifico

Se vogliamo che app_prod abbia accesso CRUD completo (Configura, Leggi, Scrivi) solo al /prod_vhost:

rabbitmqctl set_permissions -p /prod_vhost app_prod "^.*" "^.*" "^.*"
Permesso Significato Utilizzo tipico
Configura Creare, eliminare o modificare code, exchange e binding che corrispondono all'espressione regolare. Sviluppatori o app che dichiarano la propria topologia.
Scrivi Pubblicare su exchange corrispondenti. Produttori.
Leggi Consumare da code corrispondenti. Consumatori.

Esempio: Limitare un utente alla sola pubblicazione

Un pattern comune per i produttori di flussi è limitarli alla sola scrittura:

# L'utente 'publisher' può scrivere ma non può configurare o leggere messaggi in /analytics_vhost
rabbitmqctl set_permissions -p /analytics_vhost publisher "^$" "^events\\." "^$"

Questo esempio consente di pubblicare su exchange i cui nomi iniziano con events.. Non consente all'utente di configurare la topologia o consumare messaggi.

Esempio: Limitare un consumatore

# Può leggere da code che iniziano con worker. ma non può pubblicare o configurare
rabbitmqctl set_permissions -p /jobs worker_consumer "^$" "^$" "^worker\."

Le espressioni regolari per i permessi sono potenti, ma è anche facile renderle troppo ampie. Se le tue code si chiamano prod.orders.created e staging.orders.created nello stesso vhost, un'espressione regolare come .*orders.* potrebbe coprire più del previsto. Vhost separati sono di solito più puliti di confini basati su espressioni regolari complicate.

3. Cancellare i permessi

Per rimuovere completamente tutti i permessi che un utente ha su un vhost specifico, usa clear_permissions:

rabbitmqctl clear_permissions -p /prod_vhost app_prod

4. Elencare i permessi utente

Per verificare i permessi concessi su un vhost:

rabbitmqctl list_permissions -p /prod_vhost

Per vedere tutti i permessi assegnati a un utente su tutti i vhost:

rabbitmqctl list_user_permissions app_prod

Best practice per l'amministrazione degli utenti

  • Usa il minimo privilegio: i produttori di solito necessitano del permesso di scrittura, i consumatori di solito necessitano del permesso di lettura e solo i proprietari della topologia necessitano del permesso di configurazione.
  • Usa vhost dedicati: separa ambienti e tenant con vhost invece di cercare di risolvere tutto con espressioni regolari.
  • Gestisci guest deliberatamente: l'utente predefinito guest è limitato a localhost per impostazione predefinita. Molti team di produzione lo eliminano dopo aver creato un account amministratore reale.
  • Scrivi lo stato desiderato in script: mantieni la configurazione di utenti, vhost e permessi nell'automazione del deployment in modo che un broker ricostruito non dipenda dalla memoria.
  • Verifica dopo le modifiche: esegui list_users, list_permissions e list_user_permissions dopo ogni modifica in produzione.

Una configurazione pratica dell'applicazione spesso si presenta così:

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

Questo mantiene separate le credenziali di pubblicazione e consumo. Se una password del worker viene divulgata, non può pubblicare nuovi messaggi. Se una password del publisher viene divulgata, non può svuotare le code. Questa separazione è semplice, ma è una delle abitudini di sicurezza più utili di RabbitMQ.