1. ホーム
  2. データベース
  3. モンゴルディーブ

MongoDBの役割管理について説明する

2022-01-19 04:46:21

NO.1 MongoDBの組み込み型ロール

組み込みロールの種類と特徴を教えてください。

組み込みロールを理解するためには、やはり以下の図が必要です。MongoDBでは、ユーザーパーミッションはロールバインディングによって割り当てられます。あるロールをあるユーザーにバインドすると、そのユーザーはそのロールに対応するパーミッションを持つことになります。

MongoDB 4.0 の組み込みのロールタイプは次のとおりです。

上記の組み込みロールが持つ権限について説明します。

データベースユーザーの役割です。

read: システム以外のすべてのコレクションと、次の3つのシステムコレクションの読み取りに使用されます。

system.indexes、system.js、system.namespの3つです。

readWrite: read ロールのすべてのパーミッションを持ち、システム以外のすべてのコレクションと system.js コレクションのデータを変更することができます。

データベース管理のロール

dbAdmin: 統計情報の照会、インデックス管理など、管理関連の機能を提供します。

userAdmin: 管理用データベースロールとユーザーパーミッションを提供します。このロールを持つユーザーは、自分自身を含む現在のデータベース内のすべてのユーザーに、任意のロールとパーミッションを割り当てることができます。

dbOwner: データベース所有者へのアクセスを提供し、データベースに対するあらゆる管理操作を行うことができます。このロールは、readWrite、dbAdmin、およびuserAdminロールによって付与される権限を組み合わせたものです。

クラスタ管理者の役割

このタイプのロールは、MongoDB全体を管理するためのアクセス権を提供し、このロールは管理データベースでのみ承認されます。

clusterManager: クラスタの管理および監視を行うための権限を提供します。

clusterMonitor: 監視ツールへの読み取り専用アクセスを提供します。

hostManager: サーバを監視・管理するためのアクセス権を提供します

clusterAdmin: クラスタ管理への最高レベルのアクセスを提供します。このロールは、dropDatabase()特権に加えて、clusterManager、clusterMonitor、およびhostManagerロールによって付与される特権を有します。

バックアップとリカバリーの役割

このタイプのロールは、管理者データベースでのみバックアップとリストアが可能です。

backup: データのバックアップと mongodump を使って mongod インスタンス全体をバックアップする権限を提供します。

restore: データベースの復元に必要なパーミッションを提供し、ユーザーが mongorestore を使ってデータを復元できるようにします。

データベースのフルロール

フルデータベースロールは、すべてのカスタムデータベースを管理するために使用されますが、ローカルおよびconfigデータベースは含まれず、adminユーザーのみで付与することができます。

スーパーユーザーです。

ルート、これはあまり説明する必要はないでしょう。

ユーザーはこの権限をadminデータベースでのみ設定することができ、このロールを持つユーザーはすべてのデータベースであらゆる操作を行うことができます。

内部の役割

__system は MongoDB の内部管理にのみ使用されます。ユーザーが内部システムを操作できないようにするため、この権限をユーザーに割り当てることはお勧めしません。

MongoDBにおける役割の特徴

  • MongoDB では、あるロールのユーザーに特権を与えるとき、デフォルトでは現在のデータベースの
  • コレクションレベルの粒度で役割権限を付与することができる
  • 役割の承認は、システムコレクションと非システムコレクションのアクセスに分かれています。
  • 各データベースのロールは、一般ロールと管理ロールに分けることができる
  • 管理用データベースは、すべての組み込みロールを使用することができます

NO.2 カスタムロールを作成する

    上記は組み込みのペルソナの使用方法についてですが、ここではカスタムのペルソナを作成することについて見てみましょう。

カスタムペルソナには3つの特徴があります。

1. 一般的なデータベースで作成され、現在のデータベースにのみ適用される役割

2. 管理者データベースで作成されたロールは、すべてのデータベースに適用することができます

3. 3. ロールを作成する際、ロール名を重複して入力するとエラーになります。

