MongoDB のアクセス制御(ユーザー認証)を有効にする方法

MongoDB は初期設定が終わると、アクセス制御なしで無制限にアクセスできる。実運用でこのまま無制限に許可することはあり得ないため、アクセス制御(ユーザー認証、ロール制御)を有効にする必要がある。

ここでは、もっとも単純なシングルサーバーを前提にしたアクセス制御の方法をまとめる。

ユーザー管理に関する情報

まずはユーザー管理に関する各種情報と、その保存先について見ていく。

ユーザー情報が保存されるデータベースは admin であり、admin データベースの system.users コレクションにユーザー情報が存在する。

ユーザー管理が可能なロールには、userAdminuserAdminAnyDatabase の 2 種類がある。

  • userAdmin は、指定されたデータベースに対してのみユーザー管理を行えるロールである。
  • userAdminAnyDatabase は、このロールを付与されたユーザーがすべてのデータベースに対してユーザー管理を行えるロールである。

ユーザー認証を使用する手順

大まかな手順は次のとおりである。基本的に MongoDB サーバー上で作業する前提でコマンドを記載する。

  • 管理ユーザーを追加する
  • MongoDB を再起動する
  • 一般ユーザーを追加する
  • ユーザー名とパスワードを指定してデータベースに接続する

管理ユーザーを追加する

  1. アクセス制御なしで MongoDB を起動する。
    mongod --dbpath "C:\data\db"
    
  2. MongoDB に接続する。
    mongo
    
  3. ユーザー管理者を作成する。
    admin データベースに接続し、次のコマンドを実行してユーザー管理者を作成する。作成するユーザー名は admin である。
    use admin
    db.createUser({
        user: 'admin',
        pwd: 'password',
        roles: [{
            role: 'userAdminAnyDatabase',
            db: 'admin'
        }]
    })
    

MongoDB を再起動する

  1. MongoDB サーバーをアクセス制御付きで再起動する。
    mongod --auth --dbpath "C:\data\db"
    
    MongoDB 構成ファイルを使用して起動する方法は、MongoDB 構成ファイル設定を参照する。

一般ユーザーを追加する

  1. ユーザー名とパスワードを指定し、ユーザー管理者として 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")
      
  2. 通常利用するデータベースへアクセスできるユーザーを作成する。

    ユーザー管理者を作成してアクセス制御を有効にすると、権限のないデータベースにはアクセスできない。使用する各データベースごとにユーザーを作成する必要がある。

    以下では test データベースに接続し、user1 ユーザーを readWrite ロールで追加する。その他のロールについては、下記の組み込みロールを参照する。

    use test
    db.createUser({
        user: "user1",
        pwd: "password",
        roles: [{
            role: "readWrite", db: "test"
        }]
    })
    

ユーザー名とパスワードを指定してデータベースに接続する

  1. データベースに追加した一般ユーザーで接続する。 接続方法は管理ユーザーの場合と同じく、「MongoDB 接続と同時に認証する方法」と「MongoDB 接続後にユーザー認証する方法」がある。内容は同じなので詳細は省略する。

    • MongoDB 接続と同時に認証する方法
      mongo -u "user1" -p "password" -authenticationDatabase "test"
      
    • MongoDB 接続後にユーザー認証する方法
      mongo
      
      use test
      db.auth("user1", "password")
      

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 データベース管理者としての権限。
この権限には readWritedbAdminuserAdmin 権限が含まれる。
userAdmin データベースに対するユーザーおよびロールを管理する権限。
userAdmin ロールは、自分自身を含むすべてのユーザーに対してデータベースへのアクセス権限を付与できる。したがって、admin データベースの userAdmin ロールは、間接的にスーパーユーザーと同じ意味になる。

参考記事