MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come gestire gli utenti e l'autenticazione in MongoDB


Introduzione

La gestione degli utenti e l'autenticazione sono alcune delle attività di amministrazione più importanti della gestione dei server MongoDB. Devi assicurarti che il server sia configurato per essere in grado di identificare correttamente i tuoi utenti e applicazioni e negare connessioni o operazioni che non sono in grado di autenticarsi correttamente.

Per gestire questi requisiti, devi essere in grado di decidere quali utenti richiede il tuo server e creare quegli account. Come parte di questo processo, puoi impostare i dettagli di autenticazione per consentire l'accesso esterno utilizzando la nuova identità.

In questa guida illustreremo come creare, visualizzare e rimuovere gli account utente. Esamineremo come impostare l'autenticazione per i tuoi account e come aggiornare le credenziali quando devi modificare le password utente.



Prerequisiti

Per seguire questa guida, avrai bisogno di un account su un server MongoDB con i privilegi appropriati.


Comandi e metodi che useremo

Per creare, modificare ed eliminare utenti all'interno di MongoDB e configurare l'autenticazione, i metodi principali di cui hai bisogno sono:

  • db.createUser :crea un nuovo account utente MongoDB
  • db.updateUser :aggiorna i dettagli di un account utente
  • db.changeUserPassword :cambia la password utilizzata da un account utente
  • db.dropUser :elimina un account utente MongoDB

Inoltre, il seguente comando database è utile per trovare informazioni sugli utenti nel sistema:

  • db.runCommand('usersInfo') :mostra informazioni su uno o più account utente MongoDB


Privilegi richiesti

Per eseguire i comandi precedenti, è necessario accedere a MongoDB con un account con un numero di azioni di privilegio diverse. I privilegi specifici di cui hai bisogno dipendono dai comandi che devi utilizzare.

Per ottenere informazioni su altri utenti, l'utente corrente deve avere la seguente azione di privilegio abilitata:

  • viewUser privilegiare l'azione

Per creare nuovi utenti, il tuo attuale utente deve avere le seguenti azioni privilegiate abilitate:

  • createUser privilegiare l'azione
  • grantRole privilegiare l'azione

Per modificare la password di un utente o i dettagli dell'account, potresti aver bisogno dei seguenti privilegi:

  • changeOwnPassword azione privilegiata per modificare la password del proprio account
  • changeOwnCustomData azione privilegiata per modificare i dati personalizzati del tuo account
  • changePassword azione privilegiata per modificare le password di altri utenti
  • changeCustomData azione privilegiata per modificare i dati personalizzati di altri utenti

Non tratteremo la gestione dei ruoli in questa guida, quindi grantRole e revokeRole non sono richieste azioni privilegiate.

Per eliminare un account utente, l'utente corrente deve avere la seguente azione di privilegio abilitata:

  • dropUser privilegiare l'azione



Capire come MongoDB implementa gli utenti e l'autenticazione

Prima di iniziare a creare e gestire gli account, è utile prendersi del tempo per acquisire familiarità con il modo in cui MongoDB definisce e archivia queste informazioni.

In MongoDB, gli account utente sono una combinazione del nome utente dell'account insieme a uno specifico database di autenticazione. Il database di autenticazione è semplicemente il database in cui è definito l'utente e non implica una limitazione dell'ambito o dei diritti. I database di autenticazione sono database normali utilizzati per gestire altri dati e non sono database dedicati e speciali.

Un nome account utente deve essere univoco nel database di autenticazione. Tuttavia, lo stesso nome utente può essere riutilizzato con un database di autenticazione diverso per creare un nuovo account utente distinto.

Come risultato di questa progettazione, un account può essere identificato con precisione solo includendo il nome utente e il database di autenticazione. Per autenticarsi con un account, è necessario anche essere in grado di fornire le credenziali associate a un account. Di solito è una password, ma può anche essere un certificato.



