在Docker容器中保护Mongo

时间:2016-02-05 11:13:38

标签: mongodb docker

目前正在考虑在容器中部署mongo。到目前为止我的文件看起来像,

############################################################
# Dockerfile to build Mongo Containers
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu:14.04

# File Author / Maintainer
MAINTAINER Maintaner felix001

# Create repo file
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.0.list

# Update the default application repository sources list
RUN apt-get update && apt-get install -y \
    mongodb-org \
    vim

# Create the MongoDB data directory
RUN mkdir -p /data/db

# Expose port 27017 from the container to the host
EXPOSE 27017

# Set usr/bin/mongod as the dockerized entry-point application
ENTRYPOINT ["/usr/bin/mongod"]

但是我需要锁定mongo,因此您需要密码才能执行任何管理操作并创建数据库/用户。所以我的问题是2折,

  1. 保护的最佳方法是什么?到目前为止,我有,

    vim /etc/mongod.conf
    + auth = true
    
    use admin
    db.createUser({ user:"admin", pwd:"secretpassword", roles: ["dbAdminAnyDatabase","clusterAdmin"]})
    
    use example
    db.createUser({ user:"user1", pwd:"abc123", roles:["readWrite"] })
    
  2. 将此添加到Dockerfile的最佳方法是什么?

  3. 谢谢,

2 个答案:

答案 0 :(得分:2)

我不建议"烘焙"凭据到您的图像。您创建的每个数据库都将具有相同的密码。

有关示例,请查看tutum mongodb图像,其中容器运行脚本在启动时设置密码:

最后,我将向您介绍有关密码使用环境变量的相关问题:

答案 1 :(得分:1)

这是我如何保护我的 MongoDB docker 容器。
以下分步过程将指导您实施安全性。

解决方案 1:使用环境变量

一个简单的解决方案是在 docker run 命令时使用环境变量

$ docker run -d -p 27017:27017 --name mongodb -v /var/docker/mongo/data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=superuser \
-e MONGO_INITDB_ROOT_PASSWORD=Strong_Password \
mongo:4.4.2

当您尝试使用 MongoDB-Compass 等 MongoDB 客户端进行访问时,您必须提供用户名和密码才能访问数据库。

解决方案 2:在 MongoDB 数据库中创建用户(推荐方法)

  • 使用 auth 选项创建 docker 容器
$ docker run --name <container_name> --restart=always -d -p 27017:27017 mongo mongod --auth
  • 猛击容器
$ sudo docker exec -it <container_name> bash
  • 连接本地mongo实例
    # mongo

  • 创建第一个管理员用户

> use admin
> db.createUser({
    user: 'user',
    pwd: 'StrongPassword',
    roles: [{ role: 'dbOwner', db:'admin'}]
})
  • 退出mongo shell
    > exit

  • 退出容器
    # exit

现在您可以使用用户名和密码进行连接。记得使用 --authenticationDatabase "admin"

mongo -u "user" -p "StrongPassword" YOURHOSTIP --authenticationDatabase "admin"

您还可以通过 MongoDB-Compass 连接到 mongo 容器。我使用以下连接字符串进行连接。如果无法连接,请仔细检查您的字符串

mongodb://user:*****@IP:27017/?authSource=admin&compressors=zlib&readPreference=primary&gssapiServiceName=mongodb&appname=MongoDB%20Compass&ssl=false

参考: https://gist.github.com/davideicardi/f2094c4c3f3e00fbd490#file-mongo-docker-bash-L23