【MongoDB】認証の設定をする

2019年2月17日

私は以前にConohaVPSを借りてMongoDBを構築し、運用(放置)していたのですが、認証機能を入れていなかったのです。単純にめんどくさがってしまっていたのですが、流石にどこからでもアクセスできるは不味いと思い出しました。

なので、今回運用中のMongoDBにユーザ認証を追加しました。その手順を本記事にまとめていきます。

環境情報

OS: CentOS7

MongoDB: v4.0

MongoDBの認証

そもそもなのですが、MongoDBは初期設定では認証がついていません。MySqlなどでは標準で認証の設定が必要なので、すこし驚きでした。開発用にすぐ使いたいようにという配慮なんですかね?

MongoDB v4.0の認証方式はSCRAM-SHA-256を用いているらしいです。これ以前のバージョンではSCRAM-SHA-1を使っていたみたいです。MongoDBのバージョンによって、アプリ側からの認証方式を意識しないといけないので、お気を付けください。

以下MongoDB認証の公式ドキュメントです。

https://docs.mongodb.com/manual/security/

MongoDBに認証を追加する

それでは認証を追加していきます。

Adminユーザを追加する

まずはmongo shellを起動します。

mongo

adminテーブルへ切り替えます。(adminテーブルはインストール時に追加されます。)

use admin

adminテーブルにユーザを追加します。

db.createUser({
	user:"admin", # 任意のユーザ名を設定(とりあえずadminでよいと思います。)
	pwd:"パスワード", # 任意のパスワードを設定
	roles:[{ role:"userAdminAnyDatabase", db:"admin" }]
})

これでadminユーザが作成できました。一旦exitして、次はMongoDBのconfigをいじります。

認証機能をONに設定する。

/etc/mongod.confに記載されている設定を変更します。

vimなどで編集し、以下の記載を追加。(security:は元々コメントアウトされていると思うので、コメントアウトを外して下に行を追加します)

security:
	authorization: enabled

そうしたらMongoDBを再起動します。(以下はCentOS7の再起動コマンドなので、他のOSの場合は書き換えてください)

sudo systemctl restart mongod.service

認証を利用してアクセスする。

adminテーブルへアクセスします。

mongo
use admin

以下のコマンドで認証します。

db.auth("admin", "パスワード")

実行結果で1が表示されればOKです。

個別のテーブルへのアクセスユーザを作成する。

上記で行ったのはadminテーブルへのユーザです。そして、上記でadminユーザに与えられたロールは各テーブルのユーザ操作権限ですので、テーブルのデータを確認したりはできません。

ですので、各テーブルのデータへアクセスできるユーザを作成します。

上記のadminユーザでログインした状態から操作していきます。まずは対象のテーブルに切り替えます。(今回はtest_databaseというDBへユーザを追加します。)

use test_database

ユーザを追加します。権限はreadとwriteなので、読み書きのみができます。データ削除などはできません。

db.createUser({
	user:"ユーザ名", # 任意のユーザ名
	pwd:"パスワード", # 任意のパスワード
	roles:[{ role: "readWrite", db: "test_database" }]
})

これで個別のユーザ追加完了です。

さいごに

今回はMongoDBへの認証追加を記載しました。実際に運用中のDBへ追加したので、なかなか緊張しました。実は事前にサーバを借りて予行練習をしてから作業しています。

対象の機能が5分間に一回データを取得しているものなのですが、残念ながら5分以内に作業が終わらせることはできませんでいた…。ちょっとハプニングが発生して8分くらいかかりました。10分以内くらいなら許容するつもりだったので、OKかなとは思っています。

この記事が皆様のお役に立てば幸いです。