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

0 件のコメント

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

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

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

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

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

ユーザー管理が行えるロールには userAdminuserAdminAnyDatabase の2種類があります。 userAdmin は指定されたデータベースに対してのみユーザー管理が行える組み込みロールになります。 userAdminAnyDatabaseadmin データベースに対してのみ指定できる特別な組み込みロールで、 このロールが付与されたユーザーはすべてのデータベースに対するユーザー管理が行えます。

ユーザー認証 の 有効化 手順

大まかな手順としては以下のようになります。 基本的には MongoDB サーバー上で作業することを前提にコマンドを記述しています。

  1. 管理ユーザーの追加
  2. MongoDB再起動
  3. 通常ユーザーの追加
  4. ユーザー名とパスワードを指定してデータベースへ接続

管理ユーザーの追加

  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 ロールの場合、間接的に スーパーユーザー と同じ意味になります。

参考記事