【问题标题】:Creating a mongodb user from env variables从环境变量创建一个 mongodb 用户
【发布时间】:2020-08-16 14:08:31
【问题描述】:

假设我们在烧瓶 + MongoDB 应用程序中使用 docker 和 docker-compose,我们需要在烧瓶应用程序中与数据库进行交互。用于与数据库交互的 DB 用户的用户名和密码应在环境变量中定义,因为这是存储此类数据的最安全方式。我们可以使用三个不同的环境变量,如 mongo docker 镜像 docs 所示,其中两个变量对我们来说很有趣,MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD。我们可以以这种方式定义 root 用户并在我们的烧瓶应用程序中使用它,但这不是最佳安全实践。现在,如文档中所述,我们可以使用docker-entrypoint-initdb.d/somefile.js 定义另一个用户,但问题是,我没有找到在 js 文件中使用环境变量的方法,这意味着如果我定义了变量,比方说, MONGO_USERMONGO_PASSdocker-compose.yml environemnt 部分内,我将无法使用它们来创建数据库非 root 用户。

如果我可以在 js 文件中使用环境变量,该文件将类似于下面的文件。

db.createUser(
    {
        user: $MONGO_USER,
        pwd: $MONGO_PASS,
        roles: [
            {
                role: "readWrite",
                db: "my_database"
            }
        ]
    }
);

显然,不幸的是,我不能像这样在 js 文件中使用环境变量。

我的问题是.. 在使用 docker-compse 和 docker mongo image 时,如何使用环境变量创建 非 root 用户?访问 MongoDB 数据库是否有更好的做法?在启动容器时,我是否应该根本不以编程方式创建数据库用户?容器启动后,我是否可以使用 root 帐户手动创建用户?

【问题讨论】:

    标签: mongodb docker docker-compose environment-variables


    【解决方案1】:

    我们尝试了相同的路线,最终使用自定义 docker 映像设置数据库帐户。

    对于我们的开发环境,我们创建了一个自定义 docker 映像。使用自定义入口点脚本创建所需的用户。

    然而,这会将密码存储在图像中,并且对于任何可公开访问的数据库绝不应该这样做。这在我们这里是可以接受的,因为这个图像只在开发者机器上使用。而且我们在开发之外不使用 docker 作为 mongodb 的部署机制,所以这个镜像在生产中使用是没有风险的。

    Dockerfile

    FROM mongo:3.6
    
    RUN mkdir -p /var/lib/mongodb && chmod ugo+rwx /var/lib/mongodb
    
    COPY entrypoint.sh /
    RUN chmod +x /entrypoint.sh
    
    ENTRYPOINT ["/entrypoint.sh"]
    
    CMD ["mongod", "--auth", "--smallfiles", "--bind_ip_all", "--dbpath", "/var/lib/mongodb"]
    

    entrypoint.sh

    #!/bin/bash
    # MongoDB Entrypoint
    
    echo "MongoDB Entrypoint called"
    
    # run mongod WITHOUT auth
    mongod --smallfiles --dbpath /var/lib/mongodb &
    sleep 10
    
    # setup
    echo "db.system.version.remove({});" | mongo admin
    echo "db.system.version.insert({ '_id' : 'authSchema', 'currentVersion' : 3 });" | mongo admin
    
    # add users
    echo "db.createUser({user: 'admin',             pwd: '***', roles: ['root']});"      | mongo admin
    echo "db.createUser({user: 'service',           pwd: '***', roles: ['readWrite']});" | mongo service
    # echo "db.dropUser('test2');"                                                       | mongo test2
    
    # shutdown server WITHOUT auth
    mongod --dbpath /var/lib/mongodb --shutdown
    
    # execute any further commands
    exec "$@"
    

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多