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 MongoDBdb.updateUser
:mettre à jour les détails d'un compte utilisateurdb.changeUserPassword
:changer le mot de passe utilisé par un compte utilisateurdb.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éegrantRole
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 comptechangeOwnCustomData
action privilégiée pour modifier les données personnalisées de votre propre comptechangePassword
action de privilège pour changer les mots de passe des autres utilisateurschangeCustomData
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 normaleshowPrivileges
:affiche les informations de privilège en plus de la sortie normaleshowAuthenticationRestrictions
: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 ledb.grantRolesToUser()
etdb.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 dedb.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éfinitclientSource
et ouserverAddress
, 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 deSCRAM-SHA-1
ouSCRAM-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 soitserver
(par défaut) ouclient
.
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.