Подтвердить что ты не робот

Как включить аутентификацию в MongoDB через Docker?

Я хочу развернуть докер для mongodb:latest, но разрешить только определенным пользователям (пользователям) доступ к определенным db (s) (т.е. включить --auth). Никто больше не должен получать доступ к монгодбу! Как мне сделать это как часть инициации докера?

BTW, data directory находится на хосте, используя при запуске следующую команду: -v /my/own/datadir:/data/db.

4b9b3361

Ответ 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/

Вот что я сделал для той же проблемы, и это сработало.

  1. Запустите экземпляр докера mongo на своем сервере

    docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
    
  2. Откройте 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

  3. Введите оболочку монго, введя монго.

    [email protected]:/# mongo
    
  4. В этом примере я настрою пользователя с именем 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/ (только первая точка)

  5. Выход из оболочки Mongod и Bash.

  6. Остановите экземпляр докера с помощью приведенной ниже команды.

    docker stop mongo
    
  7. Теперь запустите панель монго с включенной аутентификацией.

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

    Ссылка: Как включить аутентификацию на MongoDB через Docker? (ответ усмана Исмаила на этот вопрос)

  8. Мне удалось подключиться к экземпляру, работающему на сервере 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