使用高级事件选择器筛选数据事件 - AWS CloudTrail

使用高级事件选择器筛选数据事件

本节介绍如何使用高级事件选择器来创建细粒度选择器以记录数据事件,从而通过仅记录感兴趣的特定数据事件来帮助您控制成本。

例如:

  • 您可以通过在 eventName 字段上添加筛选条件器来包含或排除特定 API 调用。

  • 您可以通过在 resources.ARN 字段上添加筛选条件来包含或排除特定资源的日志记录。例如,如果您正在记录 S3 数据事件,则可以对跟踪排除 S3 存储桶的日志记录。

  • 通过在 readOnly 字段上添加筛选条件,您可以选择仅记录只写事件或只读事件。

下表描述了筛选数据事件时支持的字段。有关每种 CloudTrail 事件类型支持的字段列表,请参阅《AWS CloudTrail API 参考》中的 AdvancedEventSelector

字段 必需 有效运算符 Description

eventCategory

Equals

此字段设置为 Data 以记录数据事件。

resources.type

Equals

此字段用于选择要为其记录数据事件的资源类型。数据事件表显示了可能值。

readOnly

Equals

这是一个可选字段,用于根据 readOnly 值包含或排除数据事件。true 的值仅记录读取事件。false 的值仅记录写入事件。如果不添加此字段,CloudTrail 会同时记录读取和写入事件。

eventName

EndsWith

Equals

NotEndsWith

NotEquals

NotStartsWith

StartsWith

这是一个可选字段,用于筛选入或筛选出记录到 CloudTrail 的任何数据事件,例如 PutBucketGetSnapshotBlock

如果您使用的是 AWS CLI,则可以通过用逗号分隔每个值来指定多个值。

如果您使用的是控制台,则可以通过为要筛选的每个 eventName 值创建一个条件来指定多个值。

resources.ARN

EndsWith

Equals

NotEndsWith

NotEquals

NotStartsWith

StartsWith

这是一个可选字段,用于通过提供 resources.ARN 来排除或包含特定资源的数据事件。您可以将任意运算符与 resources.ARN 结合使用,但是如果使用 EqualsNotEquals,则值必须与您指定的 resources.type 的有效资源的 ARN 完全匹配。要记录特定 S3 桶中所有对象的所有数据事件,请使用 StartsWith 运算符,并且仅包含存储桶 ARN 作为匹配值。

如果您使用的是 AWS CLI,则可以通过用逗号分隔每个值来指定多个值。

如果您使用的是控制台,则可以通过为要筛选的每个 resources.ARN 值创建一个条件来指定多个值。

eventSource

EndsWith

Equals

NotEndsWith

NotEquals

NotStartsWith

StartsWith

可以使用它来包含或排除特定的事件源。eventSource 通常为服务名称的简短形式,不含空格但会加上 .amazonaws.com。例如,可以设置 eventSource Equals ec2.amazonaws.com,以便仅记录 Amazon EC2 数据事件。

eventType

EndsWith

Equals

NotEndsWith

NotEquals

NotStartsWith

StartsWith

要包括或排除的 eventType。例如,可以将此字段设置为 NotEquals AwsServiceEvent,以排除 AWS 服务 事件

sessionCredentialFromConsole

Equals

NotEquals

包含或排除源自AWS 管理控制台会话的事件。可以将此字段设置为 EqualsNotEquals 且值为 true

userIdentity.arn

EndsWith

Equals

NotEndsWith

NotEquals

NotStartsWith

StartsWith

包含或排除特定 IAM 身份所采取操作的事件。有关更多信息,请参阅 CloudTrail userIdentity 元素

要使用 CloudTrail 控制台记录数据事件,请选择数据事件选项,然后在创建或更新跟踪或事件数据存储时选择感兴趣的资源类型数据事件表显示您可以在 CloudTrail 控制台上选择的可能的资源类型。

在控制台上选择 SNS 主题资源类型。

要使用 AWS CLI 记录数据事件,请配置 --advanced-event-selector 参数,将 eventCategory 设置为等于 Data,将 resources.type 值设置为等于您要记录数据事件的资源类型值。数据事件表列出了可用的资源类型。

例如,如果您想记录所有 Cognito 身份池的数据事件,则可以将 --advanced-event-selectors 参数配置为如下所示:

--advanced-event-selectors '[ { "Name": "Log Cognito data events on Identity pools", "FieldSelectors": [ { "Field": "eventCategory", "Equals": ["Data"] }, { "Field": "resources.type", "Equals": ["AWS::Cognito::IdentityPool"] } ] } ]'

上述示例记录了身份池上的所有 Cognito 数据事件。您可以进一步优化高级事件选择器来筛选 eventNamereadOnlyresources.ARN 字段,以记录感兴趣的特定事件或排除不感兴趣的事件。

