ITよろづや

ITの参考になる情報を備忘録代わりに残していきます

MongoDB3系でユーザーを作成し、認証を有効にする設定

自宅で色々と検証をしているんですが、会社でwikiサービスを導入すると情報共有ができて便利です。エクセルとかの場合は、中身まで簡単にチェック、検索ができないのがつらいので、wikiサービスを活用すると業務効率があがります。


そして、wikiサービスで使用するために、CentOS7.4にMongoDB 3.6.4をインストールしたんですが、デフォルトではDBに接続すると以下のエラーが出力されてしまいます。

 

以下はエラー結果

----
[root@localhost ~]# mongo --host 127.0.0.1:27017
MongoDB shell version v3.6.4
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.4
Server has startup warnings:
2018-0x-xxT14:43:41.456+0900 I CONTROL [initandlisten]
2018-0x-xxT14:43:41.456+0900 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-0x-xxT14:43:41.456+0900 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-0x-xxT14:43:41.456+0900 I CONTROL [initandlisten]
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten]
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten]
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten]
----


出ているエラーは3種類で、一つは「Access control is not enabled for the database」 で「Read and write access to data and configuration is unrestricted」とあるように、ユーザー定義されておらず、制限がされていない為、認証なしにDBにアクセスできてしまうことを指しています。検証くらいだったらいいですが、会社のシステムの一部として利用するなら設定しておいたほうがいいですね。


こちら、色々と調べて別記事に対処法を書いていますが、今回は、敢えてDBのユーザー設定という観点で記載します。

 

MongoDB3系でユーザーを作成し、認証を有効にする設定

WARNING: Access control is not enabled for the databaseを消す方法イコール、ユーザーを定義することになります。


以下は手順です。

 

keyfileの作成
# mkdir -p /usr/local/mongodb/conf
# openssl rand -base64 741 > /usr/local/mongodb/conf/mongodb-keyfile

 

権限の設定
# chmod 600 /usr/local/mongodb/conf/mongodb-keyfile
# chown -R mongod.mongod /usr/local/mongodb/conf/mongodb-keyfile

# vi /etc/mongod.conf
----
security:
keyFile: /usr/local/mongodb/conf/mongodb-keyfile
-----

 

サービス再起動
# systemctl restart mongod


接続してみて、エラーが表示されないことを確認します。


[root@localhost ~]# mongo --host 127.0.0.1:27017
MongoDB shell version v3.6.4
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.4
>

 

管理ユーザを作成

# mongo

------
> use admin
switched to db admin

> db.createUser({user:"ユーザー名",pwd:"パスワード",roles:[{role:"userAdminAnyDatabase",db:"DB名"}]})
Successfully added user: {
"user" : "ユーザー名",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "DB名"
}
]
}
------

 

ユーザー名、パスワードは環境に応じて変更してください。

# vi /etc/mongod.conf
------
security:
keyFile: /usr/local/mongodb/conf/mongodb-keyfile
authorization: enabled
------

# systemctl restart mongod

# mongo
> use admin
switched to db admin

> db.auth("ユーザー名","パスワード")
1

※「1」で成功。

とりあえず管理者ユーザーまでの作成が完了しました。


ちなみに、DBに対して権限を与えるだけで使えるようになりますので、例えば、すでに「TestDB」というデータベースがある場合は、以下の手順でユーザー作成、権限を付与します。

> use TestDB

> db.createUser({user:"test",pwd:"test",roles:[{role:"readWrite",db:"TestDB"}]})

Ctrl+Cで抜けて、testユーザで接続

# mongo -u "test" -p "test" --authenticationDatabase "TestDB"

# use TestDB

以下のコマンドでエラーが出なければ問題ないはずです。

# show collections


後はアプリケーション側でユーザー名、パスワードを指定してから接続してみてDBが接続できればOKです。