比方说,我们在烧瓶+ MongoDB应用程序中使用docker和docker-compose,并且需要在flask应用程序内部与数据库进行交互。应该在环境变量中定义用于与数据库交互的数据库用户的用户名和密码,因为这是存储此类数据的最安全方法。我们可以使用三个不同的环境变量,如mongo docker镜像docs所示,其中两个变量对我们来说很有趣,MONGO_INITDB_ROOT_USERNAME
和MONGO_INITDB_ROOT_PASSWORD
。我们可以用这种方式定义root用户,并将其用在flask应用程序中,但这不是最佳的安全实践。现在,如文档中所述,我们可以使用docker-entrypoint-initdb.d/somefile.js
定义另一个用户,但是问题是,我没有找到在js文件中使用环境变量的方法,这意味着如果我定义了变量,让我们例如,MONGO_USER
MONGO_PASS
部分中的docker-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帐户手动创建用户?
答案 0 :(得分:1)
我们尝试了相同的方法,最后得到了一个自定义docker映像来设置数据库帐户。
对于我们的开发环境,我们创建了一个自定义docker映像。使用自定义的入口点脚本创建所需的用户。
但是,这会将密码存储在图像中,并且从不对于任何可公开访问的数据库都不应这样做。在我们这里可以接受,因为该图像仅在开发人员机器上使用。而且我们不使用docker作为开发之外mongodb的部署机制,因此该映像不会在生产中使用。
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"]
#!/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 "$@"