例えば、あるアカウントに挿入、更新、選択、および削除不可の権限を割り当てたいとします。

 構文

db.createRole(
{
 role:"<name>",
 privileges:[
       {resource:{<resource>},actions:["action",...]}
      ],
 roles:[
     {role:"<role>",db:"<database>"}|"<role>"
    ],
 authenticationRestrictions:[
               {clientSource:["<IP address>"|"<CIDR range>",...] ,
               {serverAddress:["<IP address>"|"<CIDR range>",...]}
              ]
}
)

ここで、resource は指定されたデータベースまたはコレクションです。null を指定すると、現在のデータベースの完全なコレクションがデフォルトで使用されます。

actions: 権限を指定します。

1. まずペルソナを作成します。

use admin

db.createRole(
{
 role:"role_yeyz",
 privileges:[
       {resource:{db:"yeyz",collection:"test"},
       actions:["find","insert","update"]
       }
      ],
 roles:[
     {role:"read",db:"yeyz1"}
    ]
}
)

このロールの名前はrole_yeyzで、yeyzデータベース下のテスト・コレクションに対する検索、挿入、および更新の権限を持ちます。

また、システム内蔵の読み取り権限と統合されており、内蔵の権限が有効なデータベースはyeyz1です

2. 現在のロールの作成を確認するには、show roles を使用します。

use admin

show roles

{
    "role" : "role_yeyz",
    "db" : "admin",
    "isBuiltin" : false,
    "roles" : [
        {
            "role" : "read",
            "db" : "yeyz1"
        }
    ],
    "inheritedRoles" : [
        {
            "role" : "read",
            "db" : "yeyz1"
        }
    ]
}

ここでは、組み込みロールの情報のみを表示しています。このロールが配置されているデータベースはadminであることに注意してください。

3. ここで、このロールを新しいユーザー yeyz_1 に付与します。

> db.createUser(
... {
... user: "yeyz_1",
... pwd: "123456", 
... roles: [ { role: "role_yeyz", db: "admin" }]
... }
... )
Successfully added user: {
    "user" : "yeyz_1",
    "roles" : [
        {
            "role" : "role_yeyz",
            "db" : "admin"
        }
    ]
}

新しいユーザーyeyz_1を作成し、最初のステップで作成したカスタムロールrole_yeyzを継承します。

4. 認証と関連するアクションの実行を開始します。

[root@VM-0-14-centos ~]# mongo
MongoDB shell version v4.0.6
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("b9daecb8-ffd8-44a7-8af0-d1115057539a") }
MongoDB server version: 4.0.6
> use admin
switched to db admin
> db.auth("yeyz_1","123456")
1
> use yeyz
switched to db yeyz

### test lookup, success
> db.test.find()
{ "_id" : ObjectId("5fa7eae2515b814f18f2d474"), "name" : "aaa" }

### Test insert, success
> db.test.insert({ "name":"bbb"})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("5fa7eae2515b814f18f2d474"), "name" : "aaa" }
{ "_id" : ObjectId("5fa7f00e523d80402cdfa326"), "name" : "bbb" }

### Test update, success
> db.test.update({"name":"aaa"},{$set:{"name":"ccc"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> 
> db.test.find()
{ "_id" : ObjectId("5fa7eae2515b814f18f2d474"), "name" : "ccc" }
{ "_id" : ObjectId("5fa7f00e523d80402cdfa326"), "name" : "bbb" }

### Test delete, failed, as we expected, because role_yeyz, the role, does not have delete permission.
> db.test.remove({"name":"bbb"})
WriteCommandError({
    "ok" : 0,
    "errmsg" : "not authorized on yeyz to execute command { delete: \"test\", ordered: true, lsid: { id: UUID(\"b9daecb8- ffd8-44a7-8af0-d1115057539a\") }, $db: \"yeyz\" }",
    "code" : 13,
    "codeName" : "Unauthorized"
})

以上、MongoDBのロール管理について詳しく説明しました。MongoDBのロール管理についてもっと詳しく知りたい方は、スクリプトハウスの他の関連記事にも注目してください