シェア

はじめに

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

このガイドでは、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データベースまたはコレクションユーザーがコレクションを最大サイズが設定された固定サイズコレクションに変換できるようにします
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() メソッドを showPrivileges および showBuiltinRoles オプションを 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"}
]
)

カスタムロールの作成と管理

システムの組み込みロールが、割り当てる必要のある権限のタイプに適切に対応していない場合があります。このような場合は、独自のカスタムロールを作成できます。

新しいロールの作成

The db.createRole() method allows you to define a new role that you can assign privileges and other roles to. You can then grant your new role to users to give them the specific privileges you defined。

The basic syntax of the db.createRole() method involves passing a document that defines the role's characteristics. The document can have the following fields

  • role: The name you want to give the role
  • privileges: An array containing the set of loose privileges you want to assign to the role. Each privilege is defined in a nested document that defines a resource document (specifying which resources this privilege applies to) as well as an array of actions that are being granted
  • roles: An array of additional roles that this role should inherit from. The new role will acquire all of the privileges granted to any of the roles listed here.
  • authenticationRestrictions: An array that specifies any restrictions on authentication for the role. This allows you to deny a role's privileges if the user has not authenticated in a way the role approves of.

The first three fields are required for every new role created.

As an example, let's create a role called salesMonitor that provides read-only access to the sales database

db.createRole({
role: "salesMonitor",
privileges: [],
roles: [
{
role: "read",
db: "sales"
}
],
})

We could express a similar (but more limited) role using the privileges field instead of the read role by typing

db.createRole({
role: "salesMonitor",
privileges: [
{
resource: { db: "sales", collection: "" },
actions: [ "find" ]
}
],
roles: []
})

カスタムロールに関する情報の表示

As before, you can get information about your roles with the db.getRole() method

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

カスタムロールへの追加の特権の付与

To grant additional privileges to an existing user-defined role, you can use the db.grantPrivilegesToRole() method. It takes an array of privileges that are defined by documents containing a resource document and actions array, just as we saw above with db.createRole().

For instance, to add the listCollections privilege to the salesMonitor role, you could type

db.grantPrivilegesToRole(
"salesMonitor",
[
{
resource: { db: "sales", collection: "" },
actions: [ "listCollections" ]
}
]
)

カスタムロールからの特権の取り消し

If you change your mind, you can use the db.revokePrivilegesFromRole() method to remove the listCollections action using the same format

db.revokePrivilegesFromRole(
"salesMonitor",
[
{
resource: { db: "sales", collection: "" },
actions: [ "listCollections" ]
}
]
)

カスタムロールへのロールの付与

To add the privileges defined by a role to another role, you can use the db.grantRolesToRole() method. The method takes the role you want to modify and an array of roles you want to add to it as arguments.

To specify that you want to use the read role for the salesMonitor role after all, you can do so by typing

db.grantRolesToRole(
"salesMonitor",
[
"read"
]
)

カスタムロールからのロールの取り消し

If you change your mind again, you can revoke the role access using the db.revokeRolesFromRole() method, which uses the same argument syntax

db.revokeRolesFromRole(
"salesMonitor",
[
"read"
]
)

カスタムロールの値の置換

To redefine the characteristics of a user-defined role, you can use the db.updateRole() command. It works by replacing the fields it specifies instead of appending or truncating them. For this reason, it's a good idea to be careful when issuing the command so that you do not accidentally overwrite important information.

The syntax for the db.updateRole() command involves passing the role name as the first argument and a document specifying the field or fields you wish to replace as the second argument. The fields that can be replaced include the privileges array, the roles array, and the authenticationRestrictions array. At least one of these must be included in the document.

For example, once we've finally decided we want the salesMonitor role to use the read role on the sales database, we may want to redefine the role's privilege and role arrays to clean up any extra privileges that have been left behind by our experimentation. You can do this by updating the role with the new information you want to set

db.updateRole(
"salesMonitor",
{
privileges: [],
roles: [
{
role: "read",
db: "sales"
}
]
}
)

ユーザー定義ロールの削除

You can delete unnecessary roles with the db.dropRole() method.

To delete a role, just pass its name to the method

db.dropRole()

The role will be removed from the system and any privileges granted to users by that role will no longer be accessible.

結論

この記事では、MongoDB がアクセス制御と特権管理をどのように実装しているかについて、多くのことを説明しました。システムの概念的な基礎を概観し、管理者が管理できるロール、アクション、リソースを確認し、ロールシステムを使用してシステム全体の承認を構成する方法を学びました。

これらのスキルは、ユーザーが必要なタスクを完了するために必要なリソースへのアクセスを提供すると同時に、システム内の無関係な部分への露出を制限するために必要です。ロールを定義および活用する方法を学ぶことで、管理する MongoDB システムできめ細かいアクセス制御を提供できるようになります。

FAQ

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

read provides the ability to read data on all non-system collections.

readAnyDatabase provides the same capabilities as read except it also provides the ability to use the listDatabases action on a cluster as a whole.

The clusterMonitor role provides read-only access to monitoring tools, such as the MongoDB Cloud Manager and Ops Manager monitoring agent.

The backup role provides minimal privileges needed for backing up data. This role provides sufficient privileges to use the MongoDB Cloud and Ops Manager backup agents.

It also has permissions to run insert and update actions on backup collections in the admin , settings, and config databases.

The root role in MongoDB provides access to all of the operations and resources of the following roles combined

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

MongoDB employs RBAC to govern access to a MongoDB system. RBAC is a security strategy that restricts the operations permitted to a user based on their assigned roles.

MongoDB does not allow operations or access to a database if a user does not have an assigned role.

著者について
Justin Ellingwood

Justin Ellingwood

Justin は 2013 年からデータベース、Linux、インフラストラクチャ、および開発者ツールについて執筆しています。彼は現在、妻と2羽のウサギと一緒にベルリンに住んでいます。彼は通常、三人称で書く必要はありません。これは関係者全員にとって安心です。