よろづやアンテナ

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

CentOS7 MongoDB3系でAccess control is not enabled for the database警告

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にアクセスできてしまうことを指しています。検証くらいだったらいいですが、会社のシステムの一部として利用するなら設定しておいたほうがいいですね。


続いて、こちらですが「THP」が有効になっていると表示されるようで、公式によるとMongoDBのパフォーマンスを最大限出すためには、無効にしたほうがいいとのこと。


Disable Transparent Huge Pages (THP)¶

https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

 

「/sys/kernel/mm/transparent_hugepage/enabled is 'always'.」
「/sys/kernel/mm/transparent_hugepage/defrag is 'always'.」

 

Transparent Huge Pages(THP)は、大きなメモリーページを使用して大量のメモリーを持つマシンでTranslation Lookaside Buffer(TLB)ルックアップのオーバーヘッドを削減するLinuxモリー管理システムです。

ただし、データベースワークロードは、連続したメモリアクセスパターンではなく、希薄な傾向があるため、THPでパフォーマンスが低下することがよくあります。 LinuxマシンでTHPを無効にして、MongoDBで最高のパフォーマンスを確保する必要があります。

 


まずは、THPの無効化から。

 

THPの無効化

公式の手順に従いTHPを無効化します。

# vi /etc/init.d/disable-transparent-hugepages

以下を編集。

----------
#!/bin/bash
### BEGIN INIT INFO
# Provides: disable-transparent-hugepages
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description: Disable Linux transparent huge pages, to improve
# database performance.
### END INIT INFO

case $1 in
start)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
return 0
fi

echo 'never' > ${thp_path}/enabled
echo 'never' > ${thp_path}/defrag

re='^[0-1]+$'
if $(cat ${thp_path}/khugepaged/defrag) =~ $re
then
# RHEL 7
echo 0 > ${thp_path}/khugepaged/defrag
else
# RHEL 6
echo 'no' > ${thp_path}/khugepaged/defrag
fi

unset re
unset thp_path
;;
esac
----------

次のコマンドを実行して、initスクリプトを使用できるようにします。

# chmod 755 /etc/init.d/disable-transparent-hugepages


Linuxディストリビューションで新しいinitスクリプトを設定します。

# chkconfig --add disable-transparent-hugepages

以下からはLinux7、CentOS7の手順です。6は手順が異なるので注意してください。

# mkdir /etc/tuned/no-thp

# vi /etc/tuned/no-thp/tuned.conf

-----
[main]
include=virtual-guest

[vm]
transparent_hugepages=never
-----

最後に、次のコマンドを発行して新しいプロファイルを有効にします。

# tuned-adm profile no-thp

続いて確認コマンドですが、[never]になっていることを確認します。再起動しないと「/sys/kernel/mm/transparent_hugepage/defrag」はneverになりませんでした。

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

 

WARNING: Access control is not enabled for the databaseを消す方法

WARNING: Access control is not enabled for the databaseを消す方法は以下が参考になりました。

 

MongoDB 3系を CentOS7 にインストール

上記の情報通り設定すると、表示から警告が消えました。

 

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:"admin"}]})
Successfully added user: {
"user" : "myUserAdmin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
------

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

# 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」で成功。

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