はじめに
認可 (Authorization) は、ユーザー管理とアクセス制御の不可欠な部分であり、各ユーザーがシステム上で何を実行できるかのポリシーを定義します。適切なポリシーを決定し、データベースに実装することで、ユーザーが必要なリソースを操作できるようにし、不適切な動作から保護します。
このガイドでは、MongoDB での認可の仕組みについて説明します。MongoDB がアクセス管理をどのように概念化しているか、ユーザーにどのような種類の権限を付与できるか、およびユーザーアカウントにポリシーをどのように関連付けるかを見ていきます。
MongoDB を使用している場合は、Prisma の MongoDB コネクタ をご確認ください!Prisma Client を使用して、本番環境の MongoDB データベースを自信を持って管理できます。
MongoDB と Prisma の使用を開始するには、ゼロからの開始ガイド、または 既存のプロジェクトに追加する方法 をご確認ください。
前提条件
このガイドに従うには、適切な権限を持つ 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 ではタブは許可されていません)、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"}])
カスタムロールの作成と管理
システムの組み込みロールが、割り当てる必要のある権限のタイプに適切に対応していない場合があります。このような場合は、独自のカスタムロールを作成できます。
新しいロールの作成
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 roleprivileges
: 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 aresource
document (specifying which resources this privilege applies to) as well as an array ofactions
that are being grantedroles
: 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 システムできめ細かいアクセス制御を提供できるようになります。
MongoDB を使用している場合は、Prisma の MongoDB コネクタ をご確認ください!Prisma Client を使用して、本番環境の MongoDB データベースを自信を持って管理できます。
MongoDB と Prisma の使用を開始するには、ゼロからの開始ガイド、または 既存のプロジェクトに追加する方法 をご確認ください。
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.