MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment gérer les utilisateurs et l'authentification dans MongoDB


Introduction

La gestion des utilisateurs et l'authentification font partie des tâches d'administration les plus importantes de la gestion des serveurs MongoDB. Vous devez vous assurer que le serveur est configuré pour pouvoir identifier correctement vos utilisateurs et applications et refuser les connexions ou les opérations qui ne peuvent pas s'authentifier correctement.

Pour gérer ces exigences, vous devez être en mesure de déterminer les utilisateurs dont votre serveur a besoin et de créer ces comptes. Dans le cadre de ce processus, vous pouvez définir les détails d'authentification pour autoriser l'accès externe à l'aide de la nouvelle identité.

Dans ce guide, nous expliquerons comment créer, afficher et supprimer des comptes d'utilisateurs. Nous verrons comment configurer l'authentification pour vos comptes et comment mettre à jour les informations d'identification lorsque vous devez modifier vos mots de passe utilisateur.



Prérequis

Pour suivre ce guide, vous aurez besoin d'un compte sur un serveur MongoDB avec les privilèges appropriés.


Commandes et méthodes que nous utiliserons

Pour créer, modifier et supprimer des utilisateurs dans MongoDB et configurer l'authentification, les principales méthodes dont vous avez besoin sont :

  • db.createUser :créer un nouveau compte utilisateur MongoDB
  • db.updateUser :mettre à jour les détails d'un compte utilisateur
  • db.changeUserPassword :changer le mot de passe utilisé par un compte utilisateur
  • db.dropUser :supprimer un compte utilisateur MongoDB

De plus, la commande de base de données suivante est utile pour rechercher des informations sur les utilisateurs du système :

  • db.runCommand('usersInfo') :affiche des informations sur un ou plusieurs comptes utilisateurs MongoDB


Privilèges requis

Pour exécuter les commandes ci-dessus, vous devez vous connecter à MongoDB avec un compte avec un certain nombre d'actions de privilège différentes. Les privilèges spécifiques dont vous avez besoin dépendent des commandes que vous devez utiliser.

Pour obtenir des informations sur les autres utilisateurs, votre utilisateur actuel doit avoir l'action de privilège suivante activée :

  • viewUser action privilégiée

Pour créer de nouveaux utilisateurs, votre utilisateur actuel doit avoir les actions de privilège suivantes activées :

  • createUser action privilégiée
  • grantRole action privilégiée

Pour modifier le mot de passe ou les détails du compte d'un utilisateur, vous devrez peut-être disposer des privilèges suivants :

  • changeOwnPassword action privilégiée pour changer le mot de passe de votre propre compte
  • changeOwnCustomData action privilégiée pour modifier les données personnalisées de votre propre compte
  • changePassword action de privilège pour changer les mots de passe des autres utilisateurs
  • changeCustomData action privilégiée pour modifier les données personnalisées des autres utilisateurs

Nous ne couvrirons pas la gestion des rôles dans ce guide, donc le grantRole et revokeRole les actions de privilège ne sont pas nécessaires.

Pour supprimer un compte d'utilisateur, votre utilisateur actuel doit avoir l'action de privilège suivante activée :

  • dropUser action privilégiée



Comprendre comment MongoDB implémente les utilisateurs et l'authentification

Avant de commencer à créer et à gérer des comptes, il est utile de prendre le temps de se familiariser avec la façon dont MongoDB définit et stocke ces informations.

Dans MongoDB, les comptes d'utilisateurs sont une combinaison du nom d'utilisateur du compte et d'une base de données d'authentification spécifique. La base de données d'authentification est simplement la base de données dans laquelle l'utilisateur est défini et n'implique aucune limitation de portée ou de droits. Les bases de données d'authentification sont des bases de données régulières utilisées pour gérer d'autres données et ne sont pas des bases de données spéciales et dédiées.

Un nom de compte utilisateur doit être unique dans sa base de données d'authentification. Cependant, le même nom d'utilisateur peut être réutilisé avec une base de données d'authentification différente pour créer un nouveau compte utilisateur distinct.

En raison de cette conception, un compte ne peut être identifié avec précision qu'en incluant le nom d'utilisateur et la base de données d'authentification. Pour s'authentifier sur un compte, il faut également être en mesure de fournir les informations d'identification associées à un compte. Il s'agit généralement d'un mot de passe, mais il peut également s'agir d'un certificat.



