Dockerコンテナのmongodbでユーザー作成、パスワード設定をする

Dockerコンテナでmongodbを使っているが、ユーザー作成、パスワード設定など、まったく認証まわりの設定をしていなかったのでメモをしておく

docker-composeでコンテナを作成する

  • 「MONGO_INITDB_ROOT_USERNAME」、「MONGO_INITDB_ROOT_PASSWORD」はユーザーを管理するadminデータベースのユーザーとパスワードを設定する。
  • ユーザー:root
  • パスワード:pass
version: '2'

services:

    mongo:
      image: mongo:3.4
      env_file: .env
      ports:
        - $MONGO_PORT:$MONGO_PORT
      environment:
        - MONGO_INITDB_ROOT_USERNAME=root
        - MONGO_INITDB_ROOT_PASSWORD=pass
      container_name: mongo-db
      restart: always
      privileged: true

コンテナにログインする

docker exec -it mongo-db /bin/bash

mongoコマンドでDBへ繋ぐ

mongo

adminユーザDBを確認する

> use admin

switched to db admin

adminのDBへ切り替わった

docker-composeで設定したユーザー名、パスワードで認証する

> db.auth("root","pass")

1

認証されたら、「1」が返ってくる

管理者ユーザーの確認をする

> db.system.users.find()

{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "GGkn2gqig+GXudesfzDAAvyw==", "storedKey" : "nacHccQ/dk4sdfsfsdfdqwnocvU=", "serverKey" : "5lIjsdsfdjjJHYsd+EZj/+QIltImlc=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

アプリ用のDBへ切り替える

> use appdb

switched to db appdb

アプリ用のユーザーを作成する(特定のデータベースのみ管理者権限をもつユーザの作成)

  • ユーザー:app_user
  • パスワード:app_pass
  • DB名:appdb
  • 権限:dbOwner ※権限がよくわかんないけど、なんか強そうなんで設定した。詳しくは以下のサイトで確認
     http://makaaso.hatenablog.com/entry/2015/08/20/150455
> db.createUser(
   {
     user: "app_user",
     pwd: "app_pass",
     roles:
     [
       {
         role: "dbOwner",
         db: "appdb"
       }
     ]
   }
 )


Successfully added user: {
    "user" : "app_user",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "appdb"
        }
    ]
}

use appdbでDBを切り替えることが大切、もし切り替えしてないと現在のDBでユーザーが作成されてしまう・

ユーザの削除

> use データベース名
> db.system.users.remove({user:"username"})

mongooseでのURI設定はこんな感じ

mongodb://ユーザー:パスワード@ホスト:27017/DB名