Comment installer et sécuriser MongoDB sur Ubuntu 16.04
Introduction
MongoDB est une base de données orientée documents qui est gratuite et open-source. 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 tables. Au lieu de cela, elle utilise des documents similaires à JSON avec des schémas dynamiques. Contrairement aux bases de données relationnelles, MongoDB ne nécessite pas de schéma prédéfini avant d'ajouter des données à une base de données. Vous pouvez modifier le schéma à tout moment et aussi souvent que nécessaire sans avoir à créer une nouvelle base de données avec un schéma mis à jour.
Dans la première partie de ce tutoriel, nous utiliserons le référentiel MongoDB pour installer la dernière version de MongoDB. Dans la deuxième partie, nous activerons l'authentification pour le sécuriser sur le système local. Enfin, dans la troisième partie, nous montrerons comment permettre plus sûrement les connexions à distance si elles sont nécessaires.
Prérequis
Pour suivre ce tutoriel, vous aurez besoin de :
- Un serveur Ubuntu 16.04 configuré avec un utilisateur non root avec
sudoet un pare-feu en suivant le guide de configuration initiale du serveur Ubuntu 16.04.
Lorsque cela est en place, vous êtes prêt à suivre.
Première partie : Configuration du serveur
Étape 1 — Ajouter le dépôt MongoDB
MongoDB est déjà inclus dans les dépôts de paquets Ubuntu, mais le dépôt officiel de MongoDB fournit la version la plus à jour et est le moyen recommandé pour installer le logiciel. Dans cette étape, nous allons ajouter ce dépôt officiel à notre serveur.
Ubuntu garantit l'authenticité des paquets logiciels en vérifiant qu'ils sont signés avec des clés GPG, donc nous devons d'abord importer la clé du dépôt officiel de MongoDB.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6La sortie suivante confirme que nous avons importé la clé avec succès :
Executing: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80
--recv
0C49F3730359A14518585931BC711F9BA15703C6
gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)Ensuite, nous allons ajouter les détails du dépôt MongoDB afin que apt sache où télécharger les paquets. Exécutez la commande suivante pour créer un fichier de liste pour MongoDB.
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.listEnfin, nous mettrons à jour la liste des paquets.
sudo apt-get updateMaintenant nous sommes prêts à installer MongoDB.
Étape 2 — Installation de MongoDB
Nous allons installer le méta-paquet mongodb-org, qui comprend le démon, les scripts de configuration et d'initialisation, le shell et les outils de gestion sur le serveur.
sudo apt-get install mongodb-orgAppuyez sur Entrée ou tapez Y pour continuer lorsqu'on vous le demandera. Une fois l'installation terminée, nous démarrerons le démon Mongo :
sudo systemctl start mongodPuisque systemctl ne fournit pas de sortie, nous vérifierons le statut pour confirmer que le service a démarré correctement.
sudo systemctl status mongod● mongod.service - High-performance, schema-free document-oriented database
Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
Docs: https://docs.mongodb.org/manual
Main PID: 2811 (mongod)
Tasks: 17
Memory: 56.8M
CPU: 7.294s
CGroup: /system.slice/mongod.service
└─2811 /usr/bin/mongod --quiet --config /etc/mongod.confAppuyez sur q pour quitter. Maintenant que nous avons démarré manuellement le démon et vérifié qu'il fonctionne, nous allons nous assurer qu'il redémarre automatiquement au démarrage :
sudo systemctl enable mongod
La sortie suivante confirme que la commande a réussi :
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
to /lib/systemd/system/mongod.service.Ensuite, nous prendrons des mesures essentielles pour sécuriser nos bases de données.
Partie Deux : Sécurisation de MongoDB
Les versions antérieures de MongoDB étaient vulnérables aux exploits automatisés parce que, par défaut, aucune authentification n'était requise pour interagir avec la base de données. Tout utilisateur pouvait créer et supprimer des bases de données, ainsi que lire et écrire dans leurs contenus par défaut. Cela était aggravé par le fait que ces versions antérieures configuraient également le daemon MongoDB pour écouter sur toutes les interfaces par défaut, ce qui signifiait que des scripts automatisés pouvaient détecter des instances MongoDB non protégées par un pare-feu et, si l'authentification n'avait pas été activée, accéder complètement à MongoDB.
La situation a été atténuée dans la version 3.x ainsi que dans les versions antérieures fournies par certains gestionnaires de paquets, car le démon est maintenant lié à 127.0.0.1, de sorte qu'il n'acceptera des connexions que sur le socket Unix. Il n'est pas automatiquement ouvert à Internet.
Cependant, l'authentification est toujours désactivée par défaut, donc tous les utilisateurs sur le système local ont un accès complet aux bases de données. Pour sécuriser cela, nous allons créer un utilisateur administratif, activer l'authentification et tester.
Étape 1 — Ajouter un utilisateur administratif
Pour ajouter notre utilisateur, nous allons nous connecter au shell Mongo :
mongoLa sortie lorsque nous utilisons le shell Mongo nous avertit que le contrôle d'accès n'est pas activé pour la base de données et que l'accès en lecture/écriture aux données et à la configuration n'est pas restreint.
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten]
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten]
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten]
>Nous sommes libres de choisir le nom de l'utilisateur administratif puisque le niveau de privilège provient de l'attribution du rôle userAdminAnyDatabase. La base de données, admin, désigne où les identifiants sont stockés. Vous pouvez en savoir plus sur l'authentification dans la section Authentification de la sécurité MongoDB.
Définissez le nom d'utilisateur de votre choix et assurez-vous de choisir votre propre mot de passe sécurisé et de les remplacer dans la commande ci-dessous :
use admin
db.createUser(
{
user: "AdminSammy",
pwd: "AdminSammy'sSecurePassword",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)Lorsque nous exécutons la commande db.createUser, le shell préfixera chaque ligne de trois points jusqu'à ce que la commande soit terminée. Après cela, nous devrions recevoir un retour similaire au suivant lorsque l'utilisateur a été ajouté.
> use admin
switched to db admin
> db.createUser(
... {
... user: "AdminSammy",
... pwd: "AdminSammy'sSecurePassword",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... }
... )
Successfully added user: {
"user" : "AdminSammy",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
Tapez « exit » et appuyez sur ENTRÉE ou utilisez CTRL+C pour quitter le client.
À ce stade, notre utilisateur sera autorisé à entrer des identifiants, mais il ne sera pas obligé de le faire jusqu'à ce que nous activions l'authentification et redémarrions le démon MongoDB.
Étape 2 — Activation de l'authentification
L'authentification est activée dans le fichier mongod.conf. Une fois que nous l'activons et redémarrons mongod, les utilisateurs pourront toujours se connecter à Mongo sans s'authentifier, mais ils devront fournir un nom d'utilisateur et un mot de passe avant de pouvoir interagir.
Ouvrons le fichier de configuration :
sudo nano /etc/mongod.confDans la section #security, nous allons enlever le dièse devant security pour activer la strophe. Ensuite, nous ajouterons le paramètre d'autorisation. Une fois que nous aurons terminé, les lignes devraient ressembler à l'extrait ci-dessous :
. . .
security:
authorization: "enabled"
. . . Notez que la ligne « security » n'a pas d'espaces au début, et que la ligne « authorization » doit être indentée avec deux espaces
Une fois que nous avons sauvegardé et quitté le fichier, nous allons redémarrer le démon :
sudo systemctl restart mongodSi nous avons fait une erreur dans la configuration, le démon ne démarrera pas. Comme systemctl ne fournit pas de sortie, nous utiliserons son option status pour être sûrs qu'il a démarré :.
sudo systemctl status mongodSi nous voyons Active: active (running) dans la sortie et que cela se termine par quelque chose comme le texte ci-dessous, nous pouvons être sûrs que la commande restart a réussi :
Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.Après avoir vérifié que le démon est lancé, testons l'authentification.
Étape 3 — Vérification que les utilisateurs non authentifiés sont restreints
Tout d'abord, connectons-nous sans identifiants pour vérifier que nos actions sont restreintes :
mongo Maintenant que nous avons activé l'authentification, tous les avertissements précédents sont résolus.
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2Nous sommes connectés à la base de données test. Nous allons tester que notre accès est restreint avec la commande show dbs :
show dbs2017-02-21T19:20:42.919+0000 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
. . . Nous ne serions pas capables de créer des utilisateurs ou des tâches ayant des privilèges similaires sans nous authentifier.
Sortons du shell pour continuer :
exitEnsuite, nous nous assurerons que notre utilisateur Administratif dispose bien de l'accès.
Étape 4 — Vérification de l'accès de l'utilisateur administratif
Nous nous connecterons en tant qu'administrateur avec l'option -u pour fournir un nom d'utilisateur et -p pour être invité à entrer un mot de passe. Nous devrons également fournir la base de données où nous avons stocké les informations d'identification de l'utilisateur avec l'option --authenticationDatabase.
mongo -u AdminSammy -p --authenticationDatabase adminOn nous demandera le mot de passe, alors fournissez-le. Une fois que nous aurons saisi le mot de passe correct, nous serons placés dans le shell, où nous pourrons exécuter la commande show dbs :
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
>Plutôt que d'être privés d'accès, nous devrions voir les bases de données disponibles :
show dbsadmin 0.000GB
local 0.000GBTapez exit ou appuyez sur CTRL+C pour sortir.
Consultez la documentation de MongoDB pour en savoir plus sur l'authentification, le contrôle d'accès basé sur les rôles, ainsi que les utilisateurs et les rôles.
Partie Trois : Configuration de l'accès à distance (Optionnel)
Avant de commencer à travailler avec une installation qui permet des connexions à distance, idéalement, nous aurons MongoDB derrière un pare-feu externe, protégé par un réseau privé virtuel (VPN), ou restreint via un hôte bastion. Cependant, en travaillant vers cet objectif, nous pouvons prendre l'étape un peu moins compliquée consistant à activer un pare-feu sur le serveur de base de données et à restreindre l'accès à l'hôte ou aux hôtes spécifiques qui en ont besoin.
Étape 1 — Activation de UFW
Dans la configuration initiale du serveur avec Ubuntu 16.04, nous avons activé UFW et autorisé uniquement les connexions SSH. Avant d'ouvrir un port pour notre machine cliente, vérifions l'état d'UFW :
sudo ufw statusRemarque : Si le résultat indique que le pare-feu est inactif, activez-le avec :
sudo ufw enableUne fois qu'il est activé, relancer la commande de statut, sudo ufw status, affichera les règles. Si nécessaire, assurez-vous d'autoriser le SSH.
sudo ufw allow OpenSSH<$>
À moins que nous n'ayons modifié les prérequis, la sortie devrait montrer que seul OpenSSH est autorisé :
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)Ensuite, nous allons permettre l'accès au port par défaut de MongoDB, 27017, mais restreindre cet accès à un hôte spécifique. Si vous avez changé le port par défaut, assurez-vous de le mettre à jour dans la commande ci-dessous.
sudo ufw allow from client_ip_address to any port 27017Relancez cette commande en utilisant l'adresse IP de chaque client supplémentaire qui a besoin d'accès. Pour vérifier à nouveau la règle, nous allons relancer ufw status :
sudo ufw statusTo Action From
-- ------ ----
OpenSSH ALLOW Anywhere
27017 ALLOW client_ip_address
OpenSSH (v6) ALLOW Anywhere (v6)<$>[note] Remarque : Si vous êtes nouveau sur UFW, vous pouvez en apprendre davantage dans le guide, UFW Essentials : Règles et commandes courantes du pare-feu.
Avec cette règle de pare-feu en place, nous sommes prêts à configurer MongoDB pour écouter sur son interface publique.
Étape 2 — Configuration d'une bindIP publique
Pour permettre les connexions à distance, nous allons ajouter l'adresse IP publiquement routable de notre hôte au fichier mongod.conf.
sudo nano /etc/mongod.confDans la section net, ajoutez l’IP de MongoHost à la ligne bindIp :
. . .
net:
port: 27017
bindIp: 127.0.0.1,IP_of_MongoHost
. . .Nous allons enregistrer et quitter le fichier, puis redémarrer le démon :
sudo systemctl restart mongodComme nous l'avons fait précédemment, nous confirmerons que le redémarrage a réussi :
sudo systemctl status mongodLa sortie devrait contenir Active: active (running), et nous pouvons passer à notre test final. Mongo est maintenant à l'écoute sur son port par défaut.
Étape 3 — Tester la connexion à distance
Nous testerons que Mongo écoute sur son interface publique en ajoutant le drapeau --host avec l'adresse IP provenant du fichier mongodb.conf.
mongo -u AdminSammy -p --authenticationDatabase admin --host IP_address_of_MongoHostMongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://107.170.233.82:27017/
MongoDB server version: 3.4.2Atteindre l'invite confirme que le démon écoute sur son IP publique. À ce stade, toute transaction entre une connexion distante et l'hôte MongoDB n'est pas cryptée, donc l'étape suivante, avant de tester le pare-feu, devrait être de sécuriser ces transactions. Pour obtenir de l'aide à ce sujet, consultez la documentation sur la sécurité de MongoDB concernant le chiffrement des communications.
Conclusion
Dans ce tutoriel, nous avons ajouté le dépôt MongoDB à notre liste de paquets afin d'installer la dernière version disponible de MongoDB, ajouté un utilisateur administrateur et activé l'authentification.
Nous avons également montré comment configurer MongoDB pour accepter des connexions à distance tout en empêchant la publicité de l'installation de MongoDB en configurant le pare-feu du serveur pour n'autoriser les connexions qu'à partir des hôtes nécessitant un accès.
Prochaines étapes :
- Pour chiffrer les données en transit, consultez la documentation sur la sécurité de MongoDB concernant le chiffrement des transports
- En savoir plus sur l'utilisation et l'administration de MongoDB dans ces articles de la communauté Linux-Console.net.
