

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 处理 CloudTrail 日志文件
<a name="cloudtrail-working-with-log-files"></a>

您可以对 CloudTrail 文件执行更高级的任务。
+ 通过将 CloudTrail 日志文件发送到 “日志” 来监控 CloudWatch 日志文件。
+ 在账户间共享日志文件。
+ 使用 AWS CloudTrail 处理库用 Java 编写日志处理应用程序。
+ 验证您的日志文件，以确认它们在 CloudTrail 交付后未发生更改。

当您的账户中发生事件时， CloudTrail 会评估该事件是否与您的路径设置相匹配。只有与您的跟踪设置匹配的事件才会传输到您的 Amazon S3 存储桶和 Amazon Log CloudWatch s 日志组。

您可以对多个跟踪记录进行不同的配置，以便这些跟踪记录仅处理和记录您指定的事件。例如，一个跟踪可记录只读数据事件和管理事件，以使所有只读事件传送到一个 S3 存储桶。另一个跟踪可仅记录只写数据事件和管理事件，以使所有只写事件传送到一个单独的 S3 存储桶。

您也可以配置您的跟踪记录以拥有一个跟踪记录日志并将所有管理事件传送到一个 S3 存储桶，并配置另一个跟踪记录以记录所有数据事件并将其传送到另一个 S3 存储桶。

您可以配置您的跟踪记录以记录以下内容：
+ **[数据事件](logging-data-events-with-cloudtrail.md)**：通过这些事件，可以了解对资源执行的或在资源内执行的资源操作。这些也称为数据面板操作。
+ **[管理事件](logging-management-events-with-cloudtrail.md)**：管理事件可让您了解对 AWS 账户中的资源执行的管理操作。这些也称为控制面板操作。管理事件还包括在您的账户中发生的非 API 事件。例如，当用户登录您的账户时，会 CloudTrail 记录该`ConsoleLogin`事件。有关更多信息，请参阅 [捕获的非 API 事件 CloudTrail](cloudtrail-non-api-events.md)。
+ **[网络活动事件](logging-network-events-with-cloudtrail.md)**： CloudTrail 网络活动事件使 VPC 终端节点所有者能够记录使用其 VPC 终端节点从私有 VPC 到的 AWS API 调用 AWS 服务。通过网络活动事件，可以了解在 VPC 中执行的资源操作。
+ **[Insights 事件](logging-insights-events-with-cloudtrail.md)**：见解事件捕获在您的账户中检测到的异常活动。如果您启用了 Insights 事件并 CloudTrail 检测到异常活动，则 Insights 事件会记录到您的跟踪的目标 S3 存储桶中，但会记录在不同的文件夹中。在 CloudTrail 控制台上查看 Insights 事件时，您还可以查看 Insights 事件的类型和事件时间段。与 CloudTrail 跟踪中捕获的其他类型的事件不同，Insights 事件仅在 CloudTrail 检测到您的账户 API 使用情况与账户的典型使用模式明显不同时，才会记录 Insights 事件。

  仅为管理层生成见解事件 APIs。有关更多信息，请参阅 [使用见 CloudTrail 解](logging-insights-events-with-cloudtrail.md)。

