共有

はじめに

認可は、ユーザー管理とアクセス制御の不可欠な部分であり、各ユーザーがシステム上で実行できるポリシーを定義します。適切なポリシーを決定し、それらをデータベースに実装することで、ユーザーが必要なリソースと対話できるようになり、不適切な動作から保護されます。

このガイドでは、MongoDBで認可がどのように機能するかについて説明します。MongoDBがアクセス管理をどのように概念化しているか、ユーザーに付与できる特権の種類、およびユーザーアカウントにポリシーをアタッチする方法について見ていきます。

前提条件

このガイドに沿って進めるには、適切な特権を持つMongoDBサーバーのアカウントが必要です。

MongoDBの設定を調整し、データベースで認可を有効にするには、サーバーへのrootレベルのアクセスが必要です。

さらに、MongoDB内では、ロールベースの認可ポリシーを設定できるように、少なくともuserAdminロールを持つアカウントが必要です。userAdminロールを含むロールを、最も限定的なものから最も広範なレベルの特権まで列挙すると次のようになります。

  • userAdmin
  • dbOwner
  • userAdminAnyDatabase
  • root

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: 非システムコレクションへの読み取りアクセスを提供します
    • アクション
      • changeStream
      • collStats
      • dbHash
      • dbStats
      • find
      • killCursors
      • listIndexes
      • listCollections
  • readWrite: 非システムコレクションへの読み取りおよび書き込みアクセスを提供します
    • アクション
      • collStats
      • convertToCapped
      • createCollection
      • dbHash
      • dbStats
      • dropCollection
      • createIndex
      • dropIndex
      • find
      • insert
      • killCursors
      • listIndexes
      • listCollections
      • remove
      • renameCollectionSameDB
      • update
  • dbAdmin: ロールとユーザーの管理を除く、データベースレベルでの管理タスクへのアクセスを提供します
    • system.profileコレクション内のアクション
      • changeStream
      • collStats
      • convertToCapped
      • createCollection
      • dbHash
      • dbStats
      • dropCollection
      • find
      • killCursors
      • listCollections
      • listIndexes
      • planCacheRead
    • 非システムコレクション内のアクション
      • bypassDocumentValidation
      • collMod
      • collStats
      • compact
      • convertToCapped
      • createCollection
      • createIndex
      • dbStats
      • dropCollection
      • dropDatabase
      • dropIndex
      • enableProfiler
      • listCollections
      • listIndexes
      • planCacheIndexFilter
      • planCacheRead
      • planCacheWrite
      • reIndex
      • renameCollectionSameDB
      • storageDetails
      • validate
  • userAdmin: ユーザーとロールの作成および変更へのアクセスを提供します
    • アクション
      • changeCustomData
      • changePassword
      • createRole
      • createUser
      • dropRole
      • dropUser
      • grantRole
      • revokeRole
      • setAuthenticationRestriction
      • viewRole
      • viewUser
  • dbOwner: ロールとユーザーの管理を含む、データベースへの管理アクセスを提供します
    • このロールが継承するロール
      • readWrite
      • dbAdmin
      • userAdmin
  • clusterMonitor: クラスターへの読み取りアクセスを提供します
    • クラスター全体のアクション
      • checkFreeMonitoringStatus
      • connPoolStats
      • getCmdLineOpts
      • getDefaultRWConcern
      • getLog
      • getParameter
      • getShardMap
      • hostInfo
      • inprog
      • listDatabases
      • listSessions
      • listShards
      • netstat
      • replSetGetConfig
      • replSetGetStatus
      • serverStatus
      • setFreeMonitoring
      • shardingState
      • top
    • クラスター内のすべてのデータベースのアクション
      • collStats
      • dbStats
      • getShardVersion
      • indexStats
      • useUUID
    • すべてのsystem.profileコレクションのアクション
      • find
    • configデータベース内の非システムコレクションのアクション
      • collStats
      • dbHash
      • dbStats
      • find
      • getShardVersion
      • indexStats
      • killCursors
      • listCollections
      • listIndexes
      • planCacheRead
    • configデータベース内のsystem.jsコレクションのアクション
      • collStats
      • dbHash
      • dbStats
      • find
      • killCursors
      • listCollections
      • listIndexes
      • planCacheRead
    • localデータベース内のすべてのコレクションのアクション
      • collStats
      • dbHash
      • dbStats
      • find
      • getShardVersion
      • indexStats
      • killCursors
      • listCollections
      • listIndexes
      • planCacheRead
    • localデータベース内のsystem.jsコレクションのアクション
      • collStats
      • dbHash
      • dbStats
      • find
      • killCursors
      • listCollections
      • listIndexes
      • planCacheRead
    • localデータベース内のsystem.replsetおよびsystem.profileコレクションのアクション
      • find
  • clusterManager: configおよびlocalデータベースを介してクラスターの監視および管理アクセスを提供します
    • クラスター全体のアクション
      • addShard
      • appendOplogNote
      • applicationMessage
      • cleanupOrphaned
      • flushRouterConfig
      • getDefaultRWConcern
      • listSessions
      • listShards
      • removeShard
      • replSetConfigure
      • replSetGetConfig
      • replSetGetStatus
      • replSetStateChange
      • resync
      • setDefaultRWConcern
      • setFeatureCompatibilityVersion
      • setFreeMonitoring
    • クラスター内のすべてのデータベースのアクション
      • clearJumboFlag
      • enableSharding
      • refineCollectionShardKey
      • moveChunk
      • splitChunk
      • splitVector
    • configデータベース内の非システムコレクションのアクション
      • collStats
      • dbHash
      • dbStats
      • enableSharding
      • find
      • insert
      • killCursors
      • listCollections
      • listIndexes
      • moveChunk
      • planCacheRead
      • remove
      • splitChunk
      • splitVector
      • update
    • configデータベース内のsystem.jsコレクションのアクション
      • collStats
      • dbHash
      • dbStats
      • find
      • killCursors
      • listCollections
      • listIndexes
      • planCacheRead
    • localデータベース内のすべての非システムコレクションのアクション
      • enableSharding
      • insert
      • moveChunk
      • remove
      • splitChunk
      • splitVector
      • update
    • localデータベース内のsystem.replsetコレクションのアクション
      • collStats
      • dbHash
      • dbStats
      • find
      • killCursors
      • listCollections
      • listIndexes
      • planCacheRead
  • hostManager: サーバーの監視と管理を行う機能を提供します。
    • クラスター全体のアクション
      • applicationMessage
      • closeAllDatabases
      • connPoolSync
      • flushRouterConfig
      • fsync
      • invalidateUserCache
      • killAnyCursor
      • KillAnySession
      • killop
      • logRotate
      • resync
      • setParameter
      • shutdown
      • touch
      • unlock
  • clusterAdmin: すべてのクラスター管理アクセスを提供します
    • このロールが継承するロール
      • clusterManager
      • clusterMonitor
      • hostManager
    • 追加のアクション
      • dropDatabase
  • backup: データのバックアップに必要な特権を提供します
    • すべてのリソースのアクション
      • listDatabases
      • listCollections
      • listIndexes
    • クラスター全体のアクション
      • appendOplogNote
      • getParameter
      • listDatabases
      • serverStatus
    • 非システムコレクション、system.jsおよびsystem.profileコレクション、admin.system.usersおよびadmin.system.rolesコレクション、config.settingsコレクションのアクション
      • find
    • config.settingsコレクションのアクション
      • insert
      • update
  • restore: クラスターにデータを復元する特権を提供します
    • クラスター全体のアクション
      • getParameter
    • 非システムコレクションのアクション
      • bypassDocumentValidation
      • changeCustomData
      • changePassword
      • collMod
      • convertToCapped
      • createCollection
      • createIndex
      • createRole
      • createUser
      • dropCollection
      • dropRole
      • dropUser
      • grantRole
      • insert
      • revokeRole
      • viewRole
      • viewUser
    • system.jsコレクションのアクション
      • bypassDocumentValidation
      • collMod
      • createCollection
      • createIndex
      • dropCollection
      • insert
    • 任意のリソースのアクション
      • listCollections
    • configおよびlocalデータベース内の非システムコレクションのアクション
      • bypassDocumentValidation
      • collMod
      • createCollection
      • createIndex
      • dropCollection
      • insert
    • admin.system.versionコレクションのアクション
      • bypassDocumentValidation
      • collMod
      • createCollection
      • createIndex
      • dropCollection
      • find
      • insert
    • admin.system.rolesコレクションのアクション
      • createIndex
    • admin.system.usersコレクションのアクション
      • bypassDocumentValidation
      • collMod
      • createCollection
      • createIndex
      • dropCollection
      • find
      • insert
      • remove
      • update
  • readAnyDatabase: localおよびconfigを除くすべてのデータベースにreadと同じ特権を提供します
    • クラスター全体への追加のアクション
      • listDatabases
  • readWriteAnyDatabase: localおよびconfigを除くすべてのデータベースにreadWriteと同じ特権を提供します
    • クラスター全体への追加のアクション
      • listDatabases
  • userAdminAnyDatabase: localおよびconfigを除くすべてのデータベースにuserAdminと同じ特権を提供します。
    • クラスター全体への追加のアクション
      • authSchemaUpgrade
      • invalidateUserCache
      • listDatabases
    • adminデータベース内のsystem.usersおよびsystem.rolesクラスターへの追加のアクション
      • collStats
      • dbHash
      • dbStats
      • find
      • killCursors
      • planCacheRead
  • dbAdminAnyDatabase: localおよびconfigを除くすべてのデータベースにdbAdminと同じ特権を提供します。
    • クラスター全体への追加のアクション
      • listDatabases
  • root: システム全体への完全なアクセスを提供します。
    • このロールが継承するロール
      • readWriteAnyDatabase
      • dbAdminAnyDatabase
      • userAdminAnyDatabase
      • clusterAdmin
      • restore
      • backup
    • systemコレクションへの追加のアクション
      • validate

