web-dev-qa-db-ja.com

Dockerを介してMongoDBで認証を有効にする方法

mongodb:latestのドッカーをスピンアップしますが、特定のユーザーのみが特定のdbにアクセスできるようにします(つまり、--authを有効にします)。誰もmongodbにアクセスしないでください! Docker開始の一部としてこれを行うにはどうすればよいですか?

ところで、data directoryは、開始時に次のコマンドを使用することでホストに配置されます:-v /my/own/datadir:/data/db

44
user706838

あなたが見てみると:

docker-entrypoint.shには2つの変数が使用されていることがわかります。

  • 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以外のカスタムユーザーを追加するには、entpointpoint exectuableスクリプト(docker-composeでentrypointにマウントされているため、$ PWD/mongo-entrypoint dirの下に配置)を使用します。

#!/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."

エントリポイントスクリプトが実行され、追加のユーザーが作成されます。

63
jbochniak

推進のためのより良いソリューション:
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インスタンスを実行します

    docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
    
  2. 実行中のdockerインスタンスでbashを開きます。

    docker ps
    

    コンテナーIDコマンド作成ステータスポート名

    b07599e429fb mongo "docker-entrypoint ..." 35分前アップ35分0.0.0.0:27017->27017/tcp musing_stallman

    docker exec -it b07599e429fb bash
    root@b07599e429fb:/#
    

    リファレンス- https://github.com/arunoda/meteor-up-legacy/wiki/Accessing-the-running-Mongodb-docker-container-from-command-line-on-EC2

  3. Mongoと入力してmongoシェルに入ります。

    root@b07599e429fb:/# 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 Shellとbashを終了します。

  6. 以下のコマンドを使用して、Dockerインスタンスを停止します。

    docker stop mongo
    
  7. 認証を有効にしてmongo dockerを実行します。

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

    リファレンス: Dockerを介してMongoDBで認証を有効にする方法 (この質問に対するUsman Ismailの回答)

  8. 以下のコマンドを使用して、ローカルのWindowsラップトップからGoogle Cloudサーバーで実行されているインスタンスに接続できました。

    mongo <ip>:27017/cool_db -u ian -p secretPassword
    

    参照: Mac OS端末からリモートmongoサーバーに接続する方法

16

公式のmongoイメージのDockerfileは here です。デフォルトのコマンドはmongodですが、ユーザーがすでに設定されていると仮定して、上書きして--authスイッチを追加できます。

docker run -d .... mongodb:latest mongod --auth

ユーザーを作成する必要がある場合は、スタートアップスクリプトを/entrypoint.shにボリュームマウントしてデフォルトのスタートアップスクリプトを置き換え、そのスクリプトでユーザーを作成し、authスイッチでmongoを起動する必要があります。

docker run -d .... -v $PWD/my_custom_script.sh:/entrypoint.sh mongodb:latest
8
Usman Ismail

a。ターミナル経由で環境変数を使用できます:

$ 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", "password")

// Show available databases
$> show dbs

初回実行時にデータベースをインスタンス化する場合は、オプションbをオンにします。

b。バージョン3.4から4.1のdockerスタックデプロイファイルまたは構成ファイルで環境変数を使用できます。

公式mongoイメージ のクイックリファレンスセクションで説明されているように、yamlファイルでMONGO_INITDB_ROOT_USERNAMEおよびMONGO_INITDB_ROOT_PASSWORDを設定します。

mongo:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password

docker-entrypoint.sh mongoイメージ内のファイルは、これら2つの変数の存在をチェックし、それに応じて--authフラグを設定します。

c。ドッカーシークレットを使用することもできます。

MONGO_INITDB_ROOT_USERNAMEおよびMONGO_INITDB_ROOT_PASSWORDは、MONGO_INITDB_ROOT_USERNAME_FILEおよびMONGO_INITDB_ROOT_PASSWORD_FILE変数からdocker-entrypoint.shによって間接的に設定されます。

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_FILEMONGO_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_INITDB_DATABASE変数で指定されたデータベースが存在する場合、それを使用してmongoによって実行されるか、そうでない場合はテストされます。 .jsスクリプト内でデータベースを切り替えることもできます。

この最後の方法はリファレンスドキュメントに含まれていないため、更新後も存続しない場合があります。

8
SnnSnn

コメントしたいのですが、評判が足りません。

上記のユーザー追加実行可能スクリプトは、-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

5
Che-Hao Kang

エントリポイントのinitフォルダーに.jsファイルをドロップするだけで機能します

例えばentrypoint.js

var db = connect("mongodb://localhost/admin");

db.createUser(
    {
        user: "yourAdminUserName",
        pwd: "yourAdminPassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)

docker-compose.yml:

db:
  image: mongo:3.2
  volumes:
   - /my/own/datadir:/data/db
   - ../mongo-entrypoint:/docker-entrypoint-initdb.d

残りの作業を手作業で行うか、同じ作業を続けます。

必要に応じて、.shファイルをinitフォルダーにドロップして、ファイルが整理されないようにクリーンアップすることもできます:zz-cleanup.sh。

4
Shapeshifter

@jbochniak:ありがとう、最初読んで私はすでにこのすべてを発見したと思っていましたが、あなたの例(特にMongo Dockerイメージのバージョン)が私を助けてくれました!

そのバージョン(v3.4.2)およびv3.4(現在はv3.4.3に対応)は、これらの変数で指定された 'MONGO_INITDB_ROOT'を引き続きサポートしていますv3.5以降(少なくともタグ '3'および 'latest' )説明どおりに機能しない回答およびドキュメントで。

私はすぐにGitHubのコードを見ましたが、これらの変数の同様の使用法を見て、すぐにバグを見つけることができませんでした、バグとしてこれを提出する前にそうするべきです...

4
Frederik

この画像を使用して修正します。

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
2
Mark Simon