如何通过Docker在MongoDB上启用身份验证?

时间:2016-01-01 20:00:09

标签: mongodb docker

我想为mongodb:latest启动一个docker,但只允许某些用户访问某些db(即启用--auth)。没有人应该访问mongodb!作为docker启动的一部分,我该如何做?

BTW,data directory在启动期间使用以下命令位于主机上:-v /my/own/datadir:/data/db

10 个答案:

答案 0 :(得分:60)

如果你看看:

您会注意到docker-entrypoint.sh中使用了两个变量:

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

您可以使用它们来设置root用户。例如,您可以使用以下docker-compose.yml文件:

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

现在,当您按docker-compose up启动容器时,您应注意以下条目:

...
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"
        }
    ]
}

要向root用户添加自定义用户,请使用入口点exectuable脚本(放置在$ docker-compose下的$ PWD / mongo-entrypoint目录下到入口点):

#!/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."

将执行入口点脚本并创建其他用户。

答案 1 :(得分:14)

尝试时我很难过

  • 创建除 admin
  • 以外的其他数据库
  • 添加新用户并启用对上述数据库的身份验证

所以我在这里做了 2020 个回答

我的目录如下

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

我的docker-compose.yml看起来像这样

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

请根据需要更改adminpass

mongo-entrypoint内,我有entrypoint.js个文件,内容如下:

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",
    }
)

再次需要在您之前声明的admin:pass中将docker-compose.yml更改为您的root mongo凭据。另外,您需要将new_dbuserpass更改为所需的新数据库名称和凭据。

现在您可以:

docker-compose up -d

并从本地主机连接到该数据库,请注意,我已经有mongo cli,您可以安装它,也可以执行上述容器以使用mongo命令:

mongo new_db -u user -p pass

或者您可以从其他计算机连接

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

我的git存储库: https://github.com/sexydevops/docker-compose-mongo

希望它能对某人有所帮助,我为此而失去了下午;)

答案 2 :(得分:11)

  

更好的解决方案:
  https://blog.madisonhub.org/setting-up-a-mongodb-server-with-auth-on-docker/   https://docs.mongodb.com/v2.6/tutorial/add-user-administrator/

这是我为同一个问题所做的事情,并且有效。

  1. 在服务器上运行mongo docker实例

    docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
    
  2. 在正在运行的docker实例上打开bash。

    docker ps
    
      

    集装箱身份证明命令创建状态端口名称

         

    b07599e429fb mongo" docker-entrypoint ..." 35分钟前上涨35分钟0.0.0.0:27017->27017/tcp musing_stallman

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

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

  3. 输入mongo输入mongo shell。

    root@b07599e429fb:/# mongo
    
  4. 在本例中,我将设置一个名为ian的用户,并将该用户设为read&写入对cool_db数据库的访问权。

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

    参考:https://ianlondon.github.io/blog/mongodb-auth/(仅限第一点)

  5. 从mongod shell和bash退出。

  6. 使用以下命令停止docker实例。

    docker stop mongo
    
  7. 现在运行启用了auth的mongo docker。

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

    参考:How to enable authentication on MongoDB through Docker?(Usman Ismail对这个问题的回答)

  8. 我可以使用以下命令从本地Windows笔记本电脑连接到Google云端服务器上运行的实例。

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

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

答案 3 :(得分:8)

官方mongo图像的Dockerfile是here。默认命令是mongod,但您可以覆盖以添加--auth开关,假设已经配置了用户。

docker run -d .... mongodb:latest mongod --auth

如果必须创建用户,则需要将启动脚本卷装入/entrypoint.sh以替换默认启动脚本,然后让该脚本创建用户并使用auth开关启动mongo。

docker run -d .... -v $PWD/my_custom_script.sh:/entrypoint.sh mongodb:latest

答案 4 :(得分:5)

我想发表评论,但信誉不够。

上面显示的用户添加可执行脚本必须用 -authenticationDatabase管理员 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 :(得分:4)

@jbochniak:谢谢,虽然刚开始时我觉得我已经发现了所有这些,但事实证明你的例子(特别是Mongo Docker图片的版本)帮助了我!

该版本(v3.4.2)和v3.4(目前对应于v3.4.3)仍然支持“MONGO_INITDB_ROOT”&#39;通过这些变量指定,从v3.5开始(至少标签&#39; 3&#39;和#39;最新&#39;)在你的答案中按照描述工作并在文档中。

我很快看了一下GitHub上的代码,但看到了这些变量的类似用法并且无法立即找到错误,应该在将其作为错误提交之前这样做...

答案 6 :(得分:4)

a。您可以通过终端使用环境变量:

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

b。您可以在Docker堆栈部署文件中使用环境变量,也可以在3.4至4.1版本的Compose文件中使用环境变量。

如您的Yaml文件中的official mongo imageMONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD的快速参考部分所述:

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

docker-entrypoint.sh文件检查这两个变量是否存在,并相应地设置--auth标志。

c。您还可以使用Docker机密。

MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD由docker-entrypoint.sh从MONGO_INITDB_ROOT_USERNAME_FILEMONGO_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将MONGO_INITDB_ROOT_USERNAME_FILEMONGO_INITDB_ROOT_PASSWORD_FILE转换为MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD

初始化数据库实例时,可以在MONGO_INITDB_ROOT_USERNAME文件夹的MONGO_INITDB_ROOT_PASSWORD.sh脚本中使用.jsdocker-entrypoint-initdb.d

首次启动容器时,它将执行在.sh中具有扩展名.js/docker-entrypoint-initdb.d的文件。文件将按字母顺序执行。如果存在,.js文件将由mongo使用MONGO_INITDB_DATABASE变量指定的数据库执行,否则进行测试。您也可以在.js脚本中切换数据库。

最后一个方法不在参考文档中,因此它可能无法在更新后保存下来。

答案 7 :(得分:3)

将.js文件放入入口点init文件夹只适用于此

e.g。 entrypoint.js

var db = connect("mongodb://localhost/admin");

db.createUser(
    {
        user: "yourAdminUserName",
        pwd: "yourAdminPassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)

搬运工-compose.yml:

db:
  image: mongo:3.2
  volumes:
   - /my/own/datadir:/data/db
   - ../mongo-entrypoint:/docker-entrypoint-initdb.d

手工完成其余的工作或更多相同的工作。

如果您愿意,还可以将.sh文件放入init文件夹中以清理文件,使它们不会存在:zz-cleanup.sh。

答案 8 :(得分:2)

使用此图片修复:

使用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

答案 9 :(得分:1)

您可以使用env变量为mongo设置用户名和密码

MONGO_INITDB_ROOT_USERNAME
MONGO_INITDB_ROOT_PASSWORD

使用简单的docker命令

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

使用docker-compose

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: my-user
      MONGO_INITDB_ROOT_PASSWORD: my-password

最后一个选项是手动访问容器,并在mongo docker容器内设置用户和密码

docker exec -it mongo-container bash

现在您可以使用mongo shell命令配置所需的一切