Comment sécuriser MongoDB sur Ubuntu 20.04

Une version antérieure de ce tutoriel a été écrite par Brennan Bearnes.

Introduction

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.

Conditions préalables

Pour terminer ce tutoriel, vous aurez besoin des éléments suivants :

  • Un serveur fonctionnant sous Ubuntu 20.04 Ce serveur doit avoir un utilisateur administratif non root et un pare-feu configuré avec UFW. Pour cela, suivez notre guide de configuration initiale du serveur pour Ubuntu 20.04 .
  • MongoDB installé sur votre serveur. Ce tutoriel a été validé en utilisant la version de MongoDB 4.4, bien qu'il devrait généralement fonctionner pour les anciennes versions de MongoDB également. Pour installer Mongo sur votre serveur, suivez notre tutoriel sur Comment installer MongoDB sur Ubuntu 20.04.

Étape 1 – Ajouter un administrative user

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 :

OutputMongoDB 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 :

Outputadmin   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
Outputswitched 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 :

OutputEnter password: 

Entrez un mot de passe fort de votre choix. Ensuite, vous recevrez une confirmation que l'utilisateur a été ajouté :

OutputSuccessfully 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 vous n'aurez pas activé l'authentification et redémarré le démon MongoDB.

Étape 2 – Activer l'authentification

Pour activer l'authentification, vous devez éditer mongod.conf, le fichier de configuration de MongoDB. Une fois que vous l'aurez activé et redémarré le service Mongo, les utilisateurs pourront toujours se connecter à la base de données sans s'authentifier. Toutefois, ils ne pourront lire ou modifier aucune donnée tant qu'ils n'auront pas fourni un nom d'utilisateur et un mot de passe corrects.

Ouvrez le fichier de configuration avec votre éditeur. Ici, nous utiliserons nano :

  • sudo nano /etc/mongod.conf

Faites défiler la page vers le bas pour trouver la section security commentée :

/etc/mongod.conf

. . . #security:  #operationProfiling:  . . . 

Décommentez cette ligne en enlevant le signe dièse ( # ) :

/etc/mongod.conf

. . . security:  #operationProfiling:  . . . 

Ajoutez ensuite le paramètre authorization et réglez-le sur « enabled ». Quand vous aurez terminé, les lignes devraient ressembler à ceci :

/etc/mongod.conf

. . . security:   authorization: "enabled" . . . 

Notez que la ligne security: ne comporte pas d'espace au début, tandis que la ligne authorization: est en retrait de deux espaces.

Après avoir ajouté ces lignes, enregistrez et fermez le fichier. Si vous avez utilisé nano pour ouvrir le fichier, faites-le en appuyant sur CTRL + X, Y, puis ENTER

Ensuite, redémarrez le démon pour que ces nouveaux changements soient pris en compte :

  • sudo systemctl restart mongod

Ensuite, vérifiez l'état du service pour vous assurer qu'il a redémarré correctement :

  • sudo systemctl status mongod

Si la commande restart a réussi, vous recevrez une sortie qui indique que le mongod est actif et a été lancé récemment :

Output● mongod.service - MongoDB Database Server      Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)      Active: active (running) since Tue 2020-06-09 22:06:20 UTC; 7s ago        Docs: https://docs.mongodb.org/manual    Main PID: 15370 (mongod)      Memory: 170.1M      CGroup: /system.slice/mongod.service              └─15370 /usr/bin/mongod --config /etc/mongod.conf  Jun 09 22:06:20 your_host systemd[1]: Started MongoDB Database Server. 

Après avoir vérifié que le démon est de nouveau opérationnel, vous pouvez tester que le paramètre d'authentification que vous avez ajouté fonctionne comme prévu.

Étape 3 – Tester les paramètres d'authentification

Pour vérifier que les exigences d'authentification que vous avez ajoutées à l'étape précédente fonctionnent correctement, commencez par vous connecter sans spécifier d'identifiants, pour vous assurer que vos actions sont bien limitées :

  • mongo

Maintenant que vous avez activé l'authentification, aucun des avertissements que vous avez rencontrés précédemment n'apparaîtra :

OutputMongoDB shell version v4.4.0 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("5d50ed96-f7e1-493a-b4da-076067b2d898") } MongoDB server version: 4.4.0 > 

Confirmez si votre accès est restreint en exécutant à nouveau la commande show dbs :

  • show dbs

Rappelez-vous de l'étape 1 qu'il y a au moins quelques bases de données par défaut sur votre serveur. Cependant, dans ce cas, la commande n'aura aucune sortie, car vous ne vous êtes pas authentifié en tant qu'utilisateur privilégié.

Comme cette commande ne renvoie aucune information, on peut dire sans se tromper que le paramètre d'authentification fonctionne comme prévu. Vous ne pourrez pas non plus créer d'utilisateurs ou effectuer d'autres tâches privilégiées sans vous authentifier au préalable.

Continuez et sortez du shell MongoDB :

Note : Au lieu d'exécuter la commande exit suivante comme vous l'avez fait précédemment à l'étape 1, une autre façon de fermer le shell est d'appuyer simplement sur CTRL + C .

  • exit

Ensuite, assurez-vous que votre administrative user est capable de s'authentifier correctement en exécutant la commande mongo suivante pour vous connecter en tant qu'utilisateur. Cette commande comprend le drapeau -u, qui précède le nom de l'utilisateur sous lequel vous voulez vous connecter. Veillez à remplacer AdminSammy par le nom d'utilisateur de votre propre administrative user. Il comprend également le drapeau -p, qui vous demandera le mot de passe de l'utilisateur, et spécifie admin comme la base de données d'authentification où le nom d'utilisateur spécifié a été créé :

  • mongo -u AdminSammy -p --authenticationDatabase admin

Saisissez le mot de passe de l'utilisateur lorsque vous y êtes invité, et vous serez ensuite déposé dans le shell. Une fois sur place, essayez de lancer à nouveau la commande show dbs :

  • show dbs

Cette fois, parce que vous vous êtes authentifié correctement, la commande retournera avec succès une liste de toutes les bases de données actuellement sur le serveur :

Outputadmin   0.000GB config  0.000GB local   0.000GB 

Cela confirme que l'authentification a été activée avec succès.

Conclusion

En complétant ce guide, vous avez mis en place un administrative MongoDB user que vous pouvez utiliser pour créer et modifier de nouveaux utilisateurs et rôles, et pour gérer votre instance MongoDB. Vous avez également configuré votre instance MongoDB pour exiger que les utilisateurs s'authentifient avec un nom d'utilisateur et un mot de passe valides avant de pouvoir interagir avec des données.

Pour plus d'informations sur la gestion des utilisateurs de MongoDB, consultez la documentation officielle sur le sujet . Vous pourriez également vouloir en savoir plus sur le fonctionnement de l'authentification sur MongoDB.

De plus, si vous envisagez d'interagir avec votre instance MongoDB à distance, vous pouvez suivre notre guide sur Comment configurer l'accès à distance pour MongoDB sur Ubuntu 20.04 .