Quando è attivo il controllo degli accessi, caratteristica di "autorizzazione", MongoDB richiede a tutti i client di autenticarsi per determinare il tipo di accesso. L'autenticazione verifica quindi l'identità di un utente, l'autorizzazione determina per quell'utente l'accesso alle risorse e le operazioni che può effettuare.
MongoDB supporta vari meccanismi di autenticazione per la verifica dell'identità dei clients, quello di default si chiama SCRAM-SHA-1; esso verifica le credenziali di un utente nei termini di Username, Password e Database di Autenticazione. Il Database di Autenticazione è il database in cui è stato creato l'utente e insieme all'username serve ad identificare l'utente.
In aggiunta alla verifica dell'identità di un client, MongoDB può richiedere che i membri di un Replica Set si autentichino tra di loro attraverso un KeyFile o il certificato x.509.
Un keyfile utilizza il meccanismo di autenticazione SCRAM-SHA-1 e il suo contenuto serve come password condivisa tra i membri. La chiave di un keyfile deve essere compresa tra 6 e 1024 caratteri nel set base64 ed il file deve essere memorizzato su ogni membro del replica set.
Vediamo dunque come configurare un Replica Set, possiamo generare il file in qualunque modo si vuole, in questo caso si è utilizzato openssl
Codice: Seleziona tutto
openssl rand -base64 756 > <nome-del-keyfile>
chmod 400 <nome-del-keyfile>
A questo punto se le istanze del Replica Set sono attive è necessario fermarle tutte; connettersi pertanto ad ogni istanza partendo dai secondari, incluso gli arbitri, e per ultimo va fermato il primario.
Codice: Seleziona tutto
use admin
db.shutdownServer()
Codice: Seleziona tutto
security:
keyFile: <percorso-del-keyfile>
Codice: Seleziona tutto
mongod --config <percorso-del-config-file>
Il primo utente da creare è l'amministratore, esso deve avere i privilegi per poter creare a sua volta altri utenti:
Codice: Seleziona tutto
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "mongodb",
pwd: "mongodb",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
A questo punto è necessario autenticarsi con l'utenza appena creata, lo si può fare da shell senza disconnettersi, con il seguente comando:
Codice: Seleziona tutto
db.getSiblingDB("admin").auth("mongodb", "mongodb")
Codice: Seleziona tutto
mongo -u "mongodb" -p "mongodb" --authenticationDatabase "admin"
Codice: Seleziona tutto
admin = db.getSiblingDB("admin")
admin.createUser( { user: "utente1", pwd: "utente1", roles: [ { role: "readWriteAnyDatabase", db: "admin" }, "readWrite"] })