MongoDB のアクセス制御(ユーザー認証)を有効にする方法
MongoDB は初期設定が終わると、アクセス制御なしで無制限にアクセスできる。実運用でこのまま無制限に許可することはあり得ないため、アクセス制御(ユーザー認証、ロール制御)を有効にする必要がある。
ここでは、もっとも単純なシングルサーバーを前提にしたアクセス制御の方法をまとめる。
ユーザー管理に関する情報
まずはユーザー管理に関する各種情報と、その保存先について見ていく。
ユーザー情報が保存されるデータベースは admin であり、admin データベースの system.users コレクションにユーザー情報が存在する。
ユーザー管理が可能なロールには、userAdmin と userAdminAnyDatabase の 2 種類がある。
userAdminは、指定されたデータベースに対してのみユーザー管理を行えるロールである。userAdminAnyDatabaseは、このロールを付与されたユーザーがすべてのデータベースに対してユーザー管理を行えるロールである。
ユーザー認証を使用する手順
大まかな手順は次のとおりである。基本的に MongoDB サーバー上で作業する前提でコマンドを記載する。
- 管理ユーザーを追加する
- MongoDB を再起動する
- 一般ユーザーを追加する
- ユーザー名とパスワードを指定してデータベースに接続する
管理ユーザーを追加する
- アクセス制御なしで MongoDB を起動する。
mongod --dbpath "C:\data\db" - MongoDB に接続する。
mongo - ユーザー管理者を作成する。
adminデータベースに接続し、次のコマンドを実行してユーザー管理者を作成する。作成するユーザー名はadminである。use admin db.createUser({ user: 'admin', pwd: 'password', roles: [{ role: 'userAdminAnyDatabase', db: 'admin' }] })
MongoDB を再起動する
- MongoDB サーバーをアクセス制御付きで再起動する。
MongoDB 構成ファイルを使用して起動する方法は、MongoDB 構成ファイル設定を参照する。
mongod --auth --dbpath "C:\data\db"
一般ユーザーを追加する
-
ユーザー名とパスワードを指定し、ユーザー管理者として MongoDB に接続する。 アクセス制御を有効にした MongoDB に接続する方法には、「MongoDB 接続と同時に認証する方法」と「MongoDB 接続後にユーザー認証する方法」がある。
-
MongoDB 接続と同時に認証する方法
mongoコマンドの-u <username>、-p <password>、-authenticationDatabase <databasename>オプションを使って接続する。mongo -u "admin" -p "password" -authenticationDatabase "admin" -
MongoDB 接続後にユーザー認証する方法
まずは通常どおり MongoDB に接続する。mongo認証が必要なデータベースへ切り替え、
db.auth(<username>, <password>)メソッドで認証する。use admin db.auth("admin", "password")
-
-
通常利用するデータベースへアクセスできるユーザーを作成する。
ユーザー管理者を作成してアクセス制御を有効にすると、権限のないデータベースにはアクセスできない。使用する各データベースごとにユーザーを作成する必要がある。
以下では
testデータベースに接続し、user1ユーザーをreadWriteロールで追加する。その他のロールについては、下記の組み込みロールを参照する。use test db.createUser({ user: "user1", pwd: "password", roles: [{ role: "readWrite", db: "test" }] })
ユーザー名とパスワードを指定してデータベースに接続する
-
データベースに追加した一般ユーザーで接続する。 接続方法は管理ユーザーの場合と同じく、「MongoDB 接続と同時に認証する方法」と「MongoDB 接続後にユーザー認証する方法」がある。内容は同じなので詳細は省略する。
- MongoDB 接続と同時に認証する方法
mongo -u "user1" -p "password" -authenticationDatabase "test" - MongoDB 接続後にユーザー認証する方法
mongouse test db.auth("user1", "password")
- MongoDB 接続と同時に認証する方法
MongoDB 構成ファイル設定
通常の動作を考えると、コマンドを実行して MongoDB サーバーを起動することはあまりない。MongoDB 構成ファイルに起動オプションを指定し、その構成ファイルを読み込んで起動する運用になるだろう。
ここでは、アクセス制御を有効にする MongoDB 構成例と起動コマンドを示す。
mogodb.config
systemLog:
destination: file
path: C:\mongodb\server\log\mongod.log
security:
authorization: enabled
storage:
dbPath: C:\mongodb\server\data
MongoDB サーバー起動
mongod --config "C:\data\mongod.config"
MongoDB 構成ファイルオプションの詳細は、MongoDB - Configuration File Options を参照する。
組み込みロール
MongoDB にはいくつかの組み込みロールがある。ここでは、その中でも使うことが多そうなものをいくつか紹介する。
データベースユーザーロール
| ロール | 説明 |
|---|---|
read |
すべての非システムコレクションと、system.indexes.system.js および system.namespaces システムコレクションへの読み取り権限。 |
readWrite |
read ロールに加えて、すべての非システムコレクションおよび system.js システムコレクションへの変更権限。 |
データベース管理ロール
| ロール | 説明 |
|---|---|
dbAdmin |
スキーマに関するタスク、インデックス、統計情報取得などの管理作業に関する権限。 この権限には、ユーザー管理またはロール管理の権限は含まれない。 |
dbOwner |
データベース管理者としての権限。 この権限には readWrite、dbAdmin、userAdmin 権限が含まれる。 |
userAdmin |
データベースに対するユーザーおよびロールを管理する権限。userAdmin ロールは、自分自身を含むすべてのユーザーに対してデータベースへのアクセス権限を付与できる。したがって、admin データベースの userAdmin ロールは、間接的にスーパーユーザーと同じ意味になる。 |