このチュートリアルでは、自己管理型配置向けの MongoDB の認可モデルでのユーザーとロールの管理の例えを示します。 新しいユーザーを作成するには、「 自己管理型配置でユーザーを作成する 」を参照してください。
前提条件
配置でアクセス制御を有効にした場合は、各セクションで指定された必要な特権を持つユーザーとして認証する必要があります。 このチュートリアルにリストされている操作を実行するには、ユーザー管理者は特定のデータベースで userAdminAnyDatabaseロール、またはuserAdminロールを必要とします。 ユーザー管理者を最初のユーザーに追加する方法の詳細については、「自己管理型配置でアクセス制御を有効にする 」を参照してください。
ユーザー定義ロールを作成する
注意
MongoDB Atlas でユーザー定義のロールを作成するには、MongoDB Atlas ドキュメントの「 カスタム ロールの追加」を参照してください。
ロールはユーザーに MongoDB リソースへのアクセスを許可します。MongoDB には、管理者が MongoDB システムへのアクセスを制御するために使用できる組み込みロールが多数用意されています。ただし、これらのロールで目的の特権セットを記述できない場合は、特定のデータベースに新しいロールを作成できます。
admin データベースで作成されたロールを除き、ロールにはそのデータベースに適用される権限のみを含めて、そのデータベース内の他のロールからのみ継承できます。
admin データベースで作成されたロールには、admin データベース、他のデータベース、またはクラスターリソースに適用する特権を含めることができ、admin データベースだけでなく他のデータベースのロールからも継承できます。
新しいロールを作成するには、db.createRole() メソッドを使用して、privileges 配列に特権を指定し、roles 配列に継承されたロールを指定します。
MongoDB は、データベース名とロール名の組み合わせを使用して、ロールを一意に定義します。各ロールの範囲はロールを作成したデータベースに限定されますが、MongoDB はすべてのロール情報を admin データベースの admin.system.roles コレクションに保存します。
前提条件
データベースにロールを作成するには、以下が必要です。
組み込みロール userAdmin と userAdminAnyDatabase は、それぞれのリソース上で createRole および grantRole のアクションを提供します。
authenticationRestrictions を指定してロールを作成するには、ロールが作成されるデータベース リソース上のsetAuthenticationRestriction アクションが必要です。
mongosh でユーザー定義のロールをカスタムで追加するには、次の例を参照してください。
現在の操作を管理するためのロールを作成
次の例では、 manageOpRoleという名前のロールを作成します。これは、 db.currentOp()とdb.killOp()の両方を実行する特権のみを提供します。 [ 1 ]
注意
ユーザーは、 mongodインスタンスでの自身の操作を表示または強制終了するために特別な特権を必要としません。 詳しくは、 db.currentOp()とdb.killOp()を参照してください。
適切な特権で MongoDB に接続します。
前提条件 mongodセクションで指定された特権でmongos または に接続します。
次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin には、admin およびその他のデータベースでロールを作成する特権があります。
現在の操作を管理するための新しいロールを作成します。
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
次の例では、 mongostatを実行する権限のみを提供するmongostatRoleという名前のロールを作成します。 [ 2 ]
適切な特権で MongoDB に接続します。
前提条件 mongodセクションで指定された特権でmongos または に接続します。
次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin には、admin およびその他のデータベースでロールを作成する特権があります。
現在の操作を管理するための新しいロールを作成します。
mongostatRole には、クラスター リソースを操作する特権があるため、 したがって、 adminデータベースにこのロールを作成する必要があります。
use admin db.createRole( { role: "mongostatRole", privileges: [ { resource: { cluster: true }, actions: [ "serverStatus" ] } ], roles: [] } )
| [2] | 組み込みロールclusterMonitorには、他の特権に加えてmongostatを実行する特権も付与されます。 |
データベース全体で system.views コレクションを削除するロールの作成
次の例では、任意のデータベース内のsystem.viewsコレクションを削除する特権を付与するdropSystemViewsAnyDatabaseという名前のロールを作成します。
適切な特権で MongoDB に接続します。
前提条件 mongodセクションで指定された特権でmongos または に接続します。
次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin には、admin およびその他のデータベースでロールを作成する特権があります。
任意のデータベース内の system.views コレクションを削除するための新しいロールを作成します。
ロールには、次の要素を含む特権を指定します。
dropCollectionアクションを含むactions配列、およびデータベースに空の文字列(
"")を指定し、コレクションに文字列"system.views"を指定するリソース ドキュメント。詳細については、「データベース全体でコレクションをリソースとして指定」を参照してください。
use admin db.createRole( { role: "dropSystemViewsAnyDatabase", privileges: [ { actions: [ "dropCollection" ], resource: { db: "", collection: "system.views" } } ], roles: [] } )
既存のユーザーのアクセス権の変更
注意
MongoDB Atlasで既存のデータベースユーザーのロールを変更するには、 MongoDB Atlasドキュメントの 「mod-mongodb-users」 を参照してください。
前提条件
手順
適切な特権で MongoDB に接続します。
前提条件セクションで指定される特権を持つユーザーとして mongod または mongos に接続します。
次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
ユーザーのロールと特権を特定します。
変更するユーザーのロールと特権を表示するには、 db.getUser() } メソッドとdb.getRole()メソッドを使用します。
たとえば、追加の例で作成されたreportsUserのロールを表示するには、次のコマンドを発行します。
use reporting db.getUser("reportsUser")
"accounts"データベースでreadWriteロールによってユーザーに付与される権限を表示するには、次のコマンドを実行します。
use accounts db.getRole( "readWrite", { showPrivileges: true } )
付与または取り消す特権を特定します。
ユーザーが追加の特権を必要とする場合は、必要な特権セットを伴うロールを 1 つまたは複数、ユーザーに付与します。そのようなロールが存在しない場合は、適切な特権セットを伴う新しいロールを作成します。
既存ロールで提供されている特権のサブセットを取り消すには、元のロールを取り消してから必要な特権のみを含むロールを付与します。ロールが存在しない場合は、新しいロールを作成する必要があります。
ユーザーのアクセス権を変更します。
ロールを取り消す
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ドキュメントの 「mod-mongodb-users」 を参照してください。
前提条件
データベース上の別のユーザーのパスワードを変更するには、そのデータベースの changePassword アクションが必要です。
手順
適切な特権で MongoDB に接続します。
前提条件 セクションで指定された特権で mongod または mongos に接続します。
次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
パスワードを変更します。
ユーザーのユーザー名と新しいパスワードを db.changeUserPassword() メソッドに渡します。
次の操作では、 reportingユーザーのパスワードがSOh3TbYhxuLiW8ypJPxmt1oOfLに変更されます。
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
ユーザーのロールの表示
注意
MongoDB Atlasでユーザーのロールを表示するには、 MongoDB Atlasドキュメントの view-mongodb-users を参照してください。
前提条件
他のユーザーの情報を表示するには、他のユーザーのデータベースに対してviewUserアクションが必要です。
ユーザーは自分の情報を表示できます。
手順
適切な特権で MongoDB に接続します。
前提条件セクションで指定される特権を持つユーザーとして mongod または mongos に接続します。
次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
ユーザーのロールを特定します。
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アクションを持っている必要があります。
手順
適切な特権で MongoDB に接続します。
前提条件セクションで指定される特権を持つユーザーとして mongod または mongos に接続します。
次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
ロールによって付与される特権を特定します。
特定のロールに対して、 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" ] } ]