はじめに
認可は、ユーザー管理とアクセス制御の不可欠な部分であり、各ユーザーがシステム上で実行できるポリシーを定義します。適切なポリシーを決定し、それらをデータベースに実装することで、ユーザーが必要なリソースと対話できるようになり、不適切な動作から保護されます。
このガイドでは、MongoDBで認可がどのように機能するかについて説明します。MongoDBがアクセス管理をどのように概念化しているか、ユーザーに付与できる特権の種類、およびユーザーアカウントにポリシーをアタッチする方法について見ていきます。
MongoDBを使用している場合は、PrismaのMongoDBコネクタをチェックしてください!Prisma Clientを使用すると、本番環境のMongoDBデータベースを安心して管理できます。
MongoDBとPrismaの作業を始めるには、ゼロからのスタートガイドまたは既存のプロジェクトへの追加方法をご覧ください。
前提条件
このガイドに沿って進めるには、適切な特権を持つMongoDBサーバーのアカウントが必要です。
MongoDBの設定を調整し、データベースで認可を有効にするには、サーバーへのrootレベルのアクセスが必要です。
さらに、MongoDB内では、ロールベースの認可ポリシーを設定できるように、少なくともuserAdminロールを持つアカウントが必要です。userAdminロールを含むロールを、最も限定的なものから最も広範なレベルの特権まで列挙すると次のようになります。
userAdmindbOwneruserAdminAnyDatabaseroot
MongoDBで認可はどのように機能するのか?
MongoDBの認可と特権管理は、ロールベースアクセス制御 (RBAC)を使用して実装されています。このシステムでは、異なるアクセスレベルが個々のロールに関連付けられています。ユーザーにアクションを実行する権限を与えるには、適切な特権を持つロールにメンバーシップを付与します。
MongoDBのロールはネストできます。これは、ロールを他のロールに付与できることを意味します。別のロールを含むロールは、子ロールのすべての特権を継承します。これにより、ロールを適切に組み合わせることで、目的の特権を持つ新しいロールを作成できます。
特権自体は、アクションとリソースの組み合わせによって定義されます。アクションコンポーネントは、特権によって許可される動作の種類を記述し、リソースはアクションのターゲットまたはスコープを示します。
MongoDBで利用可能なリソースは?
MongoDBのアクセス制御モデルでは、アクションのターゲットまたはスコープはリソースとして知られています。各アクションは特定のタイプのリソースにのみ適用できます。特権を設定する際には、特権がスコープされる正確なリソースを指定します。
利用可能なリソースを、最も限定的なものから最も広範なものまで順に見ていきましょう。
特権は、クラスター内の特定のデータベース内の特定のコレクションにスコープすることで、最も厳密に定義できます。同じデータベース内でも、異なるコレクションは異なる特権を指定できます。これにより、異なる種類のデータに対してきめ細かなポリシーを実装できます。
ポリシーを適用できる次に大きなリソースは、データベースです。データベースレベルで特権を管理することで、データベース全体およびその中のすべてのコレクションに影響を与える一般的なポリシーを提供できます。
また、すべてのデータベースにわたって同じ名前のコレクションに適用されるポリシーを設定することもできます。これにより、命名規則を使用してシステム全体の特定のコレクションへのアクセス制御を実装できます。これよりも広範なバージョンは、システム上のすべてのデータベースおよび非システムコレクションにポリシーを適用することです。
最後に、クラスター全体にポリシーを適用できます。クラスターを対象とするアクションは、直接管理しているデータではなく、一般的なシステムに影響を与えます。クラスターレベルのポリシーは、管理操作に焦点を当てる傾向があります。
MongoDBで利用可能なアクションは?
MongoDBには、一般的な使用、データベース管理、システム管理に関連する多数のアクションが用意されています。通常、アクションはMongoDB内の1つ以上のコマンドまたはメソッドに対応します。
MongoDBで利用可能なアクションとその機能の一覧を表示するには、以下のセクションを展開してください
| アクション | スコープ | 説明 |
|---|---|---|
find | データベースまたはコレクション | データベースでの読み取り操作を許可します |
insert | データベースまたはコレクション | データベースでの書き込み操作を許可します |
remove | データベースまたはコレクション | データベースでの削除操作を許可します |
update | データベースまたはコレクション | データベースでの置換操作を許可します |
bypassDocumentValidation | データベースまたはコレクション | ユーザーがドキュメントのデータ検証ポリシーを無視できるようにします。 |
useUUID | クラスター | ユーザーがUUID値を使用してドキュメントを検索できるようにします |
changeCustomData | データベース | ユーザーはデータベース内の任意のユーザーに関連付けられたカスタムデータを変更できます |
changeOwnCustomData | データベース | ユーザーが自分のユーザーに関連付けられたカスタムデータを変更できるようにします |
changeOwnPassword | データベース | ユーザーが自分のアカウントパスワードを変更できるようにします |
changePassword | データベース | ユーザーがデータベース内の任意のユーザーのパスワードを変更できるようにします |
createCollection | データベースまたはコレクション | ユーザーがデータベースにコレクションを作成できるようにします |
createIndex | データベースまたはコレクション | ユーザーがデータベースのインデックスを作成できるようにします |
createRole | データベース | ユーザーがデータベースにカスタムロールを作成できるようにします |
createUser | データベース | ユーザーが新しいユーザーアカウントを定義できるようにします |
dropCollection | データベースまたはコレクション | ユーザーがコレクションを削除できるようにします |
dropRole | データベース | ユーザーがロールを削除できるようにします |
dropUser | データベース | ユーザーがユーザーを削除できるようにします |
enableProfiler | データベース | ユーザーがパフォーマンスプロファイリングを有効にできるようにします |
grantRole | データベース | ユーザーがデータベースに関連付けられたロールをシステム上の任意のユーザーに付与できるようにします |
killCursors | コレクション | MongoDBの4.2より前のバージョンで、ユーザーが自分のカーソルを強制終了できるようにします |
killAnyCursor | コレクション | ユーザーが他のユーザーのカーソルを強制終了できるようにします |
revokeRole | データベース | ユーザーがシステム上の任意のユーザーからロールを削除できるようにします |
setAuthenticationRestriction | データベース | ユーザーがユーザーとロールの認証要件を設定できるようにします |
unlock | クラスター | ユーザーがクラスター上の書き込みロックの数を減らせるようにします |
viewRole | データベース | データベース内のロールに関する詳細を表示できるようにします |
viewUser | データベース | データベース内のユーザーに関する詳細を表示できるようにします |
authSchemaUpgrade | クラスター | ユーザーがMongoDBバージョン間の認証メカニズムをアップグレードできるようにします |
cleanupOrphaned | クラスター | MongoDBの4.4より前のバージョンで、ユーザーが孤立したドキュメントをクリーンアップできるようにします |
cpuProfiler | クラスター | ユーザーがCPUプロファイリングを有効にできるようにします |
inprog | クラスター | ユーザーが他のユーザーの進行中またはキューに入れられた操作に関する情報を表示できるようにします |
invalidateUserCache | クラスター | ユーザーがキャッシュからユーザーの詳細を手動でフラッシュできるようにします |
killop | クラスター | ユーザーが他のユーザーの操作を強制終了できるようにします |
planCacheRead | データベースまたはコレクション | ユーザーがキャッシュされたクエリプランに関する情報を表示できるようにします |
planCacheWrite | データベースまたはコレクション | ユーザーがキャッシュされたクエリプランを削除できるようにします |
storageDetails | データベースまたはコレクション | 非推奨 |
changeStream | コレクション、データベース、またはクラスター | ユーザーが非システムコレクションからリアルタイムの変更データにアクセスできるようにします |
appendOpLogNote | クラスター | ユーザーがoplogにメモを追加できるようにします |
replSetConfigure | クラスター | レプリカセットの設定を許可します |
replSetGetConfig | クラスター | ユーザーが現在のレプリカセット設定を表示できるようにします |
replSetGetStatus | クラスター | ユーザーがレプリカセットの現在の状態を見つけられるようにします |
replSetHeartbeat | クラスター | 非推奨 |
replSetStateChange | クラスター | ユーザーがクラスターレプリカセットの状態を管理できるようにします |
resync | クラスター | 非推奨 |
addShard | クラスター | ユーザーがシャードレプリカをシャードクラスターに追加できるようにします |
clearJumboFlag | データベースまたはコレクション | ユーザーがシャード内の過大なチャンクをクリーンアップできるようにします |
enableSharding | クラスター、データベース、またはコレクション | ユーザーがクラスターおよびデータベースでシャーディングを有効にしたり、クラスターレベルでシャーディングを管理したりできるようにします |
refineCollectionShardKey | データベースまたはコレクション | ユーザーが既存のシャードキーにフィールドを追加できるようにします |
flushRouterConfig | クラスター | ユーザーがキャッシュされたルーティングテーブルを廃止済みとしてマークできるようにします |
getShardVersion | データベース | 内部コマンド |
listShards | クラスター | ユーザーがクラスターの構成済みシャードのリストを確認できるようにします |
moveChunk | データベースまたはコレクション | ユーザーがチャンクを新しいシャードに移動できるようにします |
removeShard | クラスター | ユーザーがシャードからチャンクを排出してから、クラスターからシャードを削除できるようにします |
shardingState | クラスター | ユーザーがMongoDBサーバーがシャードクラスターの一部であるかどうかを確認できるようにします |
splitChunk | データベースまたはコレクション | ユーザーがシャード内のチャンクをマージまたは分割できるようにします |
splitVector | データベースまたはコレクション | 内部コマンド |
applicationMessage | クラスター | ユーザーが監査ログにカスタムメッセージを追加できるようにします |
closeAllDatabases | クラスター | 非推奨 |
collMod | データベースまたはコレクション | ユーザーがコレクションに関連付けられたオプションを変更できるようにします |
compact | データベースまたはコレクション | ユーザーがコレクション内のデータとインデックスをデフラグできるようにします |
connPoolSync | クラスター | 内部コマンド |
convertToCapped | データベースまたはコレクション | ユーザーがコレクションを設定された最大サイズを持つcapped collectionに変換できるようにします |
dropConnections | クラスター | ユーザーがMongoDBから指定されたホストへの発信接続を削除できるようにします |
dropDatabase | データベース | ユーザーが現在のデータベースを削除できるようにします |
dropIndex | データベースまたはコレクション | ユーザーがインデックスを削除できるようにします |
forceUUID | クラスター | ユーザーがグローバルに一意のUUIDを使用してコレクションを定義できるようにします |
fsync | クラスター | ユーザーが保留中のすべての書き込みをストレージにフラッシュし、書き込みのためにクラスターをロックできるようにします |
getDefaultRWConcern | クラスター | ユーザーがデフォルトの読み取りおよび書き込み整合性と分離設定を表示できるようにします |
getParameter | クラスター | ユーザーがパラメーターの値をクエリできるようにします |
hostInfo | クラスター | ユーザーがMongoDBインスタンスを実行しているサーバーに関する情報を表示できるようにします |
logRotate | クラスター | ユーザーがログローテーションをトリガーできるようにします |
reIndex | データベースまたはコレクション | ユーザーがコレクションのインデックスを再構築できるようにします |
renameCollectionSameDB | データベース | ユーザーが現在のデータベース内のコレクションの名前を変更できるようにします |
setDefaultRWConcern | クラスター | ユーザーがデフォルトの読み取りおよび書き込み整合性と分離設定を指定できるようにします |
setParameter | クラスター | ユーザーがパラメーターの値を定義できるようにします |
shutdown | クラスター | ユーザーがMongoDBインスタンスをシャットダウンできるようにします |
touch | クラスター | 非推奨 |
impersonate | クラスター | ユーザーが他のユーザーおよびロールに関連付けられたセッションを強制終了できるようにします |
listSessions | クラスター | ユーザーがすべてのユーザーによるすべてのセッションを一覧表示できるようにします |
killAnySession | クラスター | ユーザーが特定のユーザーまたはパターンに対するすべてのセッションを強制終了できるようにします |
checkFreeMonitoringStatus | クラスター | ユーザーがクラウドモニタリング機能のステータスを確認できるようにします |
setFreeMonitoring | クラスター | ユーザーがクラウドモニタリング機能を有効または無効にできるようにします |
collStats | データベースまたはコレクション | ユーザーがコレクションに関する統計を表示できるようにします |
connPoolStats | クラスター | ユーザーがMongoDBインスタンスからの発信接続のステータスを確認できるようにします |
dbHash | データベースまたはコレクション | ユーザーがデータベース内のコレクションのハッシュ値をクエリできるようにします |
dbStats | データベース | ユーザーがストレージ統計を表示できるようにします |
getCmdLineOpts | クラスター | ユーザーがMongoDBインスタンスの起動に使用されたコマンドラインオプションを確認できるようにします |
getLog | クラスター | ユーザーが最新のMongoDBイベントを確認できるようにします |
listDatabases | クラスター | ユーザーがすべてのデータベースのリストを確認できるようにします |
listCollections | データベース | ユーザーがデータベース内のコレクションとビューのリストを確認できるようにします |
listIndexes | データベースまたはコレクション | ユーザーが特定のコレクションに関連付けられているインデックスを確認できるようにします |
netstat | クラスター | 内部コマンド |
serverStatus | クラスター | ユーザーがデータベースの現在の状態に関する情報を表示できるようにします |
validate | データベースまたはコレクション | ユーザーがコレクションのデータとインデックスの正確性をチェックできるようにします |
top | クラスター | ユーザーがコレクションの使用統計を確認できるようにします |
MongoDBでデフォルトで利用可能なロールは?
MongoDBには、類似の特権を組み合わせた多数の便利なロールが含まれています。これらのロールを使用すると、データベースリソースへの特権を簡潔な方法で付与および取り消すことができます。
MongoDBで利用可能なアクションとその機能の一覧を表示するには、以下のセクションを展開してください
read: 非システムコレクションへの読み取りアクセスを提供します- アクション
changeStreamcollStatsdbHashdbStatsfindkillCursorslistIndexeslistCollections
- アクション
readWrite: 非システムコレクションへの読み取りおよび書き込みアクセスを提供します- アクション
collStatsconvertToCappedcreateCollectiondbHashdbStatsdropCollectioncreateIndexdropIndexfindinsertkillCursorslistIndexeslistCollectionsremoverenameCollectionSameDBupdate
- アクション
dbAdmin: ロールとユーザーの管理を除く、データベースレベルでの管理タスクへのアクセスを提供しますsystem.profileコレクション内のアクションchangeStreamcollStatsconvertToCappedcreateCollectiondbHashdbStatsdropCollectionfindkillCursorslistCollectionslistIndexesplanCacheRead
- 非システムコレクション内のアクション
bypassDocumentValidationcollModcollStatscompactconvertToCappedcreateCollectioncreateIndexdbStatsdropCollectiondropDatabasedropIndexenableProfilerlistCollectionslistIndexesplanCacheIndexFilterplanCacheReadplanCacheWritereIndexrenameCollectionSameDBstorageDetailsvalidate
userAdmin: ユーザーとロールの作成および変更へのアクセスを提供します- アクション
changeCustomDatachangePasswordcreateRolecreateUserdropRoledropUsergrantRolerevokeRolesetAuthenticationRestrictionviewRoleviewUser
- アクション
dbOwner: ロールとユーザーの管理を含む、データベースへの管理アクセスを提供します- このロールが継承するロール
readWritedbAdminuserAdmin
- このロールが継承するロール
clusterMonitor: クラスターへの読み取りアクセスを提供します- クラスター全体のアクション
checkFreeMonitoringStatusconnPoolStatsgetCmdLineOptsgetDefaultRWConcerngetLoggetParametergetShardMaphostInfoinproglistDatabaseslistSessionslistShardsnetstatreplSetGetConfigreplSetGetStatusserverStatussetFreeMonitoringshardingStatetop
- クラスター内のすべてのデータベースのアクション
collStatsdbStatsgetShardVersionindexStatsuseUUID
- すべての
system.profileコレクションのアクションfind
configデータベース内の非システムコレクションのアクションcollStatsdbHashdbStatsfindgetShardVersionindexStatskillCursorslistCollectionslistIndexesplanCacheRead
configデータベース内のsystem.jsコレクションのアクションcollStatsdbHashdbStatsfindkillCursorslistCollectionslistIndexesplanCacheRead
localデータベース内のすべてのコレクションのアクションcollStatsdbHashdbStatsfindgetShardVersionindexStatskillCursorslistCollectionslistIndexesplanCacheRead
localデータベース内のsystem.jsコレクションのアクションcollStatsdbHashdbStatsfindkillCursorslistCollectionslistIndexesplanCacheRead
localデータベース内のsystem.replsetおよびsystem.profileコレクションのアクションfind
- クラスター全体のアクション
clusterManager:configおよびlocalデータベースを介してクラスターの監視および管理アクセスを提供します- クラスター全体のアクション
addShardappendOplogNoteapplicationMessagecleanupOrphanedflushRouterConfiggetDefaultRWConcernlistSessionslistShardsremoveShardreplSetConfigurereplSetGetConfigreplSetGetStatusreplSetStateChangeresyncsetDefaultRWConcernsetFeatureCompatibilityVersionsetFreeMonitoring
- クラスター内のすべてのデータベースのアクション
clearJumboFlagenableShardingrefineCollectionShardKeymoveChunksplitChunksplitVector
configデータベース内の非システムコレクションのアクションcollStatsdbHashdbStatsenableShardingfindinsertkillCursorslistCollectionslistIndexesmoveChunkplanCacheReadremovesplitChunksplitVectorupdate
configデータベース内のsystem.jsコレクションのアクションcollStatsdbHashdbStatsfindkillCursorslistCollectionslistIndexesplanCacheRead
localデータベース内のすべての非システムコレクションのアクションenableShardinginsertmoveChunkremovesplitChunksplitVectorupdate
localデータベース内のsystem.replsetコレクションのアクションcollStatsdbHashdbStatsfindkillCursorslistCollectionslistIndexesplanCacheRead
- クラスター全体のアクション
hostManager: サーバーの監視と管理を行う機能を提供します。- クラスター全体のアクション
applicationMessagecloseAllDatabasesconnPoolSyncflushRouterConfigfsyncinvalidateUserCachekillAnyCursorKillAnySessionkilloplogRotateresyncsetParametershutdowntouchunlock
- クラスター全体のアクション
clusterAdmin: すべてのクラスター管理アクセスを提供します- このロールが継承するロール
clusterManagerclusterMonitorhostManager
- 追加のアクション
dropDatabase
- このロールが継承するロール
backup: データのバックアップに必要な特権を提供します- すべてのリソースのアクション
listDatabaseslistCollectionslistIndexes
- クラスター全体のアクション
appendOplogNotegetParameterlistDatabasesserverStatus
- 非システムコレクション、
system.jsおよびsystem.profileコレクション、admin.system.usersおよびadmin.system.rolesコレクション、config.settingsコレクションのアクションfind
config.settingsコレクションのアクションinsertupdate
- すべてのリソースのアクション
restore: クラスターにデータを復元する特権を提供します- クラスター全体のアクション
getParameter
- 非システムコレクションのアクション
bypassDocumentValidationchangeCustomDatachangePasswordcollModconvertToCappedcreateCollectioncreateIndexcreateRolecreateUserdropCollectiondropRoledropUsergrantRoleinsertrevokeRoleviewRoleviewUser
system.jsコレクションのアクションbypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectioninsert
- 任意のリソースのアクション
listCollections
configおよびlocalデータベース内の非システムコレクションのアクションbypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectioninsert
admin.system.versionコレクションのアクションbypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectionfindinsert
admin.system.rolesコレクションのアクションcreateIndex
admin.system.usersコレクションのアクションbypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectionfindinsertremoveupdate
- クラスター全体のアクション
readAnyDatabase:localおよびconfigを除くすべてのデータベースにreadと同じ特権を提供します- クラスター全体への追加のアクション
listDatabases
- クラスター全体への追加のアクション
readWriteAnyDatabase:localおよびconfigを除くすべてのデータベースにreadWriteと同じ特権を提供します- クラスター全体への追加のアクション
listDatabases
- クラスター全体への追加のアクション
userAdminAnyDatabase:localおよびconfigを除くすべてのデータベースにuserAdminと同じ特権を提供します。- クラスター全体への追加のアクション
authSchemaUpgradeinvalidateUserCachelistDatabases
adminデータベース内のsystem.usersおよびsystem.rolesクラスターへの追加のアクションcollStatsdbHashdbStatsfindkillCursorsplanCacheRead
- クラスター全体への追加のアクション
dbAdminAnyDatabase:localおよびconfigを除くすべてのデータベースにdbAdminと同じ特権を提供します。- クラスター全体への追加のアクション
listDatabases
- クラスター全体への追加のアクション
root: システム全体への完全なアクセスを提供します。- このロールが継承するロール
readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestorebackup
systemコレクションへの追加のアクションvalidate
- このロールが継承するロール
MongoDBで認可を有効にする方法
MongoDBがユーザー特権を管理するために認可を使用する前に、サーバーまたはクラスターで機能を有効にする必要があります。これを行うには、rootまたは他の管理者特権でサーバーにログインする必要があります。
注:認可を有効にする前に、ロールを管理するために必要な特権を持つロールに少なくとも1つアクセスできることを再確認してください。
テキストエディタで/etc/mongod.confファイルを開き、管理者としてMongoDBサーバーの設定を変更します。このコマンドは、EDITOR環境変数で定義されたテキストエディタを使用してファイルを開き、ほぼすべてのシステムで利用可能なviにフォールバックします
sudo ${EDITOR:-vi} /etc/mongod.conf
MongoDBの設定ファイルは、設定を定義するためにYAMLシリアル化形式を使用します。security:セクションキーのコメントを解除するか、ファイルに追加します。このキーの下に、スペース(YAMLではタブは許可されません)を使用して行をインデントし、authorizationをenabledに設定します。
. . .security:authorization: enabled. . .
完了したらファイルを保存して閉じます。
新しい設定を有効にするには、MongoDBサーバープロセスを再起動します。MongoDBサーバーがLinuxホストで実行されている場合、操作は次のようになります。
sudo systemctl restart mongod.service
プロセスが再起動すると、MongoDBの認可フレームワークがデータベース内で有効になります。
特権とロールの表示
ユーザーにロールを割り当てる前に、システム内の特権とロールに関する情報を表示する方法に慣れておくことをお勧めします。
すべての組み込みロールとその関連する特権を含む、システム上で利用可能なすべてのロールを表示するには、db.getRoles()メソッドをshowPrivilegesとshowBuiltinRolesオプションをtrueに設定して使用します
db.getRoles({rolesInfo: 1,showPrivileges: true,showBuiltinRoles: true})
返されるリストには、各ロールと、システム全体でさまざまなリソースに対して持つ特権に関するネストされた情報の全リストが含まれます。
特定のロールに関する情報を取得するには、代わりにdb.getRole()メソッドを使用します。コマンドを実行する前に、ユーザーが定義されているデータベースにいる必要があります
use admindb.getRole("root",{showPrivileges: true,showBuiltinRoles: true})
各ユーザーに付与されているロールを確認するには、対象のデータベースに変更してdb.getUsers()メソッドを使用します
use admindb.getUsers()
特定のユーザーに関連付けられたロールを確認するには、代わりにdb.getUser()を使用します
use admindb.getUser("root")
ユーザーへのロールの割り当てと取り消し
ユーザーに追加の特権を付与するには、既存のロールへのアクセス権を付与する必要があります。
db.grantRolesToUser()メソッドを使用すると、ユーザーに追加したい追加のロールを指定できます。最初の引数は追加の特権を付与したいユーザーであり、2番目の引数は追加したいロールの配列です
db.grantRolesToUser("sally",["read","backup"])
ロールが現在のデータベースで定義されている場合、上記のようにデータベースを明示せずにロール名を指定する省略形を使用できます。
異なるデータベースに関連付けられたロールを付与する場合、またはより明確にするために、roleとdbを定義するドキュメントとしてロールを指定します
db.grantRolesToUser("sally",[{ role: "read", db: "sales"},{ role: "readWrite", db: "callLogs"}])
ユーザーからロールを取り消すには、db.revokeRolesFromUser()という付随するメソッドを使用できます。引数の構文はまったく同じですが、今回は、指定されたアカウントからロールが削除されます。
現在のデータベースで定義されているロールを削除するには、データベースを明示せずにロール名を使用できます
db.revokeRolesFromUser("sally",["read","backup"])
他のデータベースに関連付けられているロールを指定するには、ドキュメントでroleとdbを指定して長い形式を使用します
db.revokeRolesFromUser("sally",[{ role: "read", db: "sales"},{ role: "readWrite", db: "callLogs"}])
カスタムロールの作成と管理
システム組み込みのロールが、割り当てる必要のあるアクセス許可のタイプと適切に一致しない場合があります。このような場合は、独自のカスタムロールを作成できます。
新しいロールの作成
db.createRole()メソッドを使用すると、特権や他のロールを割り当てることができる新しいロールを定義できます。その後、新しいロールをユーザーに付与して、定義した特定の特権を付与できます。
db.createRole()メソッドの基本的な構文は、ロールの特性を定義するドキュメントを渡すことです。このドキュメントには次のフィールドを含めることができます。
role: ロールに付けたい名前privileges: ロールに割り当てたい一連の緩やかな特権を含む配列。各特権は、resourceドキュメント(この特権が適用されるリソースを指定する)と、付与されるactionsの配列を定義するネストされたドキュメントで定義されます。roles: このロールが継承すべき追加のロールの配列。新しいロールは、ここにリストされているすべてのロールに付与されたすべての特権を取得します。authenticationRestrictions: ロールの認証に関する制限を指定する配列。これにより、ユーザーがロールが承認する方法で認証されていない場合、ロールの特権を拒否できます。
最初の3つのフィールドは、作成されるすべての新しいロールに必須です。
例として、salesデータベースへの読み取り専用アクセスを提供するsalesMonitorというロールを作成しましょう。
db.createRole({role: "salesMonitor",privileges: [],roles: [{role: "read",db: "sales"}],})
readロールの代わりにprivilegesフィールドを使用して、同様の(ただしより限定的な)ロールを次のように表現できます。
db.createRole({role: "salesMonitor",privileges: [{resource: { db: "sales", collection: "" },actions: [ "find" ]}],roles: []})
カスタムロールに関する情報の表示
以前と同様に、db.getRole()メソッドでロールに関する情報を取得できます
db.getRole("salesMonitor",{showPrivileges: true})
カスタムロールへの追加特権の付与
既存のユーザー定義ロールに追加の特権を付与するには、db.grantPrivilegesToRole()メソッドを使用できます。これは、db.createRole()で前述したように、resourceドキュメントとactions配列を含むドキュメントで定義された特権の配列を受け取ります。
たとえば、salesMonitorロールにlistCollections特権を追加するには、次のように入力できます
db.grantPrivilegesToRole("salesMonitor",[{resource: { db: "sales", collection: "" },actions: [ "listCollections" ]}])
カスタムロールからの特権の取り消し
気が変わった場合は、db.revokePrivilegesFromRole()メソッドを使用して、同じ形式でlistCollectionsアクションを削除できます
db.revokePrivilegesFromRole("salesMonitor",[{resource: { db: "sales", collection: "" },actions: [ "listCollections" ]}])
カスタムロールへのロールの付与
ロールによって定義された特権を別のロールに追加するには、db.grantRolesToRole()メソッドを使用できます。このメソッドは、変更したいロールと、そのロールに追加したいロールの配列を引数として受け取ります。
結局、salesMonitorロールにsalesデータベースに対するreadロールを使用させたいと決めた場合、次のように入力してそれを行うことができます
db.grantRolesToRole("salesMonitor",["read"])
カスタムロールからのロールの取り消し
再度気が変わった場合は、db.revokeRolesFromRole()メソッドを使用してロールアクセスを取り消すことができます。このメソッドは同じ引数構文を使用します。
db.revokeRolesFromRole("salesMonitor",["read"])
カスタムロールの値を置き換える
ユーザー定義ロールの特性を再定義するには、db.updateRole()コマンドを使用できます。これは、フィールドを追加または切り詰めるのではなく、指定されたフィールドを置き換えることによって機能します。このため、重要な情報を誤って上書きしないように、コマンドを発行する際には注意が必要です。
db.updateRole()コマンドの構文は、最初の引数としてロール名を渡し、2番目の引数として置き換えたいフィールドを指定するドキュメントを渡します。置き換え可能なフィールドには、privileges配列、roles配列、authenticationRestrictions配列が含まれます。これらのうち少なくとも1つはドキュメントに含まれている必要があります。
たとえば、salesMonitorロールがsalesデータベースでreadロールを使用することを最終的に決定した場合、実験によって残された余分な特権をクリーンアップするために、ロールの特権とロールの配列を再定義したい場合があります。これは、新しい情報でロールを更新することで行うことができます
db.updateRole("salesMonitor",{privileges: [],roles: [{role: "read",db: "sales"}]})
ユーザー定義ロールの削除
不要なロールは、db.dropRole()メソッドで削除できます。
ロールを削除するには、その名前をメソッドに渡すだけです
db.dropRole()
ロールはシステムから削除され、そのロールによってユーザーに付与された特権はアクセスできなくなります。
まとめ
この記事では、MongoDBがアクセス制御と特権管理をどのように実装しているかについて広範囲にわたって説明しました。システムの概念的基盤、管理者が利用できるロール、アクション、リソースを確認し、システム全体で認可を設定するためにロールシステムを使用する方法を学びました。
これらのスキルは、ユーザーが必要なタスクを完了するために必要なリソースへのアクセスを提供しつつ、システム内の関連しない部分への露出を制限するために不可欠です。ロールを定義して活用する方法を学ぶことで、管理するMongoDBシステムで細粒度のアクセス制御を提供する能力が高まります。
MongoDBを使用している場合は、PrismaのMongoDBコネクタをチェックしてください!Prisma Clientを使用すると、本番環境のMongoDBデータベースを安心して管理できます。
MongoDBとPrismaの作業を始めるには、ゼロからのスタートガイドまたは既存のプロジェクトへの追加方法をご覧ください。
FAQ
MongoDBには、読み取り専用ユーザー用の組み込みロールが2つあります。ユーザーはreadロールまたはreadAnyDatabaseロールのいずれかに割り当てることができます。
readは、すべての非システムコレクションでデータを読み取る機能を提供します。
readAnyDatabaseは、readと同じ機能を提供しますが、クラスター全体でlistDatabasesアクションを使用する機能も提供します。
clusterMonitorロールは、MongoDB Cloud ManagerやOps Manager監視エージェントなどの監視ツールへの読み取り専用アクセスを提供します。
backupロールは、データのバックアップに必要な最小限の特権を提供します。このロールは、MongoDB CloudおよびOps Managerバックアップエージェントを使用するのに十分な特権を提供します。
また、admin、settings、configデータベースのバックアップコレクションでinsertおよびupdateアクションを実行する権限も持っています。
MongoDBのrootロールは、次のロールのすべての操作とリソースへの完全なアクセスを提供します。
readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestorebackup
MongoDBは、MongoDBシステムへのアクセスを管理するためにRBACを採用しています。RBACは、ユーザーに割り当てられたロールに基づいて、ユーザーに許可される操作を制限するセキュリティ戦略です。
MongoDBは、ユーザーに割り当てられたロールがない場合、データベースへの操作やアクセスを許可しません。
