自己管理型配置でユーザーとロールを管理
このチュートリアルでは、自己管理型配置向けの 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 ドキュメントの「データベースユーザーの変更 」を参照してください。
前提条件
手順
適切な特権で 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 ドキュメントの「データベースユーザーの変更 」を参照してください。
前提条件
データベース上の別のユーザーのパスワードを変更するには、そのデータベースの 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 ドキュメントの「 データベースユーザーと証明書の表示 」を参照してください。
前提条件
他のユーザーの情報を表示するには、他のユーザーのデータベースに対して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" ] } ]