您可以配置高级事件选择器来根据多个字段筛选数据事件。例如,您可以将高级事件选择器配置为记录所有 Amazon S3 PutObjectDeleteObject API 调用,但排除特定 S3 存储桶的事件日志记录,如以下示例所示。将 amzn-s3-demo-bucket 替换为您的存储桶的名称。

--advanced-event-selectors '[ { "Name": "Log PutObject and DeleteObject events for all but one bucket", "FieldSelectors": [ { "Field": "eventCategory", "Equals": ["Data"] }, { "Field": "resources.type", "Equals": ["AWS::S3::Object"] }, { "Field": "eventName", "Equals": ["PutObject","DeleteObject"] }, { "Field": "resources.ARN", "NotStartsWith": ["arn:aws:s3:::amzn-s3-demo-bucket/"] } ] } ]'

您还可以为一个字段包含多个条件。有关如何评估多个条件的信息,请参阅CloudTrail 如何评估字段的多个条件

您可以使用高级事件选择器来同时记录管理事件和数据事件。要记录多种资源类型的数据事件,请为要记录数据事件的每种资源类型添加一个字段选择器语句。

注意

跟踪可以使用基本事件选择器或高级事件选择器,但不能同时使用两者。如果将高级事件选择器应用于跟踪,则所有现有的基本事件选择器都将被覆盖。

选择器不支持使用通配符,例如 *。要将多个值与单个条件匹配,可以使用 StartsWithEndsWithNotStartsWithNotEndsWith 明确匹配事件字段的开头或结尾。

CloudTrail 如何评估字段的多个条件

对于高级事件选择器,CloudTrail 会评估字段的多个条件,如下所示:

  • DESELECT 运算符用 AND 连接在一起。如果满足任何 DESELECT 运算符条件,则不会传递事件。这些是高级事件选择器的有效 DESELECT 运算符:

    • NotEndsWith

    • NotEquals

    • NotStartsWith

  • SELECT 运算符用 OR 连接在一起。这些是高级事件选择器的有效 SELECT 运算符:

    • EndsWith

    • Equals

    • StartsWith

  • SELECT 和 DESELECT 运算符的组合遵循上述规则,并且两组以 AND 连接在一起。

显示 resources.ARN 字段的多个条件的示例

以下示例事件选择器语句收集 AWS::S3::Object 资源类型的数据事件,并对 resources.ARN 字段应用多个条件。

{ "Name": "S3Select", "FieldSelectors": [ { "Field": "eventCategory", "Equals": [ "Data" ] }, { "Field": "resources.type", "Equals": [ "AWS::S3::Object" ] }, { "Field": "resources.ARN", "Equals": [ "arn:aws:s3:::amzn-s3-demo-bucket/object1" ], "StartsWith": [ "arn:aws:s3:::amzn-s3-demo-bucket/" ], "EndsWith": [ "object3" ], "NotStartsWith": [ "arn:aws:s3:::amzn-s3-demo-bucket/deselect" ], "NotEndsWith": [ "object5" ], "NotEquals": [ "arn:aws:s3:::amzn-s3-demo-bucket/object6" ] } ] }

在前面的示例中,在以下情况下,将传输 AWS::S3::Object 资源的 Amazon S3 数据事件:

  1. 这些 DESELECT 运算符条件均不满足:

    • resources.ARN 字段 NotStartsWith 的值为 arn:aws:s3:::amzn-s3-demo-bucket/deselect

    • resources.ARN 字段 NotEndsWith 的值为 object5

    • resources.ARN 字段 NotEquals 的值为 arn:aws:s3:::amzn-s3-demo-bucket/object6

  2. 至少满足以下 SELECT 运算符条件之一:

    • resources.ARN 字段 Equals 的值为 arn:aws:s3:::amzn-s3-demo-bucket/object1

    • resources.ARN 字段 StartsWith 的值为 arn:aws:s3:::amzn-s3-demo-bucket/

    • resources.ARN 字段 EndsWith 的值为 object3

基于评估逻辑:

  1. 之所以传输 amzn-s3-demo-bucket/object1 的数据事件,是因为它与 Equals 运算符的值匹配,而与 NotStartsWithNotEndsWithNotEquals 运算符的任何值都不匹配。

  2. 之所以传输 amzn-s3-demo-bucket/object2 的数据事件,是因为它与 StartsWith 运算符的值匹配,而与 NotStartsWithNotEndsWithNotEquals 运算符的任何值都不匹配。

  3. 之所以传输 amzn-s3-demo-bucket1/object3 的数据事件,是因为它与 EndsWith 运算符匹配,而与 NotStartsWithNotEndsWithNotEquals 运算符的任何值都不匹配。

  4. 之所以传输 arn:aws:s3:::amzn-s3-demo-bucket/deselectObject4 的数据事件,是因为它与 NotStartsWith 的条件匹配,也与 StartsWith 运算符的条件匹配。

  5. 之所以传输 arn:aws:s3:::amzn-s3-demo-bucket/object5 的数据事件,是因为它与 NotEndsWith 的条件匹配,也与 StartsWith 运算符的条件匹配。

  6. 之所以不传输 arn:aws:s3:::amzn-s3-demo-bucket/object6 的数据事件,是因为它与 NotEquals 运算符的条件匹配,也与 StartsWith 运算符的条件匹配。

