Как включить аутентификацию в MongoDB через Docker?
Я хочу развернуть докер для mongodb:latest
, но разрешить только определенным пользователям (пользователям) доступ к определенным db (s) (т.е. включить --auth
). Никто больше не должен получать доступ к монгодбу! Как мне сделать это как часть инициации докера?
BTW, data directory
находится на хосте, используя при запуске следующую команду: -v /my/own/datadir:/data/db
.
Ответы
Ответ 1
Если вы посмотрите на:
вы заметите, что в 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, используйте сценарий точки входа (помещается в каталог $ PWD/mongo-entrypoint dir, когда он монтируется в docker-compose
к точке входа):
#!/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."
Сценарий входа будет выполнен, и будут созданы дополнительные пользователи.
Ответ 2
Better solutions for furthering:
https://blog.madisonhub.org/setting-up-a-mongodb-server-with-auth-on-docker/
https://docs.mongodb.com/v2.6/tutorial/add-user-administrator/
Вот что я сделал для той же проблемы, и это сработало.
Запустите экземпляр докера mongo на своем сервере
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
Откройте bash на работающем экземпляре Docker.
docker ps
ИМЯ КОНТЕЙНЕРА СОЗДАЕТ СОЗДАНИЕ ПОРТОВ ИМЯ
b07599e429fb mongo "docker-entrypoint..." 35 минут назад вверх 35 минут 0.0.0.0:27017->27017/tcp musing_stallman
docker exec -it b07599e429fb bash
[email protected]:/#
Reference- https://github.com/arunoda/meteor-up-legacy/wiki/Accessing-the-running-Mongodb-docker-container-from-command-line-on-EC2
Введите оболочку монго, введя монго.
[email protected]:/# 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 и Bash.
Остановите экземпляр докера с помощью приведенной ниже команды.
docker stop mongo
Теперь запустите панель монго с включенной аутентификацией.
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
Ссылка: Как включить аутентификацию на MongoDB через Docker? (ответ усмана Исмаила на этот вопрос)
Мне удалось подключиться к экземпляру, работающему на сервере Google Cloud, с моего локального ноутбука Windows с помощью следующей команды.
mongo <ip>:27017/cool_db -u ian -p secretPassword
Справка: как я могу подключиться к удаленному серверу Монго из терминала Mac OS
Ответ 3
а. Вы можете использовать переменные окружения через терминал:
$ 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.
б. Вы можете использовать переменные среды в файле развертывания стека докеров или создать файл для версий с 3.4 по 4.1.
Как объясняется в разделе кратких справок официального изображения монго, установите MONGO_INITDB_ROOT_USERNAME
и MONGO_INITDB_ROOT_PASSWORD
в файле yaml:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
файл docker-entrypoint.sh в образе монго проверяет наличие этих двух переменных и соответственно устанавливает флаг --auth
.
с. Вы также можете использовать секреты докера.
MONGO_INITDB_ROOT_USERNAME
и MONGO_INITDB_ROOT_PASSWORD
устанавливаются косвенно с помощью docker-entrypoint.sh из переменных MONGO_INITDB_ROOT_USERNAME_FILE
и MONGO_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_FILE
в MONGO_INITDB_ROOT_USERNAME
и MONGO_INITDB_ROOT_PASSWORD
.
Вы можете использовать MONGO_INITDB_ROOT_USERNAME
и MONGO_INITDB_ROOT_PASSWORD
в своих скриптах .sh
или .js
в папке docker-entrypoint-initdb.d
при инициализации экземпляра базы данных.
Когда контейнер запускается в первый раз, он будет выполнять файлы с расширениями .sh
и .js
, которые находятся в /docker-entrypoint-initdb.d
. Файлы будут выполнены в алфавитном порядке. Файлы .js
будут выполняться mongo с использованием базы данных, указанной в переменной MONGO_INITDB_DATABASE
, если она есть, или протестировать иначе. Вы также можете переключать базы данных в скрипте .js
.
Этот последний метод отсутствует в справочных документах, поэтому он может не выдержать обновления.
Ответ 4
Файл Docker для официального изображения mongo здесь. Команда по умолчанию - mongod, но вы можете переопределить, чтобы добавить переключатель --auth, если пользователь уже настроен.
docker run -d .... mongodb:latest mongod --auth
Если пользователь должен быть создан, вам необходимо объединить старт файл script в /entrypoint.sh
, чтобы заменить запуск по умолчанию script, а затем создать script пользователей и запустить mongo с помощью auth-переключателя.
docker run -d .... -v $PWD/my_custom_script.sh:/entrypoint.sh mongodb:latest
Ответ 5
Для этого просто добавьте файл .js в папку инициализации точки входа.
например 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.
Ответ 6
@jbochniak: Спасибо, хотя сначала прочитал, я думал, что я уже все это обнаружил, оказалось, что ваш пример (например, версия изображения Mongo Docker) помог мне!
Эта версия (v3.4.2) и v3.4 (в настоящее время соответствующая v3.4.3) по-прежнему поддерживает "MONGO_INITDB_ROOT", указанный через эти переменные, по версии 3.5 (по крайней мере, теги "3" и " последний) НЕ РАБОТАЕТ, как описано в вашем ответе и в документах.
Я быстро просмотрел код на GitHub, но видел подобное использование этих переменных и не мог найти ошибку сразу, должен сделать это, прежде чем подавать это как ошибку...
Ответ 7
Я хочу комментировать, но у меня недостаточно репутации.
Показанный выше исполняемый скрипт для добавления пользователя должен быть изменен с помощью
--authenticationDatabase admin и 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
Ответ 8
используйте эти изображения для исправления:
С 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