Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

自己管理型配置でユーザーとロールを管理

項目一覧

  • 前提条件
  • ユーザー定義ロールを作成する
  • 既存のユーザーのアクセス権の変更
  • 既存のユーザーのパスワードの変更
  • ユーザーのロールの表示
  • ロールの特権を表示

このチュートリアルでは、自己管理型配置向けの MongoDB の認可モデルでのユーザーとロールの管理の例えを示します。 新しいユーザーを作成するには、「 自己管理型配置でユーザーを作成する 」を参照してください。

配置でアクセス制御を有効にした場合は、各セクションで指定された必要な特権を持つユーザーとして認証する必要があります。 このチュートリアルにリストされている操作を実行するには、ユーザー管理者は特定のデータベースで userAdminAnyDatabaseロール、またはuserAdminロールを必要とします。 ユーザー管理者を最初のユーザーに追加する方法の詳細については、「自己管理型配置でアクセス制御を有効にする 」を参照してください。

注意

MongoDB Atlas でユーザー定義ロールを作成するには、MongoDB Atlas ドキュメントの「 カスタムロールの追加」を参照してください。

ロールはユーザーに MongoDB リソースへのアクセスを許可します。MongoDB には、管理者が MongoDB システムへのアクセスを制御するために使用できる組み込みロールが多数用意されています。ただし、これらのロールで目的の特権セットを記述できない場合は、特定のデータベースに新しいロールを作成できます。

admin データベースで作成されたロールを除き、ロールにはそのデータベースに適用される権限のみを含めて、そのデータベース内の他のロールからのみ継承できます。

admin データベースで作成されたロールには、admin データベース、他のデータベース、またはクラスターリソースに適用する特権を含めることができ、admin データベースだけでなく他のデータベースのロールからも継承できます。

新しいロールを作成するには、db.createRole() メソッドを使用して、privileges 配列に特権を指定し、roles 配列に継承されたロールを指定します。

MongoDB は、データベース名とロール名の組み合わせを使用して、ロールを一意に定義します。各ロールの範囲はロールを作成したデータベースに限定されますが、MongoDB はすべてのロール情報を admin データベースの admin.system.roles コレクションに保存します。

データベースにロールを作成するには、以下が必要です。

組み込みロール userAdminuserAdminAnyDatabase は、それぞれのリソース上で createRole および grantRole のアクションを提供します。

authenticationRestrictions を指定してロールを作成するには、ロールが作成されるデータベース リソース上のsetAuthenticationRestriction アクションが必要です。

mongosh でユーザー定義のロールをカスタムで追加するには、次の例を参照してください。

次の例では、 manageOpRoleという名前のロールを作成します。これは、 db.currentOp()db.killOp()の両方を実行する特権のみを提供します。 [ 1 ]

注意

ユーザーは、 mongodインスタンスでの自身の操作を表示または強制終了するために特別な特権を必要としません。 詳しくは、 db.currentOp()db.killOp()を参照してください。

1

前提条件 mongodセクションで指定された特権でmongos または に接続します。

次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin には、admin およびその他のデータベースでロールを作成する特権があります。

2

manageOpRole には、複数のデータベースとクラスター リソースを操作する特権があるため、 したがって、 adminデータベースにこのロールを作成する必要があります。

use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)

新しいロールによってあらゆる操作を強制終了する権限が付与されます。

警告

実行中の操作は、細心の注意を払って終了します。 クライアントによって開始された操作を終了するには、 db.killOp()メソッドまたはkillOpコマンドを使用するのみを使用し、内部データベース操作は終了しません

[1] 組み込みロール clusterMonitor では他の特権に加え db.currentOp() を実行する特権が付与され、組み込みロール hostManager では他の特権に加え、 db.killOp() を実行する特権が付与されます。

次の例では、 mongostatを実行する権限のみを提供するmongostatRoleという名前のロールを作成します。 [ 2 ]

1

前提条件 mongodセクションで指定された特権でmongos または に接続します。

次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin には、admin およびその他のデータベースでロールを作成する特権があります。

2

mongostatRole には、クラスター リソースを操作する特権があるため、 したがって、 adminデータベースにこのロールを作成する必要があります。

use admin
db.createRole(
{
role: "mongostatRole",
privileges: [
{ resource: { cluster: true }, actions: [ "serverStatus" ] }
],
roles: []
}
)
[2] 組み込みロールclusterMonitorには、他の特権に加えてmongostatを実行する特権も付与されます。

次の例では、任意のデータベース内のsystem.viewsコレクションを削除する特権を付与するdropSystemViewsAnyDatabaseという名前のロールを作成します。

1

前提条件 mongodセクションで指定された特権でmongos または に接続します。

次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin には、admin およびその他のデータベースでロールを作成する特権があります。

2

ロールには、次の要素を含む特権を指定します。

use admin
db.createRole(
{
role: "dropSystemViewsAnyDatabase",
privileges: [
{
actions: [ "dropCollection" ],
resource: { db: "", collection: "system.views" }
}
],
roles: []
}
)

注意