**注意**  
CloudTrail 通常在 API 调用后的平均大约 5 分钟内传送日志。此时间并不能得到保证。有关更多信息，请参阅 [AWS CloudTrail 服务等级协议](https://aws.amazon.com/cloudtrail/sla)。  
如果您错误配置了跟踪（例如，无法访问 S3 存储桶），则 CloudTrail 会尝试将日志文件重新传送到您的 S3 存储桶，持续 30 天，这些 attempted-to-deliver事件将按标准费用收费。 CloudTrail 为避免配置错误的跟踪产生费用，您需要删除跟踪。

**Topics**
+ [

# 接收来自多个区域的 CloudTrail 日志文件
](receive-cloudtrail-log-files-from-multiple-regions.md)
+ [

# 在中管理数据一致性 CloudTrail
](cloudtrail-data-consistency.md)
+ [

# 使用 Amazon CloudTrail 日志监控 CloudWatch 日志文件
](monitor-cloudtrail-log-files-with-cloudwatch-logs.md)
+ [

# 接收来自多个账户的 CloudTrail 日志文件
](cloudtrail-receive-logs-from-multiple-accounts.md)
+ [

# 在 AWS 账户之间共享 CloudTrail 日志文件
](cloudtrail-sharing-logs.md)
+ [

# 验证 CloudTrail 日志文件完整性
](cloudtrail-log-file-validation-intro.md)
+ [

# CloudTrail 日志文件示例
](cloudtrail-log-file-examples.md)
+ [

# 使用 CloudTrail 处理库
](use-the-cloudtrail-processing-library.md)

# 接收来自多个区域的 CloudTrail 日志文件
<a name="receive-cloudtrail-log-files-from-multiple-regions"></a>



创建多区域跟踪时，会 CloudTrail 记录您账户中启用的所有区域的事件。 CloudTrail 将日志文件传送到相同的 S3 存储桶和 CloudWatch 日志组。只要 CloudTrail 有权写入 S3 存储桶，多区域跟踪的存储桶就不必位于跟踪的主区域中。

尽管大多数区域默认 AWS 区域 处于启用状态 AWS 账户，但您必须手动启用某些区域（也称为可*选区域*）。有关默认启用哪些区域的信息，请参阅《*AWS 账户管理 参考指南*》中的 [Considerations before enabling and disabling Regions](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html#manage-acct-regions-considerations)。有关 CloudTrail 支持的区域列表，请参阅[CloudTrail 支持的区域](cloudtrail-supported-regions.md)。

启用可选区域后， CloudTrail 将在您启用的选择加入区域中为每条多区域跟踪创建相同的副本。有关更多信息，请参阅 [启用选择加入区域后会发生什么？](cloudtrail-multi-region-trails.md#cloudtrail-multi-region-trails-optin)。

如果您后来禁用某个选择加入区域，则该区域中的多区域跟踪副本将保留。由于您的账户可能在您禁用的区域内有活动（例如删除资源的操作），因此 CloudTrail 将继续捕获活动并尝试将所有在禁用该区域之前未删除的跟踪的事件传送到 S3 存储桶。 AWS 服务 

要将现有单区域跟踪转换为多区域跟踪，您必须使用 AWS CLI。

要更改现有跟踪以使其应用于所有已启用区域，请向 [**update-trail**](cloudtrail-create-and-update-a-trail-by-using-the-aws-cli-update-trail.md) 命令添加 `--is-multi-region-trail` 选项。

```
aws cloudtrail update-trail --name my-trail --is-multi-region-trail
```

要确认该跟踪现在是多区域跟踪，请验证输出中的 `IsMultiRegionTrail` 元素是否显示 `true`。

```
{
    "IncludeGlobalServiceEvents": true, 
    "Name": "my-trail", 
    "TrailARN": "arn:aws:cloudtrail:us-east-2:123456789012:trail/my-trail", 
    "LogFileValidationEnabled": false, 
    "IsMultiRegionTrail": true, 
    "IsOrganizationTrail": false,
    "S3BucketName": "amzn-s3-demo-bucket"
}
```

有关更多信息，请参阅以下资源：
+ [了解多区域跟踪和选择加入区域](cloudtrail-multi-region-trails.md)
+ [为您创建路线 AWS 账户](cloudtrail-create-and-update-a-trail.md)
+  [CloudTrail FAQs](https://aws.amazon.com/cloudtrail/faqs/) 

# 在中管理数据一致性 CloudTrail
<a name="cloudtrail-data-consistency"></a>

CloudTrail 使用一种名为[最终一致性的](https://en.wikipedia.org/wiki/Eventual_consistency)分布式计算模型。您对 CloudTrail 配置（或其他 AWS 服务）所做的任何更改，包括[基于属性的访问控制 (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) 中使用的标签，都需要一段时间才能从所有可能的端点中看见。有些延迟是由于将数据从一个服务器发送到另一个服务器以及从一个区域发送到另一个地区所花费的时间造成的。 CloudTrail 还使用缓存来提高性能，但在某些情况下，这可能会增加时间。在之前缓存的数据超时之前，更改可能不可见。

 您在设计应用程序时，必须考虑到这些可能的延迟。确保应用程序可以按预期工作，即使在一个位置进行的更改不能立即在其他位置可见。此类更改包括[启用选择加入区域](cloudtrail-multi-region-trails.md#cloudtrail-multi-region-trails-optin)、创建或更新跟踪或事件数据存储、更新事件选择器，以及启动或停止日志记录。创建或更新跟踪或事件数据存储时，会根据最新的已知配置将日志传 CloudTrail 送到 S3 存储桶或事件数据存储，直到更改传播到所有位置。

 有关这会如何影响其他人的更多信息 AWS 服务，请参阅以下资源：
+  **Amazon DynamoDB**：*DynamoDB 常见问题*中的[什么是 DynamoDB 的一致性模型？](https://aws.amazon.com/dynamodb/faqs/)，以及**《Amazon DynamoDB 开发人员指南》中的[读取一致性](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html)。
+  **亚马逊 EC2**：《*亚马逊弹性计算云 API 参考*》中的[最终一致](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/query-api-troubleshooting.html#eventual-consistency)性。
+  **亚马逊 EMR**：在*AWS 大*数据博客中[使用 Amazon S3 和 Amazon Elastic MapReduce 处理 ETL 工作流程时确保一致](https://aws.amazon.com/blogs/big-data/ensuring-consistency-when-using-amazon-s3-and-amazon-elastic-mapreduce-for-etl-workflows/)性。
+  **AWS Identity and Access Management (IAM)**：[我所做的更改并不总是立即显示](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency)在 *IAM 用户指南*中。
+  **Amazon Redshift**：**《Amazon Redshift 数据库开发人员指南》中的[管理数据一致性](https://docs.aws.amazon.com/redshift/latest/dg/managing-data-consistency.html)。
+  **Amazon S3**：**《Amazon Simple Storage Service 用户指南》中的 [Amazon S3 数据一致性模型](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#ConsistencyModel)。

# 使用 Amazon CloudTrail 日志监控 CloudWatch 日志文件
<a name="monitor-cloudtrail-log-files-with-cloudwatch-logs"></a>

您可以使用 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 从中监控、存储和访问您的日志文件 CloudTrail。

CloudWatch 日志使您能够将来自所有系统、应用程序和您 AWS 服务 使用的日志集中到一个高度可扩展的单一服务中。然后，您可以轻松查看它们，在它们中搜索特定的错误代码或模式，根据特定字段对其进行筛选，或者将其安全地存档以备将来分析。 CloudWatch 日志使您可以将所有日志（无论其来源如何）视为按时间排序的单一且一致的事件流。

完成以下步骤， CloudTrail 使用 CloudWatch 日志进行配置，以监控您的跟踪日志，并在发生特定活动时收到通知。

1. 配置您的跟踪以将日志事件发送到 CloudWatch 日志。

1. 定义 CloudWatch 日志指标筛选器，以评估日志事件中是否存在术语、短语或值的匹配项。例如，您可以监控 `ConsoleLogin` 事件。

1. 为 CloudWatch 指标筛选器分配指标。

1. 创建根据您指定的阈值和时间段触发的 CloudWatch 警报。您可以配置警报，以在触发警报时发送通知，使您可以执行操作。

1. 您也可以配置 CloudWatch 为自动执行操作以响应警报。

Amazon CloudWatch 和 Amazon CloudWatch Logs 的标准定价适用。有关更多信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

有关您可以将跟踪配置为向 CloudWatch 日志发送日志的区域的更多信息，请参阅*AWS 一般参考*中的 [Amazon CloudWatch Logs 区域和配额](https://docs.aws.amazon.com/general/latest/gr/cwl_region.html)。

**Topics**
+ [

# 将事件发送到 CloudWatch 日志
](send-cloudtrail-events-to-cloudwatch-logs.md)
+ [

# 为 CloudTrail 事件创建 CloudWatch 警报：示例
](cloudwatch-alarms-for-cloudtrail.md)
+ [

# 停止 CloudTrail 向 CloudWatch 日志发送事件
](stop-cloudtrail-from-sending-events-to-cloudwatch-logs.md)
+ [

# CloudWatch 的日志组和日志流命名 CloudTrail
](cloudwatch-log-group-log-stream-naming-for-cloudtrail.md)
+ [

# 使用 CloudWatch 日志 CloudTrail 进行监控的角色策略文档
](cloudtrail-required-policy-for-cloudwatch-logs.md)

# 将事件发送到 CloudWatch 日志
<a name="send-cloudtrail-events-to-cloudwatch-logs"></a>

当您将跟踪配置为向 CloudWatch Logs 发送事件时，仅 CloudTrail 发送与您的跟踪设置相匹配的事件。例如，如果您将跟踪配置为仅记录数据事件，则您的跟踪仅将数据事件发送到您的 CloudWatch 日志日志组。 CloudTrail 支持向 CloudWatch 日志发送数据、见解和管理事件。有关更多信息，请参阅 [处理 CloudTrail 日志文件](cloudtrail-working-with-log-files.md)。

**注意**  
只有管理账户才能使用控制台为组织跟踪配置 CloudWatch 日志组。授权的管理员可以使用 AWS CLI 或 CloudTrail `CreateTrail`或 `UpdateTrail` API 操作配置 CloudWatch 日志组。

要将事件发送到 CloudWatch 日志日志组，请执行以下操作：
+ 请确保您有足够的权限来创建或指定 IAM 角色。有关更多信息，请参阅 [授予在 CloudTrail 控制台上查看和配置 Amazon CloudWatch 日志信息的权限](security_iam_id-based-policy-examples.md#grant-cloudwatch-permissions-for-cloudtrail-users)。
+ 如果您使用配置 CloudWatch 日志日志组 AWS CLI，请确保您有足够的权限在您指定的 CloudWatch 日志组中创建日志日志流并将 CloudTrail 事件传送到该日志流。有关更多信息，请参阅 [创建策略文档](#send-cloudtrail-events-to-cloudwatch-logs-cli-create-policy-document)。
+ 创建新的跟踪或指定现有的跟踪。有关更多信息，请参阅 [使用控制台创建和更新跟踪](cloudtrail-create-and-update-a-trail-by-using-the-console.md)。
+ 创建一个日志组或指定一个现有日志组。
+ 指定 IAM 角色。如果您要修改用于组织跟踪的现有 IAM 角色，则必须手动更新策略，以允许组织跟踪的日志记录。有关更多信息，请参阅[此策略示例](#policy-cwl-org)和[为组织创建跟踪](creating-trail-organization.md)。
+ 附加一个角色策略或者使用默认角色策略。

**Contents**
+ [

## 使用控制台配置 CloudWatch 日志监控
](#send-cloudtrail-events-to-cloudwatch-logs-console)
  + [

### 创建一个日志组或指定一个现有日志组
](#send-cloudtrail-events-to-cloudwatch-logs-console-create-log-group)
  + [

### 指定 IAM 角色
](#send-cloudtrail-events-to-cloudwatch-logs-console-create-role)
  + [

### 在 CloudWatch 控制台中查看事件
](#viewing-events-in-cloudwatch)
+ [

## 使用配置 CloudWatch 日志监控 AWS CLI
](#send-cloudtrail-events-to-cloudwatch-logs-cli)
  + [

### 创建日志组
](#send-cloudtrail-events-to-cloudwatch-logs-cli-create-log-group)
  + [

### 创建角色
](#send-cloudtrail-events-to-cloudwatch-logs-cli-create-role)
  + [

### 创建策略文档
](#send-cloudtrail-events-to-cloudwatch-logs-cli-create-policy-document)
  + [

### 更新跟踪
](#send-cloudtrail-events-to-cloudwatch-logs-cli-update-trail)
+ [

## 限制
](#send-cloudtrail-events-to-cloudwatch-logs-limitations)

## 使用控制台配置 CloudWatch 日志监控
<a name="send-cloudtrail-events-to-cloudwatch-logs-console"></a>

您可以使用来配置您的跟踪 AWS 管理控制台 ，以便将事件发送到 CloudWatch 日志进行监控。

### 创建一个日志组或指定一个现有日志组
<a name="send-cloudtrail-events-to-cloudwatch-logs-console-create-log-group"></a>

CloudTrail 使用 CloudWatch 日志日志组作为日志事件的传输终端节点。可创建一个日志组或者指定一个现有日志组。

**为现有跟踪创建或指定日志组**

1. 请务必使用具有足够权限的管理用户或角色登录，以配置 CloudWatch 日志集成。有关更多信息，请参阅 [授予在 CloudTrail 控制台上查看和配置 Amazon CloudWatch 日志信息的权限](security_iam_id-based-policy-examples.md#grant-cloudwatch-permissions-for-cloudtrail-users)。
**注意**  
只有管理账户才能使用控制台为组织跟踪配置 CloudWatch 日志组。授权的管理员可以使用 AWS CLI 或 CloudTrail `CreateTrail`或 `UpdateTrail` API 操作配置 CloudWatch 日志组。

1. 打开 CloudTrail 控制台，网址为[https://console.aws.amazon.com/cloudtrail/](https://console.aws.amazon.com/cloudtrail/)。

1. 选择跟踪名称。如果您选择多区域跟踪，则将重定向到创建该跟踪的区域。可以在跟踪所在的区域创建一个日志组或者选择一个现有日志组。
**注意**  
多区域跟踪会将您中所有已启用区域的日志文件发送 AWS 账户 到您指定的 CloudWatch 日志日志组。

1. 在**CloudWatch 日志**中，选择**编辑**。

1. 对于**CloudWatch 日志**，选择**启用**。

1. 在**日志组名称**下，选择**新建**创建新的日志组，或选择**现有**使用现有的日志组。如果选择 “**新建**”，则会为您 CloudTrail 指定新日志组的名称，也可以键入名称。有关命名的更多信息，请参阅 [CloudWatch 的日志组和日志流命名 CloudTrail](cloudwatch-log-group-log-stream-naming-for-cloudtrail.md)。

1. 如果选择**现有**，则从下拉列表中选择一个日志组。

1. 对于**角色名称**，选择**新建**以创建新的 IAM 角色，以获得向日志发送 CloudWatch 日志的权限。选择**现有**以从下拉列表中选择一个现有 IAM 角色。展开**策略文档**时，将显示新角色或现有角色的策略语句。有关该角色的更多信息，请参阅[使用 CloudWatch 日志 CloudTrail 进行监控的角色策略文档](cloudtrail-required-policy-for-cloudwatch-logs.md)。
**注意**  
在您配置跟踪时，可以选择属于另一个账户的 S3 存储桶和 SNS 主题。但是，如果 CloudTrail 要将事件传送到 CloudWatch 日志日志组，则必须选择当前账户中存在的日志组。

1. 选择**保存更改**。

### 指定 IAM 角色
<a name="send-cloudtrail-events-to-cloudwatch-logs-console-create-role"></a>

您可以指定一个角色 CloudTrail 来代入将事件传送到日志流。

**指定角色**

1. 默认情况下，系统将为您指定 `CloudTrail_CloudWatchLogs_Role`。默认角色策略具有在您指定的 CloudWatch 日志组中创建日志日志流并将 CloudTrail 事件传送到该日志流所需的权限。
**注意**  
如果要将此角色用于组织跟踪的日志组，则必须在创建角色后手动修改策略。有关更多信息，请参阅[此策略示例](#policy-cwl-org)和[为组织创建跟踪](creating-trail-organization.md)。

   1. 要验证角色，请转到 AWS Identity and Access Management 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

   1. 选择 “**角色**”，然后选择 **CloudTrail\$1 CloudWatchLogs \$1Rol** e。

   1. 在**权限**选项卡中，展开策略查看其内容。

1. 您可以指定其他角色，但是如果要使用该角色向 CloudWatch 日志发送事件，则必须将所需的角色策略附加到现有角色。有关更多信息，请参阅 [使用 CloudWatch 日志 CloudTrail 进行监控的角色策略文档](cloudtrail-required-policy-for-cloudwatch-logs.md)。



### 在 CloudWatch 控制台中查看事件
<a name="viewing-events-in-cloudwatch"></a>

将跟踪配置为将事件发送到 CloudWatch 日志日志组后，您可以在 CloudWatch 控制台中查看事件。 CloudTrail 通常在 API 调用后的平均大约 5 分钟内将事件传送到您的日志组。此时间并不能得到保证。有关更多信息，请参阅 [AWS CloudTrail 服务等级协议](https://aws.amazon.com/cloudtrail/sla)。

**在 CloudWatch 控制台中查看事件**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在左侧导航窗格中，从**日志**下选择**日志组**。

1. 选择为您的跟踪指定的日志组。

1. 选择要查看的日志流。

1. 要查看您的跟踪记录的事件的详细信息，请选择一个事件。

**注意**  
 CloudWatch 控制台中的**时间 (UTC)** 列显示事件何时传送到您的日志组。要查看记录事件的实际时间 CloudTrail，请参阅字`eventTime`段。

## 使用配置 CloudWatch 日志监控 AWS CLI
<a name="send-cloudtrail-events-to-cloudwatch-logs-cli"></a>

您可以使用配置 AWS CLI 将事件发送 CloudTrail 到 CloudWatch 日志进行监控。

### 创建日志组
<a name="send-cloudtrail-events-to-cloudwatch-logs-cli-create-log-group"></a>

1. 如果您没有现有的日志组，请使用 Logs `create-log-group` 命令创建一个 CloudWatch 日志日志组作为日志事件的传输终端节点。 CloudWatch 

   ```
   aws logs create-log-group --log-group-name name
   ```

   下面的示例创建一个名为 `CloudTrail/logs` 的日志组：

   ```
   aws logs create-log-group --log-group-name CloudTrail/logs
   ```

1. 检索日志组 Amazon 资源名称（ARN）。

   ```
   aws logs describe-log-groups
   ```

### 创建角色
<a name="send-cloudtrail-events-to-cloudwatch-logs-cli-create-role"></a>

为其创建一个角色 CloudTrail ，使其能够将事件发送到 CloudWatch 日志日志组。IAM `create-role` 命令接受两个参数：角色名称和代入角色策略文档（JSON 格式）的文件路径。您使用的策略文档`AssumeRole`授予权限 CloudTrail。`create-role` 命令可创建具有所需权限的角色。

要创建包含此策略文档的 JSON 文件，请打开文本编辑器并将以下策略内容保存到名为 `assume_role_policy_document.json` 的文件中。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

运行以下命令来创建具有`AssumeRole`权限的角色 CloudTrail。

```
aws iam create-role --role-name role_name --assume-role-policy-document file://<path to assume_role_policy_document>.json
```

待命令完成后，记下输出中的角色 ARN。

### 创建策略文档
<a name="send-cloudtrail-events-to-cloudwatch-logs-cli-create-policy-document"></a>

为创建以下角色策略文档 CloudTrail。本文档授予 CloudTrail 在您指定的 CloudWatch 日志组中创建日志日志流以及向该日志流传送 CloudTrail 事件所需的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailCreateLogStream2014110",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:111111111111:log-group:log_group_name:log-stream:111111111111_CloudTrail_us-east-1*"
            ]
        },
        {
            "Sid": "AWSCloudTrailPutLogEvents20141101",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:111111111111:log-group:log_group_name:log-stream:111111111111_CloudTrail_us-east-1*"
            ]
        }
    ]
}
```

------

将此策略文档保存到名为 `role-policy-document.json` 的文件中。<a name="policy-cwl-org"></a>

如果您要创建可能用于组织跟踪记录的策略，则需要对其进行稍微不同的配置。例如，以下策略授予 CloudTrail 在您指定的日志组中创建 CloudWatch 日志日志流以及向该日志流传送 CloudTrail 事件所需的权限，这些跟踪包括账户 111111111111 中的两个跟踪和在 111111111111 AWS 账户中创建的组织跟踪，这些跟踪应用于 ID 为的组织： AWS Organizations *o-exampleorgid*

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailCreateLogStream20141101",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111111:log-group:CloudTrail/DefaultLogGroupTest:log-stream:111111111111_CloudTrail_us-east-2*",
                "arn:aws:logs:us-east-2:111111111111:log-group:CloudTrail/DefaultLogGroupTest:log-stream:o-aa111bb222_*"
            ]
        },
        {
            "Sid": "AWSCloudTrailPutLogEvents20141101",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111111:log-group:CloudTrail/DefaultLogGroupTest:log-stream:111111111111_CloudTrail_us-east-2*",             
                "arn:aws:logs:us-east-2:111111111111:log-group:CloudTrail/DefaultLogGroupTest:log-stream:o-aa111bb222_*"
            ]
        }
    ]
}
```

------

有关组织跟踪记录的更多信息，请参阅[为组织创建跟踪](creating-trail-organization.md)。

运行以下命令以将策略应用于角色。

```
aws iam put-role-policy --role-name role_name --policy-name cloudtrail-policy --policy-document file://<path to role-policy-document>.json
```

### 更新跟踪
<a name="send-cloudtrail-events-to-cloudwatch-logs-cli-update-trail"></a>

使用 CloudTrail`update-trail`命令使用日志组和角色信息更新跟踪。

```
aws cloudtrail update-trail --name trail_name --cloud-watch-logs-log-group-arn log_group_arn --cloud-watch-logs-role-arn role_arn
```

有关 AWS CLI 命令的更多信息，请参阅《[AWS CloudTrail 命令行参考](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/)》。

## 限制
<a name="send-cloudtrail-events-to-cloudwatch-logs-limitations"></a>

CloudWatch 日志和 EventBridge 每个日志[允许的最大事件大小为 256 KB](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html)。尽管大多数服务事件的最大大小为 256 KB，但有些服务的事件仍然更大。 CloudTrail 不会将这些事件发送到 CloudWatch 日志或 EventBridge。

从 CloudTrail 事件版本 1.05 开始，事件的最大大小为 256 KB。这是为了帮助防止恶意行为者利用这些漏洞，并允许其他 AWS 服务（例如 L CloudWatch ogs 和）使用事件 EventBridge。

# 为 CloudTrail 事件创建 CloudWatch 警报：示例
<a name="cloudwatch-alarms-for-cloudtrail"></a>

本主题介绍如何为 CloudTrail 事件配置警报，并包括示例。

**Topics**
+ [

## 先决条件
](#cloudwatch-alarms-prerequisites)
+ [

## 创建指标筛选条件，并创建警报
](#cloudwatch-alarms-metric-filter-alarm)
+ [

## 示例安全组配置更改
](#cloudwatch-alarms-for-cloudtrail-security-group)
+ [

## 登录失 AWS 管理控制台 败示例
](#cloudwatch-alarms-for-cloudtrail-signin)
+ [

## 示例：IAM policy 更改
](#cloudwatch-alarms-for-cloudtrail-iam-policy-changes)
+ [

## 为 CloudWatch 日志警报配置通知
](#cloudtrail-configure-notifications-for-cloudwatch-logs-alarms)

## 先决条件
<a name="cloudwatch-alarms-prerequisites"></a>

在使用本主题中的示例前，您必须：
+ 使用 控制台或 CLI 创建一个跟踪。
+ 创建日志组，您可以在创建跟踪时执行此操作。有关创建跟踪的更多信息，请参阅[使用 CloudTrail 控制台创建跟踪](cloudtrail-create-a-trail-using-the-console-first-time.md)。
+ 指定或创建一个 IAM 角色， CloudTrail 该角色授予在您指定的CloudWatch 日志组中创建日志日志流以及向该日志流传送 CloudTrail 事件的权限。默认的 `CloudTrail_CloudWatchLogs_Role` 将为您执行此操作。

有关更多信息，请参阅 [将事件发送到 CloudWatch 日志](send-cloudtrail-events-to-cloudwatch-logs.md)。本节中的示例在 Amazon CloudWatch Logs 控制台中执行。有关如何创建指标筛选条件和警报的更多信息，请参阅亚马逊* CloudWatch 用户指南中的[使用筛选条件从日志事件创建指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html)和使用亚马逊 CloudWatch *[警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。

## 创建指标筛选条件，并创建警报
<a name="cloudwatch-alarms-metric-filter-alarm"></a>

要创建警报，您必须首先创建指标筛选条件，然后根据该筛选条件配置警报。会针对所有示例显示这些过程。有关指标筛选器语法和 CloudTrail 日志事件模式的更多信息，请参阅 A *mazon Log CloudWatch s 用户*指南中[筛选和模式语法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html)的 JSON 相关部分。

## 示例安全组配置更改
<a name="cloudwatch-alarms-for-cloudtrail-security-group"></a>

按照此过程创建 Amazon CloudWatch 警报，当安全组发生配置更改时触发该警报。

### 创建指标筛选条件
<a name="cloudwatch-alarms-for-cloudtrail-security-group-metric-filter"></a>

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在导航窗格中，从**日志**下选择**日志组**。

1. 在日志组列表中，选择为跟踪创建的日志组。

1. 从**指标筛选条件**或**操作**菜单中选择**创建指标筛选条件**。

1. 在 **Define pattern**（定义模式）页面上的 **Create filter pattern**（创建筛选条件模式）中，为 **Filter pattern**（筛选条件模式）输入以下内容。

   ```
   { ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup) }
   ```

1. 在 **Test pattern**（测试模式）中，保留默认值。选择**下一步**。

1. 在**分配指标**页面上，为**筛选条件名称**输入 **SecurityGroupEvents**。

1. 在**指标详细信息**中，开启**新建**，然后在**指标命名空间**中输入 **CloudTrailMetrics**。

1. 对于**指标名称**，键入 **SecurityGroupEventCount**。

1. 对于**指标值**，键入 **1**。

1. 将 **Default value**（默认值）留空。

1. 选择**下一步**。

1. 在 **Review and create**（审核和重建）页面上，审核您的选择。选择 **Create metric filter**（创建指标筛选条件）以创建筛选条件，或选择 **Edit**（编辑）返回并更改值。

### 创建警报
<a name="cloudwatch-alarms-for-cloudtrail-security-group-create-alarm"></a>

创建指标筛选器后，将打开您的 CloudTrail 跟踪 CloudWatch 日志组的日志日志组详细信息页面。按照此程序创建警报。

1. 在 **Metric filters**（指标筛选条件）选项卡上，找到您在 [创建指标筛选条件](#cloudwatch-alarms-for-cloudtrail-security-group-metric-filter) 中创建的指标筛选条件。填充指标筛选条件的复选框。在 **Metric filters**（指标筛选条件）栏中，选择 **Create alarm**（创建警报）。

1. 在**指定指标和条件**字段中输入以下内容。

   1. 对于 **Graph**（图表），根据您在创建警报时所做的其他设置，该行设置为 **1**。

   1. 对于 **Metric name**（指标名称），请保留当前指标名称 **SecurityGroupEventCount**。

   1. 对于 **Statistic**（统计数据），请保留默认值 **Sum**。

   1. 对于 **Period**（期限），请保留默认值 **5 minutes**。

   1. 在 **Conditions**（条件）中，对于 **Threshold type**（阈值类型），选择 **Static**（静态）。

   1. 对于 “**无论何时*metric\$1name*是**”，选择 “**大于/** 等于”。

   1. 为阈值输入 **1**。

   1. 在 **Additional configuration**（其他配置）中，保留默认值。选择**下一步**。

1. 在 “**配置操作**” 页面上，选择 “**通知**”，然后选择 “**警报**”，这表示当超过 5 分钟内 1 个更改事件的阈值并**SecurityGroupEventCount**处于警报状态时，将采取行动。

   1. 对于**向以下 SNS 主题发送通知**，选择**新建主题**。

   1. 输入 **SecurityGroupChanges\$1CloudWatch\$1Alarms\$1Topic** 作为 Amazon SNS 新主题的名称。

   1. 在**将接收通知的电子邮件端点**中，输入您希望在触发此警报时接收通知的用户的电子邮件地址。用逗号分隔电子邮件地址。

      每位电子邮件收件人会收到电子邮件，要求他们确认他们想要订阅 Amazon SNS 主题。

   1. 选择**创建主题**。

1. 对于此示例，跳过其他操作类型。选择**下一步**。

1. 在 **Add name and description**（添加名称和描述）页面上，输入警报的易识别名称以及描述。在此示例中，请输入 **Security group configuration changes** 作为名称，**Raises alarms if security group configuration changes occur** 作为说明。选择**下一步**。

1. 在 **Preview and create**（预览和重建）页面上，审核您的选择。选择 **Edit**（编辑）以进行更改，或选择 **Create alarm**（创建警报）以创建警报。

   创建警报后， CloudWatch 打开 “**警报**” 页面。在有关 SNS 主题的所有电子邮件收件人都确认他们想要订阅 SNS 通知之前，警报的 **Actions**（操作）列一直显示 **Pending confirmation**（待确认）。

## 登录失 AWS 管理控制台 败示例
<a name="cloudwatch-alarms-for-cloudtrail-signin"></a>

按照此过程创建 Amazon CloudWatch 警报，该警报将在五分钟内出现三次或更多 AWS 管理控制台 登录失败时触发。

### 创建指标筛选条件
<a name="cloudwatch-alarms-for-cloudtrail-signin-metric-filter"></a>

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在导航窗格中，从**日志**下选择**日志组**。

1. 在日志组列表中，选择为跟踪创建的日志组。

1. 从**指标筛选条件**或**操作**菜单中选择**创建指标筛选条件**。

1. 在 **Define pattern**（定义模式）页面上的 **Create filter pattern**（创建筛选条件模式）中，为 **Filter pattern**（筛选条件模式）输入以下内容。

   ```
   { ($.eventName = ConsoleLogin) && ($.errorMessage = "Failed authentication") }
   ```

1. 在 **Test pattern**（测试模式）中，保留默认值。选择**下一步**。

1. 在**分配指标**页面上，为**筛选条件名称**输入 **ConsoleSignInFailures**。

1. 在**指标详细信息**中，开启**新建**，然后在**指标命名空间**中输入 **CloudTrailMetrics**。

1. 对于**指标名称**，键入 **ConsoleSigninFailureCount**。

1. 对于**指标值**，键入 **1**。

1. 将 **Default value**（默认值）留空。

1. 选择**下一步**。

1. 在 **Review and create**（审核和重建）页面上，审核您的选择。选择 **Create metric filter**（创建指标筛选条件）以创建筛选条件，或选择 **Edit**（编辑）返回并更改值。

### 创建警报
<a name="cloudwatch-alarms-for-cloudtrail-signin-create-alarm"></a>

创建指标筛选器后，将打开您的 CloudTrail跟踪 CloudWatch 日志组的日志日志组详细信息页面。按照此程序创建警报。

1. 在 **Metric filters**（指标筛选条件）选项卡上，找到您在 [创建指标筛选条件](#cloudwatch-alarms-for-cloudtrail-signin-metric-filter) 中创建的指标筛选条件。填充指标筛选条件的复选框。在 **Metric filters**（指标筛选条件）栏中，选择 **Create alarm**（创建警报）。

1. 在 **Create Alarm**（创建警报）页面上的 **Specify metric and conditions**（指定指标和条件）中，输入以下内容：

   1. 对于 **Graph**（图表），根据您在创建警报时所做的其他设置，该行设置为 **3**。

   1. 对于 **Metric name**（指标名称），请保留当前指标名称 **ConsoleSigninFailureCount**。

   1. 对于 **Statistic**（统计数据），请保留默认值 **Sum**。

   1. 对于 **Period**（期限），请保留默认值 **5 minutes**。

   1. 在 **Conditions**（条件）中，对于 **Threshold type**（阈值类型），选择 **Static**（静态）。

   1. 对于 “**无论何时*metric\$1name*是**”，选择 “**大于/** 等于”。

   1. 为阈值输入 **3**。

   1. 在 **Additional configuration**（其他配置）中，保留默认值。选择**下一步**。

1. 在 “**配置操作**” 页面上，在 “**通知**” **中选择 “警报**”，这表示当超过 5 分钟内 3 个更改事件的阈值并**ConsoleSigninFailureCount**处于警报状态时，将采取该操作。

   1. 对于**向以下 SNS 主题发送通知**，选择**新建主题**。

   1. 输入 **ConsoleSignInFailures\$1CloudWatch\$1Alarms\$1Topic** 作为 Amazon SNS 新主题的名称。

   1. 在**将接收通知的电子邮件端点**中，输入您希望在触发此警报时接收通知的用户的电子邮件地址。用逗号分隔电子邮件地址。

      每位电子邮件收件人会收到电子邮件，要求他们确认他们想要订阅 Amazon SNS 主题。

   1. 选择**创建主题**。

1. 对于此示例，跳过其他操作类型。选择**下一步**。

1. 在 **Add name and description**（添加名称和描述）页面上，输入警报的易识别名称以及描述。在此示例中，请输入 **Console sign-in failures** 作为名称，**Raises alarms if more than 3 console sign-in failures occur in 5 minutes** 作为说明。选择**下一步**。

1. 在 **Preview and create**（预览和重建）页面上，审核您的选择。选择 **Edit**（编辑）以进行更改，或选择 **Create alarm**（创建警报）以创建警报。

   创建警报后， CloudWatch 打开 “**警报**” 页面。在有关 SNS 主题的所有电子邮件收件人都确认他们想要订阅 SNS 通知之前，警报的 **Actions**（操作）列一直显示 **Pending confirmation**（待确认）。

## 示例：IAM policy 更改
<a name="cloudwatch-alarms-for-cloudtrail-iam-policy-changes"></a>

按照此过程创建 Amazon CloudWatch 警报，该警报将在调用 API 以更改 IAM 策略时触发。

### 创建指标筛选条件
<a name="cloudwatch-alarms-for-cloudtrail-iam-policy-changes-metric-filter"></a>

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在导航窗格中，选择**日志**。

1. 在日志组列表中，选择为跟踪创建的日志组。

1. 选择 **Actions**（操作），然后选择 **Create metric filter**（创建指标筛选条件）。

1. 在 **Define pattern**（定义模式）页面上的 **Create filter pattern**（创建筛选条件模式）中，为 **Filter pattern**（筛选条件模式）输入以下内容。

   ```
   {($.eventName=DeleteGroupPolicy)||($.eventName=DeleteRolePolicy)||($.eventName=DeleteUserPolicy)||($.eventName=PutGroupPolicy)||($.eventName=PutRolePolicy)||($.eventName=PutUserPolicy)||($.eventName=CreatePolicy)||($.eventName=DeletePolicy)||($.eventName=CreatePolicyVersion)||($.eventName=DeletePolicyVersion)||($.eventName=AttachRolePolicy)||($.eventName=DetachRolePolicy)||($.eventName=AttachUserPolicy)||($.eventName=DetachUserPolicy)||($.eventName=AttachGroupPolicy)||($.eventName=DetachGroupPolicy)}
   ```

1. 在 **Test pattern**（测试模式）中，保留默认值。选择**下一步**。

1. 在**分配指标**页面上，为**筛选条件名称**输入 **IAMPolicyChanges**。

1. 在**指标详细信息**中，开启**新建**，然后在**指标命名空间**中输入 **CloudTrailMetrics**。

1. 对于**指标名称**，键入 **IAMPolicyEventCount**。

1. 对于**指标值**，键入 **1**。

1. 将 **Default value**（默认值）留空。

1. 选择**下一步**。

1. 在 **Review and create**（审核和重建）页面上，审核您的选择。选择 **Create metric filter**（创建指标筛选条件）以创建筛选条件，或选择 **Edit**（编辑）返回并更改值。

### 创建警报
<a name="cloudwatch-alarms-for-cloudtrail-iam-policy-changes-create-alarm"></a>

创建指标筛选器后，将打开您的 CloudTrail跟踪 CloudWatch 日志组的日志日志组详细信息页面。按照此程序创建警报。

1. 在 **Metric filters**（指标筛选条件）选项卡上，找到您在 [创建指标筛选条件](#cloudwatch-alarms-for-cloudtrail-iam-policy-changes-metric-filter) 中创建的指标筛选条件。填充指标筛选条件的复选框。在 **Metric filters**（指标筛选条件）栏中，选择 **Create alarm**（创建警报）。

1. 在 **Create Alarm**（创建警报）页面上的 **Specify metric and conditions**（指定指标和条件）中，输入以下内容：

   1. 对于 **Graph**（图表），根据您在创建警报时所做的其他设置，该行设置为 **1**。

   1. 对于 **Metric name**（指标名称），请保留当前指标名称 **IAMPolicyEventCount**。

   1. 对于 **Statistic**（统计数据），请保留默认值 **Sum**。

   1. 对于 **Period**（期限），请保留默认值 **5 minutes**。

   1. 在 **Conditions**（条件）中，对于 **Threshold type**（阈值类型），选择 **Static**（静态）。

   1. 对于 “**无论何时*metric\$1name*是**”，选择 “**大于/** 等于”。

   1. 为阈值输入 **1**。

   1. 在 **Additional configuration**（其他配置）中，保留默认值。选择**下一步**。

1. 在 “**配置操作**” 页面上，在 “**通知**” **中选择 “警报**”，这表示当超过 5 分钟内 1 个更改事件的阈值并**IAMPolicyEventCount**处于警报状态时，将采取该操作。

   1. 对于**向以下 SNS 主题发送通知**，选择**新建主题**。

   1. 输入 **IAM\$1Policy\$1Changes\$1CloudWatch\$1Alarms\$1Topic** 作为 Amazon SNS 新主题的名称。

   1. 在**将接收通知的电子邮件端点**中，输入您希望在触发此警报时接收通知的用户的电子邮件地址。用逗号分隔电子邮件地址。

      每位电子邮件收件人会收到电子邮件，要求他们确认他们想要订阅 Amazon SNS 主题。

   1. 选择**创建主题**。

1. 对于此示例，跳过其他操作类型。选择**下一步**。

1. 在 **Add name and description**（添加名称和描述）页面上，输入警报的易识别名称以及描述。在此示例中，请输入 **IAM Policy Changes** 作为名称，**Raises alarms if IAM policy changes occur** 作为说明。选择**下一步**。

1. 在 **Preview and create**（预览和重建）页面上，审核您的选择。选择 **Edit**（编辑）以进行更改，或选择 **Create alarm**（创建警报）以创建警报。

   创建警报后， CloudWatch 打开 “**警报**” 页面。在有关 SNS 主题的所有电子邮件收件人都确认他们想要订阅 SNS 通知之前，警报的 **Actions**（操作）列一直显示 **Pending confirmation**（待确认）。

## 为 CloudWatch 日志警报配置通知
<a name="cloudtrail-configure-notifications-for-cloudwatch-logs-alarms"></a>

您可以将 CloudWatch 日志配置为在触发警报时发送通知 CloudTrail。这样，您就可以对事件中捕获并由 CloudWatch 日志检测到的关键操作 CloudTrail事件做出快速响应。 CloudWatch 使用亚马逊简单通知服务 (SNS) Simple Notification Service 发送电子邮件。有关更多信息，请参阅*CloudWatch 用户*指南中的[设置 Amazon SNS 通知](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Notify_Users_Alarm_Changes.html#US_SetupSNS)。

# 停止 CloudTrail 向 CloudWatch 日志发送事件
<a name="stop-cloudtrail-from-sending-events-to-cloudwatch-logs"></a>

您可以通过更新跟踪以禁用 CloudWatch CloudWatch 日志设置来停止向 Amazon Logs 发送 AWS CloudTrail 事件。

## 停止向 CloudWatch 日志发送事件（控制台）
<a name="stop-cloudtrail-from-sending-events-to-cloudwatch-logs-console"></a>



**停止向 CloudWatch 日志发送 CloudTrail 事件**

1. 登录 AWS 管理控制台 并打开 CloudTrail 控制台，网址为[https://console.aws.amazon.com/cloudtrail/](https://console.aws.amazon.com/cloudtrail/)。

1. 在导航窗格中，选择**跟踪**。

1. 选择要禁用 CloudWatch 日志集成的跟踪的名称。

1. 在**CloudWatch 日志**中，选择**编辑**。

1. 取消选中**启用**复选框。

1. 选择**保存更改**。

## 停止向 CloudWatch 日志发送事件 (CLI)
<a name="stop-cloudtrail-from-sending-events-to-cloudwatch-logs-cli"></a>

您可以通过运行[**update-trail**](cloudtrail-create-and-update-a-trail-by-using-the-aws-cli-update-trail.md)命令来移除作为传输终端节点的 CloudWatch 日志组。以下命令将日志组 ARN 和日志角色 ARN 的值替换为空值，从而从跟踪配置中清除日志组 CloudWatch 和角色 ARN。

```
aws cloudtrail update-trail --name trail_name --cloud-watch-logs-log-group-arn="" --cloud-watch-logs-role-arn=""
```

# CloudWatch 的日志组和日志流命名 CloudTrail
<a name="cloudwatch-log-group-log-stream-naming-for-cloudtrail"></a>

Amazon CloudWatch 会将您为 CloudTrail 事件创建的日志组与您在某个区域中的任何其他日志组一起显示。建议您使用可帮助您轻松地将该日志组与其他日志组区分开的日志组名称。例如 **CloudTrail/logs**。

命名日志组时请遵循以下准则：
+ 日志组名称在 AWS 账户的某个区域内必须是唯一的。
+ 日志组名称的长度可介于 1 和 512 个字符之间。
+ 日志组名称包含以下字符：a-z、A-Z、0-9、“\$1”（下划线）、“-”（连字符）、“/”（正斜杠）、“.”（句点）和“\$1”（井号）。

在为日志组 CloudTrail 创建日志流时，它会根据以下格式命名日志流：*account\$1ID*\$1 CloudTrail \$1 *trail\$1region*。

**注意**  
如果 CloudTrail 日志量很大，则可能会创建多个日志流来将日志数据传送到您的日志组。当有多个日志流时，按以下格式 CloudTrail 命名每个日志流：*account\$1ID*\$1 CloudTrail \$1 *trail\$1region* \$1 *number*。

有关 CloudWatch 日志组的更多信息，请参阅 Amazon [日志*用户指南和 Amazon Lo CloudWatch g* s *API 参考[CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)中的使用 CloudWatch 日志*组和日志流](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)。

# 使用 CloudWatch 日志 CloudTrail 进行监控的角色策略文档
<a name="cloudtrail-required-policy-for-cloudwatch-logs"></a>

本节介绍 CloudTrail 角色向 Log CloudWatch s 发送日志事件所需的权限策略。在配置为发送事件时，可以将策略文档附加 CloudTrail 到角色，如中所述[将事件发送到 CloudWatch 日志](send-cloudtrail-events-to-cloudwatch-logs.md)。您也可以使用 IAM 创建角色。有关更多信息，请参阅[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)或[创建 IAM 角色（AWS CLI）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-cli)。

以下示例策略文档包含在您指定的日志组中创建 CloudWatch 日志流以及将 CloudTrail 事件传送到美国东部（俄亥俄州）地区的日志流所需的权限。（这是适用于默认 IAM 角色 `CloudTrail_CloudWatchLogs_Role` 的默认策略。）

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailCreateLogStream2014110",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111122223333:log-group:log_group_name:log-stream:CloudTrail_log_stream_name_prefix*"
            ]
        },
        {
            "Sid": "AWSCloudTrailPutLogEvents20141101",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111122223333:log-group:log_group_name:log-stream:CloudTrail_log_stream_name_prefix*"
            ]
        }
    ]
}
```

------

如果您要创建可能用于组织跟踪记录的策略，则需要根据为该角色创建的默认策略对其进行修改。例如，以下策略授予 CloudTrail 在您指定为的值的 CloudWatch 日志组中创建日志日志流以及向该日志流传送 CloudTrail事件所需的权限*log\$1group\$1name*，该权限适用于账户 111111111111 中的两个跟踪和在 111111111111 AWS 账户中创建的组织跟踪，这些跟踪应用于组织 ID 为： AWS Organizations *o-exampleorgid*

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailCreateLogStream20141101",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111111:log-group:log_group_name:log-stream:111111111111_CloudTrail_us-east-2*",
                "arn:aws:logs:us-east-2:111111111111:log-group:log_group_name:log-stream:o-exampleorgid_*"
            ]
        },
        {
            "Sid": "AWSCloudTrailPutLogEvents20141101",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111111:log-group:log_group_name:log-stream:111111111111_CloudTrail_us-east-2*",
                "arn:aws:logs:us-east-2:111111111111:log-group:log_group_name:log-stream:o-exampleorgid_*"
            ]
        }
    ]
}
```

------

有关组织跟踪记录的更多信息，请参阅[为组织创建跟踪](creating-trail-organization.md)。

# 接收来自多个账户的 CloudTrail 日志文件
<a name="cloudtrail-receive-logs-from-multiple-accounts"></a>

您可以 AWS 账户 将多个日志文件 CloudTrail 传输到单个 Amazon S3 存储桶中。例如，您有四个 AWS 账户 账户为 IDs 111111111111、222222222222、33333333333333和4444444444444，并且您要配置为将所有四个账户中的日志文件传输到属于账户 11111111111111 的存储桶。 CloudTrail 要完成此操作，请依次完成以下步骤：

1. 在目标存储桶所属的账户（此示例中为 111111111111）中创建跟踪。不要为任何其他账户创建跟踪。

   有关说明，请参阅[使用控制台创建跟踪](cloudtrail-create-a-trail-using-the-console-first-time.md#creating-a-trail-in-the-console)。

1. 更新目标存储桶的存储桶策略，以便向 CloudTrail 授予跨账户权限。

   有关说明，请参阅[设置适用于多个账户的存储桶策略](cloudtrail-set-bucket-policy-for-multiple-accounts.md)。

1. 在要为其记录活动的其他账户（此示例中为 222222222222、333333333333 和 444444444444）中创建跟踪。在每个账户中创建跟踪时，指定属于您在步骤 1 中指定的账户（此示例中为 111111111111）的 Amazon S3 存储桶。有关说明，请参阅[在其他账户中创建跟踪](turn-on-cloudtrail-in-additional-accounts.md)。
**注意**  
如果您选择启用 SSE-KMS 加密，KMS 密钥策略必须 CloudTrail 允许使用该密钥加密您的日志文件和摘要文件，并允许您指定的用户读取未加密形式的日志文件或摘要文件。有关手动编辑密钥政策的信息，请参阅[为以下各项配置 AWS KMS 密钥策略 CloudTrail](create-kms-key-policy-for-cloudtrail.md)。

## 为其他账户调 IDs 用的数据事件编辑存储桶所有者账户
<a name="cloudtrail-receive-logs-s3-owner-id-redaction"></a>

过去，如果在 Amazon S3 CloudTrail 数据事件 API 调用者中启用了数据事件，则会在数据事件中 CloudTrail 显示 S3 存储桶拥有者的账户 ID（例如`PutObject`）。 AWS 账户 即使存储桶拥有者账户没有启用 S3 数据事件，也会出现这种情况。

现在，如果满足以下两个条件，则 CloudTrail 删除`resources`区块中 S3 存储桶所有者的账户 ID：
+ 数据事件 API 调用来自不同 AWS 账户 于 Amazon S3 存储桶拥有者的人。
+ API 调用程序收到了一个仅适用于该调用程序账户的 `AccessDenied` 错误。

在其上面进行 API 调用的资源的拥有者仍收到完整的事件。

以下事件记录片段是一个预期行为的示例。在 `Historic` 片段中，将向不同账户中的 API 调用程序显示 S3 存储桶拥有者的账户 ID 123456789012。在当前行为示例中，不会显示存储桶拥有者的账户 ID。

```
# Historic

"resources": [
    {
        "type": "AWS::S3::Object",
        "ARNPrefix": "arn:aws:s3:::amzn-s3-demo-bucket2/"
    },
    {
        "accountId": "123456789012",
        "type": "AWS::S3::Bucket",
        "ARN": "arn:aws:s3:::amzn-s3-demo-bucket2"
    }
]
```

以下是当前的行为。

```
# Current

"resources": [
    {
        "type": "AWS::S3::Object",
        "ARNPrefix": "arn:aws:s3:::amzn-s3-demo-bucket2/"
    },
    {
        "accountId": "",
        "type": "AWS::S3::Bucket",
        "ARN": "arn:aws:s3:::amzn-s3-demo-bucket2"
    }
]
```

**Topics**
+ [

## 为其他账户调 IDs 用的数据事件编辑存储桶所有者账户
](#cloudtrail-receive-logs-s3-owner-id-redaction)
+ [

# 设置适用于多个账户的存储桶策略
](cloudtrail-set-bucket-policy-for-multiple-accounts.md)
+ [

# 在其他账户中创建跟踪
](turn-on-cloudtrail-in-additional-accounts.md)

# 设置适用于多个账户的存储桶策略
<a name="cloudtrail-set-bucket-policy-for-multiple-accounts"></a>

对于要从多个账户接收日志文件的存储桶，其存储桶策略必须向 CloudTrail 授予从您指定的所有账户写入日志文件的权限。这意味着您必须修改目标存储桶的存储桶策略，以授予从每个指定账户写入日志文件的 CloudTrail 权限。

**注意**  
出于安全原因，未经授权的用户无法创建包含 `AWSLogs/` 作为 `S3KeyPrefix` 参数的跟踪记录。

**修改存储桶权限，以便可以从多个账户接收这些文件**

1.  AWS 管理控制台 使用拥有存储桶的账户（在本示例中为 111111111111）登录，然后打开 Amazon S3 控制台。

1. 选择用于 CloudTrail 传送日志文件的存储桶，然后选择**权限**。

1. 在 **Bucket policy**（存储桶策略）下，选择 **Edit**（编辑）。

1. 修改现有策略以便为要将其日志文件传输到此存储桶的每个额外账户添加一个行。参阅以下示例策略并记下指定另一个账户 ID 的带下划线的 `Resource` 行。作为安全最佳实践，请将 `aws:SourceArn` 条件密钥添加到 Amazon S3 存储桶策略。这有助于防止未经授权访问您的 S3 存储桶。如果您有现有跟踪记录，请务必添加一个或多个条件密钥。
**注意**  
 AWS 账户 ID 是一个十二位数字，包括前导零。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AWSCloudTrailAclCheck20131101",
               "Effect": "Allow",
               "Principal": {
                   "Service": "cloudtrail.amazonaws.com"
               },
               "Action": "s3:GetBucketAcl",
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
               "Condition": {
                   "StringEquals": {
                       "aws:SourceArn": [
                           "arn:aws:cloudtrail:region:111111111111:trail/primaryTrailName",
                           "arn:aws:cloudtrail:region:222222222222:trail/secondaryTrailName"
                       ]
                   }
               }
           },
           {
               "Sid": "AWSCloudTrailWrite20131101",
               "Effect": "Allow",
               "Principal": {
                   "Service": "cloudtrail.amazonaws.com"
               },
               "Action": "s3:PutObject",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/optionalLogFilePrefix/AWSLogs/111111111111/*",
                   "arn:aws:s3:::amzn-s3-demo-bucket/optionalLogFilePrefix/AWSLogs/222222222222/*"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:SourceArn": [
                           "arn:aws:cloudtrail:region:111111111111:trail/primaryTrailName",
                           "arn:aws:cloudtrail:region:222222222222:trail/secondaryTrailName"
                       ],
                       "s3:x-amz-acl": "bucket-owner-full-control"
                   }
               }
           }
       ]
   }
   ```

------

# 在其他账户中创建跟踪
<a name="turn-on-cloudtrail-in-additional-accounts"></a>

您可以使用控制台或创建其他跟踪 AWS 账户 并将其日志文件聚合 AWS CLI 到一个 Amazon S3 存储桶中。或者，您可以创建组织跟踪以记录 AWS 账户 属于组织的所有成员 AWS Organizations。有关更多信息，请参阅 [为组织创建跟踪](creating-trail-organization.md)。

## 使用控制台在其他 AWS 账户中创建跟踪
<a name="turn-on-cloudtrail-in-additional-accounts-console"></a>

您可以使用 CloudTrail 控制台在其他账户中创建跟踪。

1.  AWS 管理控制台 使用您要为其创建跟踪的账户登录。按照 [使用控制台创建跟踪](cloudtrail-create-a-trail-using-the-console-first-time.md#creating-a-trail-in-the-console) 中的步骤，使用控制台创建跟踪。

1. 对于 **Storage location**（存储位置），选择 **Use existing S3 bucket**（使用现有 S3 存储桶）。使用文本框输入您用于跨账户存储日志文件的存储桶的名称。
**注意**  
存储桶策略必须授予对其进行写入的 CloudTrail 权限。有关手动编辑存储桶策略的信息，请参阅[设置适用于多个账户的存储桶策略](cloudtrail-set-bucket-policy-for-multiple-accounts.md)。  
![\[使用现有的 S3 存储桶\]](http://docs.aws.amazon.com/zh_cn/awscloudtrail/latest/userguide/images/cloudtrail-use-existing-bucket.png)

1. 在**前缀**中，输入您用于跨账户存储日志文件的前缀。如果您选择使用与您在存储桶策略中指定的前缀不同的前缀，则必须编辑目标存储桶的存储桶策略， CloudTrail 以允许使用此新前缀将日志文件写入存储桶。

## 使用 CLI 在其他 AWS 账户中创建跟踪
<a name="turn-on-cloudtrail-in-additional-accounts-cli"></a>

您可以使用 AWS 命令行工具在其他账户中创建跟踪，并将其日志文件聚合到一个 Amazon S3 存储桶中。有关这些工具的更多信息，请参阅《*AWS CLI 命令参考*》中的 [cloudtrail](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/)。

使用 **create-trail** 命令创建跟踪，并指定以下内容：
+ `--name` 指定跟踪的名称。
+ `--s3-bucket-name` 指定您用于跨账户存储日志文件的 Amazon S3 存储桶。
+ `--s3-prefix` 指定日志文件传输路径的前缀（可选）。
+ `--is-multi-region-trail`指定此跟踪将记录您所在分区中所有 AWS 区域的事件。

您可以为账户运行 AWS 资源的每个区域创建一个跟踪。

以下示例命令说明如何使用 AWS CLI为您的附加账户创建跟踪。要将这些账户的日志文件传送到您在第一个账户（此示例中为 111111111111）中创建的存储桶，请在 `--s3-bucket-name` 选项中指定存储桶名称。Amazon S3 存储桶名称具有全局唯一性。

```
aws cloudtrail create-trail --name my-trail --s3-bucket-name amzn-s3-demo-bucket --is-multi-region-trail
```

当您运行该命令时，将显示与以下内容类似的输出：

```
{
    "IncludeGlobalServiceEvents": true, 
    "Name": "AWSCloudTrailExample", 
    "TrailARN": "arn:aws:cloudtrail:us-east-2:222222222222:trail/my-trail", 
    "LogFileValidationEnabled": false, 
    "IsMultiRegionTrail": true, 
    "IsOrganizationTrail": false,
    "S3BucketName": "amzn-s3-demo-bucket"
}
```

有关使用 AWS 命令行工具 CloudTrail 的更多信息，请参阅[CloudTrail 命令行参考](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/index.html)。

# 在 AWS 账户之间共享 CloudTrail 日志文件
<a name="cloudtrail-sharing-logs"></a>

本节介绍如何在多个 AWS 账户之间共享 CloudTrail 日志文件。您用于在两者之间共享日志的方法 AWS 账户 取决于您的 S3 存储桶的配置。下面是是共享日志文件的选项：
+ **[强制执行存储桶所有者](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-ownership-existing-bucket.html)** — [S3 对象所有权](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)是 Amazon S3 存储桶级别的设置，可用于控制上传到存储桶的对象的所有权以及禁用或启用访问控制列表 ()。ACLs默认情况下，“对象所有权” 设置为 “**存储桶所有者强制执行**” 设置，并且所有设置 ACLs 均处于禁用状态。禁 ACLs 用后，存储桶拥有者将拥有存储桶中的所有对象，并使用访问管理策略专门管理对数据的访问权限。设置**强制存储桶拥有者**选项后，访问权限将通过存储桶策略进行管理，用户无需代入角色。
+ **[代入角色以共享日志文件](#cloudtrail-sharing-logs-assumerole)**：如果您尚未选择**强制存储桶拥有者**设置，则用户需要代入角色才能访问您的 S3 存储桶中的日志文件。

## 通过代入角色在账户之间共享日志文件
<a name="cloudtrail-sharing-logs-assumerole"></a>

**注意**  
本部分仅适用于未使用**强制存储桶拥有者**设置的 Amazon S3 存储桶。

本节介绍如何 AWS 账户 通过扮演角色在多个 CloudTrail 日志文件之间共享日志文件，并描述共享日志文件的场景。
+ **方案 1**：向生成了已放置到 Amazon S3 存储桶中的日志文件的账户授予只读访问权。
+ **方案 2**：向可以为您分析日志文件的第三方账户授予访问您的 Amazon S3 存储桶中的所有日志文件的权限。

**要授予对 Amazon S3 存储桶中的日志文件的只读访问权**

1. 为您要与之共享日志文件的每个账户[创建一个 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。您必须是管理员才能授予权限。

   创建角色时，请执行以下操作:
   + 选择**其他 AWS 账户** 选项。
   + 输入要授予访问权的账户的 12 位数账户 ID。
   + 如果您希望用户在代入角色之前提供多重验证，请选中 **Require MFA** 框。
   + 选择 **AmazonS3 ReadOnlyAccess** 政策。
**注意**  
默认情况下，**AmazonS3 ReadOnlyAccess** 政策授予您账户中所有 Amazon S3 存储桶的检索和列出权限。

   有关 IAM 角色的权限管理的详细信息，请参阅 IAM 用户指南中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

1. [创建一个访问策略](#cloudtrail-sharing-logs-your-accounts)，该策略向要与之共享日志文件的账户授予只读访问权。

1. 指示每个账户[代入一个角色](#cloudtrail-sharing-logs-assume-role)来检索日志文件。

**要使用第三方账户授予对日志文件的只读访问权**

1. 为您要与之共享日志文件的第三方账户[创建一个 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。您必须是管理员才能授予权限。

   创建角色时，请执行以下操作:
   + 选择**其他 AWS 账户** 选项。
   + 输入要授予访问权的账户的 12 位数账户 ID。
   + 输入外部 ID 以便额外控制可代入角色的用户。有关更多信息，请参阅 *IAM 用户指南*中的[如何在向第三方授予对您的 AWS 资源的访问权限时使用外部 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)。
   + 选择 **AmazonS3 ReadOnlyAccess** 政策。
**注意**  
默认情况下，**AmazonS3 ReadOnlyAccess** 政策授予您账户中所有 Amazon S3 存储桶的检索和列出权限。

1. [创建一个访问策略](#cloudtrail-sharing-logs-third-party)，该策略向要与之共享日志文件的第三方账户授予只读访问权。

1. 指示第三方账户[代入一个角色](#cloudtrail-sharing-logs-assume-role)来检索日志文件。

以下部分介绍了有关这些步骤的更多详细信息。

**Topics**
+ [

### 创建用于向自己的账户授予访问权限的访问策略
](#cloudtrail-sharing-logs-your-accounts)
+ [

### 创建用于向第三方授予访问权限的访问策略
](#cloudtrail-sharing-logs-third-party)
+ [

### 代入角色
](#cloudtrail-sharing-logs-assume-role)
+ [

### 停止在 AWS 账户之间共享 CloudTrail 日志文件
](#cloudtrail-sharing-logs-stop-sharing)

### 创建用于向自己的账户授予访问权限的访问策略
<a name="cloudtrail-sharing-logs-your-accounts"></a>

作为 Amazon S3 存储桶的所有者，您可以完全控制向其 CloudTrail 写入其他账户日志文件的 Amazon S3 存储桶。您想将每个业务部门的日志文件共享回创建它们的业务部门。但您不希望部门能够读取任何其他部门的日志文件。

例如，要与账户 B 而非账户 C 共享账户 B 的日志文件，您必须在您的账户中创建一个新的 IAM 角色，指定账户 B 是受信任的账户。此角色信任策略指定可信任账户 B 来代入由您的账户创建的角色，与以下示例类似。如果使用控制台创建角色，则将自动创建信任策略。如果您使用 SDK 创建角色，则必须将信任策略作为参数提供给 `CreateRole` API。如果您使用 CLI 创建角色，则必须在 `create-role` CLI 命令中指定信任策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

您还必须创建访问策略来指定账户 B 只能从账户 B 将其日志文件写入到的位置进行读取。访问策略将类似于以下内容。请注意，**资源** ARN 包括账户 B 的十二位数账户 ID，以及您在聚合过程中为账户 B 开启时指定的前缀（如果有）。 CloudTrail 有关指定前缀的更多信息，请参阅[在其他账户中创建跟踪](turn-on-cloudtrail-in-additional-accounts.md)。

**重要**  
您必须确保访问策略中的前缀与您在账户 B 开启时指定的前缀完全相同。如果不是，则必须编辑账户中的 IAM 角色访问策略以包含账户 B 的实际前缀。如果角色访问策略中的前缀与您在账户 B CloudTrail 中开启时指定的前缀不完全相同，则账户 B 将无法访问其日志文件。 CloudTrail 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix/AWSLogs/account-B-id/*"
    }, 
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
    }
  ]
}
```

------

对任何其他账户使用上述过程。

在创建每个用户的角色并指定相应的信任和访问策略后，以及在每个账户的管理员向该账户中的 IAM 用户授予访问权后，账户 B 或账户 C 中的 IAM 用户可以编程方式代入角色。

有关更多信息，请参阅 [代入角色](#cloudtrail-sharing-logs-assume-role)。

### 创建用于向第三方授予访问权限的访问策略
<a name="cloudtrail-sharing-logs-third-party"></a>

您必须为第三方账户创建单独的 IAM 角色。在创建角色时， AWS 会自动创建信任关系，以指定将信任第三方账户来代入角色。此角色的访问策略指定了该账户可执行的操作。有关创建角色的更多信息，请参阅[创建 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

例如，由创建的信任关系 AWS 指定第三方账户（本例中为账户 Z）受信任来担任您创建的角色。以下是信任策略的示例：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

如果您在为第三方账户创建角色时指定了外部 ID，则您的访问策略将包含一个添加的 `Condition` 元素，该元素将测试由该账户分配的唯一 ID。此测试在代入角色时执行。以下示例访问策略包含 `Condition` 元素。

有关更多信息，请参阅 *IAM 用户指南*中的[如何在向第三方授予 AWS 资源访问权限时使用外部 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "",
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::111111111111:root"},
        "Action": "sts:AssumeRole",
        "Condition": {"StringEquals": {"sts:ExternalId": "external-ID-issued-by-account-Z"}}
    }]
}
```

------

您还必须为您的账户创建访问策略来指定第三方账户可读取 Amazon S3 存储桶中的所有日志。访问策略应类似于以下示例。`Resource` 值结尾处的通配符（\$1）表示第三方账户可访问已获得相应访问权的 S3 存储桶中的任何日志文件。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
        }
    ]
}
```

------

在为第三方账户创建角色并指定相应的信任关系和访问策略后，第三方账户中的 IAM 用户必须以编程方式代入角色才能读取存储桶中的日志文件。有关更多信息，请参阅 [代入角色](#cloudtrail-sharing-logs-assume-role)。

### 代入角色
<a name="cloudtrail-sharing-logs-assume-role"></a>

您必须指定一个单独的 IAM 用户来代入自己在每个账户中创建的各个角色，还必须确保每个 IAM 用户都拥有相应权限。

#### IAM 用户和角色
<a name="cloudtrail-sharing-logs-assume-role-iam-user-permission"></a>

在创建必要的角色和策略后，您必须在要与之共享文件的每个账户中指定一个 IAM 用户。每个 IAM 用户均以编程方式代入相应的角色以访问日志文件。当用户代入角色时， AWS 会向该用户返回临时安全凭证。此类凭证可用于发出列出、检索、复制或删除日志文件的请求，具体取决于与角色关联的访问策略所授予的权限。

有关使用 IAM 身份的更多信息，请参阅 [IAM 身份（用户、组和角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。

主要区别在于，您在每个方案中为每个 IAM 角色创建的访问策略。
+ 在方案 1 中，访问策略只允许每个账户读取其自己的日志文件。有关更多信息，请参阅 [创建用于向自己的账户授予访问权限的访问策略](#cloudtrail-sharing-logs-your-accounts)。
+ 在方案 2 中，访问策略允许第三方账户读取已聚合到 Amazon S3 存储桶中的所有日志文件。有关更多信息，请参阅 [创建用于向第三方授予访问权限的访问策略](#cloudtrail-sharing-logs-third-party)。

#### 为 IAM 用户创建权限策略
<a name="cloudtrail-sharing-logs-assume-role-create-policy"></a>

要执行角色允许的操作，IAM 用户必须拥有调用 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)API 的权限。您必须编辑每个用户的策略，以授予他们相应的权限。也就是说，在附加到 IAM 用户的策略中设置**资源**元素。以下示例演示了另一个账户中的 IAM 用户的策略，此策略允许该用户代入账户 A 之前创建的一个名为 `Test` 的角色。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::111122223333:role/Test"
        }
    ]
}
```

------

**编辑客户托管策略（控制台）**

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**策略**。

1. 在策略列表中，选择要编辑的策略的名称。您可以使用搜索框筛选策略列表。

1. 选择**权限**选项卡，然后选择**编辑**。

1. 请执行以下操作之一：
   + 选择**可视化**选项以更改您的策略，而无需了解 JSON 语法。您可以更改策略中的每个权限块的服务、操作、资源或可选条件。也可以导入一个策略以在您的策略底部添加其他权限。完成更改后，选择**下一步**以继续。
   + 选择 **JSON** 选项，然后在 JSON 文本框中键入或粘贴文本以修改您的策略。也可以导入一个策略以在您的策略底部添加其他权限。解决[策略验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html)过程中生成的任何安全警告、错误或常规警告，然后选择**下一步**。
**注意**  
您可以随时在**可视化**和 **JSON** 编辑器选项卡之间切换。不过，如果您进行更改或在**可视化**编辑器中选择**下一步**，IAM 可能会调整策略结构以针对可视化编辑器进行优化。有关更多信息，请参阅*《IAM 用户指南》*中的[调整策略结构](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_policies.html#troubleshoot_viseditor-restructure)。

1. 在**查看并保存**页面上，查看**此策略中定义的权限**，然后选择**保存更改**以保存您的工作。

1. 如果管理型策略已达到最大版本数（5 个），选择**保存更改**将显示对话框。要保存您的新版本，策略最旧的非默认版本将被移除并替换为该新版本。（可选）您也可以将新版本设置为策略的默认版本。

   选择**保存更改**以保存您的新策略版本。

#### 正在呼叫 AssumeRole
<a name="cloudtrail-sharing-logs-assume-role-call"></a>

用户可以通过创建一个应用程序来代入角色，该应用程序调用 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)API 并传递角色会话名称、要代入的角色的 Amazon 资源编号 (ARN) 以及可选的外部 ID。创建要代入的角色的账户将定义角色会话名称。外部 ID（如果有）由第三方账户定义，并且将传递给拥有账户以便在创建角色时将此 ID 包含在内。有关更多信息，请参阅 *IAM 用户指南*中的[如何在向第三方授予对您的 AWS 资源的访问权限时使用外部 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)。您可以通过打开 IAM 控制台从账户 A 检索 ARN。

**使用 IAM 控制台在账户 A 中查找 ARN 值**

1. 选择 **Roles**

1. 选择要检查的角色。

1. 在**摘要**部分中查找**角色 ARN**。

 AssumeRole API 会返回临时证书，用于访问拥有账户的资源。在此示例中，您要访问的资源是 Amazon S3 存储桶以及该存储桶所包含的日志文件。该临时证书拥有您在角色访问策略中定义的权限。

以下 Python 示例（使用 [AWS SDK for Python (Boto)](https://aws.amazon.com/developer/tools/)）将说明如何调用 `AssumeRole` 以及如何使用返回的临时安全证书来列出由账户 A 控制的所有 Simple Storage Service（Amazon S3）存储桶。

```
def list_buckets_from_assumed_role(user_key, assume_role_arn, session_name):
    """
    Assumes a role that grants permission to list the Amazon S3 buckets in the account.
    Uses the temporary credentials from the role to list the buckets that are owned
    by the assumed role's account.

    :param user_key: The access key of a user that has permission to assume the role.
    :param assume_role_arn: The Amazon Resource Name (ARN) of the role that
                            grants access to list the other account's buckets.
    :param session_name: The name of the STS session.
    """
    sts_client = boto3.client(
        "sts", aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret
    )
    try:
        response = sts_client.assume_role(
            RoleArn=assume_role_arn, RoleSessionName=session_name
        )
        temp_credentials = response["Credentials"]
        print(f"Assumed role {assume_role_arn} and got temporary credentials.")
    except ClientError as error:
        print(
            f"Couldn't assume role {assume_role_arn}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    # Create an S3 resource that can access the account with the temporary credentials.
    s3_resource = boto3.resource(
        "s3",
        aws_access_key_id=temp_credentials["AccessKeyId"],
        aws_secret_access_key=temp_credentials["SecretAccessKey"],
        aws_session_token=temp_credentials["SessionToken"],
    )
    print(f"Listing buckets for the assumed role's account:")
    try:
        for bucket in s3_resource.buckets.all():
            print(bucket.name)
    except ClientError as error:
        print(
            f"Couldn't list buckets for the account. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise
```

### 停止在 AWS 账户之间共享 CloudTrail 日志文件
<a name="cloudtrail-sharing-logs-stop-sharing"></a>

要停止与他人共享日志文件 AWS 账户，请删除您为该账户创建的角色。有关如何删除角色的信息，请参阅[删除角色或实例配置文件](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html)。

# 验证 CloudTrail 日志文件完整性
<a name="cloudtrail-log-file-validation-intro"></a>

要确定日志文件在 CloudTrail 传送后是被修改、删除还是未更改，可以使用 CloudTrail 日志文件完整性验证。该功能是使用业界标准算法构建的：哈希采用 SHA-256，数字签名采用带 RSA 的 SHA-256。这使得在没有检测到的情况下修改、删除或伪造 CloudTrail 日志文件在计算上是不可行的。您可以使用 AWS CLI 在文件 CloudTrail 交付地点验证文件。

## 为什么使用它？
<a name="cloudtrail-log-file-validation-intro-use-cases"></a>

在安全和事故调查中，经验证的日志文件非常重要。例如，通过经验证的日志文件，您可以十分确定日志文件本身未更改，或者特定用户凭证执行了特定 API 活动。 CloudTrail 日志文件完整性验证过程还可以让您知道日志文件是否已被删除或更改，或者肯定地断言在给定时间段内没有向您的账户发送任何日志文件。

## 工作原理
<a name="cloudtrail-log-file-validation-intro-how-it-works"></a>

启用日志文件完整性验证后， CloudTrail 会为其提供的每个日志文件创建一个哈希值。每隔一小时， CloudTrail 还会创建并传送一个文件，该文件引用了过去一小时的日志文件，并包含每个文件的哈希值。此文件称为摘要文件。 CloudTrail 使用公钥和私钥对的私钥签署每个摘要文件。交付后，您可以使用公钥来验证摘要文件。 CloudTrail 对每个密钥对使用不同的密钥对 AWS 区域。

摘要文件将与您的 CloudTrail 日志文件传输到与您的跟踪关联的 Amazon S3 存储桶。如果您的日志文件从所有区域或多个账户传输到单个 Amazon S3 存储桶，则 CloudTrail 会将来自这些区域和账户的摘要文件传送到同一个存储桶中。

摘要文件放在与日志文件不同的文件夹中。摘要文件与日志文件分开放置，您就可以执行细粒度安全策略，允许现有日志处理解决方案继续运行，无需进行修改。每个摘要文件还包含之前摘要文件（如果存在）的数字签名。当前摘要文件的签名位于摘要文件 Amazon S3 对象的元数据属性中。有关摘要文件内容的更多信息，请参阅[CloudTrail 摘要文件结构](cloudtrail-log-file-validation-digest-file-structure.md)。

### 存储日志文件和摘要文件
<a name="cloudtrail-log-file-validation-intro-storage"></a>

您可以安全、耐用、廉价地将 CloudTrail 日志文件和摘要文件无限期地存储在 Amazon S3 或 Amazon Glacier 中。为增强存储在 Amazon S3 中的摘要文件的安全性，您可以使用 [Amazon S3 MFA 删除](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMFADelete.html)。

### 启用验证并验证文件
<a name="cloudtrail-log-file-validation-intro-enabling-and-using"></a>

要启用日志文件完整性验证，可以使用 AWS 管理控制台 AWS CLI、或 CloudTrail API。启用日志文件完整性验证允许 CloudTrail 将摘要日志文件传输到您的 Amazon S3 存储桶，但不能验证文件的完整性。有关更多信息，请参阅 [为启用日志文件完整性验证 CloudTrail](cloudtrail-log-file-validation-enabling.md)。

要验证 CloudTrail 日志文件的完整性，您可以使用 AWS CLI 或创建自己的解决方案。 AWS CLI 将在文件 CloudTrail 交付地点对文件进行验证。如果您要验证已移到其他位置（Amazon S3 或别处）的日志，您可以创建自己的验证工具。

有关使用验证日志的信息 AWS CLI，请参阅[CloudTrail 使用验证日志文件的完整性 AWS CLI](cloudtrail-log-file-validation-cli.md)。有关开发 CloudTrail 日志文件验证的自定义实现的信息，请参阅[CloudTrail 日志文件完整性验证的自定义实现](cloudtrail-log-file-custom-validation.md)。

# 为启用日志文件完整性验证 CloudTrail
<a name="cloudtrail-log-file-validation-enabling"></a>

您可以使用 AWS 管理控制台、 AWS 命令行界面 (AWS CLI) 或 CloudTrail API 启用日志文件完整性验证。 CloudTrail 大约一小时后开始交付摘要文件。

## AWS 管理控制台
<a name="cloudtrail-log-file-validation-enabling-console"></a>

要使用 CloudTrail 控制台启用日志文件完整性验证，请在创建或更新跟踪时为 “**启用日志文件验证**” 选项选择 “**是**”。默认情况下会对新的跟踪记录启用此功能。有关更多信息，请参阅 [使用控制台创建和更新跟踪](cloudtrail-create-and-update-a-trail-by-using-the-console.md)。

## AWS CLI
<a name="cloudtrail-log-file-validation-enabling-cli"></a>

要使用启用日志文件完整性验证 AWS CLI，请将`--enable-log-file-validation`选项与 create-t [rail 或 [up](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/update-trail.html) date-trail 命令](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/create-trail.html)一起使用。要禁用日志文件完整性验证，请使用 `--no-enable-log-file-validation` 选项。

**示例**

下面的 `update-trail` 命令启用日志文件验证并开始将摘要文件传送到指定跟踪的 Amazon S3 存储桶中。

```
aws cloudtrail update-trail --name your-trail-name --enable-log-file-validation
```

## CloudTrail API
<a name="cloudtrail-log-file-validation-enabling-api"></a>

要使用 CloudTrail API 启用日志文件完整性验证，请在调用`CreateTrail`或`true`时将`EnableLogFileValidation`请求参数设置为`UpdateTrail`。

有关更多信息，请参阅《[AWS CloudTrail API 参考](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/)》中的[CreateTrail](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_CreateTrail.html)和[UpdateTrail](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_UpdateTrail.html)。

# CloudTrail 使用验证日志文件的完整性 AWS CLI
<a name="cloudtrail-log-file-validation-cli"></a>

要使用验证日志 AWS Command Line Interface，请使用 CloudTrail `validate-logs`命令。此命令使用提交到 Amazon S3 存储桶的摘要文件执行验证。有关摘要文件的信息，请参阅 [CloudTrail 摘要文件结构](cloudtrail-log-file-validation-digest-file-structure.md)。

 AWS CLI 允许您检测以下类型的更改：
+ 修改或删除 CloudTrail 日志文件
+ 修改或删除 CloudTrail 摘要文件
+ 上述两者的修改或删除

**注意**  
仅 AWS CLI 验证摘要文件引用的日志文件。有关更多信息，请参阅 [检查特定文件是否由 CloudTrail](#cloudtrail-log-file-validation-cli-validate-logs-check-file)。

## 先决条件
<a name="cloudtrail-log-file-validation-cli-prerequisites"></a>

要使用验证日志文件的完整性 AWS CLI，必须满足以下条件：
+ 您必须联机连接到 AWS。
+ 您必须拥有包含摘要文件和日志文件的 Amazon S3 存储桶的读取访问权限。
+ 摘要和日志文件不得从 CloudTrail 交付它们的原始 Amazon S3 位置移出。
+ 执行命令的角色必须有权为跟踪引用的每个 S3 存储桶调用 `ListObjects`、`GetObject` 和 `GetBucketLocation`。

**注意**  
 AWS CLI无法验证下载到本地磁盘的日志文件。有关自行创建验证工具的指南，请参阅 [CloudTrail 日志文件完整性验证的自定义实现](cloudtrail-log-file-custom-validation.md)。

## validate-logs
<a name="cloudtrail-log-file-validation-cli-validate-logs"></a>

### 语法
<a name="cloudtrail-log-file-validation-cli-validate-logs-syntax"></a>

`validate-logs` 采用下面的语法形式。括号内为可选参数。

`aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <amzn-s3-demo-bucket>] [--s3-prefix <prefix>] [--account-id <account-id>] [--verbose]` 

**注意**  
`validate-logs` 命令与特定区域相关。必须指定`--region`全局选项才能验证特定日志的日志 AWS 区域。

### 选项
<a name="cloudtrail-log-file-validation-cli-validate-logs-options"></a>

`validate-logs` 提供以下命令行选项。`--trail-arn` 和 `--start-time` 为必需选项。组织跟踪还需要 `--account-id` 选项。

`--start-time`  
指定将验证在指定 UTC 时间戳值当时或之后提交的日志文件。示例：`2015-01-08T05:21:42Z`。

`--end-time`  
（可选）指定将验证在指定 UTC 时间戳值当时或之前提交的日志文件。默认值为当前 UTC 时间（`Date.now()`）。示例：`2015-01-08T12:31:41Z`。  
对于指定的时间范围，`validate-logs` 命令只检查其对应的摘要文件引用的日志文件。不检查 Amazon S3 存储桶中的任何其他日志文件。有关更多信息，请参阅 [检查特定文件是否由 CloudTrail](#cloudtrail-log-file-validation-cli-validate-logs-check-file)。

`--s3-bucket`  
（可选）指定存储摘要文件的 Amazon S3 存储桶。如果未指定存储桶名称，则 AWS CLI 将通过调用来检索存储桶名称`DescribeTrails()`。

`--s3-prefix`  
（可选）指定表示摘要文件存储位置的 Amazon S3 前缀。如果未指定，则 AWS CLI 将通过调用来检索它`DescribeTrails()`。  
仅在当前前缀不同于指定时间范围期间使用的前缀时，才应使用此选项。

`--account-id`  
也可选择指定用于验证日志的账户。组织跟踪需要此参数来验证组织内特定账户的日志。

`--trail-arn`  
指定要验证的跟踪的 Amazon 资源名称（ARN）。跟踪 ARN 遵循的格式。  

```
arn:aws:cloudtrail:us-east-2:111111111111:trail/MyTrailName
```
要获取跟踪的 ARN，您可以先使用 `describe-trails` 命令，然后再运行 `validate-logs`。  
如果在您指定的时间范围内日志文件被提交到多个存储桶，而您需要将对日志文件的验证限制在一个存储桶，则除了跟踪 ARN，您可能还需要指定存储桶的名称和前缀。

`--verbose`  
（可选）输出指定时间范围内的每个日志文件或摘要文件的验证信息。输出指示文件保持不变还是发生过修改或已删除。在非详细模式（默认）下，仅当验证失败时才返回信息。

### 示例
<a name="cloudtrail-log-file-validation-cli-validate-logs-example"></a>

下面的示例验证从指定起始时间到当前时间的日志文件，使用为当前跟踪配置的 Amazon S3 存储桶并指定详细输出。

```
aws cloudtrail validate-logs --start-time 2015-08-27T00:00:00Z --end-time 2015-08-28T00:00:00Z --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/my-trail-name --verbose
```

### `validate-logs` 的工作原理
<a name="cloudtrail-log-file-validation-cli-validate-logs-how-it-works"></a>

`validate-logs` 命令从验证指定时间范围内最新的摘要文件开始。首先，它验证摘要文件是否已从其声明的所属位置下载。换句话说，如果 CLI 从 S3 位置 `p1` 下载摘要文件 `df1`，则 validate-logs 会验证 `p1 == df1.digestS3Bucket + '/' + df1.digestS3Object`。

如果摘要文件的签名有效，则它检查摘要文件中引用的每个日志的哈希值。之后，此命令按时间倒序连续验证之前的摘要文件及其引用的日志文件。它继续进行这一操作，直到到达指定的 `start-time` 值或摘要链结束为止。如果有摘要文件缺失或无效，则此命令在输出中指出无法验证的时间范围。该`validate-logs`命令首先在标准摘要链上运行。完成标准摘要验证后，它会验证回填摘要文件（如果存在）。回填摘要形成一个单独的验证链，并且独立于标准摘要进行处理。

## 验证结果
<a name="cloudtrail-log-file-validation-cli-results"></a>

验证结果从摘要头开始，采用以下格式：

```
Validating log files for trail trail_ARN  between time_stamp and time_stamp
```

主输出的每一行都包含以下格式的单个摘要或日志文件的验证结果。前缀为前缀的行`(backfill)`表示回填摘要文件，这些文件与标准摘要文件形成单独的验证链。

```
<optional (backfill)> <Digest file | Log file> <S3 path> <Validation Message>
```

下表描述了可能会出现的日志文件和摘要文件的验证消息。


****  

| 文件类型 | 验证消息 | 说明 | 
| --- | --- | --- | 
| Digest file | valid | 摘要文件签名有效。可以检查所引用的日志文件。仅详细模式包含此消息。 | 
| Digest file | INVALID: has been moved from its original location | 检索摘要文件的 S3 存储桶或 S3 对象与摘要文件中记录的 S3 存储桶或 S3 对象位置不匹配。 | 
| Digest file | INVALID: invalid format | 摘要文件格式无效。无法验证与摘要文件表示的时间范围对应的日志文件。 | 
| Digest file | INVALID: not found | 找不到摘要文件。无法验证与摘要文件表示的时间范围对应的日志文件。 | 
| Digest file | INVALID: public key not found for fingerprint fingerprint | 找不到与摘要文件中记录的指纹对应的公有密钥。无法验证摘要文件。 | 
| Digest file | INVALID: signature verification failed | 摘要文件签名无效。摘要文件无效，无法验证其引用的日志文件，也无法确定其中所列的 API 活动。 | 
| Digest file | INVALID: Unable to load PKCS \$11 key with fingerprint fingerprint | 无法加载含有指定指纹的 DER 编码公有密钥（PKCS \$11 格式），无法验证摘要文件。 | 
| Log file | valid | 日志文件已验证且自提交以来未发生过修改。仅详细模式包含此消息。 | 
| Log file | INVALID: hash value doesn't match | 日志文件的哈希值不匹配。日志文件自 CloudTrail 提交后发生过修改。 | 
| Log file | INVALID: invalid format | 日志文件格式无效。无法验证日志文件。 | 
| Log file | INVALID: not found | 找不到日志文件，无法验证。 | 

输出包含有关返回结果的摘要信息。

## 示例输出
<a name="cloudtrail-log-file-validation-cli-results-examples"></a>

### 详细
<a name="cloudtrail-log-file-validation-cli-results-verbose"></a>

下面的示例 `validate-logs` 命令使用 `--verbose` 标志并生成后面的示例输出。`[...]` 表示示例输出已省略。

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2015-08-31T22:00:00Z --end-time 2015-09-01T19:17:29Z --verbose
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2015-08-31T22:00:00Z and 2015-09-01T19:17:29Z
                                       
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/09/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T201728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1925Z_WZZw1RymnjCRjxXc.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_POuvV87nu6pfAV2W.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1930Z_l2QgXhAKVm1QXiIA.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_eQJteBBrfpBCqOqw.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1950Z_9g5A6qlR2B5KaRdq.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_i4DNCC12BuXd6Ru7.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_Sg5caf2RH6Jdx0EJ.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/09/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T191728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1910Z_YYSFiuFQk4nrtnEW.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1055Z_0Sfy6m9f6iBzmoPF.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1040Z_lLa3QzVLpOed7igR.json.gz	valid

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T101728Z.json.gz	INVALID: signature verification failed

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T091728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T0830Z_eaFvO3dwHo4NCqqc.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T081728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T071728Z.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2245Z_mbJkEO5kNcDnVhGh.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2225Z_IQ6kXy8sKU03RSPr.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2230Z_eRPVRTxHQ5498ROA.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2255Z_IlWawYZGvTWB5vYN.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/08/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150831T221728Z.json.gz	valid

Results requested for 2015-08-31T22:00:00Z to 2015-09-01T19:17:29Z
Results found for 2015-08-31T22:17:28Z to 2015-09-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
63/63 log files valid
```

以下示例`validate-logs`命令在存在回填摘要文件的时段上使用该`--verbose`标志，并生成以下示例输出。回填摘要以`(backfill)`前缀显示，并且与标准摘要链分开验证。 `[...]`表示样本输出已被缩短。

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2024-07-31T22:00:00Z --end-time 2024-08-01T19:17:29Z --verbose
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2024-07-31T22:00:00Z and 2024-08-01T19:17:29Z

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T201728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1925Z_Xm3pK9vN2wQ5rT8h.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1915Z_Bj7cL4nM6pR9sU2v.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1930Z_Fy1dG8kN3qT6wX0z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1920Z_Hn5jM2pQ7sV9yB4e.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1950Z_Kp8rN1tW4xZ7aC3f.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1920Z_Mq6sP9uX2yB5dE8g.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1915Z_Rt4vQ7wZ0aC3fG6h.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T191728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1910Z_Uw9xR2yB5dH8jK1m.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T1055Z_Vz3aS6cE9fL2nP5q.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T1040Z_Xy7bT0dG3hM6pR9s.json.gz	valid

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z.json.gz	INVALID: signature verification failed

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T091728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T081728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T071728Z.json.gz	valid
[...]
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/07/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240731T221728Z.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T201728Z_backfill.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T191728Z_backfill.json.gz	valid
[...]

(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z_backfill.json.gz	INVALID: signature verification failed

(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T091728Z_backfill.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T0830Z_Rn6uk0wY5aD9fJ3n.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T081728Z_backfill.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T071728Z_backfill.json.gz	valid
[...]
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/07/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240731T221728Z_backfill.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2145Z_Sp3vm7xZ2bE6gK0p.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2125Z_Tq0wn4ya9cF3hL7q.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2130Z_Ur7xp1zb6dG0jM4r.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2155Z_Vs4yq8ac3eH7kN1s.json.gz	valid

Results requested for 2024-07-31T22:00:00Z to 2024-08-01T19:17:29Z
Results found for 2024-07-31T22:17:28Z to 2024-08-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
22/23 backfill digest files valid, 1/23 backfill digest files INVALID
63/63 log files valid
```

### 非详细
<a name="cloudtrail-log-file-validation-cli-results-non-verbose"></a>

下面的示例 `validate-logs` 命令不使用 `--verbose` 标志。在后面的示例输出中，出现一个错误。只返回了头、错误和摘要信息。

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2015-08-31T22:00:00Z --end-time 2015-09-01T19:17:29Z
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2015-08-31T22:00:00Z and 2015-09-01T19:17:29Z

Digest file	s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T101728Z.json.gz	INVALID: signature verification failed

(backfill) Digest file	s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z_backfill.json.gz	INVALID: signature verification failed

Results requested for 2015-08-31T22:00:00Z to 2015-09-01T19:17:29Z
Results found for 2015-08-31T22:17:28Z to 2015-09-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
22/23 backfill digest files valid, 1/23 backfill digest files INVALID
63/63 log files valid
```

## 检查特定文件是否由 CloudTrail
<a name="cloudtrail-log-file-validation-cli-validate-logs-check-file"></a>

要检查存储桶中的特定文件是否由传送 CloudTrail，请在包含该文件的时间段内以详细模式运行`validate-logs`。如果文件出现在的输出中`validate-logs`，则该文件由传送 CloudTrail。

# CloudTrail 摘要文件结构
<a name="cloudtrail-log-file-validation-digest-file-structure"></a>

每个摘要文件均包含前一小时提交到您的 Amazon S3 存储桶的日志文件的名称，这些日志文件的哈希值，以及前一日志文件的数字签名。最新摘要文件的签名存储在摘要文件对象的元数据属性中。数字签名和哈希值用于验证日志文件和摘要文件本身的完整性。

## 摘要文件位置
<a name="cloudtrail-log-file-validation-digest-file-location"></a>

摘要文件提交到 Amazon S3 存储桶位置，语法如下。

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp.json.gz
```

**注意**  
对于组织跟踪记录，存储桶位置还包括组织单位 ID，如下所示：  

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/O-ID/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp.json.gz
```

**注意**  
如果 CloudTrail 需要包含由于处理延迟而未在原始摘要中引用的日志文件，则会交付回填摘要文件。回填摘要文件在其文件名中使用`_backfill`后缀，如下所示：  

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp_backfill.json.gz
```

## 示例摘要文件内容
<a name="cloudtrail-log-file-validation-digest-file-contents"></a>

以下示例摘要文件包含 CloudTrail 日志信息。

```
{
  "awsAccountId": "111122223333",
  "digestStartTime": "2015-08-17T14:01:31Z",
  "digestEndTime": "2015-08-17T15:01:31Z",
  "digestS3Bucket": "amzn-s3-demo-bucket",
  "digestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/17/111122223333_CloudTrail-Digest_us-east-2_your-trail-name_us-east-2_20150817T150131Z.json.gz",
  "digestPublicKeyFingerprint": "31e8b5433410dfb61a9dc45cc65b22ff",
  "digestSignatureAlgorithm": "SHA256withRSA",
  "newestEventTime": "2015-08-17T14:52:27Z",
  "oldestEventTime": "2015-08-17T14:42:27Z",
  "previousDigestS3Bucket": "amzn-s3-demo-bucket",
  "previousDigestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/17/111122223333_CloudTrail-Digest_us-east-2_your-trail-name_us-east-2_20150817T140131Z.json.gz",
  "previousDigestHashValue": "97fb791cf91ffc440d274f8190dbdd9aa09c34432aba82739df18b6d3c13df2d",
  "previousDigestHashAlgorithm": "SHA-256",
  "previousDigestSignature": "50887ccffad4c002b97caa37cc9dc626e3c680207d41d27fa5835458e066e0d3652fc4dfc30937e4d5f4cc7f796e7a258fb50a43ac427f2237f6e505d4efaf373d156e15e3b68dea9f58111d395b62628d6bd367a9024d2183b5c5f6e19466d3a996b92df705bc997b8a0e13430f241d733cf95df4e41bb6c304c3f58363043572ea57a27085639ce187e679c0d81c7519b1184fa77fb7ab0b0e40a32dace6e1eefc3995c5ae182da49b62b26398cebb52a2201a6387b75b89c83e5570bcb9bba6c34a80f2f00a1c6ebe07d1ff149eccd812dc805bb3eeff6657db32a6cb48d2d096404eb76181877bc6ebb8cd0b23f823200155b2fd8848d428e46e8456328a",
  "logFiles": [
    {
      "s3Bucket": "amzn-s3-demo-bucket",
      "s3Object": "AWSLogs/111122223333/CloudTrail/us-east-2/2015/08/17/111122223333_CloudTrail_us-east-2_20150817T1445Z_9nYN7gp2eWAJHIfT.json.gz",
      "hashValue": "9bb6196fc6b84d6f075a56548feca262bd99ba3c2de41b618e5b6e22c1fc71f6",
      "hashAlgorithm": "SHA-256",
      "newestEventTime": "2015-08-17T14:52:27Z",
      "oldestEventTime": "2015-08-17T14:42:27Z"
    }
  ]
}
```

## 摘要文件字段描述
<a name="cloudtrail-log-file-validation-digest-file-descriptions"></a>

下面是摘要文件中每个字段的描述：

`awsAccountId`  
已发送摘要文件的 AWS 账户 ID。

`digestStartTime`  
摘要文件所涵盖的起始 UTC 时间范围，以日志文件交付的时间为参考。 CloudTrail这意味着，如果时间范围是 [Ta, Tb]，则摘要包含在 Ta 与 Tb 之间提交给客户的所有日志文件。

`digestEndTime`  
摘要文件所涵盖的 UTC 结束时间范围，以日志文件交付的时间为参考。 CloudTrail这意味着，如果时间范围是 [Ta, Tb]，则摘要包含在 Ta 与 Tb 之间提交给客户的所有日志文件。

`digestS3Bucket`  
已将最新摘要文件传送到的 Amazon S3 存储桶的名称。

`digestS3Object`  
最新摘要文件的 Amazon S3 对象密钥（即，Amazon S3 存储桶位置）。字符串中的前两个区域显示摘要文件是从哪个区域提交的。最后的区域（`your-trail-name` 之后）是跟踪的主区域。主区域是创建跟踪的区域。如果是多区域跟踪，主区域可能不是提交摘要文件的区域。

`newestEventTime`  
摘要的日志文件中的所有事件中最近事件的 UTC 时间。

`oldestEventTime`  
摘要的日志文件中的所有事件中最早事件的 UTC 时间。  
如果摘要文件延迟提交，则 `oldestEventTime` 的值将早于 `digestStartTime` 的值。

`previousDigestS3Bucket`  
上一个摘要文件传送到的 Amazon S3 存储桶。

`previousDigestS3Object`  
上一个摘要文件的 Amazon S3 对象密钥（即，Amazon S3 存储桶位置）。

`previousDigestHashValue`  
前一摘要文件的未压缩内容的十六进制编码哈希值。

`previousDigestHashAlgorithm`  
用于对前一摘要文件进行哈希处理的哈希算法的名称。

`publicKeyFingerprint`  
与用于对摘要文件进行签名的私有密钥相匹配的公有密钥的十六进制编码指纹。您可以使用 AWS CLI 或 CloudTrail API 检索与摘要文件对应的时间范围内的公钥。对于返回的公有密钥，其指纹与此值匹配的公有密钥可用于验证摘要文件。有关检索摘要文件公钥的信息，请参阅 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/list-public-keys.html](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/list-public-keys.html)命令或 CloudTrail [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_ListPublicKeys.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_ListPublicKeys.html)API。  
CloudTrail 每个区域使用不同的 private/public 密钥对。每个摘要文件都使用对其区域唯一的私钥进行签名。因此，当您验证来自特定区域的摘要文件时，必须从同一区域检索其相应公钥。

`digestSignatureAlgorithm`  
用于对摘要文件进行签名的算法。

`logFiles.s3Bucket`  
日志文件的 Amazon S3 存储桶的名称。

`logFiles.s3Object`  
最新日志文件的 Amazon S3 对象密钥。

`logFiles.newestEventTime`  
日志文件中最近事件的 UTC 时间。此时间还与日志文件本身的时间戳相对应。

`logFiles.oldestEventTime`  
日志文件中最早事件的 UTC 时间。

`logFiles.hashValue`  
未压缩日志文件内容的十六进制编码哈希值。

`logFiles.hashAlgorithm`  
用于对日志文件进行哈希处理的哈希算法。

## 启动摘要文件
<a name="cloudtrail-log-file-validation-digest-file-starting"></a>

启动日志文件完整性验证时，将生成一个启动摘要文件。重新启动日志文件完整性验证（通过禁用后重新启用日志文件完整性验证，或者通过停止记录然后在启用验证时重新启动记录）时，也将生成一个启动摘要文件。在启动摘要文件中，与前一摘要文件相关的以下字段将为空：
+ `previousDigestS3Bucket`
+ `previousDigestS3Object`
+ `previousDigestHashValue`
+ `previousDigestHashAlgorithm`
+ `previousDigestSignature`

## “空”摘要文件
<a name="cloudtrail-log-file-validation-digest-file-empty"></a>

CloudTrail 即使在摘要文件所代表的一小时内您的账户中没有 API 活动，也会提供摘要文件。如果需要确定在摘要文件报告的小时内未提交日志文件，这非常有用。

下面的示例说明当未出现 API 活动时记录了 1 小时的摘要文件的内容。注意，摘要文件内容最后的 `logFiles:[ ]` 字段为空。

```
{
  "awsAccountId": "111122223333",
  "digestStartTime": "2015-08-20T17:01:31Z",
  "digestEndTime": "2015-08-20T18:01:31Z",
  "digestS3Bucket": "amzn-s3-demo-bucket",
  "digestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/20/111122223333_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150820T180131Z.json.gz",
  "digestPublicKeyFingerprint": "31e8b5433410dfb61a9dc45cc65b22ff",
  "digestSignatureAlgorithm": "SHA256withRSA",
  "newestEventTime": null,
  "oldestEventTime": null,
  "previousDigestS3Bucket": "amzn-s3-demo-bucket",
  "previousDigestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/20/111122223333_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150820T170131Z.json.gz",
  "previousDigestHashValue": "ed96c4bac9eaa8fe9716ca0e515da51938be651b1db31d781956416a9d05cdfa",
  "previousDigestHashAlgorithm": "SHA-256",
  "previousDigestSignature": "82705525fb0fe7f919f9434e5b7138cb41793c776c7414f3520c0242902daa8cc8286b29263d2627f2f259471c745b1654af76e2073264b2510fd45236b3aea4d80c0e8e6455223d7bd54ff80af0edf22a5f14fa856626daec919f0591479aa4f213787ba1e1076328dcf8ff624e03a977fa5612dcf58594c590fd8c1c5b48bddf43fc84ecc00b41bedd0ff7f293c3e2de8dcdc78f98b03e17577f5822ba842399d69eb79921c0429773509520e08c8b518702d987dfbb3a4e5d8c5f17673ce1f989dfff82d4becf24e452f20d3bcac94ad50131f93e57f10155536acb54c60efbe9d57228c2b930bc6082b2318e3ccd36834a8e835b8d112dbf32145f445c11",
  "logFiles": []
}
```

## 摘要文件的签名
<a name="cloudtrail-log-file-validation-digest-file-signature"></a>

摘要文件的签名信息位于 Amazon S3 摘要文件对象的两个对象元数据属性中。每个摘要文件都有下面的元数据项：
+ `x-amz-meta-signature`

  摘要文件签名的十六进制编码值。下面是示例签名：

  ```
  3be472336fa2989ef34de1b3c1bf851f59eb030eaff3e2fb6600a082a23f4c6a82966565b994f9de4a5989d053d9d15d20fc5c43e66358652d93326550a4acc5c5f541bb52e9b455897ab723bd7cbabfe963a406a41d600f3658f7a3135e5ed9fcae7b79bb5857d1e5eb78fcce8595ce0ade2f3ad1d9f2d62be7bc4660d83166ce24586489b7da9ee9883eaf0b9efabb5dd3cbba565cc4aab5c9c46c9fa7e9cda310afcc5e8adcd9e48d0597ec5f8174a52c3bebb3e845eeb1d18904fbf4cc14cd117080098e10022ddf55e017a9431446acad8560de0ba1e477af9f8a3048bc6196350adad0cc0cb4ab99b5e7c9944437a3c674a038009220684ced7be07b4f
  28f1cc237f372264a51b611c01da429565def703539f4e71009051769469231bc22232fa260df02740047af532229885ea2b0e95ecd353326b7104941e0cbddb076a391f1fcf2923c19565f4841770a78723451aeb732ff1b6162dc40e601fc6720bc5325987942ebd817783b322f0ac77698523bf742fdea7aa44f4911b3101221b7e1233387f16a52077610498f4a1254211258e37da0fb4cb207aef593b4c1baa13674e85acc52046b3adb889e63331a66abac5de7e42ffdd6952987c31ae871650e130bd2e63bfe145b22bbd39ea192210f6df64d49b888a321e02d3fc4cf126accae30d2857ccd6b2286a7c9feba6c35c44161b24147d645e6ca26844ba
  05d3ffcb5d2dd5dc28f8bb5b7993938e8a5f912a82b448a367eccb2ec0f198ba71e23eb0b97278cf65f3c8d1e652c6de33a22ca8428821ffc95bf8b726ba9f37cfbc20c54dc5bd6159bdea1c4d951b68cb8e0528852c55bb0c5e499ea60560f7c2bb3af7f694407da863a2594f7a2f2838cb09254afbaf8003587746e719a0437f85eeffae534f283f3837eb939a9bccc3c71573500661245891051231b580ac92d9e0e68c6f47ad38975f493e2c40e7f303353c4adc7d563ef1e875977afac2e085f0c824045d998c9543d8a3293ad3c063b7a109d0bfd84b0b1e3f72c4f057e744e6a2cf9cc97727b08584f44bfa47799c5072b60f0b619aea88a17de585e9
  ```
+ `x-amz-meta-signature-algorithm`

  下面是用于生成摘要签名的算法示例值：

  `SHA256withRSA`
+ `x-amz-meta-backfill-generation-timestamp`

  生成回填摘要时的 UTC 时间戳。此元数据属性仅存在于回填摘要文件中，用于识别用于签名验证的正确公钥。以下是时间戳示例：

  `2025-05-20T00:00:00.000Z`

## 摘要文件链
<a name="cloudtrail-log-file-validation-digest-file-chaining"></a>

每个摘要文件都包含对其先前摘要文件的引用，这一事实实现了 “链接”，允许像这样的验证工具检测摘要文件是否已被删除。 AWS CLI 通过它，在指定时间范围内的摘要文件可以从最近开始往前连续检查。

**注意**  
禁用日志文件完整性验证后，摘要文件链将在一小时后中断。 CloudTrail 不会为在禁用日志文件完整性验证期间传送的日志文件创建摘要文件。例如，如果您在 1 月 1 日中午启用日志文件完整性验证，在 1 月 2 日中午禁用它，在 1 月 10 日中午再次启用它，则不会为从 1 月 2 日中午到 1 月 10 日中午之间提交的日志文件创建摘要文件。每当您停止 CloudTrail 记录或删除跟踪时，这同样适用。

如果您的跟踪的 [S3 存储桶策略](create-s3-bucket-policy-for-cloudtrail.md)配置错误或服务 CloudTrail 出现意外中断，则可能无法收到全部或部分摘要文件。要确认您的跟踪是否有任何摘要传输错误，请运行 [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_GetTrailStatus.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_GetTrailStatus.html) 命令并检查 `LatestDigestDeliveryError` 参数是否有错误。在交付问题得到解决（例如，通过修复存储桶策略）后， CloudTrail 将尝试重新传送任何丢失的摘要文件。在重新传输期间，摘要文件可能会乱序传输，因此链条可能会暂时显得中断。

如果日志记录停止或跟踪被删除， CloudTrail 将提供最终摘要文件。此摘要文件包含有关所有剩余日志文件的信息，所涵盖的事件直至（包含）`StopLogging` 事件。

# CloudTrail 日志文件完整性验证的自定义实现
<a name="cloudtrail-log-file-custom-validation"></a>

由于 CloudTrail 使用行业标准、公开可用的加密算法和哈希函数，因此您可以创建自己的工具来验证 CloudTrail 日志文件的完整性。启用日志文件完整性验证后，会将摘要文件 CloudTrail 传送到您的 Amazon S3 存储桶。您可以使用这些文件实现自己的验证解决方案。有关摘要文件的更多信息，请参阅[CloudTrail 摘要文件结构](cloudtrail-log-file-validation-digest-file-structure.md)。

本主题介绍如何为摘要文件签名，然后详述了要对摘要文件及其引用的日志文件实现验证解决方案所需采取的步骤。

## 了解 CloudTrail 摘要文件的签名方式
<a name="cloudtrail-log-file-custom-validation-how-cloudtrail-digest-files-are-signed"></a>

CloudTrail 摘要文件使用 RSA 数字签名进行签名。对于每个摘要文件， CloudTrail 执行以下操作：

1. 创建一个字符串，以基于指定的摘要文件字段进行数据签名（在下一章节中讲解）。

1. 获取区域唯一的私钥。

1. 将此字符串的 SHA-256 哈希值和私钥传递给 RSA 签名算法（生成数字签名）。

1. 将签名的字节代码编码成十六进制格式。

1. 将此数字签名放入 Amazon S3 摘要文件对象的 `x-amz-meta-signature` 元数据属性中。

### 数据签名字符串的内容
<a name="cloudtrail-log-file-custom-validation-data-signing-string-summary"></a>

用于数据签名的字符串中包含以下 CloudTrail 对象：
+ UTC 扩展格式的摘要文件结束时间戳（如 `2015-05-08T07:19:37Z`）
+ 当前摘要文件的 S3 路径
+ 当前摘要文件的 SHA-256 哈希值（十六进制编码）
+ 之前摘要文件的十六进制编码签名

本文档的稍后部分提供了计算此字符串的格式和作为示例的字符串。

## 自定义验证实现步骤
<a name="cloudtrail-log-file-custom-validation-steps"></a>

实现自定义验证解决方案时，您需要先验证摘要文件，然后再验证其引用的日志文件。

### 验证摘要文件
<a name="cloudtrail-log-file-custom-validation-steps-digest"></a>

要验证摘要文件，您需要其签名、与用于对其进行签名的私钥对应的公钥以及您计算的数据签名字符串。

1. 获取摘要文件。

1. 验证已从摘要文件的原始位置检索了摘要文件。

1. 获取摘要文件的十六进制编码签名。

1. 获取与用于对摘要文件进行签名的私钥对应的公钥的十六进制编码指纹。

1. 检索与摘要文件对应的时间范围的公钥。

1. 从检索到的公钥中，选择指纹与摘要文件中的指纹匹配的公钥。

1. 使用摘要文件哈希值及其他摘要文件字段，重新创建用于验证摘要文件签名的数据签名字符串。

1. 将此字符串的 SHA-256 哈希值、公钥及签名作为参数传递给 RSA 签名验证算法，以验证签名。如果结果为 true，则摘要文件有效。

### 验证日志文件
<a name="cloudtrail-log-file-custom-validation-steps-logs"></a>

如果摘要文件有效，则验证摘要文件引用的每个日志文件。

1. 为验证日志文件的完整性，系统会计算未压缩内容的 SHA-256 哈希值并将结果与摘要中记录的十六进制日志文件哈希值进行比较。如果哈希值匹配，则日志文件有效。

1. 通过使用当前摘要文件中包含的有关前一个摘要文件的信息，连续验证前一个摘要文件及其对应的日志文件。

以下部分详细介绍了这些步骤。

### A. 获取摘要文件
<a name="cloudtrail-log-file-custom-validation-steps-get-the-digest-file"></a>

第一步是获取最新的摘要文件，验证您已从其来源位置检索到它，然后验证其数字签名并获取公钥的指纹。

1. 使用 S3 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 或 AmazonS3Client 类（举例）从 Amazon S3 存储桶获取需要验证的时间范围的最新摘要文件。

1. 检查用于检索此文件的 S3 存储桶和 S3 对象是否与摘要文件中记录的 S3 存储桶 S3 对象位置匹配。

1. 接下来，从 Amazon S3 中摘要文件对象的 `x-amz-meta-signature` 元数据属性获取摘要文件的数字签名。

1. In the digest file, get the fingerprint of the public key whose private key was used to sign the digest file from the `digestPublicKeyFingerprint` field。

### B. 检索用于验证摘要文件的公钥
<a name="cloudtrail-log-file-custom-validation-steps-retrieve-public-key"></a>

要获取用于验证摘要文件的公钥，您可以使用 AWS CLI 或 CloudTrail API。在这两种情况下，您都需要指定要验证的摘要文件的时间范围（即，起始时间和结束时间）。对于您指定的时间范围，可能会返回一个或多个公钥。返回的密钥的有效时间范围可能会发生重叠。

**注意**  
由于每个区域 CloudTrail 使用不同的 private/public 密钥对，因此每个摘要文件都使用其区域独有的私钥进行签名。因此，当您验证来自特定区域的摘要文件时，必须从同一区域检索其公钥。

#### 使用检 AWS CLI 索公钥
<a name="cloudtrail-log-file-custom-validation-steps-retrieve-public-key-cli"></a>

要使用检索摘要文件的公钥 AWS CLI，请使用`cloudtrail list-public-keys`命令。此命令采用以下格式：

 `aws cloudtrail list-public-keys [--start-time <start-time>] [--end-time <end-time>]` 

start-time 和 end-time 参数为 UTC 时间戳且是可选的。如果未指定，则使用当前时间，且返回当前有效的一个或多个公钥。

 **示例响应** 

响应是代表所返回的一个或多个密钥的 JSON 对象的列表：

```
{
    "publicKeyList": [
        {
            "ValidityStartTime": "1436317441.0",
            "ValidityEndTime": "1438909441.0",
            "Value": "MIIBCgKCAQEAn11L2YZ9h7onug2ILi1MWyHiMRsTQjfWE+pHVRLk1QjfWhirG+lpOa8NrwQ/r7Ah5bNL6HepznOU9XTDSfmmnP97mqyc7z/upfZdS/AHhYcGaz7n6Wc/RRBU6VmiPCrAUojuSk6/GjvA8iOPFsYDuBtviXarvuLPlrT9kAd4Lb+rFfR5peEgBEkhlzc5HuWO7S0y+KunqxX6jQBnXGMtxmPBPP0FylgWGNdFtks/4YSKcgqwH0YDcawP9GGGDAeCIqPWIXDLG1jOjRRzWfCmD0iJUkz8vTsn4hq/5ZxRFE7UBAUiVcGbdnDdvVfhF9C3dQiDq3k7adQIziLT0cShgQIDAQAB",
            "Fingerprint": "8eba5db5bea9b640d1c96a77256fe7f2"
        },
        {
            "ValidityStartTime": "1434589460.0",
            "ValidityEndTime": "1437181460.0",
            "Value": "MIIBCgKCAQEApfYL2FiZhpN74LNWVUzhR+VheYhwhYm8w0n5Gf6i95ylW5kBAWKVEmnAQG7BvS5g9SMqFDQx52fW7NWV44IvfJ2xGXT+wT+DgR6ZQ+6yxskQNqV5YcXj4Aa5Zz4jJfsYjDuO2MDTZNIzNvBNzaBJ+r2WIWAJ/Xq54kyF63B6WE38vKuDE7nSd1FqQuEoNBFLPInvgggYe2Ym1Refe2z71wNcJ2kY+q0h1BSHrSM8RWuJIw7MXwF9iQncg9jYzUlNJomozQzAG5wSRfbplcCYNY40xvGd/aAmO0m+Y+XFMrKwtLCwseHPvj843qVno6x4BJN9bpWnoPo9sdsbGoiK3QIDAQAB",
            "Fingerprint": "8933b39ddc64d26d8e14ffbf6566fee4"
        },
        {
            "ValidityStartTime": "1434589370.0",
            "ValidityEndTime": "1437181370.0",
            "Value": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqlzPJbvZJ42UdcmLfPUqXYNfOs6I8lCfao/tOs8CmzPOEdtLWugB9xoIUz78qVHdKIqxbaG4jWHfJBiOSSFBM0lt8cdVo4TnRa7oG9io5pysS6DJhBBAeXsicufsiFJR+wrUNh8RSLxL4k6G1+BhLX20tJkZ/erT97tDGBujAelqseGg3vPZbTx9SMfOLN65PdLFudLP7Gat0Z9p5jw/rjpclKfo9Bfc3heeBxWGKwBBOKnFAaN9V57pOaosCvPKmHd9bg7jsQkI9Xp22IzGLsTFJZYVA3KiTAElDMu80iFXPHEq9hKNbt9e4URFam+1utKVEiLkR2disdCmPTK0VQIDAQAB",
            "Fingerprint": "31e8b5433410dfb61a9dc45cc65b22ff"
        }
    ]
}
```

#### 使用 CloudTrail API 检索公钥
<a name="cloudtrail-log-file-custom-validation-steps-retrieve-public-key-api"></a>

要使用 CloudTrail API 检索摘要文件的公钥，请将开始时间和结束时间值传递给 `ListPublicKeys` API。`ListPublicKeys` API 返回与用于在指定时间范围对摘要文件进行签名的私钥对应的公钥。对于每个公钥，此 API 还返回相应的指纹。

##### `ListPublicKeys`
<a name="cloudtrail-log-file-custom-validation-steps-list-public-keys"></a>

本部分介绍 `ListPublicKeys` API 的请求参数和响应元素。

**注意**  
`ListPublicKeys` 的二进制字段的编码可能随时发生变化。

 **请求参数** 


****  

| Name | 说明 | 
| --- | --- | 
|  StartTime  |  （可选）以 UTC 为单位指定查找 CloudTrail 摘要文件公钥的时间范围的起始时间。如果 StartTime 未指定，则使用当前时间，并返回当前的公钥。 类型： DateTime   | 
|  EndTime  |  （可选）以 UTC 为单位指定查找 CloudTrail 摘要文件公钥的时间范围的结束时间。如果 EndTime 未指定，则使用当前时间。 类型： DateTime   | 

 **响应元素** 

`PublicKeyList`：`PublicKey` 对象数组，包含：


****  

|  |  | 
| --- |--- |
|  名称  |  描述  | 
|  Value  |  DER 编码的公钥值（采用 PKCS \$11 格式）。 类型：Blob   | 
|  ValidityStartTime  |  公钥有效的起始时间。 类型： DateTime   | 
|  ValidityEndTime  |  公钥有效的结束时间。 类型： DateTime   | 
|  Fingerprint  |  公钥的指纹。指纹可用于识别验证摘要文件所必需的公钥。 类型：字符串   | 

### C. 选择要用于验证的公钥
<a name="cloudtrail-log-file-custom-validation-steps-choose-public-key"></a>

从 `list-public-keys` 或 `ListPublicKeys` 返回的公钥中，选择指纹与摘要文件的 `digestPublicKeyFingerprint` 字段中记录的指纹匹配的公钥。此即为用于验证摘要文件的公钥。

### D. 重新创建数据签名字符串
<a name="cloudtrail-log-file-custom-validation-steps-recreate-data-signing-string"></a>

现在，您有了摘要文件的签名及关联公钥，接下来，您需要计算数据签名字符串。算出数据签名字符串后，您就有了验证签名所需的输入。

数据签名字符串采用以下格式：

```
Data_To_Sign_String = 
  Digest_End_Timestamp_in_UTC_Extended_format + '\n' +
  Current_Digest_File_S3_Path + '\n' +
  Hex(Sha256(current-digest-file-content)) + '\n' +
  Previous_digest_signature_in_hex
```

之后是示例 `Data_To_Sign_String`。

```
2015-08-12T04:01:31Z
amzn-s3-demo-bucket/AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/12/111122223333_us-east-2_CloudTrail-Digest_us-east-2_20150812T040131Z.json.gz
4ff08d7c6ecd6eb313257e839645d20363ee3784a2328a7d76b99b53cc9bcacd
6e8540b83c3ac86a0312d971a225361d28ed0af20d70c211a2d405e32abf529a8145c2966e3bb47362383a52441545ed091fb81
d4c7c09dd152b84e79099ce7a9ec35d2b264eb92eb6e090f1e5ec5d40ec8a0729c02ff57f9e30d5343a8591638f8b794972ce15bb3063a01972
98b0aee2c1c8af74ec620261529265e83a9834ebef6054979d3e9a6767dfa6fdb4ae153436c567d6ae208f988047ccfc8e5e41f7d0121e54ed66b1b904f80fb2ce304458a2a6b91685b699434b946c52589e9438f8ebe5a0d80522b2f043b3710b87d2cda43e5c1e0db921d8d540b9ad5f6d4$31b1f4a8ef2d758424329583897339493a082bb36e782143ee5464b4e3eb4ef6
```

重新创建此字符串后，您即可验证摘要文件。

### E. 验证摘要文件
<a name="cloudtrail-log-file-custom-validation-steps-validate-digest-file"></a>

将重新创建的数据签名字符串的 SHA-256 哈希值、数字签名和公钥传给 RSA 签名验证算法。如果输出为 true，则已验证摘要文件签名，且摘要文件有效。

### F. 验证日志文件
<a name="cloudtrail-log-file-custom-validation-steps-validate-log-files"></a>

验证摘要文件后，您可以验证其引用的日志文件。摘要文件包含日志文件的 SHA-256 哈希值。如果其中一个日志文件在 CloudTrail 交付后被修改，则 SHA-256 哈希值将发生变化，并且摘要文件的签名将不匹配。

下面的内容介绍如何验证日志文件：

1. 使用摘要文件的 `logFiles.s3Bucket` 和 `logFiles.s3Object` 字段中的 S3 位置信息对日志文件执行 `S3 Get` 操作。

1. 如果 `S3 Get` 操作成功，则按照以下步骤循环访问摘要文件的 logFiles 数组中列出的日志文件：

   1. 从摘要文件中相应日志的 `logFiles.hashValue` 字段检索文件的原始哈希值。

   1. 使用 `logFiles.hashAlgorithm` 中指定的哈希算法计算未压缩的日志文件内容的哈希值。

   1. 比较您生成的哈希值和摘要文件中日志的哈希值。如果哈希值匹配，则日志文件有效。

### G. 验证其他摘要和日志文件
<a name="cloudtrail-log-file-custom-validation-steps-validate-additional-files"></a>

在每个摘要文件中，以下字段提供前一个摘要文件的位置和签名：
+  `previousDigestS3Bucket` 
+  `previousDigestS3Object` 
+  `previousDigestSignature` 

使用此信息顺序访问之前的摘要文件，按照前述部分中的步骤验证每个摘要文件的签名及其引用的日志文件。唯一的区别在于：对于之前的摘要文件，您不需要从摘要文件对象的 Amazon S3 元数据属性检索数字签名。`previousDigestSignature` 字段提供了前一个摘要文件的签名。

您可以一直向前进行此操作，直到到达起始的摘要文件，或摘要文件链断开，以先到者为准。

## 离线验证摘要和日志文件
<a name="cloudtrail-log-file-custom-validation-offline"></a>

离线验证摘要和日志文件时，您通常可以按照前述部分中介绍的流程进行。但是，您必须考虑到以下方面：

### 处理最新的摘要文件
<a name="cloudtrail-log-file-custom-validation-offline-most-recent-digest"></a>

最新（即“当前”）摘要文件的数字签名位于摘要文件对象的 Amazon S3 元数据属性中。在离线情况下，当前摘要文件的数字签名不可用。

对于这种情况，有两种处理方式：
+ 由于前一个摘要文件的数字签名位于当前摘要文件中，因此请从 next-to-last摘要文件开始验证。使用这种方法时，不会验证最新的摘要文件。
+ 作为预备步骤，从摘要文件对象的元数据属性获取当前摘要文件的签名，然后将其安全地离线存储。这样，除了链中前面的文件，此最新的摘要文件也可得到验证。

### 路径解决方案
<a name="cloudtrail-log-file-custom-validation-offline-path-resolution"></a>

已下载的摘要文件中的字段（如 `s3Object` 和 `previousDigestS3Object`）仍将指向日志文件和摘要文件的 Amazon S3 在线位置。离线解决方案必须找到一种方法，将它们重新路由到已下载的日志和摘要文件的当前路径。

### 公钥
<a name="cloudtrail-log-file-custom-validation-offline-public-keys"></a>

要进行离线验证，首先必须在线获取验证给定时间范围内的日志文件所需的所有公钥（例如，通过调用 `ListPublicKeys` 实现），然后将它们安全地离线存储。每当您需要验证超出指定的初始时间范围的其他文件时，都必须重复执行这一步。

## 示例验证代码段
<a name="cloudtrail-log-file-custom-validation-sample-code"></a>

以下示例片段提供了用于验证 CloudTrail 摘要和日志文件的基本代码。基本代码是 online/offline 不可知论的；也就是说，由你来决定是否在联机连接的情况下实现它。 AWS建议在实现中使用 [Java Cryptography Extension（JCE）](https://en.wikipedia.org/wiki/Java_Cryptography_Extension)和 [Bouncy Castle](https://www.bouncycastle.org/) 作为安全提供程序。

示例代码段：
+ 如何创建用于验证摘要文件签名的数据签名字符串。
+ 如何验证摘要文件签名。
+ 如何验证日志文件哈希值。
+ 用于验证摘要文件链的代码结构。

```
import java.util.Arrays;
import java.security.MessageDigest;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Security;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import org.json.JSONObject;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.apache.commons.codec.binary.Hex;

public class DigestFileValidator {

    public void validateDigestFile(String digestS3Bucket, String digestS3Object, String digestSignature) {
 
        // Using the Bouncy Castle provider as a JCE security provider - http://www.bouncycastle.org/
        Security.addProvider(new BouncyCastleProvider());
 
        // Load the digest file from S3 (using Amazon S3 Client) or from your local copy
        JSONObject digestFile = loadDigestFileInMemory(digestS3Bucket, digestS3Object);
 
        // Check that the digest file has been retrieved from its original location
        if (!digestFile.getString("digestS3Bucket").equals(digestS3Bucket) ||
                !digestFile.getString("digestS3Object").equals(digestS3Object)) {
            System.err.println("Digest file has been moved from its original location.");
        } else {
            // Compute digest file hash
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(convertToByteArray(digestFile));
            byte[] digestFileHash = messageDigest.digest();
            messageDigest.reset();
 
            // Compute the data to sign
            String dataToSign = String.format("%s%n%s/%s%n%s%n%s",
                                digestFile.getString("digestEndTime"),
                                digestFile.getString("digestS3Bucket"), digestFile.getString("digestS3Object"), // Constructing the S3 path of the digest file as part of the data to sign
                                Hex.encodeHexString(digestFileHash),
                                digestFile.getString("previousDigestSignature"));
 
            byte[] signatureContent = Hex.decodeHex(digestSignature);
 
            /*
                NOTE: 
                To find the right public key to verify the signature, call CloudTrail ListPublicKey API to get a list 
                of public keys, then match by the publicKeyFingerprint in the digest file. Also, the public key bytes 
                returned from ListPublicKey API are DER encoded in PKCS#1 format:
 
                PublicKeyInfo ::= SEQUENCE {
                    algorithm       AlgorithmIdentifier,
                    PublicKey       BIT STRING
                }
 
                AlgorithmIdentifier ::= SEQUENCE {
                    algorithm       OBJECT IDENTIFIER,
                    parameters      ANY DEFINED BY algorithm OPTIONAL
                }                
            */
            pkcs1PublicKeyBytes = getPublicKey(digestFile.getString("digestPublicKeyFingerprint")));
 
            // Transform the PKCS#1 formatted public key to x.509 format.
            RSAPublicKey rsaPublicKey = RSAPublicKey.getInstance(pkcs1PublicKeyBytes);
            AlgorithmIdentifier rsaEncryption = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, null);
            SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo(rsaEncryption, rsaPublicKey);
 
            // Create the PublicKey object needed for the signature validation
            PublicKey publicKey = KeyFactory.getInstance("RSA", "BC").generatePublic(new X509EncodedKeySpec(publicKeyInfo.getEncoded()));
 
            // Verify signature
            Signature signature = Signature.getInstance("SHA256withRSA", "BC");
            signature.initVerify(publicKey);
            signature.update(dataToSign.getBytes("UTF-8"));
 
            if (signature.verify(signatureContent)) {
                System.out.println("Digest file signature is valid, validating log files…");
                for (int i = 0; i < digestFile.getJSONArray("logFiles").length(); i++) {
 
                    JSONObject logFileMetadata = digestFile.getJSONArray("logFiles").getJSONObject(i);
 
                    // Compute log file hash
                    byte[] logFileContent = loadUncompressedLogFileInMemory(
                                                logFileMetadata.getString("s3Bucket"),
                                                logFileMetadata.getString("s3Object")
                                            );
                    messageDigest.update(logFileContent);
                     byte[] logFileHash = messageDigest.digest();
                    messageDigest.reset();
 
                    // Retrieve expected hash for the log file being processed
                    byte[] expectedHash = Hex.decodeHex(logFileMetadata.getString("hashValue"));
 
                    boolean signaturesMatch = Arrays.equals(expectedHash, logFileHash);
                    if (!signaturesMatch) {
                        System.err.println(String.format("Log file: %s/%s hash doesn't match.\tExpected: %s Actual: %s",
                               logFileMetadata.getString("s3Bucket"), logFileMetadata.getString("s3Object"),
                               Hex.encodeHexString(expectedHash), Hex.encodeHexString(logFileHash)));
                    } else {
                        System.out.println(String.format("Log file: %s/%s hash match",
                               logFileMetadata.getString("s3Bucket"), logFileMetadata.getString("s3Object")));
                    }
                }
 
            } else {
                System.err.println("Digest signature failed validation.");
            }
 
            System.out.println("Digest file validation completed.");
 
            if (chainValidationIsEnabled()) {
                // This enables the digests' chain validation
                validateDigestFile(
                        digestFile.getString("previousDigestS3Bucket"),
                        digestFile.getString("previousDigestS3Object"),
                        digestFile.getString("previousDigestSignature"));
            }
        }
    }
}
```

# CloudTrail 日志文件示例
<a name="cloudtrail-log-file-examples"></a>

CloudTrail 监控您账户的事件。如果您创建跟踪，它会将这些事件作为日志文件传送到您的 Amazon S3 存储桶。如果您在 CloudTrail Lake 中创建事件数据存储，则事件将记录到您的事件数据存储中。事件数据存储不使用 S3 存储桶。

**Topics**
+ [

## CloudTrail 日志文件名格式
](#cloudtrail-log-filename-format)
+ [

## 日志文件示例
](#cloudtrail-log-file-examples-section)

## CloudTrail 日志文件名格式
<a name="cloudtrail-log-filename-format"></a>

CloudTrail 对于传输到您的 Amazon S3 存储桶的日志文件对象，使用以下文件名格式：

```
AccountID_CloudTrail_RegionName_YYYYMMDDTHHmmZ_UniqueString.FileNameFormat 
```
+ `YYYY`、`MM`、`DD`、`HH` 和 `mm` 为日志文件传输时间中表示年、月、日、小时和分钟的数字。小时为 24 小时格式。`Z` 表示时间采用 UTC 格式。
**注意**  
在特定时间传输的日志文件可包含在该时间前的任何时刻编写的记录。
+ 日志文件名称的 16 字符 `UniqueString` 部分用于防止覆盖文件。它没有意义，日志处理软件应忽略它。
+ `FileNameFormat` 为文件的编码。目前，这是 `json.gz`（一个采用压缩 gzip 格式的 JSON 文本文件）。

 **示例 CloudTrail 日志文件名**

```
111122223333_CloudTrail_us-east-2_20150801T0210Z_Mu0KsOhtH1ar15ZZ.json.gz 
```

## 日志文件示例
<a name="cloudtrail-log-file-examples-section"></a>

一个日志文件包含一条或多条记录。以下是日志代码段的示例，其中显示开始日志文件创建的操作记录。

有关 CloudTrail 事件记录字段的信息，请参见[CloudTrail 记录管理、数据和网络活动事件的内容](cloudtrail-event-reference-record-contents.md)。

**Contents**
+ [

### Amazon EC2 日志示例
](#cloudtrail-log-file-examples-ec2)
+ [

### IAM 日志示例
](#cloudtrail-log-file-examples-iam)
+ [

### 示例错误代码及留言记录
](#error-code-and-error-message)
+ [

### CloudTrail 洞察事件日志示例
](#insights-event-example)

### Amazon EC2 日志示例
<a name="cloudtrail-log-file-examples-ec2"></a>

Amazon Elastic Compute Cloud（Amazon EC2）在 AWS 云中提供大小可调的计算容量。您可以启动虚拟服务器，配置安全性和联网，并管理存储。Amazon EC2 还可快速扩展或缩减以处理需求变化或使用高峰，从而减少对预测服务器流量的需求。有关更多信息，请参阅[《Amazon EC2 用户指南》](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/)。

以下示例显示，一位名为 `Mateo` 的 IAM 用户对实例 `i-EXAMPLE56126103cb` 和 `i-EXAMPLEaff4840c22` 执行了 **aws ec2 start-instances** 命令，从而调用了 Amazon EC2 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html) 操作。

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "EXAMPLE6E4XEGITWATV6R",
        "arn": "arn:aws:iam::123456789012:user/Mateo",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Mateo",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:17:28Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StartInstances",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.start-instances",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-EXAMPLE56126103cb"
                },
                {
                    "instanceId": "i-EXAMPLEaff4840c22"
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "e4336db0-149f-4a6b-844d-EXAMPLEb9d16",
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-EXAMPLEaff4840c22",
                    "currentState": {
                        "code": 0,
                        "name": "pending"
                    },
                    "previousState": {
                        "code": 80,
                        "name": "stopped"
                    }
                },
                {
                    "instanceId": "i-EXAMPLE56126103cb",
                    "currentState": {
                        "code": 0,
                        "name": "pending"
                    },
                    "previousState": {
                        "code": 80,
                        "name": "stopped"
                    }
                }
            ]
        }
    },
    "requestID": "e4336db0-149f-4a6b-844d-EXAMPLEb9d16",
    "eventID": "e755e09c-42f9-4c5c-9064-EXAMPLE228c7",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
     "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "ec2.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

以下示例显示，一位名为 `Nikki` 的 IAM 用户执行了 **aws ec2 stop-instances** 命令，从而调用了 Amazon EC2 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StopInstances.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StopInstances.html) 操作，以停止两个实例。

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "EXAMPLE6E4XEGITWATV6R",
        "arn": "arn:aws:iam::777788889999:user/Nikki",
        "accountId": "777788889999",
        "accessKeyId": "AKIAI44QH8DHBEXAMPLE",
        "userName": "Nikki",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:14:20Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StopInstances",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.stop-instances",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-EXAMPLE56126103cb"
                },
                {
                    "instanceId": "i-EXAMPLEaff4840c22"
                }
            ]
        },
        "force": false
    },
    "responseElements": {
        "requestId": "c308a950-e43e-444e-afc1-EXAMPLE73e49",
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-EXAMPLE56126103cb",
                    "currentState": {
                        "code": 64,
                        "name": "stopping"
                    },
                    "previousState": {
                        "code": 16,
                        "name": "running"
                    }
                },
                {
                    "instanceId": "i-EXAMPLEaff4840c22",
                    "currentState": {
                        "code": 64,
                        "name": "stopping"
                    },
                    "previousState": {
                        "code": 16,
                        "name": "running"
                    }
                }
            ]
        }
    },
    "requestID": "c308a950-e43e-444e-afc1-EXAMPLE73e49",
    "eventID": "9357a8cc-a0eb-46a1-b67e-EXAMPLE19b14",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "777788889999",
    "eventCategory": "Management",
     "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "ec2.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

以下示例显示，一位名为 `Arnav` 的 IAM 用户执行了 **aws ec2 create-key-pair** 命令，从而调用了 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html) 操作。请注意，`responseElements`包含密钥对的哈希值，并 AWS 删除了密钥材料。

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGIEXAMPLE",
        "arn": "arn:aws:iam::444455556666:user/Arnav",
        "accountId": "444455556666",
        "accessKeyId": "AKIAI44QH8DHBEXAMPLE",
        "userName": "Arnav",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:19:22Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateKeyPair",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.create-key-pair",
    "requestParameters": {
        "keyName": "my-key",
        "keyType": "rsa",
        "keyFormat": "pem"
    },
    "responseElements": {
        "requestId": "9aa4938f-720f-4f4b-9637-EXAMPLE9a196",
        "keyName": "my-key",
        "keyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f",
        "keyPairId": "key-abcd12345eEXAMPLE",
        "keyMaterial": "<sensitiveDataRemoved>"
    },
    "requestID": "9aa4938f-720f-4f4b-9637-EXAMPLE9a196",
    "eventID": "2ae450ff-e72b-4de1-87b0-EXAMPLE5227cb",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "444455556666",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "ec2.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

### IAM 日志示例
<a name="cloudtrail-log-file-examples-iam"></a>

AWS Identity and Access Management (IAM) 是一项 Web 服务，可帮助您安全地控制对 AWS 资源的访问。借助 IAM，您可以集中管理控制用户可访问哪些 AWS 资源的权限。可以使用 IAM 来控制谁通过了身份验证（准许登录）并获得授权（具有相应权限）来使用资源。有关更多信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/)。

以下示例显示，名为 `Mary` 的 IAM 用户执行了 **aws iam create-user** 命令，从而调用了 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateUser.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateUser.html) 操作，以创建名为 `Richard` 的新用户。

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGITEXAMPLE",
        "arn": "arn:aws:iam::888888888888:user/Mary",
        "accountId": "888888888888",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Mary",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:25:09Z",
    "eventSource": "iam.amazonaws.com",
    "eventName": "CreateUser",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/iam.create-user",
    "requestParameters": {
        "userName": "Richard"
    },
    "responseElements": {
        "user": {
            "path": "/",
            "arn": "arn:aws:iam::888888888888:user/Richard",
            "userId": "AIDA6ON6E4XEP7EXAMPLE",
            "createDate": "Jul 19, 2023 9:25:09 PM",
            "userName": "Richard"
        }
    },
    "requestID": "2d528c76-329e-410b-9516-EXAMPLE565dc",
    "eventID": "ba0801a1-87ec-4d26-be87-EXAMPLE75bbb",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "888888888888",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "iam.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

以下示例显示，名为 `Paulo` 的 IAM 用户执行了 **aws iam add-user-to-group** 命令，从而调用了 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html) 操作，以将名为 `Jane` 的用户添加到 `Admin` 组。

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGIEXAMPLE",
        "arn": "arn:aws:iam::555555555555:user/Paulo",
        "accountId": "555555555555",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Paulo",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:25:09Z",
    "eventSource": "iam.amazonaws.com",
    "eventName": "AddUserToGroup",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/iam.add-user-to-group",
    "requestParameters": {
        "groupName": "Admin",
        "userName": "Jane"
    },
    "responseElements": null,
    "requestID": "ecd94349-b36f-44bf-b6f5-EXAMPLE9c463",
    "eventID": "2939ba50-1d26-4a5a-83bd-EXAMPLE85850",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "555555555555",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "iam.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

以下示例显示，名为 `Saanvi` 的 IAM 用户执行了 **aws iam create-role** 命令，从而调用了 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) 操作，以创建角色。

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGITEXAMPLE",
        "arn": "arn:aws:iam::777777777777:user/Saanvi",
        "accountId": "777777777777",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Saanvi",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:29:12Z",
    "eventSource": "iam.amazonaws.com",
    "eventName": "CreateRole",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/iam.create-role",
    "requestParameters": {
        "roleName": "TestRole",
        "description": "Allows EC2 instances to call AWS services on your behalf.",
        "assumeRolePolicyDocument": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"sts:AssumeRole\"],\"Principal\":{\"Service\":[\"ec2.amazonaws.com\"]}}]}"
    },
    "responseElements": {
        "role": {
            "assumeRolePolicyDocument": "policy-statement",
            "arn": "arn:aws:iam::777777777777:role/TestRole",
            "roleId": "AROA6ON6E4XEFFEXAMPLE",
            "createDate": "Jul 19, 2023 9:29:12 PM",
            "roleName": "TestRole",
            "path": "/"
        }
    },
    "requestID": "ff38f36e-ebd3-425b-9939-EXAMPLE1bbe",
    "eventID": "9da77cd0-493f-4c89-8852-EXAMPLEa887c",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "777777777777",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "iam.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

### 示例错误代码及留言记录
<a name="error-code-and-error-message"></a>

以下示例显示，名为 `Terry` 的 IAM 用户执行了 **aws cloudtrail update-trail** 命令，从而调用了 [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_UpdateTrail.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_UpdateTrail.html) 操作，以更新名为 `myTrail2` 的跟踪，但未找到跟踪名称。日志在 `errorCode` 和 `errorMessage` 中显示了此错误。

```
{"Records": [{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGIEXAMPLE",
        "arn": "arn:aws:iam::111122223333:user/Terry",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Terry",
        "sessionContext": {
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:35:03Z",
    "eventSource": "cloudtrail.amazonaws.com",
    "eventName": "UpdateTrail",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.0 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/cloudtrail.update-trail",
    "errorCode": "TrailNotFoundException",
    "errorMessage": "Unknown trail: arn:aws:cloudtrail:us-east-1:111122223333:trail/myTrail2 for the user: 111122223333",
    "requestParameters": {
        "name": "myTrail2",
        "isMultiRegionTrail": true
    },
    "responseElements": null,
    "requestID": "28d2faaf-3319-4649-998d-EXAMPLE72818",
    "eventID": "694d604a-d190-4470-8dd1-EXAMPLEe20c1",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "cloudtrail.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

### CloudTrail 洞察事件日志示例
<a name="insights-event-example"></a>

以下示例显示了 CloudTrail Insights 事件日志。实际上，Insights 事件是一对事件，它们标记异常的写管理 API 活动或错误响应活动周期的开始和结束。`state` 字段显示是在异常活动期间的开始还是结束时记录事件。事件名称与 CloudTrail 分析管理事件以确定发生了异常活动的 AWS Systems Manager API 的名称相同。`UpdateInstanceInformation`尽管开始事件和结束事件具有唯一的 `eventID` 值，但它们也有一个由该对使用的 `sharedEventID` 值。见解事件显示 `baseline`、正常活动模式、`insight` 或触发开始见解事件的平均异常活动；在结束事件中，还显示见解事件持续时间内平均异常活动的 `insight` 值。有关 CloudTrail Insights 的更多信息，请参阅[使用见 CloudTrail 解](logging-insights-events-with-cloudtrail.md)。

```
{
    "Records": [{
        "eventVersion": "1.08",
        "eventTime": "2023-01-02T02:51:00Z",
        "awsRegion": "us-east-1",
        "eventID": "654a30ff-b0f3-4527-81b6-EXAMPLEf2393",
        "eventType": "AwsCloudTrailInsight",
        "recipientAccountId": "123456789012",
        "sharedEventID": "bcbfc274-8559-4a56-beb0-EXAMPLEa6c34",
        "insightDetails": {
            "state": "Start",
            "eventSource": "ssm.amazonaws.com",
            "eventName": "UpdateInstanceInformation",
            "insightType": "ApiCallRateInsight",
            "insightContext": {
                "statistics": {
                    "baseline": {
                        "average": 84.410596421
                    },
                    "insight": {
                        "average": 669
                    }
                }
            }
        },
        "eventCategory": "Insight"
    },
    {
        "eventVersion": "1.08",
        "eventTime": "2023-01-02T00:22:00Z",
        "awsRegion": "us-east-1",
        "eventID": "258de2fb-e2a9-4fb5-aeb2-EXAMPLE449a4",
        "eventType": "AwsCloudTrailInsight",
        "recipientAccountId": "123456789012",
        "sharedEventID": "8b74a7bc-d5d3-4d19-9d60-EXAMPLE08b51",
        "insightDetails": {
            "state": "End",
            "eventSource": "ssm.amazonaws.com",
            "eventName": "UpdateInstanceInformation",
            "insightType": "ApiCallRateInsight",
            "insightContext": {
                "statistics": {
                    "baseline": {
                        "average": 74.156423842
                    },
                    "insight": {
                        "average": 657
                    },
                    "insightDuration": 1
                }
            }
        },
        "eventCategory": "Insight"
    }]
}
```

# 使用 CloudTrail 处理库
<a name="use-the-cloudtrail-processing-library"></a>

 CloudTrail 处理库是一个 Java 库，它提供了一种处理 AWS CloudTrail 日志的简便方法。您可以提供有关 CloudTrail SQS 队列的配置详细信息，并编写用于处理事件的代码。剩下的就交给 CloudTrail 处理库了。它会轮询您的 Amazon SQS 队列，读取和解析队列消息，下载 CloudTrail 日志文件，解析日志文件中的事件，并将事件作为 Java 对象传递到您的代码。

 CloudTrail 处理库具有高度的可扩展性和容错能力。它可以并行处理日志文件，以便您可以根据需要处理任意数量的日志。它会处理与网络超时和无法访问的资源相关的网络故障。

以下主题向您展示如何使用 CloudTrail 处理库来处理 Java 项目中的 CloudTrail 日志。

该库是作为Apache许可的开源项目提供的，可在以下网址获得：。 GitHub [https://github.com/aws/aws-cloudtrail-processing-library](https://github.com/aws/aws-cloudtrail-processing-library)库源包括可用作您自己的项目基础的示例代码。

**Topics**
+ [

## 最低要求
](#use-the-cloudtrail-processing-library-prerequisites)
+ [

## 处理 CloudTrail 日志
](#use-the-cloudtrail-processing-library-how-to)
+ [

## 高级主题
](#use-the-cloudtrail-processing-library-advanced)
+ [

## 其他资源
](#UsingProcessingLib-ar)

## 最低要求
<a name="use-the-cloudtrail-processing-library-prerequisites"></a>

要使用 CloudTrail 处理库，必须具备以下条件：
+ [适用于 Java 的 AWS SDK 1.11.830](https://github.com/aws/aws-sdk-java)
+ [Java 1.8 (Java SE 8)](https://www.oracle.com/java/technologies/java-se-glance.html)

## 处理 CloudTrail 日志
<a name="use-the-cloudtrail-processing-library-how-to"></a>

要在 Java 应用程序中处理 CloudTrail 日志，请执行以下操作：

1. [将 CloudTrail 处理库添加到您的项目中](#use-the-cloudtrail-processing-library-add-to-project)

1. [配置 CloudTrail 处理库](#use-the-cloudtrail-processing-library-configure)

1. [实施事件处理器](#use-the-cloudtrail-processing-library-implement-events-processor)

1. [实例化和运行处理执行程序](#use-the-cloudtrail-processing-library-instantiate-and-run-executor)

### 将 CloudTrail 处理库添加到您的项目中
<a name="use-the-cloudtrail-processing-library-add-to-project"></a>

要使用 CloudTrail 处理库，请将其添加到 Java 项目的类路径中。

**Contents**
+ [

#### 将库添加到 Apache Ant 项目
](#use-the-cloudtrail-processing-library-add-to-project-apache-ant)
+ [

#### 将库添加到 Apache Maven 项目
](#use-the-cloudtrail-processing-library-add-to-project-apache-maven)
+ [

#### 将库添加到 Eclipse 项目
](#use-the-cloudtrail-processing-library-add-to-project-eclipse)
+ [

#### 将库添加到 IntelliJ 项目
](#use-the-cloudtrail-processing-library-add-to-intellij-project)

#### 将库添加到 Apache Ant 项目
<a name="use-the-cloudtrail-processing-library-add-to-project-apache-ant"></a>

**将 CloudTrail 处理库添加到 Apache Ant 项目中**

1. 从以下地址下载或克隆 CloudTrail 处理库源代码 GitHub：
   + [https://github.com/aws/aws-cloudtrail-processing-library](https://github.com/aws/aws-cloudtrail-processing-library)

1. 从源构建 .jar 文件，如[自述文件](https://github.com/aws/aws-cloudtrail-processing-library/blob/master/README.rst)中所述：

   ```
   mvn clean install -Dgpg.skip=true
   ```

1. 将生成的 .jar 文件复制到您的项目中，并将它添加到您项目的 `build.xml` 文件中。例如：

   ```
   <classpath>
     <pathelement path="${classpath}"/>
     <pathelement location="lib/aws-cloudtrail-processing-library-1.6.1.jar"/>
   </classpath>
   ```

#### 将库添加到 Apache Maven 项目
<a name="use-the-cloudtrail-processing-library-add-to-project-apache-maven"></a>

 CloudTrail 处理库可用于 [Apache Maven](https://maven.apache.org/)。您可以将其添加到您的项目，方法是：在项目的 `pom.xml` 文件中编写单个依赖项。

**将 CloudTrail 处理库添加到 Maven 项目**
+ 打开您的 Maven 项目的 `pom.xml` 文件，并添加如下依赖项：

  ```
  <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-cloudtrail-processing-library</artifactId>
      <version>1.6.1</version>
  </dependency>
  ```

#### 将库添加到 Eclipse 项目
<a name="use-the-cloudtrail-processing-library-add-to-project-eclipse"></a>

**将 CloudTrail 处理库添加到 Eclipse 项目中**

1. 从以下地址下载或克隆 CloudTrail 处理库源代码 GitHub：
   + [https://github.com/aws/aws-cloudtrail-processing-library](https://github.com/aws/aws-cloudtrail-processing-library)

1. 从源构建 .jar 文件，如[自述文件](https://github.com/aws/aws-cloudtrail-processing-library/blob/master/README.rst)中所述：

   ```
   mvn clean install -Dgpg.skip=true
   ```

1. 将生成的 aws-cloudtrail-processing-library -1.6.1.jar 复制到项目中的某个目录中（通常）。`lib`

1. 在 Eclipse **Project Explorer** 中右键单击您的项目名称，选择 **Build Path**，然后选择 **Configure**。

1. 在 **Java Build Path** 窗口中，选择 **Libraries** 选项卡。

1. 选择**添加 JARs...** 然后导航到你复制的路径 aws-cloudtrail-processing-library -1.6.1.jar。

1. 选择 **OK** 以完成将 `.jar` 添加到您的项目的过程。

#### 将库添加到 IntelliJ 项目
<a name="use-the-cloudtrail-processing-library-add-to-intellij-project"></a>

**将 CloudTrail 处理库添加到 IntelliJ 项目中**

1. 从以下地址下载或克隆 CloudTrail 处理库源代码 GitHub：
   + [https://github.com/aws/aws-cloudtrail-processing-library](https://github.com/aws/aws-cloudtrail-processing-library)

1. 从源构建 .jar 文件，如[自述文件](https://github.com/aws/aws-cloudtrail-processing-library/blob/master/README.rst)中所述：

   ```
   mvn clean install -Dgpg.skip=true
   ```

1. 从 **File** 中，选择 **Project Structure**。

1. 选择 **Modules**，然后选择 **Dependencies**。

1. 选择 **\$1 JARS or Directories**，然后转至您构建 `aws-cloudtrail-processing-library-1.6.1.jar` 的路径。

1. 选择 **Apply**，然后选择 **OK** 以完成将 `.jar` 添加到您的项目的过程。

### 配置 CloudTrail 处理库
<a name="use-the-cloudtrail-processing-library-configure"></a>

您可以通过创建在运行时加载的类路径属性文件来配置 CloudTrail 处理库，也可以手动创建`ClientConfiguration`对象并设置选项。

#### 提供属性文件
<a name="use-the-cloudtrail-processing-library-configure-provide-classpath-properties-file"></a>

您可以编写向您的应用程序提供配置选项的类路径属性文件。以下示例文件显示了您可设置的选项：

```
# AWS access key. (Required)
accessKey = your_access_key

# AWS secret key. (Required)
secretKey = your_secret_key

# The SQS URL used to pull CloudTrail notification from. (Required)
sqsUrl = your_sqs_queue_url

# The SQS end point specific to a region.
sqsRegion = us-east-1

# A period of time during which Amazon SQS prevents other consuming components
# from receiving and processing that message.
visibilityTimeout = 60

# The S3 region to use.
s3Region = us-east-1

# Number of threads used to download S3 files in parallel. Callbacks can be
# invoked from any thread.
threadCount = 1

# The time allowed, in seconds, for threads to shut down after
# AWSCloudTrailEventProcessingExecutor.stop() is called. If they are still
# running beyond this time, they will be forcibly terminated.
threadTerminationDelaySeconds = 60

# The maximum number of AWSCloudTrailClientEvents sent to a single invocation
# of processEvents().
maxEventsPerEmit = 10

# Whether to include raw event information in CloudTrailDeliveryInfo.
enableRawEventInfo = false

# Whether to delete SQS message when the CloudTrail Processing Library is unable to process the notification.
deleteMessageUponFailure = false
```

以下参数为必需参数：
+ `sqsUrl`— 提供从中提取 CloudTrail通知的 URL。如果不指定此值，则 `AWSCloudTrailProcessingExecutor` 会引发 `IllegalStateException`。
+ `accessKey`：您账户的唯一标识符，例如 AKIAIOSFODNN7EXAMPLE。
+ `secretKey`：您账户的唯一标识符，例如 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY。

`accessKey`和`secretKey`参数提供您访问库的 AWS 凭据，以便库可以 AWS 代表您进行访问。

其他参数的默认值由库设置。有关更多信息，请参阅 [AWS CloudTrail Processing Library 参考](https://docs.aws.amazon.com/awscloudtrail/latest/processinglib/)。

#### 创建一个 ClientConfiguration
<a name="use-the-cloudtrail-processing-library-configure-create-clientconfiguration"></a>

您可以通过在 `ClientConfiguration` 对象上设置选项来提供针对 `AWSCloudTrailProcessingExecutor` 的选项，而不是在类路径属性中设置选项，如下面的示例所示：

```
ClientConfiguration basicConfig = new ClientConfiguration(
    "http://sqs.us-east-1.amazonaws.com/123456789012/queue2",
    new DefaultAWSCredentialsProviderChain());

basicConfig.setEnableRawEventInfo(true);
basicConfig.setThreadCount(4);
basicConfig.setnEventsPerEmit(20);
```

### 实施事件处理器
<a name="use-the-cloudtrail-processing-library-implement-events-processor"></a>

要处理 CloudTrail 日志，必须实现接收 CloudTrail 日志数据的。`EventsProcessor`以下是一个实施示例：

```
public class SampleEventsProcessor implements EventsProcessor {

    public void process(List<CloudTrailEvent> events) {
        int i = 0;
        for (CloudTrailEvent event : events) {
            System.out.println(String.format("Process event %d : %s", i++, event.getEventData()));
        }
    }
}
```

在实现时`EventsProcessor`，您需要实现`AWSCloudTrailProcessingExecutor`用于向您发送 CloudTrail 事件的`process()`回调。事件在 `CloudTrailClientEvent` 对象的列表中提供。

该`CloudTrailClientEvent`对象提供了一个`CloudTrailEvent`和`CloudTrailEventMetadata`，你可以用它来读取 CloudTrail 事件和交付信息。

该简单示例会输出传递到 `SampleEventsProcessor` 的每个事件的事件信息。在您自己的实现中，您可以按照所需方式处理日志。只要 `AWSCloudTrailProcessingExecutor` 有事件要发送并仍在运行，它就会继续将事件发送至您的 `EventsProcessor`。

### 实例化和运行处理执行程序
<a name="use-the-cloudtrail-processing-library-instantiate-and-run-executor"></a>

在您编写`EventsProcessor`并设置 CloudTrail 处理库的配置值（在属性文件中或通过使用`ClientConfiguration`类）之后，您可以使用这些元素来初始化和使用`AWSCloudTrailProcessingExecutor`。

**用于`AWSCloudTrailProcessingExecutor`处理 CloudTrail 事件**

1. 实例化 `AWSCloudTrailProcessingExecutor.Builder` 对象。 `Builder` 的构造函数采用一个 `EventsProcessor` 对象和一个类路径属性文件名。

1. 调用 `Builder` 的 `build()` 工厂方法，以配置并获取 `AWSCloudTrailProcessingExecutor` 对象。

1. 使用`start()`和`AWSCloudTrailProcessingExecutor``stop()`方法开始和结束 CloudTrail 事件处理。

```
public class SampleApp {
  public static void main(String[] args) throws InterruptedException {
    AWSCloudTrailProcessingExecutor executor = new
      AWSCloudTrailProcessingExecutor.Builder(new SampleEventsProcessor(),
        "/myproject/cloudtrailprocessing.properties").build();

    executor.start();
    Thread.sleep(24 * 60 * 60 * 1000); // let it run for a while (optional)
    executor.stop(); // optional
  }
}
```

## 高级主题
<a name="use-the-cloudtrail-processing-library-advanced"></a>

**Topics**
+ [

### 筛选要处理的事件
](#use-the-cloudtrail-processing-library-advanced-filter-events)
+ [

### 处理数据事件
](#use-the-cpl-advanced-integers-floats)
+ [

### 报告进度
](#use-the-cloudtrail-processing-library-advanced-report-progress)
+ [

### 处理错误
](#use-the-cloudtrail-processing-library-advanced-handle-errors)

### 筛选要处理的事件
<a name="use-the-cloudtrail-processing-library-advanced-filter-events"></a>

默认情况下，您的 Amazon SQS 队列的 S3 存储桶中的所有日志及其包含的所有事件均会发送到您的 `EventsProcessor`。P CloudTrail rocessing Library 提供了可选接口，您可以实现这些接口来筛选用于获取 CloudTrail 日志的源并筛选您有兴趣处理的事件。

`SourceFilter`  
您可以实施 `SourceFilter` 接口，以选择是否要处理来自提供的源的日志。`SourceFilter` 声明单个调用方法 `filterSource()`，该方法接收一个 `CloudTrailSource` 对象。要阻止源中的事件被处理，请从 `filterSource()` 返回 `false`。  
在库轮询 Amazon SQS 队列中的日志之后， CloudTrail 处理库会调用该`filterSource()`方法。在库启动日志的事件筛选或处理之前会发生此事。  
以下是一个实施示例：  

```
public class SampleSourceFilter implements SourceFilter{
  private static final int MAX_RECEIVED_COUNT = 3;

  private static List<String> accountIDs ;
  static {
    accountIDs = new ArrayList<>();
    accountIDs.add("123456789012");
    accountIDs.add("234567890123");
  }

  @Override
  public boolean filterSource(CloudTrailSource source) throws CallbackException {
    source = (SQSBasedSource) source;
    Map<String, String> sourceAttributes = source.getSourceAttributes();

    String accountId = sourceAttributes.get(
      SourceAttributeKeys.ACCOUNT_ID.getAttributeKey());

    String receivedCount = sourceAttributes.get(
      SourceAttributeKeys.APPROXIMATE_RECEIVE_COUNT.getAttributeKey());

    int approximateReceivedCount = Integer.parseInt(receivedCount);

    return approximateReceivedCount <= MAX_RECEIVED_COUNT && accountIDs.contains(accountId);
  }
}
```
如果您未提供自己的 `SourceFilter`，则会使用 `DefaultSourceFilter`，这样将允许处理所有源（它总是返回 `true`）。

`EventFilter`  
您可以实施 `EventFilter` 接口，以选择是否要将 CloudTrail 事件发送到 `EventsProcessor`。`EventFilter` 声明单个调用方法 `filterEvent()`，该方法接收一个 `CloudTrailEvent` 对象。要阻止事件被处理，请从 `filterEvent()` 返回 `false`。  
 CloudTrail 处理库会在库轮询 Amazon SQS 队列中的日志并进行源筛选之后调用该`filterEvent()`方法。这在库开始处理日志的事件之前发生。  
请参阅下面的实施示例：  

```
public class SampleEventFilter implements EventFilter{

  private static final String EC2_EVENTS = "ec2.amazonaws.com";

  @Override
  public boolean filterEvent(CloudTrailClientEvent clientEvent) throws CallbackException {
    CloudTrailEvent event = clientEvent.getEvent();

    String eventSource = event.getEventSource();
    String eventName = event.getEventName();

    return eventSource.equals(EC2_EVENTS) && eventName.startsWith("Delete");
  }
}
```
如果您未提供自己的 `EventFilter`，则会使用 `DefaultEventFilter`，这样将允许处理所有事件（它总是返回 `true`）。

### 处理数据事件
<a name="use-the-cpl-advanced-integers-floats"></a>

 CloudTrail 处理数据事件时，它会保留原始格式的数字，无论是整数 (`int`) 还是`float`（包含十进制的数字）。在数据事件字段中包含整数的事件中， CloudTrail 历史上会将这些数字作为浮点数进行处理。目前，通过保留这些字段的原始格式来 CloudTrail 处理这些字段中的数字。

作为最佳实践，为避免破坏自动化，请灵活使用任何用于处理或筛选 CloudTrail 数据事件的代码或自动化，并允许两者兼`int`而有`float`格式的数字。为获得最佳效果，请使用 CloudTrail 处理库 1.4.0 或更高版本。

以下示例代码段显示了 `float` 格式的数字 `2.0`，用于数据事件的 `ResponseParameters`数据块中的 `desiredCount` 参数。

```
"eventName": "CreateService",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "000.00.00.00",
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
        "clientToken": "EXAMPLE",
        "cluster": "default",
        "desiredCount": 2.0
...
```

以下示例代码段显示了 `int` 格式的数字 `2`，用于数据事件的 `ResponseParameters`数据块中的 `desiredCount` 参数。

```
"eventName": "CreateService",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "000.00.00.00",
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
        "clientToken": "EXAMPLE",
        "cluster": "default",
        "desiredCount": 2
...
```

### 报告进度
<a name="use-the-cloudtrail-processing-library-advanced-report-progress"></a>

实现`ProgressReporter`接口以自定义 CloudTrail 处理库进度报告。 `ProgressReporter`声明了两个方法：`reportStart()`和`reportEnd()`，它们在以下操作的开头和结尾处被调用：
+ 轮询来自 Amazon SQS 的消息
+ 分析来自 Amazon SQS 的消息
+ 正在处理日志 Amazon SQS 来源 CloudTrail 
+ 删除来自 Amazon SQS 的消息
+ 正在下载 CloudTrail 日志文件
+ 处理 CloudTrail 日志文件

这两种方法均会收到一个 `ProgressStatus` 对象，该对象包含有关已执行操作的信息。`progressState` 成员包含标识当前操作的 `ProgressState` 枚举的一个成员。此成员可以包含 `progressInfo` 成员中的其他信息。此外，您从 `reportStart()` 返回的任何对象都会传递给 `reportEnd()`，以便您能够提供上下文信息，例如事件开始处理时的时间。

下面是一个实施示例，该示例提供了有关完成操作所需时间的信息：

```
public class SampleProgressReporter implements ProgressReporter {
  private static final Log logger =
    LogFactory.getLog(DefaultProgressReporter.class);

  @Override
  public Object reportStart(ProgressStatus status) {
    return new Date();
  }

  @Override
  public void reportEnd(ProgressStatus status, Object startDate) {
    System.out.println(status.getProgressState().toString() + " is " +
      status.getProgressInfo().isSuccess() + " , and latency is " +
      Math.abs(((Date) startDate).getTime()-new Date().getTime()) + "
      milliseconds.");
  }
}
```

如果您未实施自己的 `ProgressReporter`，则将改用 `DefaultExceptionHandler`（它会输出正在运行的状态的名称）。

### 处理错误
<a name="use-the-cloudtrail-processing-library-advanced-handle-errors"></a>

您可使用 `ExceptionHandler` 接口在日志处理期间发生异常时提供特殊处理。`ExceptionHandler` 声明单个调用方法 `handleException()`，该方法将接收一个带有关于已发生异常的上下文的 `ProcessingLibraryException` 对象。

您可以使用传入的 `ProcessingLibraryException` 的 `getStatus()` 方法来查明发生异常时所执行的操作，并获取有关该操作的状态的附加信息。`ProcessingLibraryException` 派生自 Java 的标准 `Exception` 类，因此您也可以通过调用任一 Exception 方法来检索有关异常的信息。

请参阅下面的实施示例：

```
public class SampleExceptionHandler implements ExceptionHandler{
  private static final Log logger =
    LogFactory.getLog(DefaultProgressReporter.class);

  @Override
  public void handleException(ProcessingLibraryException exception) {
    ProgressStatus status = exception.getStatus();
    ProgressState state = status.getProgressState();
    ProgressInfo info = status.getProgressInfo();

    System.err.println(String.format(
      "Exception. Progress State: %s. Progress Information: %s.", state, info));
  }
}
```

如果您未提供自己的 `ExceptionHandler`，则改用 `DefaultExceptionHandler`（它会输出标准错误消息）。<a name="delete-message-exception"></a>

**注意**  
如果`deleteMessageUponFailure`参数为`true`，则 CloudTrail 处理库不区分一般异常和处理错误，并且可能会删除队列消息。  
例如，使用 `SourceFilter` 按时间戳筛选消息。
但是，您没有访问接收 CloudTrail 日志文件的 S3 存储桶所需的权限。由于您没有所需的权限，因此会引发 `AmazonServiceException`。 CloudTrail 处理库将其封装在`CallBackException`.
`DefaultExceptionHandler` 会将其记录为错误，但不会确定根本原因，这个原因就是您没有所需的权限。 CloudTrail 处理库将此视为处理错误并删除该消息，即使该消息包含有效的 CloudTrail 日志文件也是如此。
如果您要用 `SourceFilter` 来筛选消息，请验证您的 `ExceptionHandler` 是否可将服务异常与处理错误区分开。

## 其他资源
<a name="UsingProcessingLib-ar"></a>

有关 CloudTrail 处理库的更多信息，请参阅以下内容：
+ [CloudTrail 处理库](https://github.com/aws/aws-cloudtrail-processing-library) GitHub 项目，其中包括演示如何实现 CloudTrail 处理库应用程序的[示例](https://github.com/aws/aws-cloudtrail-processing-library/tree/master/src/sample)代码。
+ [CloudTrail 处理库 Java Package 文档](https://docs.aws.amazon.com/awscloudtrail/latest/processinglib/)。