Last chance! 50% off DataCamp Premium
Sale ends in
MongoDB offre un framework di sicurezza completo basato su tre principi fondamentali: autenticazione, autorizzazione e crittografia.
Questi pilastri formano una difesa stratificata, garantendo che un singolo malfunzionamento non comprometta l’intero sistema. Il pilastro dell’autorizzazione è guidato dal principio del privilegio minimo (PoLP), assicurando che ogni utente o applicazione disponga solo dei permessi minimi necessari per svolgere i propri compiti.
Implementare questo approccio completo e stratificato rafforza la tua postura di sicurezza complessiva e riduce significativamente l’esposizione a configurazioni errate o violazioni.
L’autenticazione è il primo passo fondamentale di sicurezza. Verifica l’identità di ogni entità che tenta di connettersi. In MongoDB, si ottiene abilitando le funzionalità di sicurezza che, per praticità nello sviluppo locale, sono disabilitate per impostazione predefinita.
Per impostazione predefinita, il tuo deployment MongoDB ascolta solo su localhost e consente l’accesso senza autenticazione. Questa configurazione è intenzionale e offre la massima semplicità per l’installazione iniziale e gli esperimenti in locale.
Per qualsiasi deployment in produzione, due impostazioni richiedono l’attenzione degli sviluppatori:
Abilitare l’autenticazione trasforma MongoDB da un ambiente di prova locale a un archivio dati sicuro. Si fa modificando il file di configurazione di MongoDB (in genere mongod.conf) e riavviando il server.
Impostazione nel file di configurazione: imposta l’opzione di autorizzazione nella sezione security per abilitare la funzionalità:
authorization: enabled
Il primo utente: una volta abilitata l’autenticazione, nessuno può connettersi finché non crei un utente amministrativo. Questo primo utente, fondamentale, deve essere creato nel database admin, conferendogli i diritti iniziali necessari per gestire il sistema e creare altri utenti.
Dopo aver abilitato l’autorizzazione, tutto l’accesso al database è regolato da utenti e relativi ruoli. Usi il comando createUser per definire queste identità.
Sintassi e ruoli: quando crei un utente, specifichi username, password e un array di ruoli. I ruoli definiscono i permessi (ad es. readWrite su un database specifico).
db.createUser(
{
user: "appUser",
pwd: passwordPrompt(), // Questo metodo chiede una password e
// evita di memorizzare la password in chiaro nella
// cronologia della shell e nei log dei comandi.
roles: [ { role: "readWrite", db: "inventory" } ]
}
)
Standard SCRAM: MongoDB si basa sul Salted Challenge Response Authentication Mechanism (SCRAM) per gestire le password in modo sicuro. SCRAM evita di memorizzare password in chiaro e usa hashing e salting crittograficamente robusti, rendendolo resistente a vettori d’attacco comuni come le rainbow table.
Per organizzazioni con requisiti di compliance stringenti o infrastrutture complesse, MongoDB offre l’integrazione con sistemi di autenticazione enterprise esistenti:
L’autenticazione conferma chi è un utente; l’autorizzazione determina cosa quell’utente è autorizzato a fare. Il sistema di Role-Based Access Control (RBAC) di MongoDB è il meccanismo centrale per gestire i permessi, assicurando che utenti e servizi interagiscano solo con i dati e i comandi strettamente necessari.
Nel modello RBAC di MongoDB, i permessi sono raggruppati in ruoli e questi ruoli sono assegnati agli utenti. Invece di assegnare centinaia di permessi singoli, assegni un unico ruolo (ad es. inventoryReader), che include automaticamente il set di permessi definiti (ad es. read su inventory.products). Questo rende la gestione dei permessi scalabile e verificabile.
MongoDB fornisce un set solido di ruoli predefiniti che coprono i pattern di accesso più comuni. Di seguito alcuni esempi. Per l’elenco completo, fai riferimento al link sopra.
La pietra angolare della sicurezza moderna dei database è il principio del privilegio minimo (PoLP). Stabilisce che ogni utente (specialmente quelli applicativi) debba ottenere solo i permessi minimi necessari per svolgere le attività richieste, e nulla di più.
Ecco un esempio di best practice: invece di usare un utente readWrite globale, crea utenti specifici per l’applicazione. Ad esempio, se il tuo servizio di inventario interagisce solo con il database app_data, l’utente dell’applicazione dovrebbe avere accesso readWrite solo a quel singolo database. Questa compartimentazione impedisce a un servizio compromesso di ottenere accessi non autorizzati ad altri database (come billing o users).
Esempio di codice: creazione di un utente a privilegio minimo
Questo esempio crea un utente (inventory_service) con accesso in lettura/scrittura limitato strettamente al database app_data.
use admin
db.createUser(
{
user: "inventory_service",
pwd: passwordPrompt(),
roles: [
{ role: "readWrite", db: "app_data" }
]
}
)
Sebbene i ruoli predefiniti siano potenti, esigenze di compliance o logiche applicative complesse possono richiedere un controllo molto granulare. In questi casi, MongoDB ti permette di definire ruoli personalizzati usando il comando db.createRole().
Definire permessi granulari: i ruoli personalizzati consentono di specificare esattamente quali azioni privilegiate (ad es. find, update, insert) possono essere eseguite su risorse con ambito di cluster, database o raccolta. Le organizzazioni possono sfruttare tecniche come la redazione a livello di campo per proteggere campi altamente sensibili all’interno di una raccolta altrimenti pubblica.
Esempio di codice: creazione di un ruolo personalizzato
Questo esempio crea un ruolo personalizzato (product_creator) che può solo inserire documenti nella raccolta products all’interno del database app_data.
use app_data
db.createRole(
{
role: "product_creator",
privileges: [
{
resource: { db: "app_data", collection: "products" },
actions: [ "insert" ]
}
],
roles: []
}
)
Sebbene autenticazione e autorizzazione forti controllino l’accesso al database, una sicurezza completa richiede di proteggere i dati stessi—sia quando viaggiano in rete (in transito) sia quando sono archiviati su disco (a riposo).
La trasmissione dei dati su qualsiasi rete, sia interna a un data center sia esterna verso il cloud, deve essere crittografata per prevenire intercettazioni e attacchi man-in-the-middle (MITM). MongoDB usa Transport Layer Security/Secure Sockets Layer (TLS/SSL) per crittografare tutte le comunicazioni tra i client (come la tua applicazione) e il server.
Senza TLS/SSL, credenziali utente, parametri di query e risultati sensibili vengono trasmessi in chiaro, rendendone banale l’intercettazione. Abilitare TLS/SSL assicura che i dati siano offuscati e protetti durante la trasmissione.
Abilitare TLS/SSL: si fa principalmente tramite impostazioni di configurazione, dove specifichi i certificati che il server deve usare per la verifica dell’identità e lo scambio delle chiavi di crittografia:
net:
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb.pem
La segmentazione della rete fornisce un livello di difesa cruciale limitando le interfacce fisiche o virtuali che possono connettersi al database. Anche se un attaccante ottiene accesso alla rete, dovrà comunque superare il tuo perimetro.
Proteggere i dati a riposo garantisce che, se il disco fisico o l’host vengono compromessi, i file restino illeggibili. MongoDB lo realizza tramite la crittografia del motore di archiviazione.
Mentre la crittografia a riposo protegge l’intero database, la Client-Side Field Level Encryption (CSFLE) offre allo sviluppatore un controllo di precisione sui dati sensibili, permettendo di crittografare campi specifici prima che vengano inviati al database.
Queryable Encryption è un’evoluzione di CSFLE che affronta la sfida di interrogare campi crittografati. Consente alle applicazioni di eseguire query di uguaglianza (ad es. trovare documenti in cui un campo crittografato è uguale a un certo valore) direttamente sul ciphertext. Offre la sicurezza di CSFLE mantenendo l’utilità dei dati, di fatto crittografandoli durante l’uso.
Le misure di sicurezza riguardano la prevenzione, ma l’audit riguarda la responsabilità e il rilevamento. Il framework di auditing integrato di MongoDB offre la capacità cruciale di tracciare e registrare gli eventi rilevanti per la sicurezza, fornendo un registro immutabile essenziale per forense, compliance e rilevamento proattivo delle minacce.
L’audit registra ogni azione critica eseguita sul database, creando uno storico dettagliato. Include:
Questo log è inestimabile per i team di sicurezza che eseguono analisi post-incidente (lo strumento "post-mortem") o per soddisfare i requisiti normativi.
Abilitare l’audit è semplice e spesso richiede una sola riga nel file di configurazione per attivare il sistema e specificare la destinazione del log (file, syslog o console).
auditLog:
destination: file
format: BSON
path: /var/log/mongodb/audit.bson
filter: '{ atype: { $in: [ "authenticate", "createRole", "dropUser" ] } }'
MongoDB fornisce una suite completa di funzionalità di sicurezza che, se distribuite correttamente, creano una potente strategia di difesa in profondità. Il tuo compito principale come developer è andare oltre i default di sviluppo e implementare questi controlli di base.
Prima che qualsiasi applicazione vada in produzione, ricordati questi tre mandati di sicurezza fondamentali:
La sicurezza è una disciplina in evoluzione. Per approfondimenti e configurazioni avanzate, utilizza la documentazione ufficiale:
Ti consiglio anche di dare un’occhiata al corso Introduction to Using MongoDB for Data Science in Python.
Autenticazione impostando security.authorization: enabled.
L’autenticazione verifica chi sei (identità), di solito con username e password. L’autorizzazione determina cosa puoi fare (permessi), usando l’RBAC per applicare il privilegio minimo.
Il principio del privilegio minimo (PoLP) mira a concedere a utenti e sistemi solo l’accesso strettamente necessario per i loro compiti specifici. Pur minimizzando i danni durante una violazione, il principio agisce anche come difesa cruciale contro minacce interne ed errori operativi, aiutando al contempo l’organizzazione a soddisfare requisiti normativi stringenti. È l’equivalente della sicurezza di dare a tuo figlio piccolo solo i giocattoli infrangibili.
TLS/SSL cripta i dati in transito, quindi tutta la comunicazione tra la tua applicazione e il server MongoDB è offuscata sulla rete.
CSFLE crittografa dati sensibili specifici (come PII) nell’applicazione prima che lascino il client. Questo assicura che i dati restino protetti anche se il server MongoDB stesso, o il suo amministratore, vengono compromessi.
Karen è una Data Engineer con la passione per la creazione di piattaforme dati scalabili. Ha esperienza nell'automazione dell'infrastruttura con Terraform ed è entusiasta di condividere ciò che ha imparato in post del blog e tutorial. Karen è una persona che costruisce comunità ed è appassionata nel favorire connessioni tra professionisti dei dati.
I migliori corsi DataCamp
{count, plural, one {Corso} other {Corsi}}
{count, plural, one {Corso} other {Corsi}}
{count, plural, one {Corso} other {Corsi}}
{count, plural, one {blog} other {blogs}}
Tim Lu
12 min

{count, plural, one {blog} other {blogs}}
Abid Ali Awan
15 min

{count, plural, one {blog} other {blogs}}
Abid Ali Awan
10 min