MongoDB Atlas で既存のデータベースユーザーのロールを変更するには、MongoDB Atlas ドキュメントの「データベースユーザーの変更 」を参照してください。

  • データベースにロールを付与するには、そのデータベースに対してgrantRoleアクションが必要です。

  • データベースのロールを取り消すには、データベースに対してrevokeRoleアクションが必要です。

  • ロールの情報を表示するには、ロールが明示的に付与されているか、ロールのデータベースに対してviewRoleアクションを持っている必要があります。

1

前提条件セクションで指定される特権を持つユーザーとして mongod または mongos に接続します。

次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

変更するユーザーのロールと特権を表示するには、 db.getUser() } メソッドとdb.getRole()メソッドを使用します。

たとえば、追加の例で作成されたreportsUserのロールを表示するには、次のコマンドを発行します。

use reporting
db.getUser("reportsUser")

"accounts"データベースでreadWriteロールによってユーザーに付与される権限を表示するには、次のコマンドを実行します。

use accounts
db.getRole( "readWrite", { showPrivileges: true } )
3

ユーザーが追加の特権を必要とする場合は、必要な特権セットを伴うロールを 1 つまたは複数、ユーザーに付与します。そのようなロールが存在しない場合は、適切な特権セットを伴う新しいロールを作成します

既存ロールで提供されている特権のサブセットを取り消すには、元のロールを取り消してから必要な特権のみを含むロールを付与します。ロールが存在しない場合は、新しいロールを作成する必要があります。

4

db.revokeRolesFromUser()メソッドを使用してロールを取り消します。 次の操作の例では、 accountsデータベースのreadWriteロールをreportsUserから削除します。

use reporting
db.revokeRolesFromUser(
"reportsUser",
[
{ role: "readWrite", db: "accounts" }
]
)

db.grantRolesToUser() メソッドを使用してロールを付与します。たとえば、次の操作を実行すると、reportsUser ユーザーにaccounts データベースで read ロールが付与されます。

use reporting
db.grantRolesToUser(
"reportsUser",
[
{ role: "read", db: "accounts" }
]
)

シャーディングされたクラスターでは、ユーザーに加えた変更はコマンドが実行される mongos にすぐに反映されます。ただし、クラスター内の他の mongos インスタンスでは、ユーザー キャッシュが更新されるまでに最大 10 分かかる場合があります。詳細については、「userCacheInvalidationIntervalSecs」を参照してください。

注意

既存の MongoDB Atlas ユーザーのパスワードを変更するには、MongoDB Atlas ドキュメントの「データベースユーザーの変更 」を参照してください。

データベース上の別のユーザーのパスワードを変更するには、そのデータベースの changePassword アクションが必要です。

1

前提条件 セクションで指定された特権で mongod または mongos に接続します。

次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

ユーザーのユーザー名と新しいパスワードを db.changeUserPassword() メソッドに渡します。

次の操作では、 reportingユーザーのパスワードがSOh3TbYhxuLiW8ypJPxmt1oOfLに変更されます。

db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")

Tip

以下も参照してください。

注意

MongoDB Atlas でユーザーのロールを表示するには、MongoDB Atlas ドキュメントの「 データベースユーザーと証明書の表示 」を参照してください。

他のユーザーの情報を表示するには、他のユーザーのデータベースに対してviewUserアクションが必要です。

ユーザーは自分の情報を表示できます。

1

前提条件セクションで指定される特権を持つユーザーとして mongod または mongos に接続します。

次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

usersInfo コマンドまたは db.getUser() メソッドを使用してユーザー情報を表示します。

たとえば、追加の例で作成されたreportsUserのロールを表示するには、次のコマンドを発行します。

use reporting
db.getUser("reportsUser")

返されたドキュメントのrolesフィールドにはreportsUserのすべてのロールが表示されます。

...
"roles" : [
{ "role" : "readWrite", "db" : "accounts" },
{ "role" : "read", "db" : "reporting" },
{ "role" : "read", "db" : "products" },
{ "role" : "read", "db" : "sales" }
]

注意

MongoDB Atlas でロールの特権を表示するには、MongoDB Atlas ドキュメントの「 カスタムロールの表示 」を参照してください。

ロールの情報を表示するには、ロールが明示的に付与されているか、ロールのデータベースに対してviewRoleアクションを持っている必要があります。

1

前提条件セクションで指定される特権を持つユーザーとして mongod または mongos に接続します。

次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

特定のロールに対して、 db.getRole()メソッドまたはrolesInfoコマンドとshowPrivilegesオプションを使用します。

たとえば、products データベースで read ロールによって付与される特権を表示するには、次の操作を使用してコマンドを発行します。

use products
db.getRole( "read", { showPrivileges: true } )

返されたドキュメントには、privileges 配列と inheritedPrivileges 配列が含まれます。privileges には、ロールによって直接指定される特権のみが列挙され、他のロールから継承される特権は除外されています。inheritedPrivileges には、直接指定されるものと継承されるものの両方を含む、このロールによって付与されるすべての特権が列挙されています。ロールが他のロールの特権を継承しない場合、これら2つのフィールドは同一になります。

...
"privileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
],
"inheritedPrivileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
]

戻る

ユーザー定義のロール