ロールベースのアクセスコントロールを使用したデータベースアクセス - Amazon DocumentDB

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ロールベースのアクセスコントロールを使用したデータベースアクセス

Amazon DocumentDB (MongoDB 互換) のロールベースのアクセスコントロール (RBAC) を使用して、ユーザーがデータベースに対して実行できるアクションへのアクセスを制限できます。RBAC は、ユーザーに 1 つ以上のロールを付与することで機能します。これらのロールは、ユーザーがデータベースリソースに対して実行できるオペレーションを決定します。Amazon DocumentDB は、現在、readreadWritereadAnyDatabaseclusterAdmin のようなデータベースレベルを対象とする組み込みロール、および要件に基づいて特定のアクションと詳細なリソースの両方をサポートしています。

の一般的なユースケースRBACには、クラスター内のデータベースまたはコレクションへの読み取り専用アクセス権を持つユーザーを作成することで最小特権を強制することや、クラスター内の特定のデータベースまたはコレクションに 1 人のユーザーがアクセスできるようにするマルチテナントアプリケーション設計などがあります。

注記

2020 年 3 月 26 日 より前に作成されたすべての新規ユーザーには dbAdminAnyDatabasereadWriteAnyDatabase、および clusterAdmin のロールが付与されています。すべての既存ユーザーを再評価し、必要に応じてロールを変更してクラスターに最小特権を適用することをお勧めします。

RBAC の概念

ロールベースのアクセスコントロールに関連する重要な用語と概念を以下に示します。Amazon DocumentDB ユーザーの詳細については、Amazon DocumentDB ユーザーの管理 を参照してください。

  • ユーザー - データベースに対して認証し、オペレーションを実行できる個別のエンティティ。

  • パスワード - ユーザーの認証に使用されるシークレット。

  • ロール - 1 つ以上のデータベースに対してアクションを実行することをユーザーに許可します。

  • 管理データベース - ユーザーを保存して認証する先のデータベース。

  • データベース (db) - ドキュメントを保存するためのコレクションを含むクラスター内の名前空間。

次のコマンドは、sample-user というユーザーを作成します。

db.createUser({user: "sample-user", pwd: "abc123", roles: [{role: "read", db: "sample-database"}]})

この例では、以下のようになっています。

  • user: "sample-user" - ユーザー名を示します。

  • pwd: "abc123" - ユーザーのパスワードを示します。

  • role: "read", "db: "sample-database" - ユーザー sample-usersample-database への読み取り許可を付与することを示します。

ユーザー名、パスワード、アクセス許可を示す createUser コマンドを示すコード例。

次の例は、db.getUser(sample-user) を使用してユーザー sample-user を取得した後の出力を示しています。この例では、ユーザー sample-useradmin データベース内に存在しますが、データベース sample-database の読み取りロールを持っています。

新しいユーザー ID、新しいユーザーが割り当てられている管理者データベース、およびユーザーに適用されるロールのアクセス許可を定義する createUser コマンドの結果を示すコード出力例。

ユーザーの作成時に、db フィールドを省略してロールを指定すると、Amazon DocumentDB は接続の発行先であるデータベースに暗黙でロールを帰属させます。たとえば、データベース sample-database に対して接続を発行し、次のコマンドを実行すると、ユーザー sample-useradmin データベース内に作成され、データベース sample-database への readWrite アクセス許可が付与されます。

db.createUser({user: "sample-user", pwd: "abc123", roles: ["readWrite"]})

このオペレーションによる出力は、次のようになります。

{ "user":"sample-user", "roles":[ { "db":"sample-database", "role":"readWrite" } ] }

すべてのデータベースを対象とするロール (readAnyDatabase など) を持つユーザーを作成するには、ユーザーの作成時に admin データベースのコンテキストで操作をしているか、ユーザーの作成時にロールのデータベースを明示的に指定する必要があります。admin データベースに対してコマンドを発行するには、コマンド use admin を使用します。詳細については、「一般的なコマンド」を参照してください。

RBAC 組み込みロールの開始方法

ロールベースのアクセスコントロールの使用を簡単に開始できるように、このセクションでは、異なるジョブ機能を持つ 3 人のユーザーのロールを作成して最小特権を強制するシナリオの例を示します。

  • user1 は、クラスター内のすべてのデータベースの表示とアクセスを必要とする新しいマネージャーです。

  • user2 は、同じクラスター内の 1 つのデータベース (sample-database-1) にのみアクセスする必要がある新しい従業員です。

  • user3 は、同じクラスター内の、以前はアクセスできなかった別のデータベース (sample-database-2) の表示とアクセを必要とする既存の従業員です。