Comment créez-vous des utilisateurs ?

Maintenant que nous avons vu comment MongoDB conceptualise les comptes d'utilisateurs, nous pouvons discuter de la façon de créer de nouveaux utilisateurs. N'oubliez pas de vous connecter à votre serveur MongoDB avec un utilisateur disposant des privilèges appropriés pour suivre.

Pour créer un nouvel utilisateur, vous devez d'abord basculer vers la base de données que vous souhaitez utiliser comme base de données d'authentification du nouvel utilisateur.

Tout d'abord, vous pouvez obtenir une liste des bases de données déjà configurées sur votre système en tapant :

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Passez à la base de données à laquelle l'utilisateur sera associé en utilisant le use commande :

use admin
switched to db admin

Pour créer un nouvel utilisateur, vous pouvez utiliser soit le db.createUser() ou vous pouvez utiliser la méthode createUser commande de la base de données. Dans tous les cas, vous devrez transmettre le nom d'utilisateur (le user champ), mot de passe (le pwd champ) et un tableau de rôles auxquels l'utilisateur doit être ajouté (les roles clé) au sein d'un user objet.

Pour créer un nouvel utilisateur appelé tom avec un mot de passe défini sur hellothere avec un tableau de rôles vide en utilisant le db.createUser() méthode, vous pouvez taper :

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

La même opération en utilisant le createUser la commande de la base de données ressemblerait à ceci :

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

Les deux options différentes sont très similaires, nous ne montrerons donc que les méthodes de base de données, le cas échéant, à l'avenir. Cependant, si vous préférez la syntaxe des commandes de base de données, vous pouvez trouver chacune des commandes associées dans la documentation de référence des commandes MongoDB.

Dans les commandes ci-dessus, nous avons explicitement défini le mot de passe en ligne dans le user objet. Pour empêcher le mot de passe d'être enregistré et récupérable, vous pouvez également utiliser le passwordPrompt() méthode dans l'user document pour que MongoDB vous demande de manière interactive un mot de passe lorsque la commande est exécutée. Le mot de passe ne sera pas visible, donc votre historique de commandes sera propre :

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

Gardez à l'esprit que le mot de passe sera toujours envoyé au serveur en texte brut si vous n'avez pas activé TLS/SSL.



Comment affichez-vous les utilisateurs existants ?

Voyons maintenant comment trouver des informations sur les utilisateurs existants.

Pour renvoyer plusieurs utilisateurs, vous pouvez utiliser le db.getUsers() sur pour afficher tous les utilisateurs de la base de données actuelle. Tout d'abord, passez à la base de données que vous souhaitez interroger :

use admin

Ensuite, utilisez le db.getUsers() méthode pour renvoyer tous les utilisateurs associés à la base de données actuelle :

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"            ]    }]

Pour afficher en plus les informations d'identification de chaque utilisateur, passez un objet à la méthode avec le showCredentials clé sur 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="                        }                },                . . .        }]

Pour interroger les utilisateurs qui correspondent à certains critères, vous pouvez transmettre un objet qui définit un filter clé qui définit la condition de correspondance.

Par exemple, pour obtenir des informations sur tous les utilisateurs de la base de données actuelle qui ont le root rôle, vous pouvez taper :

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"                ]        }]

Pour obtenir un utilisateur spécifique, vous pouvez utiliser le db.getUser() méthode à la place. Cela fonctionne comme le db.getUsers() méthode, mais renvoie un seul utilisateur. Au lieu de passer un objet à la méthode, vous passez une chaîne contenant le nom d'utilisateur que vous souhaitez récupérer :

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"        ]}

Vous pouvez éventuellement inclure un args supplémentaire objet qui vous permet de spécifier des informations supplémentaires que vous souhaitez en définissant les clés suivantes sur true :

  • showCredentials  :affiche les informations d'identification en plus de la sortie normale
  • showPrivileges  :affiche les informations de privilège en plus de la sortie normale
  • showAuthenticationRestrictions  :affiche les restrictions d'authentification sur le compte en plus de la sortie habituelle

Par exemple, vous pouvez dire à MongoDB de vous fournir toutes les informations ci-dessus en tapant :

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" : [ ]}


Comment changer le mot de passe d'un utilisateur MongoDB ?

Pour changer le mot de passe d'un utilisateur, vous pouvez utiliser le db.changeUserPassword() méthode. Encore une fois, vous devez basculer vers la base de données d'authentification de l'utilisateur avant d'exécuter la commande.

