How to enable authentication on MongoDB through Docker?

后端 未结 10 2061
没有蜡笔的小新
没有蜡笔的小新 2020-11-29 18:53

I want to spin-up a docker for mongodb:latest but allow only certain user(s) to access certain db(s) (i.e. enable --auth). No one else should acces

相关标签:
10条回答
  • 2020-11-29 19:12

    you can use env variables to setup username and password for mongo

    MONGO_INITDB_ROOT_USERNAME
    MONGO_INITDB_ROOT_PASSWORD
    

    using simple docker command

    docker run -e MONGO_INITDB_ROOT_USERNAME=my-user MONGO_INITDB_ROOT_PASSWORD=my-password mongo
    

    using docker-compose

    version: '3.1'
    
    services:
    
      mongo:
        image: mongo
        restart: always
        environment:
          MONGO_INITDB_ROOT_USERNAME: my-user
          MONGO_INITDB_ROOT_PASSWORD: my-password
    

    and the last option is to manually access the container and set the user and password inside the mongo docker container

    docker exec -it mongo-container bash
    

    now you can use mongo shell command to configure everything that you want

    0 讨论(0)
  • 2020-11-29 19:13

    Better solutions for furthering:
    https://blog.madisonhub.org/setting-up-a-mongodb-server-with-auth-on-docker/ https://docs.mongodb.com/v2.6/tutorial/add-user-administrator/

    Here's what I did for the same problem, and it worked.

    1. Run the mongo docker instance on your server

      docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
      
    2. Open bash on the running docker instance.

      docker ps
      

      CONTAINER IDIMAGE COMMAND CREATED STATUS PORTS NAMES

      b07599e429fb mongo "docker-entrypoint..." 35 minutes ago Up 35 minutes 0.0.0.0:27017->27017/tcp musing_stallman

      docker exec -it b07599e429fb bash
      root@b07599e429fb:/#
      

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

    3. Enter the mongo shell by typing mongo.

      root@b07599e429fb:/# mongo
      
    4. For this example, I will set up a user named ian and give that user read & write access to the cool_db database.

      > use cool_db
      
      > db.createUser({
          user: 'ian',
          pwd: 'secretPassword',
          roles: [{ role: 'readWrite', db:'cool_db'}]
      })
      

      Reference: https://ianlondon.github.io/blog/mongodb-auth/ (First point only)

    5. Exit from mongod shell and bash.

    6. Stop the docker instance using the below command.

      docker stop mongo
      
    7. Now run the mongo docker with auth enabled.

      docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
      

      Reference: How to enable authentication on MongoDB through Docker? (Usman Ismail's answer to this question)

    8. I was able to connect to the instance running on a Google Cloud server from my local windows laptop using the below command.

      mongo <ip>:27017/cool_db -u ian -p secretPassword
      

      Reference: how can I connect to a remote mongo server from Mac OS terminal

    0 讨论(0)
  • 2020-11-29 19:14

    I have hard time when trying to

    • Create other db than admin
    • Add new users and enable authentication to the db above

    So I made 2020 answer here

    My directory looks like this

    ├── docker-compose.yml
    └── mongo-entrypoint
        └── entrypoint.js
    

    My docker-compose.yml looks like this

    version: '3.4'
    services:
      mongo-container:
        # If you need to connect to your db from outside this container 
        network_mode: host
        image: mongo:4.2
        environment:
            - MONGO_INITDB_ROOT_USERNAME=admin
            - MONGO_INITDB_ROOT_PASSWORD=pass
        ports:
          - "27017:27017"
        volumes:
          - "$PWD/mongo-entrypoint/:/docker-entrypoint-initdb.d/"
        command: mongod
    

    Please change admin and pass with your need.

    Inside mongo-entrypoint, I have entrypoint.js file with this content:

    var db = connect("mongodb://admin:pass@localhost:27017/admin");
    
    db = db.getSiblingDB('new_db'); // we can not use "use" statement here to switch db
    
    db.createUser(
        {
            user: "user",
            pwd: "pass",
            roles: [ { role: "readWrite", db: "new_db"} ],
            passwordDigestor: "server",
        }
    )
    

    Here again you need to change admin:pass to your root mongo credentials in your docker-compose.yml that you stated before. In additional you need to change new_db, user, pass to your new database name and credentials that you need.

    Now you can:

    docker-compose up -d
    

    And connect to this db from localhost, please note that I already have mongo cli, you can install it or you can exec to the container above to use mongo command:

    mongo new_db -u user -p pass
    

    Or you can connect from other computer

    mongo host:27017/new_db -u user -p pass
    

    My git repository: https://github.com/sexydevops/docker-compose-mongo

    Hope it can help someone, I lost my afternoon for this ;)

    0 讨论(0)
  • 2020-11-29 19:15

    a. You can use environment variables via terminal:

    $ docker run -d --name container_name \
          -e MONGO_INITDB_ROOT_USERNAME=admin \
          -e MONGO_INITDB_ROOT_PASSWORD=password \
          mongo
    

    If you like to test if everything works:

    // 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", passwordPrompt())
    
    // Show available databases
    $> show dbs
    

    If you like to instantiate a database on first run, check option b.

    b. You can use environment variables in your docker stack deploy file or compose file for versions 3.4 through 4.1.

    As it is explained on the quick reference section of the official mongo image set MONGO_INITDB_ROOT_USERNAME and MONGO_INITDB_ROOT_PASSWORD in your yaml file:

    mongo:
        image: mongo
        environment:
          MONGO_INITDB_ROOT_USERNAME: admin
          MONGO_INITDB_ROOT_PASSWORD: password
    

    docker-entrypoint.sh file in mongo image checks for the existence of these two variables and sets --auth flag accordingly.

    c. You can also use docker secrets.

    MONGO_INITDB_ROOT_USERNAME and MONGO_INITDB_ROOT_PASSWORD is set indirectly by docker-entrypoint.sh from MONGO_INITDB_ROOT_USERNAME_FILE and MONGO_INITDB_ROOT_PASSWORD_FILE variables:

    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 converts MONGO_INITDB_ROOT_USERNAME_FILE and MONGO_INITDB_ROOT_PASSWORD_FILE to MONGO_INITDB_ROOT_USERNAME and MONGO_INITDB_ROOT_PASSWORD.

    You can use MONGO_INITDB_ROOT_USERNAME and MONGO_INITDB_ROOT_PASSWORD in your .sh or .js scripts in docker-entrypoint-initdb.d folder while initializing database instance.

    When a container is started for the first time it will execute files with extensions .sh and .js that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. .js files will be executed by mongo using the database specified by the MONGO_INITDB_DATABASE variable, if it is present, or test otherwise. You may also switch databases within the .js script.

    This last method is not in the reference docs, so it may not survive an update.

    0 讨论(0)
提交回复
热议问题