後で、user1user2 が退職し、この両方のユーザーのアクセス権を取り消す必要があります。

ユーザーを作成してロールを付与する場合、クラスターに対して認証を行うユーザーには、createUsergrantRole のアクションを実行できるロールが関連付けられている必要があります。たとえば、admin ロールと userAdminAnyDatabase ロールは両方とも、該当するアクションのアクセス許可を付与できます。ロール別のアクションについては、「ロールベースのアクセスコントロールを使用したデータベースアクセス」を参照してください。

注記

Amazon DocumentDB では、create データベースに対してコマンドを発行するかどうかにかかわらず、ユーザーおよびロールのすべてのオペレーション (getdropgrantrevokeadmin など) が admin データベース内で暗黙で実行されます。

まず、クラスター内の現在のユーザーとロールを確認するために、次の例に示すように show users コマンドを実行します。2 人のユーザーserviceadminとクラスターのプライマリユーザーが表示されます。これらの 2 人のユーザーは常に存在し、削除することはできません。詳細については、「Amazon DocumentDB ユーザーの管理」を参照してください。

show users

user1 に対して、次のコマンドを使用し、クラスター全体のすべてのデータベースに対する読み取りおよび書き込みアクセス権を持つロールを作成します。

db.createUser({user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})

このオペレーションによる出力は、次のようになります。

{ "user":"user1", "roles":[ { "role":"readWriteAnyDatabase", "db":"admin" } ] }

user2 に対して、次のコマンドを使用し、データベース sample-database-1 への読み取り専用アクセス権を持つロールを作成します。

db.createUser({user: "user2", pwd: "abc123", roles: [{role: "read", db: "sample-database-1"}]})

このオペレーションによる出力は、次のようになります。

{ "user":"user2", "roles":[ { "role":"read", "db":"sample-database-1" } ] }

user3 を既存のユーザーとするシナリオをシミュレートするには、まずユーザー user3 を作成し、次に user3 新しいロールを割り当てます。

db.createUser({user: "user3", pwd: "abc123", roles: [{role: "readWrite", db: "sample-database-1"}]})

このオペレーションによる出力は、次のようになります。

{ "user":"user3", "roles":[ { "role":"readWrite", "db":"sample-database-1" } ] }

ユーザー user3 を作成したので、この user3 に対して sample-database-2read ロールを割り当てます。

db.grantRolesToUser("user3", [{role: "read", db: "sample-database-2"}])

最後に、user1user2 が退職し、この両ユーザーのクラスターに対するアクセス権を取り消す必要があります。これを行うには、次のようにユーザーを削除します。

db.dropUser("user1") db.dropUser("user2")

すべてのユーザーが適切なロールを持っていることを確認するには、次のコマンドを使用してすべてのユーザーを一覧表示します。

show users

このオペレーションによる出力は、次のようになります。

{ "_id":"serviceadmin", "user":"serviceadmin", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"master-user", "user":"master-user", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"user3", "user":"user3", "db":"admin", "roles":[ { "db":"sample-database-2", "role":"read" }, { "db":"sample-database-1", "role":"readWrite" } ] }

RBAC ユーザー定義ロールの開始方法

このセクションでは、ユーザー定義の役割を開始するのに役立つように、ジョブ機能が異なる 3 人のユーザーにロールを作成して最小特権を適用するシナリオの例について説明します。

この例では、以下が適用されます。

  • user1 は、クラスター内のすべてのデータベースの表示とアクセスを必要とする新しいマネージャーです。

  • user2 は、同じクラスター内の 1 つのデータベース sample-database-1 にのみアクセスする必要がある新しい従業員です。

  • user3 は、同じクラスター内で以前はアクセスできなかった sample-database-2、別のデータベースの col2 という特定のコレクションを表示してアクセスする必要がある既存の従業員です。

  • user1 に対して、次のコマンドを使用し、クラスター全体のすべてのデータベースに対する読み取りおよび書き込みアクセス権を持つロールを作成します。

db.createUser( { user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}] } )

このオペレーションによる出力は、次のようになります。

{ "user":"user1", "roles":[ { "role":"readWriteAnyDatabase", "db":"admin" } ] }

