今回は「MongoDB のレプリカセットに対してアクセス制御(ユーザー認証)を有効化する方法」についてまとめます。
概要
レプリカセットに対するアクセス制御を有効化するためには内部認証(レプリカセットメンバー間の認証)を有効化する必要があります。 内部認証の方法は以下の2通りがあります。
- キーファイル (チャレンジレスポンス認証、SCRAM-SHA-1)
- x.509(公開鍵認証、TLS/SSL)
今回はお手軽に実現できる「キーファイル」を用いた内部認証の有効化およびアクセス制御の有効化を行います。
キーファイルを用いたアクセス制御
管理ユーザーの追加
アクセス制御を有効化する前に管理ユーザーを作っておきます。
-
アクセス制御無効化状態でMongoDBのすべてのレプリカセットメンバーを起動
mongod --config "C:\mongodb\server1\server1.cfg"
-
プライマリサーバーに接続
mongoシェルでプライマリサーバーに接続します。 プライマリサーバーが不明な場合、 rs.status() でプライマリサーバーを確認して接続しなおします。
mongo --host 127.0.0.1:8001
-
管理ユーザーを追加
以下のコマンドのように、adminデータベースへスイッチしたのち、管理ユーザーを作成します。
レプリカセットコマンドである
rs.xxxx
を利用できるのはclusterMonitor
というロールのようですが、ここではclusterAdmin
ロールを追加しています。PRIMARY> use admin PRIMARY> db.createUser({ user: "admin", pwd: "password", roles: [ "userAdminAnyDatabase", "dbAdminAnyDatabase", "clusterAdmin" ] })
MongoDBの設定変更(アクセス制御有効化)
-
キーファイルの作成
キーファイル は Base64セットの文字列 ([a-zA-Z0-9/+] の64種類) を使った 6~1024文字 のファイルになります。 ランダム文字列生成した後、Base64変換して1024文字までにカットするような方法で良いかと思います。 Linux使えるなら openssl を使った以下のコマンドでランダム文字列を生成できます。
$ openssl rand -base64 1024 > keyfile
キーファイルは以下のようなBase64文字列で構成される内容になります。 以下はサンプルなので、必ず自前で生成してください。 ランダム文字列生成するツールを使うとラクかもしれません。
keyfile
rMvhlWEIzktbhXN+rcTV43z2YKPGsd8YHNNuOVpZLW9bIPx1MaAeGTVullFVY4A5 B0zRpKLXcB347T/m278LK3BNBynB3mVpoe1pPmSYVjpBmo3LhsDKXywb8dU7UrBl 9bgh4NZfNaBcYykuoQsiloWNP5QtMquBymF2bh+1s+aJpvkq1FzAhsJvwcGeILBc gnBOwZAsDXlE0M1hr0zvsulkyvFDgE2UcS+2tm4yZPKNDygA2HCcXqJypa9L2f1J dC83SLNxbN4MkeE+NeY3ZE+LFUqTyvb827VhXfCX+S+TpD5h/otiS1GiQnTcBiSB fYrMhLsOFPU9UYc705XDw48m
ランダム文字列生成ツール
-
キーファイルをレプリカセットメンバーへ配布
任意の方法で各レプリカセットメンバーに作成したキーファイルを配置します。 今回はサンプルとして以下のような場所に配置したものとします。
C:\mongodb │ ├ \server1 │ └ keyfile │ ├ \server2 │ └ keyfile │ └ \server3 └ keyfile
-
すべてのレプリカセットメンバー設定に認証設定を追加
MongoDB設定ファイル(mongod.config)に対して
security.authorization
を有効化し、security.keyFile
設定を追加します。mongod.config
systemLog: destination: file path: C:\mongodb\server1\log\mongod.server1.log logAppend: true logRotate: "rename" storage: dbPath: C:\mongodb\server1\data security: authorization: enabled keyFile: C:\mongodb\server1\keyfile replication: replSetName: "rs0" net: bindIpAll: true port: 8001
-
すべてのレプリカセットメンバーを再起動
各サーバーに mongoシェル でログインして以下のコマンドを実行してサーバーを停止させます。 サーバーを停止させる際、ロールバックを避けるため、プライマリサーバーが最後になるよう停止していきます。
停止
SECONDARY> use admin SECONDARY> db.shutdownServer()
開始
mongod --config "C:\mongodb\server1\server1.cfg"
通常ユーザーの追加
-
プライマリサーバーに管理ユーザーで接続
mongoシェルでプライマリサーバーに管理ユーザーで接続します。 プライマリサーバーが不明な場合、 rs.status() でプライマリサーバーを確認して接続しなおします。
接続方法は「接続時にユーザー名とパスワードを指定する方法」と「接続語にユーザー名とパスワードを指定する方法」の2通りがあります。
-
MongoDB へ接続と同時に認証する
mongo --host 127.0.0.1:8001 -u admin -p Passw0rd --authenticationDatabase admin
-
MongoDB へ接続、接続後に認証する
mongo --host 127.0.0.1:8001
PRIMARY> use admin PRIMARY> db.auth('admin', 'Passw0rd')
-
-
通常ユーザーを追加
データベースを指定して通常ユーザーを追加します。
PRIMARY> use test PRIMARY> db.createUser({ user: "test", pwd: "test", roles: [{ role: "readWrite", db: "test" }] })
ユーザー名とパスワードを指定してデータベースへ接続
-
プライマリサーバーに通常ユーザーで接続
mongoシェルでプライマリサーバーに通常ユーザーで接続します。
接続方法は管理ユーザーで接続するのと同じで、 「接続時にユーザー名とパスワードを指定する方法」と「接続語にユーザー名とパスワードを指定する方法」の2通りがあります。
-
MongoDB へ接続と同時に認証する
mongo --host 127.0.0.1:8001 -u test -p test --authenticationDatabase test
-
MongoDB へ接続、接続後に認証する
mongo --host 127.0.0.1:8001
PRIMARY> use test PRIMARY> db.auth(test, test)
-
今回は「MongoDB のレプリカセットに対してキーファイルを用いたアクセス制御(ユーザー認証)を有効化する方法」についてまとめました。 ポイントは以下の通りです。
- MongoDBのレプリカセットでアクセス制御は「キーファイル」と「x.509」の2種類が選べる
- アクセス制御有効化前に管理ユーザーを作成しておく
参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
参考記事
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!