筛选数据事件的 AWS CLI 示例

本节提供了一些 AWS CLI 示例,说明如何根据不同字段筛选数据事件。有关其他 AWS CLI 示例,请参阅 使用高级事件选择器记录跟踪的数据事件使用 AWS CLI 记录事件数据存储的数据事件

有关如何使用控制台记录数据事件的信息,请参阅使用 AWS 管理控制台 记录数据事件

示例 1:根据 eventName 字段进行筛选

在第一个示例中,跟踪的 --advanced-event-selectors 配置为仅针对通用存储桶中的 Amazon S3 对象记录 GetObjectPutObjectDeleteObject API 调用。

aws cloudtrail put-event-selectors \ --trail-name trailName \ --advanced-event-selectors '[ { "Name": "Log GetObject, PutObject and DeleteObject S3 data events", "FieldSelectors": [ { "Field": "eventCategory", "Equals": ["Data"] }, { "Field": "resources.type", "Equals": ["AWS::S3::Object"] }, { "Field": "eventName", "Equals": ["GetObject","PutObject","DeleteObject"] } ] } ]'

下一个示例创建了一个新的事件数据存储,用于记录 EBS Direct API 的数据事件,但不包括 ListChangedBlocks API 调用。您可以使用 update-event-data-store 命令来更新现有事件数据存储库。

aws cloudtrail create-event-data-store \ --name "eventDataStoreName" --advanced-event-selectors '[ { "Name": "Log all EBS Direct API data events except ListChangedBlocks", "FieldSelectors": [ { "Field": "eventCategory", "Equals": ["Data"] }, { "Field": "resources.type", "Equals": ["AWS::EC2::Snapshot"] }, { "Field": "eventName", "NotEquals": ["ListChangedBlocks"] } ] } ]'

示例 2:根据 resources.ARNuserIdentity.arn 字段进行筛选

以下示例展示了如何包含特定通用 S3 存储桶中所有 Amazon S3 对象的所有数据事件,并排除 bucket-scanner-role userIdentity 生成的事件。S3 事件在 resources.type 字段中的值为 AWS::S3::Object。由于 S3 对象和 S3 存储桶的 ARN 值略有不同,因此必须为 resources.ARN 添加 StartsWith 运算符。

aws cloudtrail put-event-selectors \ --trail-name trailName \ --advanced-event-selectors \ '[ { "Name": "S3EventSelector", "FieldSelectors": [ { "Field": "eventCategory", "Equals": ["Data"] }, { "Field": "resources.type", "Equals": ["AWS::S3::Object"] }, { "Field": "resources.ARN", "StartsWith": ["arn:partition:s3:::amzn-s3-demo-bucket/"] }, { "Field": "userIdentity.arn", "NotStartsWith": ["arn:aws:sts::123456789012:assumed-role/bucket-scanner-role"]} ] } ]'

示例 3:根据 resources.typeeventName 字段进行筛选以排除由 Amazon S3 DeleteObjects 事件删除的单个对象

以下示例展示了如何包含特定通用 Amazon S3 存储桶中所有 Amazon S3 对象的所有数据事件,并排除 DeleteObject 操作删除的各个事件。S3 事件在 resources.type 字段中的值为 AWS::S3::Object。事件名称的值是 DeleteObject

aws cloudtrail put-event-selectors \ --trail-name trailName \ --advanced-event-selectors \ { "Name": "Exclude Events for DeleteObject operation", "FieldSelectors": [ { "Field": "eventCategory", "Equals": [ "Data" ] }, { "Field": "resources.type", "Equals": [ "AWS::S3::Object" ] }, { "Field": "eventName", "NotEquals": [ "DeleteObject" ] } ] }, { "Name": "Exclude DeleteObject Events for individual objects deleted by DeleteObjects Operation", "FieldSelectors": [ { "Field": "eventCategory", "Equals": [ "Data" ] }, { "Field": "resources.type", "Equals": [ "AWS::S3::Object" ] }, { "Field": "eventName", "Equals": [ "DeleteObject" ] }, { "Field": "eventType", "NotEquals": [ "AwsServiceEvent" ] } ] } ] (edited)