Come crei gli utenti?

Ora che abbiamo dato un'occhiata a come MongoDB concettualizza gli account utente, possiamo discutere come creare nuovi utenti. Ricordati di accedere al tuo server MongoDB con un utente che abbia i privilegi appropriati per seguirti.

Per creare un nuovo utente, devi prima passare al database che desideri utilizzare come database di autenticazione del nuovo utente.

Innanzitutto, puoi ottenere un elenco dei database che sono già configurati sul tuo sistema digitando:

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Passa al database a cui verrà associato l'utente utilizzando use comando:

use admin
switched to db admin

Per creare un nuovo utente, puoi utilizzare il db.createUser() oppure puoi usare il createUser comando database. In ogni caso, dovrai passare il nome utente (l'user campo), password (il pwd campo) e una serie di ruoli a cui l'utente deve essere aggiunto (i roles chiave) all'interno di un user oggetto.

Per creare un nuovo utente chiamato tom con una password impostata su hellothere con un array di ruoli vuoto utilizzando db.createUser() metodo, puoi digitare:

db.createUser({    user: "tom",    pwd: "hellothere",    roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }

La stessa operazione utilizzando il createUser il comando database sarebbe simile a questo:

db.runCommand({    createUser: "tom",    pwd: "hellothere",    roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }

Le due diverse opzioni sono molto simili, quindi mostreremo solo i metodi del database ove applicabili in futuro. Tuttavia, se preferisci la sintassi dei comandi del database, puoi trovare ciascuno dei comandi associati nella documentazione di riferimento dei comandi di MongoDB.

Nei comandi precedenti, abbiamo definito esplicitamente la password inline all'interno di user oggetto. Per evitare che la password venga registrata e recuperata, puoi in alternativa utilizzare il passwordPrompt() metodo all'interno dell'user documento per fare in modo che MongoDB richieda interattivamente una password quando viene eseguito il comando. La password non sarà visibile, quindi la cronologia dei comandi sarà pulita:

db.createUser({    user: "tom",    pwd: passwordPrompt(),    roles: []})
Enter password:Successfully added user: { "user" : "tom", "roles" : [ ] }

Tieni presente che la password verrà comunque inviata al server in testo normale se non hai abilitato TLS/SSL.



Come mostri gli utenti esistenti?

Successivamente, diamo un'occhiata a come trovare informazioni sugli utenti esistenti.

Per restituire più utenti, puoi utilizzare db.getUsers() metodo su per mostrare tutti gli utenti all'interno del database corrente. Per prima cosa, passa al database che ti interessa interrogare:

use admin

Quindi, usa db.getUsers() metodo per restituire tutti gli utenti associati al database corrente:

db.getUsers()
[    {            "_id" : "admin.root",            "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),            "user" : "root",            "db" : "admin",            "roles" : [                    {                            "role" : "root",                            "db" : "admin"                    }            ],            "mechanisms" : [                    "SCRAM-SHA-1",                    "SCRAM-SHA-256"            ]    },    {            "_id" : "admin.tom",            "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),            "user" : "tom",            "db" : "admin",            "roles" : [ ],            "mechanisms" : [                    "SCRAM-SHA-1",                    "SCRAM-SHA-256"            ]    }]

Per mostrare ulteriormente le informazioni sulle credenziali di ogni utente, passa un oggetto al metodo con showCredentials chiave per true :

use admindb.getUsers({    showCredentials: true})
[        {                "_id" : "admin.root",                . . .                "credentials" : {                        "SCRAM-SHA-1" : {                                "iterationCount" : 10000,                                "salt" : "WpB0H4f7dG8XlCDyaVzarA==",                                "storedKey" : "b11nA1+mGo3+Tr8P//u3NEdJLHk=",                                "serverKey" : "3xE8o663hjqySrMCQcXjSxmjmhk="                        },                        "SCRAM-SHA-256" : {                                "iterationCount" : 15000,                                "salt" : "UtsfNRedf2ek5tbWFoGs2g52U0H7Na44wV4rYA==",                                "storedKey" : "mz9/qHnI79pNAIQm0MZTKZ0U3qFk0xhUDd2grvKtMdI=",                                "serverKey" : "c/sA4j+I/29Ea1y07zxoMcBgHFoYTUAa6luX3Z9sToQ="                        }                },                . . .        },        {                "_id" : "admin.tom",                . . .                "credentials" : {                        "SCRAM-SHA-1" : {                                "iterationCount" : 10000,                                "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",                                "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",                                "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="                        },                        "SCRAM-SHA-256" : {                                "iterationCount" : 15000,                                "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",                                "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",                                "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="                        }                },                . . .        }]

Per cercare utenti che soddisfano determinati criteri, puoi passare un oggetto che definisce un filter chiave che definisce la condizione di corrispondenza.

Ad esempio, per ottenere informazioni su tutti gli utenti nel database corrente che hanno il root ruolo, puoi digitare:

use admindb.getUsers({    filter: {        "roles.role": "root"    }})
[        {                "_id" : "admin.root",                "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),                "user" : "root",                "db" : "admin",                "roles" : [                        {                                "role" : "root",                                "db" : "admin"                        }                ],                "mechanisms" : [                        "SCRAM-SHA-1",                        "SCRAM-SHA-256"                ]        }]

Per ottenere un utente specifico, puoi utilizzare db.getUser() metodo invece. Funziona come db.getUsers() metodo, ma restituisce un singolo utente. Invece di passare un oggetto al metodo, passi una stringa contenente il nome utente che desideri recuperare:

use admindb.getUser("tom")
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "roles" : [ ],        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ]}

Puoi opzionalmente includere un extra args oggetto che ti consente di specificare informazioni aggiuntive che desideri impostando le seguenti chiavi su true :

  • showCredentials :mostra le informazioni sulle credenziali oltre al normale output
  • showPrivileges :mostra le informazioni sui privilegi oltre al normale output
  • showAuthenticationRestrictions :mostra le restrizioni di autenticazione sull'account oltre al normale output

Ad esempio, puoi dire a MongoDB di fornirti tutte le informazioni di cui sopra digitando:

use admindb.getUser("tom",{    showCredentials: true,    showPrivileges: true,    showAuthenticationRestrictions: true})
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ],        "credentials" : {                "SCRAM-SHA-1" : {                        "iterationCount" : 10000,                        "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",                        "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",                        "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="                },                "SCRAM-SHA-256" : {                        "iterationCount" : 15000,                        "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",                        "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",                        "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="                }        },        "roles" : [ ],        "inheritedRoles" : [ ],        "inheritedPrivileges" : [ ],        "inheritedAuthenticationRestrictions" : [ ],        "authenticationRestrictions" : [ ]}


