Une version antérieure de ce tutoriel a été écrite par Brennan Bearnes.
MongoDB , également connu sous le nom de Mongo , est une base de données de documents open-source utilisée dans de nombreuses applications web modernes. Elle est classée comme une base de données NoSQL car elle ne repose pas sur une structure de base de données relationnelle traditionnelle basée sur des tableaux. Elle utilise plutôt des documents de type JSON avec des schémas dynamiques.
MongoDB n’a pas d’authentification activée par défaut, ce qui signifie que tout utilisateur ayant accès au serveur où la base de données est installée peut ajouter et supprimer des données sans restriction. Afin de sécuriser cette vulnérabilité, ce tutoriel vous guidera dans la création d’un administrative user et l’activation de l’authentification. Vous ferez ensuite des tests pour confirmer que seul cet administrative user a accès à la base de données.
Pour terminer ce tutoriel, vous aurez besoin des éléments suivants :
Depuis la sortie de la version 3.0, le démon MongoDB est configuré pour n’accepter que les connexions provenant de la socket Unix locale, et il n’est pas automatiquement ouvert à l’Internet dans toute son étendue. Toutefois, l’authentification est toujours désactivée par défaut. Cela signifie que tous les utilisateurs qui ont accès au serveur où MongoDB est installé ont également un accès complet aux bases de données.
Dans un premier temps, pour sécuriser cette vulnérabilité, vous créerez un administrative user. Plus tard, vous activerez l’authentification et vous vous connecterez en tant qu’administrative user pour accéder à la base de données.
Pour ajouter un administrative user, vous devez d’abord vous connecter au shell Mongo. L’authentification étant désactivée, vous pouvez le faire avec la commande mongo
, sans aucune autre option :
mongo
Il y aura une sortie au-dessus de l’invite du shell Mongo. Comme vous n’avez pas encore activé l’authentification, vous recevrez un avertissement indiquant que le contrôle d’accès n’est pas activé pour la base de données et que l’accès en lecture et en écriture aux données et la configuration de la base de données ne sont pas restreints :
Output
MongoDB shell version v4.4.0
. . .
2020-06-09T13:26:51.391+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-06-09T13:26:51.391+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
. . .
>
Ces avertissements disparaîtront une fois que vous aurez activé l’authentification, mais pour l’instant, ils signifient que toute personne pouvant accéder à votre serveur Ubuntu pourrait également prendre le contrôle de votre base de données.
Pour illustrer le tout, faites fonctionner la commande show dbs
de Mongo :
show dbs
Cette commande renvoie une liste de toutes les bases de données sur le serveur. Cependant, lorsque l’authentification est activée, la liste change en fonction du rôle de l’utilisateur Mongo ou de son niveau d’accès à certaines bases de données. Cependant, comme l’authentification est désactivée, elle renvoie toutes les bases de données actuellement présentes sur le système sans restriction :
Output
admin 0.000GB
config 0.000GB
local 0.000GB
Dans cet exemple de sortie, seules les bases de données par défaut apparaissent. Cependant, si vous avez des bases de données contenant des données sensibles sur votre système, n’importe quel utilisateur pourrait les trouver avec cette commande.
Dans le cadre de l’atténuation de cette vulnérabilité, cette étape est axée sur l’ajout d’un administrative user. Pour ce faire, vous devez d’abord vous connecter à la base de données admin
. C’est là que sont stockées les informations sur les utilisateurs, comme leurs noms d’utilisateur, mots de passe et rôles :
use admin
Output
switched to db admin
MongoDB est installé avec un certain nombre de méthodes de shell basées sur JavaScript que vous pouvez utiliser pour gérer votre base de données. L’une d’entre elles, la méthode db.createUser
, est utilisée pour créer de nouveaux utilisateurs au sein de la base de données sur laquelle la méthode est exécutée.
Lancez la méthode db.createUser
:
db.createUser(
Cette méthode exige que vous spécifiiez un nom d’utilisateur et un mot de passe pour l’utilisateur, ainsi que les rôles que vous souhaitez lui attribuer. Rappelons que MongoDB stocke ses données dans des documents de type JSON. Ainsi, lorsque vous créez un nouvel utilisateur, tout ce que vous faites est de créer un document contenant les données appropriées de l’utilisateur sous forme de champs individuels.
Comme pour les objets dans JSON, les documents dans MongoDB commencent et se terminent par des accolades ( {
et }
). Pour commencer à ajouter un utilisateur, entrez une accolade d’ouverture :
Note : Mongo n’enregistrera pas la méthode db.createUser
comme complète tant que vous n’aurez pas entré une parenthèse de fermeture. En attendant, l’invite passera d’un signe plus grand que ( >
) à une ellipse ( ...
).
{
Ensuite, remplissez un champ user:
en indiquant entre guillemets le nom d’utilisateur souhaité, suivi d’une virgule. L’exemple suivant précise le nom d’utilisateur AdminSammy, mais vous pouvez entrer le nom d’utilisateur que vous souhaitez :
user: "AdminSammy",
Ensuite, entrez un champ pwd
avec la méthode passwordPrompt()
comme valeur. Lorsque vous exécutez la méthode db.createUser
, la méthode passwordPrompt()
vous invite à saisir votre mot de passe. Cette méthode est plus sûre que l’autre, ce qui consiste à taper votre mot de passe en clair comme vous l’avez fait pour votre nom d’utilisateur.
Note : La méthode passwordPrompt()
est uniquement compatible avec les versions de MongoDB 4.2 et plus récentes. Si vous utilisez une ancienne version de Mongo, vous devrez écrire votre mot de passe en clair, de la même manière que vous avez écrit votre nom d’utilisateur :
pwd: "password",
Veillez également à faire suivre ce champ d’une virgule :
pwd: passwordPrompt(),
Saisissez ensuite les rôles que vous souhaitez attribuer à votre administrative user. Comme vous créez un administrative user, vous devez au minimum lui accorder le rôle de userAdminAnyDatabase
par rapport à la base de données admin
. Cela permettra à l’administrative user de créer et de modifier de nouveaux utilisateurs et rôles. Comme l’administrative user a ce rôle dans la base de données admin
, cela lui donnera également un accès de superuser à l’ensemble du cluster.
En outre, l’exemple suivant accorde également à l’administrative user le rôle de ReadWriteAnyDatabase
. Cela donne à l’administrative user la possibilité de lire et de modifier les données de n’importe quelle base de données du cluster, à l’exception des bases de données config
et local
, qui sont pour la plupart à usage interne :
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
Puis entrez une accolade de fermeture pour marquer la fin du document :
}
Ensuite, entrez une parenthèse de fermeture pour fermer et exécutez la méthode db.createUser
:
)
En résumé, voici à quoi devrait ressembler votre méthode db.createUser
:
> db.createUser(
... {
... user: "AdminSammy",
... pwd: passwordPrompt(),
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... }
... )
Si la syntaxe de chaque ligne est correcte, la méthode s’exécutera correctement et vous serez invité(e) à entrer un mot de passe :
Output
Enter password:
Entrez un mot de passe fort de votre choix. Ensuite, vous recevrez une confirmation que l’utilisateur a été ajouté :
Output
Successfully added user: {
"user" : "AdminSammy",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}
Ensuite, vous pouvez quitter le client MongoDB :
exit
À ce stade, votre utilisateur sera autorisé à saisir des informations d’identification. Cependant, il ne sera pas tenu de le faire tant que vou
#ubuntu