[MongoDB] Replica Set: Autenticazione e Controllo Accessi

Rispondi
Roberto
Amministratore
Messaggi: 161
Iscritto il: 19/12/2009, 19:30

[MongoDB] Replica Set: Autenticazione e Controllo Accessi

Messaggio da Roberto »

Per quanto riguarda la "sicurezza", MongoDB fornisce varie caratteristiche come l'autenticazione, il controllo degli accessi e la crittografia dei dati.

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>
Il keyfile adesso va copiato in ognuna delle macchine su cui sono attive le istenza mongoDB, per esempio potete metterlo nella directory dove c'e' il file di configurazione dei membri del replica set.

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()
Aggiungere adesso il riferimento al keyfile in ognuno dei file di configurazione dei membri del replica set:

Codice: Seleziona tutto

security:
  keyFile: <percorso-del-keyfile>
Eseguire nuovamente tutte le istanze mongoDB:

Codice: Seleziona tutto

mongod --config <percorso-del-config-file>
Connettersi adesso ad una istanza mongo ed usare il comando rs.status() per identificare il primario e connettersi ad esso.

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" } ]
  }
)
La password dovrebbe essere casuale, lunga e complessa per aumentare la sicurezza del sistem e prevenire accessi non autorizzati.

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")
oppure riconnettendosi alla shell mongo utilizzando i seguenti parametri:

Codice: Seleziona tutto

mongo -u "mongodb" -p "mongodb" --authenticationDatabase "admin"
Creare infine gli utenti che vogliamo possano accedere al DB e assegnare gli opportuni ruoli:

Codice: Seleziona tutto

admin = db.getSiblingDB("admin")
admin.createUser( { user: "utente1", pwd: "utente1", roles: [ { role: "readWriteAnyDatabase", db: "admin" }, "readWrite"] })
Roberto Basile
Rispondi