Come si cambia la password per un utente MongoDB?

Per modificare la password di un utente, puoi utilizzare db.changeUserPassword() metodo. Ancora una volta, devi passare al database di autenticazione dell'utente prima di eseguire il comando.

Il db.changeUserPassword() accetta due argomenti:il nome utente dell'account che desideri modificare e la nuova password per l'account.

Ad esempio, per cambiare la password per l'utente tom autenticato con l'admin database in secretpassword , puoi digitare:

use admindb.changeUserPassword("tom", "secretpassword")

Proprio come con db.createUser() metodo, puoi usare il passwordPrompt() metodo per il secondo argomento invece di fornire una password inline. MongoDB ti chiederà di inserire una password quando viene eseguito il comando:

use admindb.changeUserPassword("tom", passwordPrompt())
Enter password:


Come modifichi i dettagli di altri account utente?

Per modificare altre informazioni associate a un account utente, puoi utilizzare db.updateUser() metodo. Assicurati di passare al database di autenticazione dell'utente prima di aggiornare i suoi dettagli.

Il db.updateUser() Il metodo richiede di specificare il nome utente e quindi di fornire un oggetto contenente i dati che si desidera aggiornare. Qualsiasi campo che scegli di aggiornare verrà completamente sostituito con le nuove informazioni, quindi assicurati di includere i dati originali e i nuovi dati nel tuo oggetto se speri solo di aggiungere nuove informazioni.

