ポイント: MongoDBの役割ベースアクセス制御(RBAC)は、役割を通じてユーザーの権限を管理することによりセキュリティを強化します。ビルトインおよびカスタム役割の割り当てを可能にし、複数の認証方法をサポートしながら、アクセス制御のための設定が必要です。
- デフォルトではアクセス制御は無効です。
- ユーザーは、アクセス範囲を定義する複数の役割を持つことができます。
MongoDBのアクセス制御は、データベース管理者がユーザー認証を強制することによってMongoDBインスタンスを保護することを可能にします。MongoDBは複数の認証方法をサポートし、ロールベースの認可を通じてアクセスを提供します。
ロールはMongoDBの基礎的な構成要素であり、ユーザーの隔離を提供し、高度なセキュリティと管理性を実現します。
この記事では、MongoDBで最も一般的なロールを見ていきます。その後、ロールに関連する多くの一般的な機能を示すことでロール管理を探ります。
MongoDBのRBACの仕組み
ユーザーには1つ以上のロールが割り当てられ、データベースシステムへのユーザーアクセスの範囲は、割り当てられたロールによって決まります。ユーザーは指定されたロールの外側のシステムにアクセスすることはできません。
重要なのは、MongoDBのアクセス制御はデフォルトでは有効になっていないことです。security.authorization設定を通じて有効にする必要があります。
その設定が有効になっていると、ユーザーはデータベースと相互作用する前に自分自身を認証する必要があります。ユーザー権限には、特定のリソース(データベース、コレクション、クラスタ)およびそのリソースで許可されているアクションが含まれる場合があります。
ロールは特定のリソース上で特定のアクションを実行するための権限を付与します。単一のユーザーアカウントは複数のロールで構成される場合があります。ロールは次のように割り当てることができます:
- ユーザー作成時
- 既存のユーザーのロールを更新する際
MongoDBには2種類のロールがあります:
- 組み込みロール。MongoDBは、データベースシステムで一般的に必要とされる権限のセットを提供するための組み込みロールを提供します。
- ユーザー定義ロール。組み込みロールが期待されるすべての権限を提供しない場合、データベース管理者はcreateRoleメソッドを使用してカスタムロールを定義できます。それらのロールはユーザー定義ロールと呼ばれます。
次に、さまざまなロールについて詳しく見ていきましょう。
組み込みロール
ユーザー定義ロール
このセクションでは、MongoDBの最も一般的な組み込みロールを見ていきます。
データベースユーザーロール
データベースユーザーロールは、通常のデータベースインタラクションで便利な通常のユーザーロールです。
| 役割 | 説明 |
| 読み取り | すべての非システムコレクションとsystem.jsコレクションを読み取ります |
| 読み書き | 非システムコレクションとsystem.jsコレクションでの読み書き機能の両方 |
データベース管理ロール
これらはデータベース上で管理操作を実行するために使用されるロールです。
| 役割 | 説明 |
| dbAdmin | インデックス作成や統計収集などの管理タスクを実行しますが、ユーザーや役割を管理することはできません |
| userAdmin | 特定のデータベースの役割とユーザーを作成および変更する機能を提供します |
| dbOwner | これはデータベースの所有者であり、任意のアクションを実行できます。これは、上記のすべての役割(読み書き、dbAdmin、userAdmin役割)を組み合わせたものに等しいです |
クラスタ管理者の役割
これらの役割は、ユーザーがMongoDBクラスタと対話し、管理することを可能にします。
| 役割 | 説明 |
| clusterManager | クラスターの管理および監視機能を有効にします。シャーディングおよびレプリケーションに使用される構成およびローカルデータベースへのアクセスを提供します |
| clusterMonitor | Cloud ManagerやOps Manager監視エージェントなどのMongoDB監視ツールへの読み取り専用アクセスを提供します |
| hostManager | 個々のサーバーを監視および管理する機能を提供します |
| clusterAdmin | この役割には、クラスター管理特権が最大限に含まれ、ユーザーがほぼ何でもできるようになります。この機能は、clusterManager、clusterMonitor、hostManager役割、およびdropDatabaseアクションの組み合わせに等しいです。 |
バックアップと復元の役割
これらは、MongoDBインスタンス内でデータをバックアップおよび復元するために必要な役割です。これらは管理データベースでのみ割り当てることができます。
| 役割 | 説明 |
| backup | データをバックアップするために必要な特権を提供します。この役割は、MongoDB Cloud ManagerおよびOps Manager、バックアップエージェント、およびmongodumpユーティリティに必要です。 |
| restore | 復元機能を実行するための特権を提供します |
すべてのデータベース役割
これらは、ローカルおよび設定データベースを除くすべてのデータベースと対話するための特権を提供するデータベース役割です。
| 役割 | 説明 |
| readAnyDatabase | 任意のデータベースを読む |
| readWriteAnyDatabase | すべてのデータベースに対する読み取りおよび書き込み権限を提供する |
| userAdminAnyDatabase | すべてのデータベースでユーザーとロールを作成および変更する |
| dbAdminAnyDatabase | すべてのデータベースでデータベース管理機能を実行する |
スーパーユーザー役割
MongoDBは、直接または間接的にシステム全体のスーパーユーザーアクセスを提供できます。以下の役割は、特定のデータベースまたはデータベースにスコープを持つスーパーユーザー特権を付与します。
- dbOwner
- userAdmin
- userAdminAnyDatabase
真のスーパーユーザー役割はroot 役割であり、すべての機能とリソースに対してシステム全体の特権を提供します。
すべてのユーザー役割と特権の詳細な説明については、公式のMongoDBドキュメントをご参照ください。
ビルトイン役割がアクセス要件の範囲をカバーするために必要な特権を提供できない場合や、ユーザーの範囲とアクションを制限する場合は、カスタムユーザー定義役割を定義できます。
MongoDB役割管理は、ユーザー定義の役割を作成および管理するために必要なメソッドを提供します。ユーザー定義の役割作成に最も一般的に使用されるメソッドは、以下の表に示されています(メソッドの完全なリストはこちらで確認できます)。
MongoDB役割管理
| メソッド | 説明 |
| db.createRole() | ロールとその権限を作成する |
| db.updateRole() | ユーザー定義のロールを更新する |
| db.dropRole() | ユーザー定義のロールを削除する |
| db.grantPrivilegesToRole() | ロールに新しい権限を割り当てる |
| db.revokePrivilegesFromRole() | ロールから権限を削除する |
このセクションでは、MongoDBインスタンス内で役割を作成および変更する方法について説明します。
役割は次の構文を使用して定義されます:
roles: [
{
role: "", db: ""
}
]
ユーザー作成時のユーザー役割の割り当て
最初に、createUserメソッドを使用して、特定のデータベース(スーパーマーケット)への読み取りおよび書き込みアクセスを持つユーザーを作成します。
結果:
db.createUser(
{
user: "harry",
pwd: "test123",
roles: [
{
role: "readWrite",
db: "supermarket"
}
]
}
)
結果:
次に、スーパーマーケットデータベースに管理ユーザーを作成し、他のすべてのデータベースに対する読み取りアクセスおよびバックアップと復元機能を付与するロールを割り当てます。
結果:
db.createUser(
{
user: "harryadmin",
pwd: "admin12345",
roles: [
{
role: "dbOwner", db: "supermarket"
},
{
role: "readAnyDatabase", db: "admin"
},
{
role: "backup", db: "admin"
},
{
role: "restore", db: "admin"
}
]
}
)
結果:
上記のコードブロックに示されているように、複数のロールを持つユーザーを作成することができ、データベース内の広範囲な機能にアクセスできます。
ロール情報の取得
getRoleメソッドを使用して、ユーザーは特定のロールに関する情報を取得できます。以下のコードは、管理データベースからreadWriteAnyDatabaseロールの詳細を取得する方法を示しています。
結果:
db.getRole("readWriteAnyDatabase")
結果:
そのロールに関連する権限を取得するには、showPrivilegesオプションを使用し、その値を'true'に設定します。これはgetUserメソッドでも使用できます。
結果:
db.getRole("readWriteAnyDatabase", { showPrivileges: true})
結果:
割り当てられたユーザーロールの特定
getUserメソッドを使用すると、特定のユーザーに割り当てられたロールを特定できます。以下の構文を使用します:
db.getUser("")
以下の例では、ユーザーharryとharryadminのユーザー詳細を取得し、そのロールを表示することができます。
結果:
db.getUser("harry")
db.getUser("harryadmin")
結果:
ユーザーロールの付与と取り消し
grantRolesToUserおよびrevokeRolesFromUserメソッドを使用して、既存のユーザーに割り当てられたロールを変更できます。これらのメソッドは以下の構文を使用します:
db. (
"",
[
{ role: "", db: "" }
]
)
以下の例では、ユーザーharryに新しいロールを付与し、必要な権限を提供してデータベース管理者(dbAdmin)として「vehicles」テーブルから統計を収集します。
結果:
db.grantRolesToUser(
"harry",
[
{ role: "dbAdmin", db: "vehicles" }
]
)
結果:
これでユーザーharryに新しいロールを追加しました。では、新たに付与したロールをrevokeRolesFromUserメソッドを使用して削除しましょう。
結果:
db.revokeRolesFromUser(
"harry",
[
{ role: "dbAdmin", db: "vehicles" }
]
)
結果:
ユーザー定義ロールの作成
createRoleメソッドを使用すると、ニーズに応じて新しいロールを作成できます。createRoleメソッドの基本構造は以下に示されています。
注意:createRoleメソッド内のrolesパラメータを使用することで、ユーザー定義ロール内の他のロールの権限を継承することができます。他の権限が不要な場合は、ユーザー定義ロールを作成する際に空のrolesパラメータを定義する必要があります。
db.createRole(
{
role: "",
privileges: [
{
resource: { db: "", collection: ""},
actions: [ "" ]
}
],
roles: [
{ role: "", db: "" } ] } )
ユーザー定義ロールをすべてのデータベースまたはコレクションに関連付けるには、リソースを空の二重引用符で指定できます。以下に示すように。
resource: { db: "", collection: ""}
次のコードブロックでは、スーパーマーケットデータベースの特定のデータベースコレクション(在庫コレクション)へのユーザーのアクセスを制限するロールを作成します。それはユーザーのアクションを見つけて更新コマンドに制限し、他の権限を継承しません。
結果:
db.createRole(
{
role: "inventoryeditor",
privileges: [
{
resource: { db: "supermarket", collection: "inventory"},
actions: [ "find", "update" ]
}
],
roles: [ ]
}
)
結果:
ユーザー定義の役割は、isBuiltinパラメーターを使用して識別できます。inventoryeditor役割は、そのパラメーターがfalseであるため、ビルトインでない役割であることを示しています。
これで、スタンドアロンのユーザー定義役割を作成する方法がわかりました。次に、別のビルトイン役割からいくつかの特権を継承するユーザー定義役割を作成します。
以下のコードブロックでは、すべてのCURD特権を持つinventorymanager役割を作成し、userAdmin役割から特権を継承します。
結果:
db.createRole(
{
role: "inventorymanager",
privileges: [
{
resource: { db: "supermarket", collection: "inventory"},
actions: [ "find", "update", "insert", "remove" ]
}
],
roles: [
{ role: "userAdmin", db: "supermarket" }
]
}
)
結果:
inventorymanager役割をgetRoleメソッドを使用して確認すると、継承された権限を含む役割の詳細が表示されます。
ユーザー定義の役割をユーザーに割り当てる
ユーザー定義の役割は、新しいユーザーに割り当てることも、既存のユーザーの役割を更新することも、ビルトイン役割と同様に行うことができます。次の例では、inventorymanager役割が割り当てられた新しいユーザーを作成し、inventoryeditor役割が割り当てられた既存のユーザーを更新します。
新しいユーザーの作成:
結果:
新しい役割の付与:
結果:
db.createUser(
{
user: "managerjerry",
pwd: "manager123",
roles: [
{
role: "inventorymanager",
db: "admin"
}
]
}
)
結果:
新しい役割の付与:
db.grantRolesToUser(
"repairmanager",
[
{ role: "inventoryeditor", db: "admin" }
]
)
結果:
ユーザー定義の役割の更新と削除
ユーザー定義の役割は、updateRoleメソッドを使用して更新し、dropRoleメソッドを使用して削除できます。
以下の例では、指定されたコレクション内で文書を作成するための追加特権を持つinventoryeditor役割を更新します。
結果:
db.updateRole(
"inventoryeditor",
{
privileges: [
{
resource: { db: "supermarket", collection: "inventory"},
actions: [ "find", "update", "insert" ]
}
],
roles: [ ]
}
)
結果:
役割を更新する際に最も重要な点は、特権と役割の配列内の古い値が完全に置き換えられることです。したがって、ユーザー定義の役割を更新する際には、変更を加えた完全な配列を提供する必要があります。
dropRoleメソッドは、ユーザー定義の役割を削除する単一の機能を持っています。以下のように、inventoryeditor役割をデータベースから削除できます。
結果:
db.dropRole("inventoryeditor")
結果:
上記のスクリーンショットは、役割の削除が成功したことを示しており、削除された役割を取得しようとすると、null値が返されます。役割が削除されると、削除された役割に関連付けられたすべてのユーザーに影響を与え、そのユーザー定義の役割によって付与されたすべての特権が取り消されます。
以前に、inventoryeditor役割をrepairmanagerユーザーに割り当てました。今、そのユーザーの詳細を確認すると、inventoryeditor役割はrepairmanagerユーザーにもはや割り当てられていないことがわかります。
結果:
db.getUser("repairmanager")
結果:
ユーザーに単一のユーザー定義役割が割り当てられている状況では、その役割が削除されると、空の役割配列が生成され、すべてのユーザー特権が否定されます。
このシナリオを確認するには、inventorymanager役割を削除し、managerjerryユーザーの詳細を取得します。これにより、ユーザーmanagerjerryの空の役割配列が生成され、役割削除前後のユーザー詳細を比較することで示されます。
結果:
db.getUser("managerjerry")
db.dropRole("inventorymanager")
db.getUser("managerjerry")
結果:
したがって、役割がユーザーに関連付けられているかどうか、またそれがユーザーの機能範囲にどのように影響するかを確認することが重要です削除する前にユーザー定義の役割。
最後に、dropRoleメソッドは、ユーザー定義の役割のみを削除できます。そのメソッドを使用してビルトイン役割を削除しようとすると、エラーが発生します。
これで、MongoDBの役割と役割管理についての包括的な説明が完了しました。
関連する読み物
- BMC Machine Learning & Big Data Blog
- 23 Common MongoDB Operators & How To Use Them、私たちのMongoDBガイドの一部
- BMCガイド、Apache CassandraやSpark、AWS、機械学習、データ可視化などのトピックに関する記事シリーズ
- データストレージの説明: データレイクとデータウェアハウス、データベースの違い
MongoDBガイド
- MongoDB概要:MongoDBの始め方
- UbuntuおよびMacにMongoDBをインストールする方法
- MongoDBにデータベースを作成する
- MongoDBシェル基本コマンド
- MongoDB Compass:Mongo GUIの使用
- MongoDBの役割ベースのアクセス制御(RBAC)の説明
- MongoDBの投影および投影演算子の説明
- MongoDBの集約関数の説明
- MongoDBのソート:sort()メソッドと例
- MongoDBでのPushおよびPull演算子の使用
- MongoDBの$unwindの使用方法
- 23の一般的なMongoDBクエリ演算子とその使用方法
- MongoDBのジオロケーションクエリの例
- MongoDBトランザクションの紹介
- MongoDBのインデックス:主要なインデックスタイプとその管理方法
- 知っておくべき主要なMongoDBコマンド
- MongoDBレプリケーション:完全な紹介
- MongoDBクラスターのセットアップ方法
- MongoDBシャーディング:概念、例、およびチュートリアル
- MongoDB Atlas:管理されたMongoDBの設定と使用
- MongoDBをDockerコンテナとして実行する方法
- MongoDBメモリ使用量、管理、および要件
- MongoDBバックアップのためにmongodumpを使用する方法
- MongoDBバックアップを復元するためのmongorestoreの例
- PyMongoの使用方法
- MongoDBおよびNodeJSにMongooseを使用する方法
- MongoDBチートシート
- MongoDB vs Cassandra:NoSQLデータベースの比較
- PostgreSQL vs MongoDB:データベースの比較
- MySQL vs MongoDB:データベースの比較
- MongoDB認定:紹介
これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。