MongoDBで認可を有効にする方法

MongoDBがユーザー特権を管理するために認可を使用する前に、サーバーまたはクラスターで機能を有効にする必要があります。これを行うには、rootまたは他の管理者特権でサーバーにログインする必要があります。

注:認可を有効にする前に、ロールを管理するために必要な特権を持つロールに少なくとも1つアクセスできることを再確認してください。

テキストエディタで/etc/mongod.confファイルを開き、管理者としてMongoDBサーバーの設定を変更します。このコマンドは、EDITOR環境変数で定義されたテキストエディタを使用してファイルを開き、ほぼすべてのシステムで利用可能なviにフォールバックします

sudo ${EDITOR:-vi} /etc/mongod.conf

MongoDBの設定ファイルは、設定を定義するためにYAMLシリアル化形式を使用します。security:セクションキーのコメントを解除するか、ファイルに追加します。このキーの下に、スペース(YAMLではタブは許可されません)を使用して行をインデントし、authorizationenabledに設定します。

. . .
security:
authorization: enabled
. . .

完了したらファイルを保存して閉じます。

新しい設定を有効にするには、MongoDBサーバープロセスを再起動します。MongoDBサーバーがLinuxホストで実行されている場合、操作は次のようになります。

sudo systemctl restart mongod.service

プロセスが再起動すると、MongoDBの認可フレームワークがデータベース内で有効になります。

特権とロールの表示

ユーザーにロールを割り当てる前に、システム内の特権とロールに関する情報を表示する方法に慣れておくことをお勧めします。

すべての組み込みロールとその関連する特権を含む、システム上で利用可能なすべてのロールを表示するには、db.getRoles()メソッドをshowPrivilegesshowBuiltinRolesオプションをtrueに設定して使用します

db.getRoles({
rolesInfo: 1,
showPrivileges: true,
showBuiltinRoles: true
})

返されるリストには、各ロールと、システム全体でさまざまなリソースに対して持つ特権に関するネストされた情報の全リストが含まれます。

特定のロールに関する情報を取得するには、代わりにdb.getRole()メソッドを使用します。コマンドを実行する前に、ユーザーが定義されているデータベースにいる必要があります

use admin
db.getRole(
"root",
{
showPrivileges: true,
showBuiltinRoles: true
}
)

各ユーザーに付与されているロールを確認するには、対象のデータベースに変更してdb.getUsers()メソッドを使用します

use admin
db.getUsers()

特定のユーザーに関連付けられたロールを確認するには、代わりにdb.getUser()を使用します

use admin
db.getUser("root")

ユーザーへのロールの割り当てと取り消し

ユーザーに追加の特権を付与するには、既存のロールへのアクセス権を付与する必要があります。

db.grantRolesToUser()メソッドを使用すると、ユーザーに追加したい追加のロールを指定できます。最初の引数は追加の特権を付与したいユーザーであり、2番目の引数は追加したいロールの配列です

db.grantRolesToUser(
"sally",
[
"read",
"backup"
]
)

ロールが現在のデータベースで定義されている場合、上記のようにデータベースを明示せずにロール名を指定する省略形を使用できます。

異なるデータベースに関連付けられたロールを付与する場合、またはより明確にするために、roledbを定義するドキュメントとしてロールを指定します

db.grantRolesToUser(
"sally",
[
{ role: "read", db: "sales"},
{ role: "readWrite", db: "callLogs"}
]
)

ユーザーからロールを取り消すには、db.revokeRolesFromUser()という付随するメソッドを使用できます。引数の構文はまったく同じですが、今回は、指定されたアカウントからロールが削除されます。

現在のデータベースで定義されているロールを削除するには、データベースを明示せずにロール名を使用できます

db.revokeRolesFromUser(
"sally",
[
"read",
"backup"
]
)

他のデータベースに関連付けられているロールを指定するには、ドキュメントでroledbを指定して長い形式を使用します

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システムで細粒度のアクセス制御を提供する能力が高まります。

FAQ

MongoDBには、読み取り専用ユーザー用の組み込みロールが2つあります。ユーザーはreadロールまたはreadAnyDatabaseロールのいずれかに割り当てることができます。

readは、すべての非システムコレクションでデータを読み取る機能を提供します。

readAnyDatabaseは、readと同じ機能を提供しますが、クラスター全体でlistDatabasesアクションを使用する機能も提供します。

clusterMonitorロールは、MongoDB Cloud ManagerやOps Manager監視エージェントなどの監視ツールへの読み取り専用アクセスを提供します。

backupロールは、データのバックアップに必要な最小限の特権を提供します。このロールは、MongoDB CloudおよびOps Managerバックアップエージェントを使用するのに十分な特権を提供します。

また、adminsettingsconfigデータベースのバックアップコレクションでinsertおよびupdateアクションを実行する権限も持っています。

MongoDBのrootロールは、次のロールのすべての操作とリソースへの完全なアクセスを提供します。

  • readWriteAnyDatabase
  • dbAdminAnyDatabase
  • userAdminAnyDatabase
  • clusterAdmin
  • restore
  • backup

MongoDBは、MongoDBシステムへのアクセスを管理するためにRBACを採用しています。RBACは、ユーザーに割り当てられたロールに基づいて、ユーザーに許可される操作を制限するセキュリティ戦略です。

MongoDBは、ユーザーに割り当てられたロールがない場合、データベースへの操作やアクセスを許可しません。

著者について
Justin Ellingwood

ジャスティン・エリングウッド

ジャスティンは2013年からデータベース、Linux、インフラ、開発者ツールについて執筆しています。現在は妻と2匹のウサギとベルリンに住んでいます。普段は三人称で書く必要がないので、関係者全員にとって安心です。
© . All rights reserved.