Un serveur MongoDB sécurisé sur Docker
Je vous propose dans cet article de jouer un peu avec Docker pour monter une instance MongoDB sur un Ubuntu Server 14.04 et la rendre accessible depuis internet. Le but étant de fournir un base de données partagée entre plusieurs développeurs pour un projet assez simple.
Nous verrons donc comment récupérer une image Docker de Mongo qui va bien à travers Docker Hub et comment mettre en place quelques mécanismes de sécurité de base (authentification + connexions SSL).
L’article peut paraître assez long mais pas de panique, c’est dû aux explications et aux exemples. Le nombre de commandes à taper n’est pas très important.
C’est parti !
Table des matières
- Installer Docker
- Récupérer une image MongoDB
- Créer des dossiers permanents pour les bases de données MongoDB
- Lancer le server MongoDB en mode authentifié
- Lancer un client Mongo pour créer un super-admin
- Ajouter un utilisateur pour notre base de données
- Encrypter notre connexion avec SSL
Installer Docker
La première chose à faire est d’installer Docker sur notre Ubuntu Server.
Docker étant un projet qui bouge vite (très vite !), on n’utilisera pas directement un apt-get install classique mais la ligne de commande suivante :
Après avoir téléchargé pas mal de choses, Docker devrait être installé correctement. On peut tester avec :
Si ce n’est pas le cas et que vous avez une erreur du style
il faut un peu bidouiller en lançant une installation par apt classique puis une suppression par apt et enfin une réinstallation par la méthode ci-dessus…
Par défaut Docker s’exécute à travers un sudo mais on peut se simplifier un peu la vie en ajoutant notre utilisateur à un groupe docker (ex avec mon login pierrot):
On peut vérifier la bonne installation avec :
Si tout va bien vous devriez voir les lignes suivantes :
sources : https://docs.docker.com/installation/ubuntulinux
Récupérer une image MongoDB
Un des gros avantages de Docker est son Hub qui met à disposition des milliers d’images prêtes à l’utilisation.
On va donc récupérer une image officielle Mongo dans sa dernière version (à ce jour 3.0) :
|
Attention de bien spécifier un tag (ici latest) sinon Docker récupérera TOUTES les versions disponibles ! Et ça en fait quelques unes, je le sais, je n’avais pas mis de tag lors de mes premiers tests….
Docker récupère l’image Mongo :
|
Il est toujours intéressant de jeter un œil à ce qui se passe en coulisse, on peut donc aller décortiquer le DockerFile associé à l’image téléchargée.
sources : https://registry.hub.docker.com/_/mongo/
Créer des dossiers permanents pour les bases de données MongoDB
Afin de pouvoirs sauvegarder les bases de données, on spécifiera à Docker un binding de /data/db (qui est le lieu de stockage par défaut de MongoDB) vers un chemin local.
Si ce n’est pas très clair, pas de soucis ça le sera quelques lignes plus bas. Pour l’instant on crée juste le dossier qui va bien :
|
Lancer le server MongoDB en mode authentifié
|
Explications :
- docker run => on crée un container
- -p 27017:27017 => dont le port 27017 (port par défaut de mongod) sera accessible en dehors du container
- -v <local_rep>:<container_rep> => le dossier /data/db (localisation des bases MongoDB) sera en fait un “lien” vers le dossier que l’on a créé juste au-dessus
- –name my-mongo-dev => nom personnalisé du container
- -d => le container sera lancé en mode démon au sens linux donc en tâche de fond
- mongo => nom de l’image associée au container (i.e. celle que l’on a téléchargé plus tôt)
- mongod –auth => lancement du serveur mongo en mode authentification requise
Si tout va bien, un docker ps nous affiche notre container et un docker logs nous donne les logs de démarrage de notre serveur MongoDB :
sources :
Lancer un client Mongo pour créer un super-admin
À ce stade, il est possible de se connecter à notre serveur de l’extérieur mais nous n’aurons accès à aucune collection (i.e. table) ni en lecture ni en écriture (à part la collection test).
Pour remédier à cela, il nous faut créer un utilisateur “super-admin” qui servira à créer d’autres utilisateurs. Cela se fait avec un client mongo lancé sur le même système que le serveur mongod grâce à la “localhost exception“.
Mais comment accéder au même système que notre serveur qui n’est autre que le container docker lancé en mode démon ? Le plus simple est d’utiliser la commande exec introduite avec la version 1.3 de Docker afin de lancer un client mongo dans le même container :
Ensuite, on crée notre super-admin dans la console mongo :
Nous voilà prêt pour créer d’autres utilisateurs.
sources :
- http://serverfault.com/questions/594281/how-can-i-override-cmd-when-running-a-docker-image
- http://docs.mongodb.org/manual/administration/security/
- http://docs.mongodb.org/manual/tutorial/enable-authentication/
Ajouter un utilisateur pour notre base de données
Il vaut mieux éviter de travailler directement avec le super-admin, on ne va l’utiliser que pour créer d’autres utilisateurs.
Pour avoir quelque chose d’assez simple, on ne va créer qu’un seul utilisateur qui aurait accès en lecture/écriture sur toute la base de données avec laquelle on veut travailler.
On commence par lancer un client mongo sur n’importe quelle machine en se connectant avec notre super-admin :
|
Puis, on switche sur la base de données que l’on veut utiliser (ici kanban) et on crée un admin :
|
On peut maintenant faire le test en se connectant directement sur la base kanban avec notre nouvel utilisateur :
On peut faire le test en se connectant sans les informations du kanbanUser et voir que l’accès est bien restreint :
sources : http://docs.mongodb.org/manual/tutorial/add-user-to-database/
Encrypter notre connexion avec SSL
Le serveur MongoDB peut être lancé pour accepter des connexions cryptées avec SSL. Pour cela, il nous faut un certificat d’authentification et comme nous sommes ici en phase de développement, nous allons créer un certificat auto-signé avec OpenSSL.
On commence par se placer dans le dossier qui va bien et on passe en root.
|
Puis on utilise la commande suivante pour générer un certificat et une clé.
Ensuite on concatène le certificat et la clé dans un fichier .pem et on quitte le mode root.
Il faut maintenant ajouter des arguments à notre serveur MongoDB. Comme nous avons fait en sorte de sauvegarder de manière permanente nos bases de données, on peut simplement supprimer le container existant et en recréer un.
Voilà, notre serveur MongoDB utilise une connexion SSL.
Il ne nous reste plus qu’à modifier la façon de lancer notre client MongoDB en ajoutant les arguments qui vont bien pour un certificat auto-signé.
sources :