Comment installer et sécuriser MongoDB sur Ubuntu 16.04

introduction

MongoDB est une base de données orientée document gratuite et à code source ouvert. Elle est classée dans une base de données NoSQL car elle ne repose pas sur une structure de base de données relationnelle traditionnelle. Au lieu de cela, il utilise des documents de type 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 l'ajout de données à une base de données. Vous pouvez modifier le schéma à tout moment et aussi souvent que nécessaire sans avoir à configurer une nouvelle base de données avec un schéma mis à jour.

Dans la première partie de ce didacticiel, 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 la sécuriser sur le système local. Enfin, dans la troisième partie, nous montrerons comment autoriser de manière plus sécurisée les connexions distantes si elles sont nécessaires.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

Lorsque cela est en place, vous êtes prêt à suivre.

Première partie: Configuration du serveur

[[step-1 -—- ajoutant-the-mongodb-repository]] == Étape 1 - Ajout du référentiel MongoDB

MongoDB est déjà inclus dans les référentiels de paquets Ubuntu, mais le référentiel officiel MongoDB fournit la version la plus récente et constitue le moyen recommandé d’installer le logiciel. Dans cette étape, nous allons ajouter ce référentiel officiel sur notre serveur.

Ubuntu garantit l'authenticité des progiciels en vérifiant qu'ils sont signés avec des clés GPG. Nous devons donc d'abord importer la clé pour le référentiel officiel MongoDB.

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

La sortie suivante confirme que nous avons importé la clé avec succès:

Sortie

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 " imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Ensuite, nous ajouterons les détails du dépôt MongoDB afin queapt sache où télécharger les packages. 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.list

Enfin, nous mettrons à jour la liste des packages.

sudo apt-get update

Nous sommes maintenant prêts à installer MongoDB.

[[step-2 -—- Installing-mongodb]] == Étape 2 - Installation de MongoDB