user2 の場合、次のコマンドを使用して、データベース sample-database-1 内のすべてのコレクションに対する「検索」権限を持つロールを作成します。このロールは、関連付けられたすべてのユーザーが検索クエリのみを実行できるようにすることに注意してください。

db.createRole( { role: "findRole", privileges: [ { resource: {db: "sample-database-1", collection: ""}, actions: ["find"] }], roles: [] } )

このオペレーションによる出力は、次のようになります。

{ "role":"findRole", "privileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "find" ] } ], "roles":[ ] }

次に、ユーザー (user2) を作成し、最近作成したロール findRole をユーザーに接続します。

db.createUser( { user: "user2", pwd: "abc123", roles: [] }) db.grantRolesToUser("user2",["findRole"])

既存のユーザーuser3であるシナリオをシミュレートするには、まずユーザー を作成しuser3、次に という新しいロールを作成します。 collectionRole このロールは、次のステップで に割り当てますuser3

そして、新しいロールを user3 に割り当てることができます。この新しいロールにより、user3 の 1 つの特定のコレクション col2 へのアクセスを挿入、更新、削除、および検索できる sample-database-2 を許可します。

db.createUser( { user: "user3", pwd: "abc123", roles: [] }) db.createRole( { role: "collectionRole", privileges: [ { resource: {db: "sample-database-2", collection: "col2"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )

このオペレーションによる出力は、次のようになります。

{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }

ユーザー user3 を作成したので、user3 にロール collectionFind を付与できます。

db.grantRolesToUser("user3",["collectionRole"])

最後に、user1user2 が退職し、この両ユーザーのクラスターに対するアクセス権を取り消す必要があります。これを行うには、次のようにユーザーを削除します。

db.dropUser("user1") db.dropUser("user2")

すべてのユーザーが適切なロールを持っていることを確認するには、次のコマンドを使用してすべてのユーザーを一覧表示します。

show users

このオペレーションによる出力は、次のようになります。

{ "_id":"serviceadmin", "user":"serviceadmin", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"master-user", "user":"master-user", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"user3", "user":"user3", "db":"admin", "roles":[ { "db":"admin", "role":"collectionRole" } ] }

ユーザーとして Amazon DocumentDB に接続する

Amazon DocumentDB クラスターに接続するときは、特定のデータベースのコンテキストで接続します。デフォルトでは、接続文字列でデータベースを指定しない場合、test データベースのコンテキストでクラスターに自動的に接続されます。insertfind などのすべてのコレクションレベルのコマンドは、test データベース内のコレクションに対して発行されます。

コンテキスト内にあるデータベース、つまりコマンドの発行を確認するには、以下のように、mongo シェル内の db コマンドを実行します。

クエリ:

db

出力:

test

デフォルトの接続が test データベースのコンテキストに存在する場合でも、この接続に関連付けられているユーザーが test データベースに対するアクションの実行を許可されているとは限りません。前のシナリオ例で、sample-database-1 データベースに対する readWrite ロールを持つユーザー user3 として認証する場合、接続のデフォルトのコンテキストは test データベースです。ただし、test データベースのコレクションにドキュメントを挿入しようとすると、認証の失敗エラーメッセージが表示されます。これは、このコマンドをデータベースに対して実行する権限がユーザーに許可されていないことが原因です。

クエリ:

db

出力:

test

クエリ:

db.col.insert({x:1})

出力:

WriteCommandError({ "ok" : 0, "code" : 13, "errmsg" : "Authorization failure" })

接続のコンテキストを sample-database-1 データベースに変更すると、ユーザーが書き込み権限を持つコレクションに書き込むことができます。

クエリ:

use sample-database-1

出力:

switched to db sample-database-1

クエリ:

db.col.insert({x:1})

出力:

WriteResult({ "nInserted" : 1})

特定のユーザーとしてクラスターに対して認証を行う場合は、接続文字列でデータベースを指定することもできます。これにより、ユーザーが admin データベースに対して認証された後で use コマンドを実行する必要がなくなります。

次の接続文字列では、admin データベースに対してユーザーを認証しますが、接続のコンテキストは sample-database-1 データベースになります。

mongo "mongodb://user3:abc123@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database-2"

一般的なコマンド

このセクションでは、Amazon DocumentDB でロールベースのアクセスコントロールを使用する一般的なコマンドの例を示します。ユーザーとロールを作成および変更するには、admin データベースのコンテキストで操作する必要があります。use admin コマンドを使用して、admin データベースに切り替えることができます。

注記

ユーザーおよびロールに対する変更は、admin データベース内で暗黙で実行されます。すべてのデータベースを対象とするロール (readAnyDatabase など) を持つユーザーを作成するには、ユーザーの作成時に admin データベース (use admin) のコンテキストで操作をしているか、ユーザーの作成時にロールのデータベースを明示的に指定する必要があります (このセクションの例 2 を参照)。

例 1: データベース read 用の foo ロールを持つユーザーを作成します。

db.createUser({user: "readInFooBar", pwd: "abc123", roles: [{role: "read", db: "foo"}]})

このオペレーションによる出力は、次のようになります。

{ "user":"readInFooBar", "roles":[ { "role":"read", "db":"foo" } ] }

例 2: すべてのデータベースへの読み取りアクセス権を持つユーザーを作成します。

db.createUser({user: "readAllDBs", pwd: "abc123", roles: [{role: "readAnyDatabase", db: "admin"}]})

このオペレーションによる出力は、次のようになります。

{ "user":"readAllDBs", "roles":[ { "role":"readAnyDatabase", "db":"admin" } ] }

例 3: 新しいデータベースの既存のユーザーに read ロールを付与します。

db.grantRolesToUser("readInFooBar", [{role: "read", db: "bar"}])

例 4: ユーザーのロールを更新します。

db.updateUser("readInFooBar", {roles: [{role: "read", db: "foo"}, {role: "read", db: "baz"}]})

例 5: ユーザーのデータベースへのアクセスを取り消します。

db.revokeRolesFromUser("readInFooBar", [{role: "read", db: "baz"}])

例 6: 組み込みロールを説明します。

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

このオペレーションによる出力は、次のようになります。

{ "role":"read", "db":"sample-database-1", "isBuiltin":true, "roles":[ ], "inheritedRoles":[ ], "privileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "changeStream", "collStats", "dbStats", "find", "killCursors", "listCollections", "listIndexes" ] } ], "inheritedPrivileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "changeStream", "collStats", "dbStats", "find", "killCursors", "listCollections", "listIndexes" ] } }

例 7: クラスターからユーザーを削除します。

db.dropUser("readInFooBar")

このオペレーションによる出力は、次のようになります。

true

例 8: 特定のコレクションに対する読み取りおよび書き込みアクセス権を持つロールを作成する

db.createRole( { role: "collectionRole", privileges: [ { resource: {db: "sample-database-2", collection: "col2"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )

このオペレーションによる出力は、次のようになります。

{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }

例 9: ユーザーを作成し、ユーザー定義ロールを割り当てる

db.createUser( { user: "user3", pwd: "abc123", roles: [] }) db.grantRolesToUser("user3",["collectionRole"])

例 10: ユーザー定義ロールに追加権限を付与する

db.grantPrivilegesToRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col1" }, actions: ["find", "update", "insert", "remove"] } ] )

例 11: ユーザー定義ロールから権限を削除する

db.revokePrivilegesFromRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col2" }, actions: ["find", "update", "insert", "remove"] } ] )

例 12: 既存のユーザー定義ロールを更新する

db.updateRole( "collectionRole", { privileges: [ { resource: {db: "sample-database-3", collection: "sample-collection-3"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )

機能の違い

Amazon DocumentDB では、ユーザーとロールの定義が admin データベースに保存され、ユーザーは admin データベースに対して認証されます。この機能は MongoDB Community Edition とは異なりますが、MongoDB Atlas と一貫しています。

Amazon DocumentDB は、変更ストリームもサポートしています。変更ストリームは、クラスターのコレクション内で発生する変更イベントの時系列シーケンスを提供します。listChangeStreams アクションは、クラスターレベル (つまり、すべてのデータベースを対象に) 適用されます。modifyChangeStreams アクションは、データベースレベルで適用されます。

制限

次のテーブルは Amazon DocumentDB におけるロールベースアクセスコントロールの制限を含む

説明 制限
クラスターあたりのユーザー数 1,000
ユーザーに関連付けられているロールの数 1,000
ユーザー定義ロールの数 100
権限に関連付けられているリソースの数 100

ロールベースのアクセスコントロールを使用したデータベースアクセス

ロールベースのアクセスコントロールでは、ユーザーを作成して 1 つ以上のロールを付与し、ユーザーがデータベースやクラスターで実行できるオペレーションを指定できます。

Amazon DocumentDB で現在サポートされている組み込みロールは次のとおりです。

注記

Amazon DocumentDB 4.0 と 5.0 では、それぞれ ListCollection および ListDatabase コマンドでは、オプションで authorizedCollections および authorizedDatabases パラメータを使用して、ユーザーが権限を持っているコレクションとデータベースを一覧表示し、listCollections および listDatabase ロールを要求するアクセスをします。また、ユーザーは KillCursor ロールを要求すねことなく、自分のカーソルを強制終了できるようになりました。

Database user
ロール名 説明 アクション
read 指定したデータベースへの読み取りアクセス権をユーザーに付与します。

changeStreams

collStats

dbStats

find

killCursors

listIndexes

listCollections

readWrite 指定したデータベースへの読み取りおよび書き込みアクセス権をユーザーに付与します。

read アクセス許可のすべてのアクション。

createCollection

dropCollection

createIndex

dropIndex

insert

killCursors

listIndexes

listCollections

remove

update

Cluster user
ロール名 説明 アクション
readAnyDatabase クラスター内のすべてのデータベースへの読み取りアクセス権をユーザーに付与します。

read アクセス許可のすべてのアクション。

listChangeStreams

listDatabases

readWriteAnyDatabase クラスター内のすべてのデータベースへの読取りおよび書込みアクセス権をユーザーに付与します。

readWrite アクセス許可のすべてのアクション。

listChangeStreams

listDatabases

userAdminAnyDatabase 指定したデータベースに対するユーザーのロールや特権を割り当てたり変更したりできる権限をユーザーに付与します。

changeCustomData

changePassword

createUser

dropRole

dropUser

grantRole

listDatabases

revokeRole

viewRole

viewUser

dbAdminAnyDatabase 指定したデータベースに対してデータベース管理ロールを実行する権限をユーザーに付与します。

dbAdmin アクセス許可のすべてのアクション。

dropCollection

listDatabases

listChangeStreams

modifyChangeStreams

Superuser
ロール名 説明 アクション
root すべてのロール (readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestorebackup) のリソースとオペレーションに対するアクセス権をユーザーに付与します。

readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestore および backup のすべてのアクション。

Database administrator
ロール名 説明 アクション
dbAdmin 指定したデータベースに対して管理タスクを実行する権限をユーザーに付与します。

bypassDocumentValidation

collMod

collStats

createCollection

createIndex

dropCollection

dropDatabase

dropIndex

dbStats

find

killCursors

listIndexes

listCollections

modifyChangeStreams

dbOwner dbAdmin ロールと readWrite ロールを組み合わせて、指定したデータベースに対する管理タスクを実行する権限をユーザーに付与します。

dbAdminreadWrite のすべてのアクション。

Cluster administrator
ロール名 説明 アクション
clusterAdmin clusterManagerclusterMonitor、および hostManager の各ロールを組み合わせで、最大のクラスター管理アクセス権をユーザーに付与します。

clusterManagerclusterMonitor、および hostManager のすべてのアクション。

listChangeStreams

dropDatabase

modifyChangeStreams

clusterManager 指定したクラスターに対して管理とモニタリングのアクションを実行する権限をユーザーに付与します。

listChangeStreams

listSessions

modifyChangeStreams

replSetGetConfig

clusterMonitor モニタリングツールへの読み取り専用アクセス権をユーザーに付与します。

collStats

dbStats

find

getParameter

hostInfo

indexStats

killCursors

listChangeStreams

listCollections

listDatabases

listIndexes

listSessions

replSetGetConfig

serverStatus

top

hostManager サーバーをモニタリングおよび管理する権限をユーザーに付与します。

auditConfigure

killCursors

killAnyCursor

killAnySession

killop

Backup administrator
ロール名 説明 アクション
backup データのバックアップに必要なアクセス権をユーザーに付与します。

getParameter

insert

find

listChangeStreams

listCollections

listDatabases

listIndexes

update

restore データの復元に必要なアクセス権をユーザーに付与します。

bypassDocumentValidation

changeCustomData

changePassword

collMod

createCollection

createIndex

createUser

dropCollection

dropRole

dropUser

getParameter

grantRole

find

insert

listCollections

modifyChangeStreams

revokeRole

remove

viewRole

viewUser

update