A partire da questa lezione, ci occuperemo dell’amministrazione e della gestione del database MongoDB.
Subito dopo l'installazione, MongoDB non ha utenti preimpostati. Ha semplicemente un meccanismo detto Localhost Exception che permette di accedere come amministratore a tutti gli utenti che tentano di accedere dalla stessa macchina in cui si trova il server. È ovviamente un’impostazione comoda per l’installazione e il test del server, che però non può essere mantenuta in deploy, altrimenti un hacker potrebbe prendere il controllo del database semplicemente accedendo al server che lo ospita.
Quindi come primo passo vediamo come creare un utente amministratore del database.
> use admin
switched to db admin
> db.createUser({ user: "onofrio", pwd: "?SlackWare &2015",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }]
})
Se la chiamata è andata a buon fine, il server risponderà con il messaggio Successfully added user. Avremo così creato un utente con i permessi di amministratore degli utenti di tutti i database presenti in MongoDB. Infatti, tra i ruoli abbiamo indicato userAdminAnyDatabase
: si tratta di uno dei numerosi ruoli predefiniti da MongoDB, che permette di creare ed eliminare utenti, ruoli e cambiare password, e può farlo su ogni database presente nell’istanza. MongoDB infatti permette di specificare ruoli sui singoli database. Se avessimo specificato il seguente ruolo, l’utente sarebbe stato l’amministratore del solo database indicato.
roles: [ { role: "userAdmin", db: "books" }]})
A questo punto possiamo avviare MongoDB abilitando la gestione delle autorizzazioni. Per farlo modifichiamo, o creiamo, il file di configurazione mongodb.config. Per abilitare le autorizzazioni deve essere presente la configurazione seguente:
security:
authorization: "enabled"
Se non è presente, fermiamo il servizio, effettuiamo la modifica e riavviamo con il comando mongod --config mongodb.config
.
Possiamo subito mettere alla prova il nostro utente specificando nella console mongo i parametri per l’autenticazione:
mongo -u onofrio -p "?SlackWare &2015" admin
Permessi di lettura e scrittura
Supponiamo ora di usare MongoDB per due applicazioni, e quindi con due database: il primo contenente i log di un sito web, e l'altro contenente le iscrizioni degli utenti ad un certo tipo di evento. Ovviamente non vogliamo che l’applicazione che scrive i log possa leggere o modificare i dati dell’altra applicazione. Quindi creiamo appositamente un utente per questa applicazione:
> use logs_database
> db.createUser( {
user: "logWriter", pwd: "4tgf7_231",
roles: [ { role: "readWrite", db: "logs_database" } ]
})
L’utente appena creato ha il ruolo readWrite
sul database specificato. Questo significa che può leggere ed effettuare modifiche alle collezioni di logs_database
, ma non può neanche accedere agli altri database. Se entrassimo con tale utente e provassimo ad effettuare una query su un altro database, otterremmo un errore del tipo seguente:
error: { "$err" : "not authorized for query on otherDatabase.otherCollection", "code" : 13 }
Ora, supponiamo che esista un’applicazione che possa leggere dai due database, quello degli utenti iscritti agli eventi e quello dei log, per effettuare statistiche. Creiamo un altro utente:
> use logs_database
> db.createUser( {
user: "statReader", pwd: "2?aaa32",
roles: [ { role: "read", db: "logs_database" }, { role: "read", db: "eventi" } ]
})
Come si vede, la sintassi è semplice: abbiamo solo posto nella lista dei ruoli un ruolo read
per ogni database. Questo utente quindi non può creare né modificare documenti nelle collezioni presenti su questi database, né può accedere ad altri database.
Ricapitolando abbiamo visto i ruoli più importanti: userAdmin
, read
e readWrite
. MongoDB ha numerosi altri ruoli predefiniti, per esempio per gestire lo sharding, le repliche o i backup: rimandiamo alla guida ufficiale per una lista esaustiva.
Altri meccanismi di autenticazione
Per quanto riguarda l’autenticazione, abbiamo visto il meccanismo di default, detto MONGODB-CR, che è anche quello più comune, basato su username e password. MongoDB permette anche la configurazione di altri meccanismi di autenticazione:
- Certificati X.509: client e server utilizzano un certificato generato dalla stessa Certification Authority (CA), ciascuno dei quali li identifica;
- LDAP: il client si autentica tramite un server LDAP, sia esso OpenLDAP o Active Directory. Particolarmente adatto in caso di utilizzo aziendale;
- Kerberos: il client si autentica utilizzando un servizio Kerberos, disponibile per Windows e Linux.
La documentazione ufficiale fornisce una guida per ognuno di questi meccanismi.