Nous allons installer le méta-package`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-org

Appuyez sur Entrée ou tapezY pour continuer lorsque vous y êtes invité. Une fois l’installation terminée, nous allons démarrer le démon Mongo:

sudo systemctl start mongod

Puisquesystemctl ne fournit pas de sortie, nous vérifierons l'état pour vérifier que le service a démarré correctement.

sudo systemctl status mongod

Sortie

● 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.conf

Appuyez surq pour quitter. Maintenant que nous avons démarré manuellement le démon et vérifié son exécution, nous allons nous assurer qu'il redémarre automatiquement au démarrage:

sudo systemctl enable mongod

La sortie suivante confirme que la commande a abouti:

OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
to /lib/systemd/system/mongod.service.

Ensuite, nous prendrons les mesures essentielles pour sécuriser nos bases de données.

Deuxième partie: Sécuriser MongoDB

Les versions antérieures de MongoDB étaient vulnérables aux exploits automatisés car aucune authentification n'était requise par défaut pour interagir avec la base de données. Tout utilisateur peut créer et détruire des bases de données, ainsi que lire et écrire par défaut dans leur contenu. Cela était aggravé par le fait que ces versions antérieures configuraient également le démon MongoDB pour écouter toutes les interfaces par défaut, ce qui signifiait que les scripts automatisés pouvaient détecter les instances MongoDB non protégées par un pare-feu et, si l'authentification n'avait pas été activée, obtenir un accès complet. à 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 packages car le démon est maintenant lié à 127.0.0.1, de sorte qu'il n'accepte que les connexions sur le socket Unix. Il n'est pas automatiquement ouvert à Internet.

Toutefois, l’authentification étant toujours désactivée par défaut, tous les utilisateurs du 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.

[[step-1 -—- ajoutant-an-administrative-user]] == Étape 1 - Ajout d'un utilisateur administratif

Pour ajouter votre utilisateur, connectez-vous au shell Mongo:

mongo

La 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 est illimité.

OutputMongoDB 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ôleuserAdminAnyDatabase. La base de données,admin désigne l'emplacement de stockage des informations d'identification. Vous pouvez en savoir plus sur l'authentification dans la section MongoDB SecurityAuthentication.

Définissez le nom d'utilisateur de votre choix et assurez-vous de choisir votre propre mot de passe sécurisé et de le remplacer dans la commande ci-dessous:

use admin
db.createUser(
  {
    user: "AdminSammy",
    pwd: "AdminSammy'sSecurePassword",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

Lorsque nous émettons la commandedb.createUser, le shell ajoutera trois points avant chaque ligne jusqu'à ce que la commande soit terminée. Après cela, nous devrions recevoir des commentaires comme celui-ci lorsque l'utilisateur a été ajouté.

Output> 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 surENTER ou utilisezCTRL+C pour quitter le client.

À ce stade, notre utilisateur sera autorisé à entrer ses informations d'identification, mais il ne sera pasrequired pour le faire tant que nous n'aurons pas activé l'authentification et redémarré le démon MongoDB.

[[step-2 -—- enabled-authentication]] == Étape 2 - Activation de l'authentification

L'authentification est activée dans le fichiermongod.conf. Une fois que nous l'avons activé et redémarré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.conf

Dans la section#security, nous supprimerons le hachage devantsecurity pour activer la strophe. Ensuite, nous ajouterons le paramètre d'autorisation. Lorsque nous avons terminé, les lignes doivent ressembler à l’extrait ci-dessous:

mongodb.conf

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

Notez que la ligne «sécurité» n'a pas d'espace au début et que la ligne «autorisation» doit être indentée de deux espaces.

Une fois le fichier sauvegardé et quitté, nous redémarrerons le démon:

sudo systemctl restart mongod

Si nous avons commis une erreur dans la configuration, le dameon ne démarrera pas. Puisquesystemctl ne fournit pas de sortie, nous utiliserons son optionstatus pour être sûrs que c'est le cas :.

sudo systemctl status mongod

Si nous voyonsActive: 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 commanderestart a réussi:

OutputJan 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 en place, testons l’authentification.

[[step-3 -—- verifying-that-unauthenticated-users-are-restricted]] == Étape 3 - Vérification que les utilisateurs non authentifiés sont limités

Commençons par nous connecter sans informations d’identification 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.

OutputMongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

Nous sommes connectés à la base de donnéestest. Nous allons tester que notre accès est restreint avec la commandeshow dbs:

show dbs
Output2017-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 en mesure de créer des utilisateurs ou des tâches ayant les mêmes privilèges sans authentification.

Quittons le shell pour continuer:

exit

Ensuite, nous nous assurerons que nos utilisateurs administratifsdoes y ont accès.

[[step-4 -—- verifying-the-administrative-user-39-s-access]] == É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 dans laquelle nous avons stocké les informations d’authentification de l’utilisateur avec l’option--authenticationDatabase.

mongo -u AdminSammy -p --authenticationDatabase admin

Le mot de passe nous sera demandé, alors fournissez-le. Une fois que nous avons entré le mot de passe correct, nous serons déposés dans le shell, où nous pouvons émettre la commandeshow dbs:

OutputMongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

>

Plutôt que de se voir refuser l'accès, nous devrions voir les bases de données disponibles:

show dbs
Outputadmin  0.000GB
local  0.000GB

Tapezexit ou appuyez surCTRL+C pour quitter.

Consultez la documentation MongoDB pour en savoir plus surAuthentication,Role-Based Access Control etUsers and Roles.

Troisième partie: Configuration de l'accès à distance (facultatif)

Avant de commencer à travailler avec une installation permettant des connexions distantes, 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, à mesure que nous travaillons dans cette direction, nous pouvons passer à l’étape un peu moins compliquée d’activer un pare-feu sur le serveur de base de données et de restreindre l’accès à l’hôte ou aux hôtes spécifiques qui en ont besoin.

[[step-1 -—- enabled-ufw]] == Étape 1 - Activation de UFW

Dans le prérequisInitial Server Setup with Ubuntu 16.04, nous avons activé UFW et autorisé uniquement les connexions SSH. Avant d’ouvrir un port pour notre ordinateur client, vérifions le statut de UFW:

sudo ufw status

[.Remarque]##

Note: Si la sortie indique que le pare-feu estinactive, activez-le avec:

sudo ufw enable

Une fois activé, réexécutez la commande status,sudo ufw status affichera les règles. Si nécessaire, assurez-vous d'autoriser SSH.

sudo ufw allow OpenSSH

Sauf si nous avons apporté des modifications aux conditions préalables, le résultat devrait indiquer que seul OpenSSH est autorisé:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Ensuite, nous autoriserons l’accès au port par défaut de MongoDB, 27017, mais limiterons cet accès à un hôte spécifique. Si vous avez modifié le port par défaut, veillez à le mettre à jour dans la commande ci-dessous.

sudo ufw allow from client_ip_address to any port 27017

Relancez cette commande en utilisant l'adresse IP de chaque client supplémentaire ayant besoin d'un accès. Pour revérifier la règle, nous exécuterons à nouveauufw status:

sudo ufw status
OutputTo                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
27017                       ALLOW      client_ip_address
OpenSSH (v6)               ALLOW       Anywhere (v6)

[.note] #Note: Si vous êtes nouveau dans UFW, vous pouvez en savoir plus dans le guide,UFW Essentials: Common Firewall Rules and Commands.
#

Avec cette règle de pare-feu en place, nous sommes prêts à configurer MongoDB pour qu’il écoute sur son interface publique.

[[step-2 -—- configuring-a-public-bindip]] == Étape 2 - Configuration d'un bindIP public

Pour autoriser les connexions à distance, nous ajouterons l’adresse IP routable publiquement de notre hôte au fichiermongod.conf.

sudo nano /etc/mongod.conf

Dans la strophenet, ajoutez l'adresse IP deMongoHost à la lignebindIp:

Extrait de /etc/mongod.conf

 . . .
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 mongod

Comme précédemment, nous confirmerons le redémarrage réussi:

sudo systemctl status mongod

La sortie doit contenirActive: active (running), et nous pouvons procéder à notre test final. Mongo écoute maintenant sur son port par défaut.

[[step-3 -—- testing-the-remote-connection]] == Étape 3 - Test de la connexion à distance

Nous allons tester que Mongo écoute sur son interface publique en ajoutant l'indicateur--host avec l'adresse IP du fichiermongodb.conf.

mongo -u AdminSammy -p --authenticationDatabase admin --host IP_address_of_MongoHost
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://107.170.233.82:27017/
MongoDB server version: 3.4.2

L'accès à 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. L'étape suivante, avant de tester le pare-feu, consiste donc à sécuriser ces transations. Pour obtenir de l'aide à ce sujet, consultez la documentation sur la sécurité de MongoDB surTransport Encryption.

Conclusion

Dans ce didacticiel, nous avons ajouté le référentiel 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 les connexions distantes tout en empêchant la publication de l’installation de MongoDB en configurant le pare-feu du serveur pour autoriser les connexions uniquement à partir d’hôtes nécessitant un accès.

Prochaines étapes: