Je veux faire tourner un docker pour mongodb:latest
mais n'autorise que certains utilisateurs à accéder à certaines bases de données (c.-à-d. enable --auth
). Personne d'autre ne devrait avoir accès à mongodb! Comment dois-je faire cela dans le cadre de l'initiation du docker?
BTW, data directory
s'assied sur l'hôte en utilisant la commande suivante lors de l'initiation: -v /my/own/datadir:/data/db
.
Si vous regardez:
vous remarquerez qu'il y a deux variables utilisées dans le docker-entrypoint.sh
:
Vous pouvez les utiliser pour configurer l'utilisateur root. Par exemple, vous pouvez utiliser le suivant docker-compose.yml
fichier:
mongo-container:
image: mongo:3.4.2
environment:
# provide your credentials here
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=rootPassXXX
ports:
- "27017:27017"
volumes:
# if you wish to setup additional user accounts specific per DB or with different roles you can use following entry point
- "$PWD/mongo-entrypoint/:/docker-entrypoint-initdb.d/"
# no --auth is needed here as presence of username and password add this option automatically
command: mongod
Maintenant, lors du démarrage du conteneur par docker-compose up
vous devriez remarquer les entrées suivantes:
...
I CONTROL [initandlisten] options: { net: { bindIp: "127.0.0.1" }, processManagement: { fork: true }, security: { authorization: "enabled" }, systemLog: { destination: "file", path: "/proc/1/fd/1" } }
...
I ACCESS [conn1] note: no users configured in admin.system.users, allowing localhost access
...
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
Pour ajouter des utilisateurs personnalisés en dehors de root, utilisez le script exécutable entrypoint (placé sous le répertoire $ PWD/mongo-entrypoint lorsqu’il est monté dans docker-compose
au point d'entrée):
#!/usr/bin/env bash
echo "Creating mongo users..."
mongo admin --Host localhost -u USER_PREVIOUSLY_DEFINED -p PASS_YOU_PREVIOUSLY_DEFINED --eval "db.createUser({user: 'ANOTHER_USER', pwd: 'PASS', roles: [{role: 'readWrite', db: 'xxx'}]}); db.createUser({user: 'admin', pwd: 'PASS', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]});"
echo "Mongo users created."
Le script Entrypoint sera exécuté et des utilisateurs supplémentaires seront créés.
De meilleures solutions pour faire avancer:
https://blog.madisonhub.org/setting-up-a-mongodb-server-with-auth-on-docker/https: // docs. mongodb.com/v2.6/tutorial/add-user-administrator/
Voici ce que j'ai fait pour le même problème, et cela a fonctionné.
Exécutez l'instance de donger Mongo sur votre serveur
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
Ouvrez bash sur l'instance de docker en cours d'exécution.
docker ps
NOM DES PORTS DE STATUT CRÉÉS PAR LE COMMAND D'IDIMAGE DU CONTENANT
b07599e429fb mongo "docker-entrypoint ..." il y a 35 minutes Up 35 minutes 0.0.0.0:27017->27017/tcp musing_stallman
docker exec -it b07599e429fb bash
root@b07599e429fb:/#
Entrez dans le shell mongo en tapant mongo.
root@b07599e429fb:/# mongo
Pour cet exemple, je vais configurer un utilisateur nommé ian et lui donner un accès en lecture et en écriture à la base de données cool_db.
> use cool_db
> db.createUser({
user: 'ian',
pwd: 'secretPassword',
roles: [{ role: 'readWrite', db:'cool_db'}]
})
Référence: https://ianlondon.github.io/blog/mongodb-auth/ (premier point seulement)
Sortez de Mongod Shell et Bash.
Arrêtez l'instance de docker à l'aide de la commande ci-dessous.
docker stop mongo
Maintenant, lancez le docker Mongo avec l'authentification activée.
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
Référence: Comment activer l'authentification sur MongoDB via Docker? (La réponse d'Usman Ismail à cette question)
J'ai pu me connecter à l'instance s'exécutant sur un serveur Google Cloud à partir de mon ordinateur portable Windows local à l'aide de la commande ci-dessous.
mongo <ip>:27017/cool_db -u ian -p secretPassword
Référence: comment puis-je me connecter à un serveur Mongo distant depuis un terminal Mac OS
Le Dockerfile pour l'image mongo officielle est ici . La commande par défaut est mongod, mais vous pouvez remplacer le commutateur --auth en supposant que les utilisateurs sont déjà configurés.
docker run -d .... mongodb:latest mongod --auth
Si l'utilisateur doit être créé, vous devez monter en volume un script de démarrage dans /entrypoint.sh
pour remplacer le script de démarrage par défaut, puis laisser ce script créer des utilisateurs et démarrer mongo avec le commutateur auth.
docker run -d .... -v $PWD/my_custom_script.sh:/entrypoint.sh mongodb:latest
a. Vous pouvez utiliser des variables d’environnement via un terminal:
$ docker run -d --name container_name \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=password \
mongo
Si vous aimez tester si tout fonctionne:
// ssh into the running container
// Change container name if necessary
$ docker exec -it mongo /bin/bash
// Enter into mongo Shell
$ mongo
// Caret will change when you enter successfully
// Switch to admin database
$> use admin
$> db.auth("admin", "password")
// Show available databases
$> show dbs
Si vous souhaitez instancier une base de données lors de la première exécution, cochez l'option b.
b. Vous pouvez utiliser des variables d’environnement dans votre fichier de déploiement de pile de docker ou de composition de fichier pour les versions 3.4 à 4.1.
Comme il est expliqué dans la section de référence rapide de image mongo officielle , définissez MONGO_INITDB_ROOT_USERNAME
Et MONGO_INITDB_ROOT_PASSWORD
Dans votre fichier yaml:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
docker-entrypoint.sh Le fichier dans l'image mongo vérifie l'existence de ces deux variables et définit l'indicateur --auth
en conséquence.
c. Vous pouvez également utiliser les secrets du menu fixe.
MONGO_INITDB_ROOT_USERNAME
Et MONGO_INITDB_ROOT_PASSWORD
Sont définis indirectement par les variables docker-entrypoint.sh à partir des variables MONGO_INITDB_ROOT_USERNAME_FILE
Et MONGO_INITDB_ROOT_PASSWORD_FILE
:
mongo:
image: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME_FILE=/run/secrets/db_root_username
- MONGO_INITDB_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
secrets:
- db_root_username
- db_root_password
docker-entrypoint.sh convertit MONGO_INITDB_ROOT_USERNAME_FILE
et MONGO_INITDB_ROOT_PASSWORD_FILE
en MONGO_INITDB_ROOT_USERNAME
et MONGO_INITDB_ROOT_PASSWORD
.
Vous pouvez utiliser MONGO_INITDB_ROOT_USERNAME
Et MONGO_INITDB_ROOT_PASSWORD
Dans vos scripts .sh
Ou .js
Dans le dossier docker-entrypoint-initdb.d
Lors de l'initialisation de l'instance de base de données.
Lorsqu'un conteneur est démarré pour la première fois, il exécute des fichiers avec les extensions .sh
Et .js
Qui se trouvent dans /docker-entrypoint-initdb.d
. Les fichiers seront exécutés dans l'ordre alphabétique. Les fichiers .js
Seront exécutés par mongo à l'aide de la base de données spécifiée par la variable MONGO_INITDB_DATABASE
, Si elle est présente, ou testez autrement. Vous pouvez également changer de base de données dans le script .js
.
Cette dernière méthode ne figure pas dans les documents de référence, elle risque donc de ne pas survivre à une mise à jour.
Je veux commenter mais je n'ai pas assez de réputation.
Le script exécutable ajoutant l'utilisateur affiché ci-dessus doit être modifié avec - authenticationDatabase admin et [~ # ~] newdatabasename [~ # ~] .
mongo --authenticationDatabase admin --Host localhost -u USER_PREVIOUSLY_DEFINED -p PASS_YOU_PREVIOUSLY_DEFINED NEWDATABASENAME --eval "db.createUser({user: 'NEWUSERNAME', pwd: 'PASSWORD', roles: [{role: 'readWrite', db: 'NEWDATABASENAME'}]});"
Il suffit pour cela de déposer un fichier .js dans le dossier init du point d’entrée.
par exemple. entrypoint.js
var db = connect("mongodb://localhost/admin");
db.createUser(
{
user: "yourAdminUserName",
pwd: "yourAdminPassword",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
docker-compose.yml:
db:
image: mongo:3.2
volumes:
- /my/own/datadir:/data/db
- ../mongo-entrypoint:/docker-entrypoint-initdb.d
Faire le reste à la main ou plusieurs des mêmes œuvres.
Si vous le souhaitez, vous pouvez également déposer un fichier .sh dans le dossier init pour nettoyer les fichiers de manière à ce qu'ils ne se trouvent pas: zz-cleanup.sh.
@jbochniak: Merci, même si au début, je pensais avoir déjà découvert tout cela, il s'est avéré que votre exemple (en particulier la version de l'image de Mongo Docker) m'a aidé!
Cette version (v3.4.2) et la v3.4 (correspondant actuellement à la v3.4.3) prennent toujours en charge "MONGO_INITDB_ROOT" spécifié via ces variables, à partir de la v3.5 (au moins les balises "3" et "dernière"). ) NE PAS travailler comme décrit dans votre réponse et dans la documentation.
J'ai rapidement regardé le code sur GitHub, mais j'ai constaté une utilisation similaire de ces variables et je ne pouvais pas trouver le bogue immédiatement. Nous devrions le faire avant de le classer comme bogue ...
utilisez ces images pour corriger:
Avec docker-compose.yml
services:
db:
image: aashreys/mongo-auth:latest
environment:
- AUTH=yes
- MONGODB_ADMIN_USER=admin
- MONGODB_ADMIN_PASS=admin123
- MONGODB_APPLICATION_DATABASE=sample
- MONGODB_APPLICATION_USER=aashrey
- MONGODB_APPLICATION_PASS=admin123
ports:
- "27017:27017"
// more configuration