Le db.changeUserPassword() prend deux arguments :le nom d'utilisateur du compte que vous souhaitez modifier et le nouveau mot de passe du compte.

Par exemple, pour changer le mot de passe de l'utilisateur tom authentifié auprès de l'admin base de données en secretpassword , vous pouvez taper :

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

Tout comme avec le db.createUser() méthode, vous pouvez utiliser la méthode passwordPrompt() méthode pour le deuxième argument au lieu de fournir un mot de passe en ligne. MongoDB vous demandera d'entrer un mot de passe lors de l'exécution de la commande :

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


Comment modifiez-vous les autres détails du compte utilisateur ?

Pour modifier d'autres informations associées à un compte utilisateur, vous pouvez utiliser le db.updateUser() méthode. Assurez-vous de passer à la base de données d'authentification de l'utilisateur avant de mettre à jour ses informations.

Le db.updateUser() nécessite que vous spécifiiez le nom d'utilisateur, puis que vous fournissiez un objet contenant les données que vous souhaitez mettre à jour. Tout champ que vous choisissez de mettre à jour sera complètement remplacé par les nouvelles informations, alors assurez-vous d'inclure les données d'origine ainsi que les nouvelles données dans votre objet si vous espérez seulement ajouter de nouvelles informations.

L'objet que vous incluez dans la commande avec les informations de modification peut contenir de nombreux champs différents. Passons en revue :

  • customData :Toute donnée arbitraire à associer au compte utilisateur.
  • roles :Les rôles accordés à l'utilisateur. Il est souvent préférable d'utiliser le db.grantRolesToUser() et db.revokeRolesFromUser() méthodes pour contrôler l'appartenance au rôle plutôt que de mettre à jour avec cette clé, car vous pouvez ajouter et supprimer des rôles individuellement.
  • pwd :Le mot de passe de l'utilisateur. Utilisation de db.ChangeUserPassword() est généralement plus facile si c'est le seul champ qui doit être mis à jour.
  • authenticationRestrictions :spécifie les restrictions pour le compte qui peuvent limiter les adresses IP à partir desquelles ou auxquelles les utilisateurs peuvent se connecter. La valeur de cette clé est un objet ou un tableau qui définit clientSource et ou serverAddress , qui contiennent des tableaux spécifiant les adresses ou plages IP valides. Pour en savoir plus, consultez la documentation MongoDB sur les restrictions d'authentification.
  • mechanisms :les mécanismes d'authentification spécifiques à utiliser pour les informations d'identification. Peut être défini sur l'un ou les deux de SCRAM-SHA-1 ou SCRAM-SHA-256 , mais ne peut être remplacé que par un sous-ensemble des mécanismes actuels si aucun nouveau mot de passe n'est actuellement fourni.
  • passwordDigestor :spécifie quel composant traite le mot de passe de l'utilisateur. Peut être soit server (par défaut) ou client .

Par exemple, nous pouvons mettre à jour le tom compte qui s'authentifie auprès de l'admin base de données pour ne pouvoir se connecter qu'à partir du même ordinateur qui héberge le serveur lui-même en modifiant les authenticationRestrictions champ :

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

Maintenant, si vous demandez à MongoDB de vous montrer les informations pertinentes sur l'utilisateur, il affichera des restrictions supplémentaires pour le compte :

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" : [ ]}

Pour révoquer ces restrictions, nous pouvons réexécuter la commande avec un tableau vide :

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


Comment supprimez-vous les utilisateurs MongoDB ?

Pour supprimer des comptes d'utilisateurs MongoDB, vous pouvez utiliser le db.dropUser() méthode. Assurez-vous de vous connecter à la base de données d'authentification de l'utilisateur avant de le supprimer.

Pour exécuter le db.dropUser() méthode, vous devez fournir le nom de l'utilisateur que vous souhaitez supprimer :

db.dropUser("tom")

Une fois la suppression réussie, MongoDB renverra true :

true

Si le compte n'existait pas dans la base de données actuelle, il renverra à la place false .



Conclusion

La configuration de la gestion des utilisateurs et de l'authentification de MongoDB vous permet de contrôler qui peut se connecter à vos serveurs et quelles sont leurs propriétés utilisateur. Dans un article suivant, nous expliquerons comment restreindre le niveau d'accès des utilisateurs en abordant la partie autorisation de la gestion des utilisateurs.