Tech Sketch Bucket of Technical Chips by TIS Inc.

MongoDBのシャーディング環境でユーザ認証を行う

Pocket

この記事はeXcale Developer's Blogから移転されたものです。

eXcale開発チームの泉谷(@syguer)です。

今回はeXcaleのバックエンドでも利用しているMongoDBで、単体でユーザー認証を 行う方法からレプリカセット及びシャーディング環境でのユーザー認証の方法まで紹介します。

1.MongoDBでユーザー認証を有効化する


step1.管理用データベースにユーザーを追加

まずは管理用データベースにユーザーを追加します。 管理用データベースとはMongo内部で予約されているデータベースであるadminのことです。 Mongoシェルに入り、以下のコマンドを実行します。

以下のコマンドでユーザーの確認ができます。

この時点ではまだ認証が有効化されません。 認証を有効化するにはstep3を実行する必要があります。

step2.各データベースにユーザーを追加

続いて認証対象となるデータベースにユーザーを追加します。 MongoDBでは認証をデータベースごとに行うため、各データベースにそれぞれユーザーを追加することになります。

ユーザーの追加方法はstep1と同様です。

※db.addUserメソッドの第三引数にtrueを付加するとRead-Onlyのユーザーを作成することができます。

step3.認証モードでmongodを再起動

ユーザーの追加が確認できたら、mongodを認証モードで起動しなおします。 認証モードで起動する方法は2種類あります。

○起動時にオプションとして付与する 起動時に--authオプションを付けて起動します。

○起動時に読み込む設定ファイルに記述する 起動時に設定ファイルとして読み込むファイル内に「auth = true」と記載します。

・起動コマンド

・設定ファイル

ここまで実行すると、認証が有効化されているはずです。 Mongoシェルで認証を行うには下記のようにします。

以上がMongoDBでの認証の基本です。

2.レプリカセットでユーザー認証を有効化する


ユーザーの追加までは同様ですが、PRIMARYとSECONDARYのデータ同期時の認証用にMongoDBではkeyFileというものを使います。

step1.ユーザーを作成する

「1.MongoDBで認証を有効化する」のstep1、step2と同様に管理用データベースと認証を使いたいデータベースにユーザーを追加します。 この操作はPRIMARYのノードで行う必要があります。

step2.keyFileを作成し、各ノードに配置する

MongoDBの公式ドキュメントに従い、keyFileを作成します。

作成したkeyFileを各ノードに配布して任意のパスに配置し、パーミッションを600に設定します。

step3.keyFileオプションを付与して各ノードを起動する

単一のMongoDBの場合はauthオプションを付加しましたが、レプリカセットでは 代わりにkeyFileオプションを付与して起動します。 以下のようになると思います。

○起動コマンド

○設定ファイル

3.シャーディング環境でユーザー認証を有効化する


シャーディング環境での手順はレプリカセットの場合とほぼ同様です。

step1.ユーザーを作成する

シャーディング環境では任意のmongosから接続し、ユーザーを作成します。

step2.keyFileを作成し、各ノードに配置する

各シャードのノード、configサーバー、mongosを動かすサーバーすべてに共通のkeyFileを配置します。

step3.keyFileオプションを付与して各ノードを起動する

これもレプリカセットの場合と同様です。 mongosの場合は起動コマンドがmongosになります。 各ノードの起動コマンド及び設定ファイルは下記のようになると思います。

○レプリカセットノード ・起動コマンド

・設定ファイル

○configサーバー ・起動コマンド

・設定ファイル

○mongos ・起動コマンド

・設定ファイル

以上で認証が有効になります。

最後に

MongoDBはスキーマレスで扱いやすく、人気が上がっているデータベースです。 今後要望が多かった場合、対応DBとして追加することも視野に入れていますので、ご要望があればサポートtwitter等からご意見をください! 今後ともeXcaleをよろしくお願いします!

エンジニア採用中!私たちと一緒に働いてみませんか?