当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何通过Docker在MongoDB上启用身份验证?》经验,为你挑选了5个好方法。

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

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



1> jbochniak..:

如果你看看:

https://github.com/docker-library/mongo/blob/27f2722bb2ebd26354321adc8c3f19f7958529e1/3.4/Dockerfile

https://github.com/docker-library/mongo/blob/27f2722bb2ebd26354321adc8c3f19f7958529e1/3.4/docker-entrypoint.sh

你会注意到有两个变量用于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."

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


我切换到使用用户名和密码环境变量(如您在答案中所示),以便我的mongo实例可以自动以身份验证模式启动.之前,我必须启动它不安全,使用docker-entrypoint .js脚本创建我的用户,然后以身份验证模式重新启动实例.当我尝试使用您的bash脚本来创建新用户时(在新的数据库中 - 而不是管理员),我收到了身份验证失败的错误.我试着直接在我正在运行的mongo容器中运行,但我仍然得到同样的错误.您能想到的任何理由吗?
如果您在数据库中创建了其他用户,那么您可能需要提供额外的选项`--authenticationDatabase`来告诉服务器在哪里查找您要进行身份验证的用户.您可以通过两种方式验证身份验证是否有效: - 从shell连接到`mongo DB --host -u USER -p PASS --authenticationDatabase DB` - 或通过localhost模式连接:`mongo --host localhost`然后`use YOUR_DB`后跟`db.auth("USER","PASS")`

2> Sankaran Sri..:

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

这就是我为同样的问题所做的,并且它起作用了.

    在服务器上运行mongo docker实例

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

    在正在运行的docker实例上打开bash.

    docker ps
    

    容器IDIMAGE命令创建状态端口名称

    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

    键入mongo输入mongo shell.

    root@b07599e429fb:/# mongo
    

    对于此示例,我将设置一个名为ian的用户,并为该用户提供对cool_db数据库的读写访问权限.

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

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

    从mongod shell和bash退出.

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

    docker stop mongo
    

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

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

    参考:如何通过Docker在MongoDB上启用身份验证?(Usman Ismail对这个问题的回答)

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

    mongo :27017/cool_db -u ian -p secretPassword
    

    参考:如何从Mac OS终端连接到远程mongo服务器


@Eric是的,你必须在再次运行'run'命令之前停止正在运行的docker实例.我已用此信息更新了答案.谢谢你指出.

3> SnnSnn..:

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

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

如果您想测试一切是否正常:

// 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

如果要在首次运行时实例化数据库,请选中选项b。

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

正如官方mongo映像集的快速参考部分MONGO_INITDB_ROOT_USERNAME以及MONGO_INITDB_ROOT_PASSWORD您的yaml文件中所述:

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

mongo映像中的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_FILE和转换MONGO_INITDB_ROOT_PASSWORD_FILEMONGO_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。文件将按字母顺序执行。.jsmongo将使用MONGO_INITDB_DATABASE变量指定的数据库(如果存在)执行文件,否则进行测试。您也可以在.js脚本内切换数据库。

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



4> Usman Ismail..:

官方mongo图像的Dockerfile就在这里.默认命令是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



5> Shapeshifter..:

只需将.js文件放入入口点init文件夹中即可

例如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

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

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

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有