MongoDBはインストール直後はだれでもDBを操作できます。セキュリティはないに等しい状態。
インストール作業でユーザー作成・操作権限は最低限やっておきましょう。という話です。
MySQLと使うコマンドは違いますが、作業の流れは似てるので困ることはないでしょう。
インストール直後のMongoDBは、サーバーに入れてしまえば誰でもなんでもできます。
mongo
MongoDB shell version v4.2.8
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("813385c3-806b-4238-bf66-72a31c83b69b") }
MongoDB server version: 4.2.8
Server has startup warnings:
2020-06-17T13:14:20.898+0900 I CONTROL [initandlisten]
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten]
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten]
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten]
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-06-17T13:14:20.899+0900 I CONTROL [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
>
これ、一般ユーザーでも実行できます。『アカン!』ですね?
まぁ、MySQLでも同じですが。
そこで、既存のユーザーがあるのか見てみました。
> show users
>
うん、ないですね? これMySQLでも同じだった。(ような気がする。)
話を戻して、mongoコマンドでログインするといくつかの警告が出ています。
WARNING: Access control is not enabled for the database.
Read and write access to data and configuration is unrestricted.
警告:データベースへのアクセスコントロールが制御が有効になっていません。
データや設定への読み書きアクセスは無制限です。
今回はこれを消します。作業は
DB接続ユーザー作成
DB接続をユーザー認証に変更
これだけ。(そのほかの警告も一緒に消える。)
管理者権限のユーザー作成
管理者権限のユーザー(rootユーザーとも言う)を作成して、無名ユーザー(ユーザーなし)をはじきましょう。
内容は公式ドキュメントのまま進めます。
use admin
db.createUser(
{
user: "root",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
use adminでカレント・データベースをadminに変えます。そこでユーザ作成コマンドを実行。
ユーザー名rootは説明のために分かりやすくしていますが、実際はオリジナルで管理者だと分からないようにしてください。
(不正ログインで見当がつかないように。)
ロール(権限)の設定は、config, localデータベース以外のユーザ・ロール作成、コレクション作成・読み書き権限を与えます。
(可能なかぎり最高の権限。コレクションはMySQLのテーブルにあたる。)
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>
4.2の新機能 - passwordPrompt()
パスワードの設定でdb.createUser()に直書きしているのを見ますが、新しいMongoDB(バージョン4.2)では、プロンプト関数を使うように勧めています。
(今までと同じように直書きでも可能。)
> use admin
switched to db admin
> db.createUser(
... {
... user: "root",
... pwd: passwordPrompt(),
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... }
... )
Enter password:
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}
>
MongoDBマニュアル
設定ファイルの変更
ユーザーを作っただけでは何も変わりません。設定ファイル(/etc/mongod.conf)でセキュアコネクションを設定しましょう。
#security:
security:
authorization: enabled
システムに反映させます。
$ sudo systemctl restart mongod
(mongodではsystemctlのreloadはない。)
コネクション確認
MongoDBのセキュアコネクションは不思議で、接続拒否ではなく参照・実行拒否です。
(コネクション自体はできて操作ができない。)
ユーザーなしだとこうなります。
mongo
MongoDB shell version v4.2.8
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c81acd0d-98b3-471d-b1fb-82ca049f2e95") }
MongoDB server version: 4.2.8
> use admin
switched to db admin
> show dbs
> show collections
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
>
コネクションできてデータベースのスイッチまではできるけどその他はアウトです。
(DB一覧結果が0。コレクション一覧を表示すると警告(参照拒否)。)
今度は作成したrootユーザーでログインします。
mongo -u root
MongoDB shell version v4.2.8
Enter password:
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("0734acdd-c5df-4271-b2f4-c1537d2fb4a0") }
MongoDB server version: 4.2.8
> use admin
switched to db admin
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> show collections
system.users
system.version
>
うん、ちゃんとできてますね? ちゃっかりsystem.usersコレクションが作られてる。
警告も出なくなったし。これだけ目立つところに出てたってことは、これくらいはやっとけ!ってことですね?
これ以外にもセキュアな作業はいくつかあり、
TLS/SSL設定などはやっておいたほうがいいですが、認証局からキーを取っておかないといけないし、ローカル接続しかしないし、とりあえず今回は割愛します。
少なくともユーザー作成と権限設定は、インストールしたらそこで作業を止めずに一気にやっちゃいましょう。