Atlas プラットフォームのアクティビティをモニターするには、監査を使用してください。
Atlas監査のための機能
M10+ クラスターで利用可能なデータベース監査により、複数のユーザーによる配置のシステム アクティビティを追跡できます。
Atlas の管理者として、MongoDB でカスタム JSON 監査フィルターを作成し、システム全体で監査される内容を正確に制御できます。
このアプローチにより、どのアクション、データベースユーザー、Atlas ロールをモニター対象とするかを正確に指定でき、監査プロセスをよりきめ細かく制御できます。これは標準的なフィルター ビルダを使用する場合と比べて優れています。
手動監査構成を使用すると、Atlas に文書化されているシステム イベント アクションのほぼすべてをモニターできます。
包括的なデータベース監査機能で、以下の項目を詳細に追跡できます。
DDL(データ定義言語)の操作
DML(データ操作言語)の操作
DCL(データ制御言語)の操作。
これにより、データベース スキーマの変更、データの変更、権限の調整を完全に可視化できます。
実装ガイダンスには、完全なイベント リストや実用的な構成例が含まれています。詳細については「MongoDB 監査」と「監査フィルターの例」のドキュメントを参照してください。追加のセットアップ手順は、「データベース監査の設定」セクションを参照してください。
Atlas で監査フィルターを作成して有効にする
監査フィルターを作成して、関心のある特定の操作のみに監査を制限できます。操作の監査を有効にすると、「監査イベント アクション、詳細、結果」で詳述されているように、監査可能なすべての操作が Atlas に記録されます。
Atlas が記録するイベントを制限するには、イベント監査フィルターを指定できます。
以下のドキュメントは、test データベースに対して行われる認証操作のみを対象とする監査フィルターを定義しています。詳細については、「監査フィルターの構成」を参照してください。
{ "atype": "authenticate", "param.db": "test" }
監査フィルターを有効にするには、 --enabledフラグを指定して atlas auditing update コマンドを実行し、監査フィルター ドキュメントを一重引用符で指定して、ドキュメントを string として渡します。
atlas auditing update --enabled --auditFilter '{"atype": "authenticate", "param.db": "test"}'
カスタム監査フィルターを使用すると、管理された {atlas-ui+} 監査フィルター ビルダーを使用せずに、イベント監査を手動で細かく制御できるようになります。Atlas は、カスタム フィルターが有効な JSON 構文を使用しているかどうかのみをチェックし、フィルターの機能を検証またはテストしません。
監査フィルター ドキュメント
監査イベントメッセージ内の 1 つ以上のフィールドに一致するクエリにクエリに解決される必要があります。
必要な監査メッセージを一致させるために、クエリ演算子と等価条件の組み合わせを使用できます。
Atlas は、MongoDB の監査をカスタマイズする JSON 形式の監査フィルターの指定をサポートしています。
カスタム フィルターの JSON 構成ファイルを設定すると便利です。大規模なフィルターを作成する必要がある場合、フィルターの構成を別のファイルに保存すると、フィルターの管理と保守が容易になるためです。
次の Atlas CLI コマンドは、指定された JSON 構成ファイルで定義されている監査フィルターを有効にします。
atlas auditing update --enabled -f filter.json
Atlas の監査に関する推奨事項
次の推奨事項は、すべての配置パラダイムに適用されます。
クラスターをプロビジョニングするときには、データベース監査を設定することをお勧めします。
データベース監査によって、クラスター リソースの使用量と運用コストが増加します。
最適なパフォーマンスを維持し、コストを制御するには、重要なユーザーのみを監査し、必要のない開発環境では監査をオフにすることを検討してください。
医療や金融サービスなどの特定の業界では、コンプライアンス上の理由から、開発環境でも監査を有効にしておくことを選択する場合があります。
少なくとも次のイベントを監査することをお勧めします。
ログオン失敗
セッション アクティビティ
ログオンとログオフ
不正な機能を実行しようとすると、
パスワードの変更
データベースユーザーアクセスの変更
DDL およびシステム構成の保存手順
ネイティブ監査の修正
バックアップまたは復元操作の実行
DBMS ネイティブ監査設定の変更
セキュリティの変更
データベースの起動コマンドと停止コマンドの実行
オートメーションの例: Atlas 監査
Tip
すべてのピリオドにわたって推奨事項を強制する Terraform の例については、 Githubの次のいずれかの例を参照してください。
次の例では、Atlas のオートメーションツールを使用してログを検索およびダウンロードし、監査を構成する方法を示します。
監査構成の更新
プロジェクトの監査構成を更新するには、atlas auditing update コマンドを使用して、新しい監査フィルターを指定します。次のコマンドは、既存の監査フィルター構成を、プロジェクト内の既知のユーザーに対してすべての認証イベントを監査する新しいフィルターに置き換えます。
atlas auditing update --enabled --auditFilter '{"atype": "authenticate"}'
監査構成の説明
指定したプロジェクトの監査構成を返すには、atlas auditing describe コマンドを実行します。
atlas auditing describe --output json
次の例は、配置で監査を有効にする方法を示しています。Terraform でリソースを作成する前に、次の操作を行う必要があります。
支払い組織を作成し、支払い組織のAPIキーを作成します。ターミナルで次のコマンドを実行中、公開鍵と秘密鍵を環境変数として保存します。
export MONGODB_ATLAS_PUBLIC_KEY="<insert your public key here>" export MONGODB_ATLAS_PRIVATE_KEY="<insert your private key here>"
監査を有効にし、監査フィルターを作成する
監査するフィルターを作成することで、文書化されたシステムイベントアクションのほとんどの手動監査を構成できます。監査するフィルターの構成の詳細については、「 監査フィルターの構成 」を参照してください。
次の Terraformスクリプトは、包括的なデータベース監査を備えた完全な MongoDB Atlas インフラストラクチャをセットアップします。スクリプトを以下に示します。
組織内に新しいプロジェクトを作成し、米国東部リージョンの AWS に配置された 3 ノードのレプリカ セット クラスター(M10 インスタンス)をプロビジョニングします。
認証イベント、ユーザーマネジメント操作、データ操作やクエリ操作などのさまざまなデータベース コマンドをモニターする JSON フィルターを使用して詳細な監査機能を有効にします。
監査構成は、特に管理者と外部データベースユーザーを対象としており、認証の試行、ロールの変更、一般的なデータベースコマンド(find、insert、update、delete 操作など)などの重要な操作を追跡します。
Add the MongoDB Atlas Provider terraform { required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" version = "1.34.0" } } } Configure the MongoDB Atlas Provider provider "mongodbatlas" { public_key = var.mongodbatlas_public_key private_key = var.mongodbatlas_private_key } Create a Project resource "mongodbatlas_project" "this" { org_id = var.atlas_org_id name = var.atlas_project_name } Create an Atlas Advanced Cluster resource "mongodbatlas_advanced_cluster" "atlas-cluster" { project_id = mongodbatlas_project.atlas-project.id name = "ClusterPortalProd" cluster_type = "REPLICASET" mongo_db_major_version = "8.0" replication_specs { region_configs { electable_specs { instance_size = "M10" node_count = 1 } provider_name = "AWS" priority = 7 region_name = "US_WEST_1" } } Advanced configuration backup_enabled = true pit_enabled = true version_release_system = "LTS" } Create comprehensive auditing configuration to capture all possible audit events resource "mongodbatlas_auditing" "atlas-auditing" { project_id = mongodbatlas_project.atlas-project.id Comprehensive audit filter to capture all possible audit events audit_filter = jsonencode({ "$or" = [ # Capture all authentication events { "atype" = { "$in" = [ "authenticate", "authCheck", "logout" ] } }, # Capture all authorization events { "atype" = "authCheck" }, # Capture all CRUD operations { "atype" = "authCheck", "param.command" = { "$in" = [ # Read operations "find", "getMore", "count", "distinct", "aggregate", "group", "mapReduce", "geoNear", "geoSearch", "parallelCollectionScan", "eval", "getLastError", "getPrevError", "resetError", # Write operations "insert", "update", "delete", "findAndModify", "save", # Index operations "createIndexes", "dropIndexes", "listIndexes", "reIndex", # Collection operations "create", "drop", "listCollections", "collMod", "convertToCapped", "emptycapped", "renameCollection", # Database operations "dropDatabase", "listDatabases", "copydb", "clone", # GridFS operations "filemd5" ] } }, # Capture all DDL (Data Definition Language) operations { "atype" = "authCheck", "param.command" = { "$in" = [ "create", "drop", "createIndexes", "dropIndexes", "collMod", "renameCollection", "dropDatabase", "createCollection", "dropCollection" ] } }, # Capture all user and role management operations { "atype" = "authCheck", "param.command" = { "$in" = [ "createUser", "dropUser", "dropAllUsersFromDatabase", "updateUser", "grantRolesToUser", "revokeRolesFromUser", "createRole", "updateRole", "dropRole", "dropAllRolesFromDatabase", "grantRolesToRole", "revokeRolesFromRole", "grantPrivilegesToRole", "revokePrivilegesFromRole" ] } }, # Capture replica set operations { "atype" = "authCheck", "param.command" = { "$in" = [ "replSetGetStatus", "replSetInitiate", "replSetReconfig", "replSetStepDown", "replSetSyncFrom", "replSetFreeze", "replSetMaintenance", "replSetGetConfig" ] } }, # Capture sharding operations { "atype" = "authCheck", "param.command" = { "$in" = [ "shardCollection", "addShard", "removeShard", "movePrimary", "enableSharding", "split", "moveChunk", "mergeChunks" ] } }, # Capture administrative operations { "atype" = "authCheck", "param.command" = { "$in" = [ "shutdown", "fsync", "getParameter", "setParameter", "serverStatus", "dbStats", "collStats", "currentOp", "killOp", "listCommands", "buildInfo", "hostInfo", "connectionStatus", "getCmdLineOpts", "logRotate", "planCacheClear", "planCacheListFilters", "planCacheSetFilter", "planCacheClearFilters" ] } }, # Capture diagnostic operations { "atype" = "authCheck", "param.command" = { "$in" = [ "explain", "profile", "validate", "dbHash", "ping", "ismaster", "isMaster", "hello" ] } }, # Capture connection and session events { "atype" = { "$in" = [ "createSession", "endSession", "refreshSession" ] } }, # Capture transaction events { "atype" = "authCheck", "param.command" = { "$in" = [ "abortTransaction", "commitTransaction", "startTransaction" ] } }, # Capture change stream events { "atype" = "authCheck", "param.command" = { "$in" = [ "aggregate" ] }, "param.pipeline" = { "$elemMatch" = { "$changeStream" = { "$exists" = true } } } } ] }) Enable comprehensive auditing settings audit_authorization_success = true # Audit both successful and failed operations enabled = true # Enable auditing } Variables variable "mongodbatlas_public_key" { default = "" description = "MongoDB Atlas Public Key" type = string sensitive = true } variable "mongodbatlas_private_key" { default = "" description = "MongoDB Atlas Private Key" type = string sensitive = true } variable "atlas_org_id" { default = "" description = "MongoDB Atlas Organization ID" type = string } variable "atlas_project_name" { description = "MongoDB Atlas Project Name" type = string default = "Atlas Auditing Example" } Outputs output "cluster_connection_string" { description = "Connection string for the Atlas cluster" value = mongodbatlas_advanced_cluster.atlas-cluster.connection_strings[0].standard_srv sensitive = true } output "cluster_id" { description = "Atlas cluster ID" value = mongodbatlas_advanced_cluster.atlas-cluster.cluster_id } output "project_id" { description = "Atlas project ID" value = mongodbatlas_project.atlas-project.id } output "auditing_enabled" { description = "Whether auditing is enabled" value = mongodbatlas_auditing.atlas-auditing.enabled }