Amazon DocumentDB イベントの監査
Amazon DocumentDB (MongoDB の互換性あり) を使用すると、クラスター内で実行されたイベントを監査できます。ログに記録されるイベントの例としては、認証の成功と失敗、データベース内のコレクションの削除、インデックスの作成などがあります。Amazon DocumentDB ではデフォルトで監査が無効になっているため、この機能を選択して使用する必要があります。
監査が有効な場合、Amazon DocumentDB はデータ定義言語 (DDL)、データ操作言語 (DML)、認証、認可、およびユーザー管理イベントを Amazon CloudWatch Logs に記録します。監査が有効な場合、Amazon DocumentDB はクラスターの監査レコード (JSON ドキュメント) を Amazon CloudWatch Logs にエクスポートします。Amazon CloudWatch Logs を使用すると、Amazon DocumentDB 監査イベントを分析、モニタリング、およびアーカイブすることができます。
Amazon DocumentDB では監査を有効にしても追加料金は発生しませんが、CloudWatch Logs の使用には標準料金がかかります。CloudWatch Logs の料金の詳細については、Amazon CloudWatch の料金
Amazon DocumentDB の監査機能は、AWS CloudTrail でモニタリングされるサービスリソースの使用状況とは明らかに異なります。CloudTrail は、クラスタ、インスタンス、パラメータグループ、スナップショットなどのリソースに対してAWS Command Line Interface (AWS CLI) または AWS Management Console で実行されるオペレーションを記録します。CloudTrailを使用した リソースの監査はデフォルトで有効化され、無効にすることはできません。Amazon DocumentDB 監査機能は、オプトイン機能です。これによって、オブジェクト (データベース、コレクション、インデックスやユーザーなど) のクラスター内で発生したオペレーションが記録されます。
サポートされるイベント
Amazon DocumentDB 監査は、以下のカテゴリのイベントをサポートしています。
-
データ定義言語 (DDL)- データベースの管理操作、接続、ユーザー管理、認可が含まれます。
-
データ操作言語読み取りイベント (DML 読み取り) -
find()
、 およびさまざまな集計演算子、算術演算子、ブール演算子、およびその他の読み取りクエリ演算子が対象になります。 -
データ操作言語書き込みイベント (DML 書き込み) -
insert(), update(), delete(),
およびbulkWrite()
演算子が対象になります。
イベントタイプは次のとおりです。
イベントタイプ | カテゴリ | 説明 |
---|---|---|
authCheck |
認可 | 結果コード 0: 成功 |
結果コード 13: 不正な操作によるオペレーションの実行。 | ||
authenticate |
Connection | 新規接続に対する認証 (成功または失敗)。 |
auditConfigure |
DDL | フィルター設定の監査。 |
createDatabase |
DDL | 新しいデータベースの作成。 |
createCollection |
DDL | データベース内での新しいコレクションの作成。 |
createIndex |
DDL | コレクション内での新しいインデックスの作成。 |
dropCollection |
DDL | データベース内のコレクションの削除。 |
dropDatabase |
DDL | データベースの削除。 |
dropIndex |
DDL | コレクション内のインデックスの削除。 |
modifyChangeStreams |
DDL | 変更ストリームが作成されました。 |
renameCollection |
DDL | データベース内のコレクションの名前変更。 |
createRole |
ロールの管理 | ロールの作成。 |
dropAllRolesFromDatabase |
ロールの管理 | データベース内のすべてのロールの削除。 |
dropRole |
ロールの管理 | ロールの削除。 |
grantPrivilegesToRole |
ロールの管理 | ロールへの権限の付与。 |
grantRolesToRole |
ロールの管理 | ユーザー定義ロールへのロールの付与。 |
revokePrivilegesFromRole |
ロールの管理 | ロールからの権限の取り消し。 |
revokeRolesFromRole |
ロールの管理 | ユーザー定義ロールからロールの取り消し。 |
updateRole |
ロールの管理 | ロールの更新。 |
createUser |
ユーザー管理 | 新しいユーザーの作成。 |
dropAllUsersFromDatabase |
ユーザー管理 | データベース内のすべてのユーザーの削除。 |
dropUser |
ユーザー管理 | 既存のユーザーの削除。 |
grantRolesToUser |
ユーザー管理 | ユーザーにロールを付与する。 |
revokeRolesFromUser |
ユーザー管理 | ユーザーからロールを取り消します。 |
updateUser |
ユーザー管理 | 既存のユーザーの更新。 |
insert |
DML 書き込み | 1 つまたは複数のドキュメントをコレクションに挿入します。 |
delete |
DML 書き込み | コレクションから 1 つまたは複数のドキュメントを削除します。 |
update |
DML 書き込み | 既存の 1 つまたは複数のコレクション内のドキュメントを変更します。 |
bulkWrite |
DML 書き込み | 実行順序を制御を使って複数の書き込み操作を実行します。 |
setAuditConfig |
DML 書き込み | DML 監査向け新しいフィルターを設定します。 |
count |
DML 読み取り | コレクションまたはビューの find() クエリに一致するドキュメントの数を返します。 |
countDocuments |
DML 読み取り | コレクションまたはビューのクエリに一致するドキュメントの数を返します。 |
find |
DML 読み取り | コレクションまたはビュー内のドキュメントを選択し、選択したドキュメントにカーソルを返します。 |
getAuditConfig |
DML 読み取り | DML 監査向けの現在のフィルターを取得します。 |
findAndModify |
DML 読み取りと DML 書き込み | 単一のドキュメントを変更して返します。 |
findOneAndDelete |
DML 読み取りと DML 書き込み | フィルターと並べ替え条件に基づいて 1 つのドキュメントを削除し、削除したドキュメントを返します。 |
findOneAndReplace |
DML 読み取りと DML 書き込み | 指定したフィルターに基づいて 1 つのドキュメントを置き換えます。 |
findOneAndUpdate |
DML 読み取りと DML 書き込み | フィルターと並べ替え条件に基づいて 1 つのドキュメントを更新します。 |
aggregate |
DML 読み取りと DML 書き込み | 集約パイプラインの API をサポートします。 |
distinct |
DML 読み取り | 1 つのコレクションまたはビューから指定されたフィールドの個別値を検索し、その結果を配列で返します。 |
注記
DML イベントドキュメントパラメータフィールドの値には 1 KB のサイズ制限があります。サイズが 1 KB を超えると、Amazon DocumentDB 値は切り捨てられます。
注記
現時点では、TTL 削除イベントは監査されません。
監査の有効化
クラスターでの監査の有効化は、2 ステップのプロセスです。両方のステップが完了していることを確認してください。完了していない場合、監査ログは CloudWatch Logs に送信されません。
ステップ 1. audit_logs クラスターパラメータを有効にする
監査を有効にするには、パラメータグループの audit_logs
パラメータを変更する必要があります。audit_logs
は記録するイベントのカンマ区切りのリストです。イベントはすべて小文字で指定する必要があります。リスト要素間に空白があってはいけません。
パラメータには以下の値を指定できます。
値 | 説明 |
---|---|
ddl |
設定すると、createDatabase、dropDatabase、createCollection、dropCollection、createIndex、dropIndex、authCheck、authenticate、createUser、dropUser、grantRolesToUser、revokeRolesFromUser、updateUser、dropAllUsersFromDatabase などの DDL イベントの監査が有効になります |
dml_read |
設定すると、find、sort count、distinct、group、projecta、unwind、geoNear、geoIntersects、geoWithin、その他の MongoDB 読み取りクエリ演算子などの DML 読み取りイベントの監査が有効になります。 |
dml_write |
設定すると、insert()、update()、delete()、bulkWrite() などの DML 書き込みイベントの監査が有効になります。 |
all |
設定すると、読み取りクエリ、書き込みクエリ、データベースアクション、管理者アクションなどのデータベースイベントの監査が有効になります。 |
none |
設定すると、監査が無効になります |
enabled (レガシー) |
これは「ddl」と同等のレガシーパラメータ設定です。設定すると、createDatabase、dropDatabase、createCollection、dropCollection、createIndex、dropIndex、authCheck、authenticate、createUser、dropUser、grantRolesToUser、revokeRolesFromUser、updateUser、dropAllUsersFromDatabase などの DDL イベントの監査が有効になります。レガシー設定であるため、この設定の使用はお勧めしません。 |
disabled (レガシー) |
これは「なし」と同等のレガシーパラメータ設定です。レガシー設定であるため、この設定の使用はお勧めしません。 |
注記
audit_logs クラスターパラメーターのデフォルト値は none
(レガシー「disabled
」) です。
上記の値を組み合わせて使用することもできます。
値 | 説明 |
---|---|
ddl, dml_read |
設定すると、DDL イベントと DML 読み取りイベントの監査が有効になります。 |
ddl, dml_write |
設定すると、DDL イベントと DML 書き込みイベントの監査が有効になります。 |
dml_read, dml_write |
設定すると、すべての DML イベントの監査が有効になります。 |
注記
デフォルトのパラメータグループを変更することはできません。
詳細については、次を参照してください:
-
Amazon DocumentDB クラスターパラメータグループを作成する
カスタムパラメータグループを作成したら、
audit_logs
パラメータ値をall
に変更します。
ステップ 2. Amazon CloudWatch Logs のエクスポートを有効にする
audit_logs
クラスターパラメータの値が enabled
か ddl
、dml_read
、dml_write
のいずれかの場合、Amazon DocumentDB がログを Amazon CloudWatch にエクスポートできるようにする必要があります。上述の手順のいずれかを省略すると、監査ログは CloudWatch に送信されません。
クラスターを作成するときにポイントインタイムリストアまたはスナップショットの復元を実行する場合、以下のステップで CloudWatch Logs を有効にすることができます。
監査の無効化
CloudWatch Logs のエクスポートを無効にし、audit_logs
パラメータを無効にすることで、監査を無効にすることができます。
CloudWatch Logs のエクスポートの無効化
監査ログのエクスポートを無効にするには、AWS Management Consoleまたは AWS CLI を使用します。
audit_logs パラメータを無効にする
クラスターの audit_logs
パラメータを無効にするには、audit_logs
パラメータ値が disabled
であるパラメータグループを使用するようにクラスターを変更します。または、クラスターの audit_logs
パラメータグループのパラメータ値を disabled
に変更することもできます。
詳細については、以下の各トピックを参照してください。
監査イベントへのアクセス
Amazon CloudWatch の監査イベントにアクセスするには、以下のステップを実行してください。
CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/
) を開きます。 -
Amazon DocumentDB クラスターと同じリージョンであることを確認します。
-
ナビゲーションペインで [ログ] を選択します。
-
クラスターの監査ログを確認するため、リストから
/aws/docdb/
を見つけ出して選択します。yourClusterName
/audit各インスタンスの監査イベントは、各インスタンス名の下に表示されます。
DML 監査イベントのフィルタリング
DML 監査フィルタリングの開始方法
DML 監査イベントは、Amazon CloudWatch への書き込み前にフィルタリングできます。この機能を使用するには、監査ログと DML ログ記録を有効にする必要があります。Amazon DocumentDB は、atype
、command
、user
、namespace
、auditAuthorizationSuccess
でのフィルタリングをサポートしています。
注記
DDL イベントはフィルタリングされません。
db.adminCommand( { command } )
オペレーションの setAuditConfig
、filter
、auditAuthorizationSuccess
パラメータを使用して監査フィルターを指定することで、いつでも監査フィルタリングを有効にできます。
db.admin.runCommand( { setAuditConfig: 1, filter: { //filter conditions }, auditAuthorizationSuccess: true | false } )
次のコマンドを実行して、監査フィルター設定を取得することもできます。
db.admin.runCommand( { getAuditConfig: 1})
セキュリティ要件
DML 監査フィルターを設定または一覧表示する際に admindb
に対して上記のコマンドを実行できるのは、特権アクション auditConfigure
を持つデータベースユーザー/ロールのみです。[clusterAdmin
、hostManager
、root
] の組み込みロールのいずれかを使用するか、あるいは auditConfigure
権限を持つカスタムロールを作成できます。以下は、auditConfigure
権限で既存のロールを使用する例と、カスタムロールを使用する例です。
ロールが組み込まれているユーザー:
use admin db.createUser( { user: "myClusterAdmin", pwd: "password123", roles: [ { role: "clusterAdmin", db: "admin" } ] } )
カスタムロールを持つユーザー:
use admin db.createRole( { role: "myRole", privileges: [ { resource: { cluster: true }, actions: [ "auditConfigure" ] } ], roles: [] } ) db.createUser( { user: "myUser", pwd: "myPassword", roles: [ { role: "myRole", db: "admin" } ] } )
ユースケースのフィルタリング
例: コマンドによるイベントのフィルタリング
db.admin.runCommand( { setAuditConfig: 1, filter: { "$and": [ { "param.command": { $in: [ "find","count", "insert", "delete", "update", "findandmodify" ] } } ] }, auditAuthorizationSuccess: true } )
例: ユーザー名によるイベントのフィルタリング
この例では、ユーザー「myUser」のみがログに記録されます。
db.admin.runCommand( { setAuditConfig: 1, filter: { "$and": [ { "param.user": { $in: [ "myUser" ] } } ]}, auditAuthorizationSuccess: true})
例: atype
によるフィルタリング
db.admin.runCommand( { setAuditConfig: 1, filter: {atype: "authCheck"}, auditAuthorizationSuccess: true })
注記
すべての DML ログは、atype
として authCheck
を持っています。DDL のみが別の atype
を持っています。filter
に authCheck
以外の値を指定した場合、CloudWatch での DML ログの生成は行われません。
例: 演算子によって結合された複数のフィルターを使用したフィルタリング
db.admin.runCommand( { setAuditConfig: 1, filter: { "$and": [ { "param.command": { $in: [ "find","count", "insert", "delete", "update", "findandmodify" ] } } ], "$nor": [ { "param.command": { $in: ["count", "insert", "delete", "update", "findandmodify" ] } }] }, auditAuthorizationSuccess: true})
注記
最上位レベルでは、$and
、$or
、$nor
のみがサポートされています。他の演算子はサポートされていないため、エラーが発生します。
例: auditAuthorizationSuccess
によるイベント別のフィルタリング
このフィルターでは、認証に合格したすべてのコマンドはログに記録されません。
db.admin.runCommand( { setAuditConfig: 1, filter: {}, auditAuthorizationSuccess: false } )
例: $in
および $nin
条件によるフィルタリング
$in
と $nin
の両方で使用する場合、条件間に暗黙的な「and」があるため、コマンドはログに記録されません。この例では、正規表現で find
コマンドがブロックされるため、ログには何も記録されません。
db.admin.runCommand( { setAuditConfig: 1, filter: { "$and": [ { atype: "authCheck", "param.command": { $in: [ "find", "insert", "delete", "update", "findandmodify" ], $nin: ["count", "insert", "delete", "update", "findandmodify" ], $not: /^^find.*/ } }, ], "$or": [ { "param.command": { $nin: ["count", "insert", "delete", "update", "findandmodify" ] } }] }, auditAuthorizationSuccess: true})
例: namespace
によるフィルタリング
db.admin.runCommand( { setAuditConfig: 1, filter: { "$and": [ { "param.ns": { $in: [ "test.foo" ] } } ]}, auditAuthorizationSuccess: true})
例: デフォルトフィルターへのリセット
デフォルト値にリセットすると、すべての DML 監査イベントがログに記録されます。フィルターをデフォルト値にリセットするには、次のコマンドを実行します。
db.admin.runCommand( { setAuditConfig: 1, filter: {}, auditAuthorizationSuccess: true } )