L'oggetto che includi nel comando con le informazioni di modifica può contenere molti campi diversi. Esaminiamoli:

  • customData :qualsiasi dato arbitrario da associare all'account utente.
  • roles :i ruoli concessi all'utente. Spesso è meglio usare db.grantRolesToUser() e db.revokeRolesFromUser() metodi per controllare l'appartenenza ai ruoli anziché aggiornare con questa chiave, poiché puoi aggiungere e rimuovere ruoli individualmente.
  • pwd :La password dell'utente. Usando il db.ChangeUserPassword() il metodo è generalmente più semplice se questo è l'unico campo che deve essere aggiornato.
  • authenticationRestrictions :specifica le restrizioni per l'account che possono limitare gli indirizzi IP da cui gli utenti possono connettersi. Il valore di questa chiave è un oggetto o un array che definisce clientSource e o serverAddress , che contengono array che specificano gli indirizzi IP o gli intervalli validi. Scopri di più nei documenti MongoDB sulle restrizioni di autenticazione.
  • mechanisms :I meccanismi di autenticazione specifici da utilizzare per le credenziali. Può essere impostato su uno o entrambi SCRAM-SHA-1 o SCRAM-SHA-256 , ma può essere modificato solo in un sottoinsieme dei meccanismi correnti se non viene attualmente fornita una nuova password.
  • passwordDigestor :specifica quale componente elabora la password dell'utente. Può essere sia server (l'impostazione predefinita) o client .

Ad esempio, possiamo aggiornare il tom account che si autentica con l'admin database per poter accedere solo dallo stesso computer che ospita il server stesso modificando le authenticationRestrictions campo:

use admindb.updateUser("tom", {    authenticationRestrictions: [ {        clientSource: ["127.0.0.1", "::1"],        serverAddress: ["127.0.0.1", "::1"]    } ]})

Ora, se chiedi a MongoDB di mostrarti le informazioni rilevanti sull'utente, verranno visualizzate ulteriori restrizioni per l'account:

use admindb.getUser("tom", {    showAuthenticationRestrictions: true})
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ],        "roles" : [ ],        "authenticationRestrictions" : [                {                        "clientSource" : [                                "127.0.0.1",                                "::1"                        ],                        "serverAddress" : [                                "127.0.0.1",                                "::1"                        ]                }        ],        "inheritedRoles" : [ ],        "inheritedPrivileges" : [ ],        "inheritedAuthenticationRestrictions" : [ ]}

Per revocare tali restrizioni, possiamo eseguire nuovamente il comando con un array vuoto:

use admindb.changeUser("tom", {    authenticationRestrictions: []})


Come si eliminano gli utenti MongoDB?

Per rimuovere gli account utente di MongoDB, puoi utilizzare db.dropUser() metodo. Assicurati di connetterti al database di autenticazione dell'utente prima di rimuoverlo.

Per eseguire db.dropUser() metodo, è necessario fornire il nome dell'utente che si desidera rimuovere:

db.dropUser("tom")

Dopo l'eliminazione riuscita, MongoDB restituirà true :

true

Se l'account non esisteva nel database corrente, restituirà invece false .



Conclusione

La configurazione della gestione e dell'autenticazione degli utenti di MongoDB ti consente di controllare chi può connettersi ai tuoi server e quali sono le loro proprietà utente. In un articolo successivo, tratteremo come limitare il livello di accesso degli utenti affrontando la parte relativa all'autorizzazione della gestione degli utenti.