Gestione di Utenti e Permessi RabbitMQ: Una Guida da Linea di Comando
La gestione degli utenti e la definizione dei diritti di accesso è un aspetto fondamentale per la sicurezza di qualsiasi infrastruttura di broker di messaggi. RabbitMQ, un potente broker di messaggi, offre robusti meccanismi per l'autenticazione e l'autorizzazione degli utenti, gestiti principalmente tramite l'utility da linea di comando rabbitmqctl. Questa guida si concentra esclusivamente sull'uso di rabbitmqctl per padroneggiare l'amministrazione degli utenti, coprendo ogni aspetto dalla creazione e assegnazione di ruoli alla definizione dettagliata dei permessi tra i virtual host.
Permessi configurati correttamente assicurano che applicazioni e amministratori interagiscano con il broker solo quando necessario, minimizzando i rischi di sicurezza e la confusione operativa. Sfruttando questi strumenti da linea di comando, è possibile scriptare e automatizzare configurazioni di sicurezza complesse in modo efficiente.
Prerequisiti
Prima di procedere, assicurati di avere quanto segue:
- Server RabbitMQ Installato: Il broker deve essere in esecuzione.
- Accesso a
rabbitmqctl: Devi avere i permessi necessari (di solito privilegi di amministratore) per eseguire comandi sull'istanza RabbitMQ in esecuzione. I comandi vengono tipicamente eseguiti dalla macchina che ospita il server RabbitMQ.
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 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
Output di Esempio:
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 un amministratore, è necessario creare l'utente e assegnare una password iniziale.
Per creare un utente chiamato api_user con la password securepass:
rabbitmqctl add_user api_user securepass
3. Modificare i Tag Utente (Ruoli)
I tag utente definiscono ruoli predefiniti che concedono specifiche capacità amministrative. I tag più comuni sono administrator, policymaker e management.
administrator: Può modificare utenti, permessi, vhost e impostare parametri di cluster.policymaker: Può impostare politiche (es. per alta disponibilità o TTL dei messaggi).management: Può utilizzare l'interfaccia del Plugin di Gestione (se installato).
Visualizzare i Tag Attuali
Usa list_user_tags per vedere i ruoli attuali:
rabbitmqctl list_user_tags api_user
Impostare o Sovrascrivere Tag
Per assegnare il tag management a api_user:
rabbitmqctl set_user_tags api_user management
Per aggiungere il tag policymaker in aggiunta ai tag esistenti, usa il comando add_tag:
rabbitmqctl set_user_tags api_user administrator policymaker
Rimuovere Tag
Per rimuovere un tag specifico:
rabbitmqctl clear_user_tags api_user policymaker
4. Cambiare la Password di un Utente
Se le credenziali necessitano di rotazione, usa il comando change_password:
rabbitmqctl change_password api_user newsecurepass123
5. Eliminare un Utente
Per rimuovere completamente un utente e revocare tutti gli accessi associati:
rabbitmqctl delete_user api_user
Attenzione: L'eliminazione dell'utente
guestè generalmente raccomandata negli ambienti di produzione per motivi di sicurezza, sebbene richieda prima la creazione di un nuovo utente amministrativo.
Gestione dei Permessi sui Virtual Host
I permessi in RabbitMQ sono definiti su base per Virtual Host (vhost). Un vhost agisce come uno spazio dei nomi per code, exchange e binding. Per impostazione predefinita, RabbitMQ ha un vhost radice chiamato /.
1. Elencare i Vhost
Innanzitutto, 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 delle applicazioni. Concede a un utente i diritti per configurare, leggere o scrivere risorse all'interno di uno specifico vhost.
Sintassi: set_permissions <vhost> <user> <conf> <read> <write>
I valori dei permessi sono espressioni regolari (.* significa tutte le risorse).
Esempio: Concedere Accesso Completo a un Vhost Specifico
Se vogliamo che app_prod abbia accesso CRUD (Configure, Read, Write) completo solo a /prod_vhost:
rabbitmqctl set_permissions -p /prod_vhost app_prod "^.*" "^.*" "^.*"
| Permesso | Significato (Regex) | Descrizione |
|---|---|---|
Configura (conf) |
.* |
Può creare/eliminare exchange, code, binding e impostare parametri del vhost. |
Leggi (read) |
.* |
Può consumare messaggi e ottenere lo stato di code/exchange. |
Scrivi (write) |
.* |
Può pubblicare messaggi e creare binding. |
Esempio: Restringere un Utente alla Sola Pubblicazione
Un modello comune per i produttori "firehose" è 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 "^$" "^$" "^.*$"
3. Cancellare i Permessi
Per rimuovere completamente tutti i permessi che un utente ha su uno specifico vhost, usa clear_permissions:
rabbitmqctl clear_permissions -p /prod_vhost app_prod
4. Elencare i Permessi Utente
Per verificare i permessi concessi a un utente specifico su un vhost:
rabbitmqctl list_permissions -p /prod_vhost app_prod
Migliori Pratiche per l'Amministrazione degli Utenti
- Principio del Minimo Privilegio (PoLP): Concedi sempre i permessi minimi necessari all'applicazione o all'utente per funzionare. Evita di usare il tag
administratorse non strettamente necessario. - Vhost Dedicati: Usa virtual host diversi per ambienti diversi (es.
dev,staging,prod) e controlla strettamente l'accesso tra di essi. - Evitare l'Utente Guest: Per sicurezza, l'utente
guestpredefinito dovrebbe essere disabilitato o limitato (per impostazione predefinita ha accesso solo alocalhost). - Scripting: Poiché tutti questi comandi sono idempotenti e basati su linea di comando, scripta le routine di setup e teardown degli utenti per una distribuzione coerente.
Padroneggiando questi comandi rabbitmqctl, ottieni un controllo granulare e scriptabile su chi può accedere alle risorse del tuo broker di messaggi, portando a una distribuzione RabbitMQ più sicura e gestibile.