web-dev-qa-db-fra.com

Comment activer l'authentification sur MongoDB via Docker?

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.

44
user706838

Si vous regardez:

vous remarquerez qu'il y a deux variables utilisées dans le docker-entrypoint.sh:

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

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.

63
jbochniak

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

  1. Exécutez l'instance de donger Mongo sur votre serveur

    docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
    
  2. 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:/#
    

    Référence- https://github.com/arunoda/meteor-up-legacy/wiki/Accessing-the-running-Mongodb-docker-container-from-command-line-on-EC2

  3. Entrez dans le shell mongo en tapant mongo.

    root@b07599e429fb:/# mongo
    
  4. 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)

  5. Sortez de Mongod Shell et Bash.

  6. Arrêtez l'instance de docker à l'aide de la commande ci-dessous.

    docker stop mongo
    
  7. 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)

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

16

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
8
Usman Ismail

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.

8
SnnSnn

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'}]});"

https://i.stack.imgur.com/MdyXo.png

5
Che-Hao Kang

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.

4
Shapeshifter

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

4
Frederik

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
2
Mark Simon