使用 Amazon CLI 验证 CloudTrail 日志文件完整性 - Amazon CloudTrail
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Amazon CLI 验证 CloudTrail 日志文件完整性

要使用 Amazon Command Line Interface 验证日志,请使用 CloudTrail validate-logs 命令。此命令使用提交到 Simple Storage Service(Amazon S3)存储桶的摘要文件执行验证。有关摘要文件的信息,请参阅 CloudTrail 摘要文件结构

Amazon CLI 让您能够检测以下类型的更改:

  • CloudTrail 日志文件的修改或删除

  • CloudTrail 摘要文件的修改或删除

  • 上述两者的修改或删除

注意

Amazon CLI 只验证摘要文件引用的日志文件。有关更多信息,请参阅检查 CloudTrail 是否传送了特定文件

先决条件

要使用 Amazon CLI 验证日志文件的完整性,必须满足以下条件:

  • 您必须在线连接到 Amazon。

  • 您必须拥有包含摘要文件和日志文件的 Simple Storage Service(Amazon S3)存储桶的读取访问权限。

  • 摘要文件和日志文件在由 CloudTrail 传输到原始 Simple Storage Service(Amazon S3)位置后不能发生移动。

注意

Amazon CLI 无法验证下载到本地磁盘的日志文件。有关自行创建验证工具的指南,请参阅 CloudTrail 日志文件完整性验证的自定义实现

validate-logs

语法

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

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

注意

validate-logs 命令与特定区域相关。您必须指定 --region 全局选项,才能验证特定 Amazon Web Services 区域 的日志。

选项

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 命令只检查其对应的摘要文件引用的日志文件。不检查 Simple Storage Service(Amazon S3)存储桶中的任何其他日志文件。有关更多信息,请参阅检查 CloudTrail 是否传送了特定文件

--s3-bucket

(可选)指定存储摘要文件的 Simple Storage Service(Amazon S3)存储桶。如果未指定存储桶名称,则 Amazon CLI 会调用 DescribeTrails() 来检索它。

--s3-prefix

(可选)指定表示摘要文件存储位置的 Simple Storage Service(Amazon S3)前缀。如果未指定,则 Amazon CLI 将调用 DescribeTrails() 来检索它。

注意

仅在当前前缀不同于指定时间范围期间使用的前缀时,才应使用此选项。

--account-id

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

--trail-arn

指定要验证的跟踪的 Amazon Resource Name(ARN)。跟踪 ARN 遵循的格式。

arn:aws:cloudtrail:us-east-2:111111111111:trail/MyTrailName
注意

要获取跟踪的 ARN,您可以先使用 describe-trails 命令,然后再运行 validate-logs

如果在您指定的时间范围内日志文件被提交到多个存储桶,而您需要将对日志文件的验证限制在一个存储桶,则除了跟踪 ARN,您可能还需要指定存储桶的名称和前缀。

--verbose

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

示例

下面的示例验证从指定起始时间到当前时间的日志文件,使用为当前跟踪配置的 Simple Storage Service(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 的工作原理

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

如果摘要文件的签名有效,则它检查摘要文件中引用的每个日志的哈希值。之后,此命令按时间倒序连续验证之前的摘要文件及其引用的日志文件。它继续进行这一操作,直到到达指定的 start-time 值或摘要链结束为止。如果有摘要文件缺失或无效,则此命令在输出中指出无法验证的时间范围。

验证结果

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

Validating log files for trail trail_ARN between time_stamp and time_stamp

主输出的每行包含单个摘要文件或日志文件的验证结果,格式如下:

<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 指纹 找不到与摘要文件中记录的指纹对应的公有密钥。无法验证摘要文件。
Digest file INVALID: signature verification failed 摘要文件签名无效。摘要文件无效,无法验证其引用的日志文件,也无法确定其中所列的 API 活动。
Digest file INVALID: Unable to load PKCS #1 key with fingerprint 指纹 无法加载含有指定指纹的 DER 编码公有密钥(PKCS #1 格式),无法验证摘要文件。
Log file valid 日志文件已验证且自提交以来未发生过修改。仅详细模式包含此消息。
Log file INVALID: hash value doesn't match 日志文件的哈希值不匹配。日志文件自 CloudTrail 提交后发生过修改。
Log file INVALID: invalid format 日志文件格式无效。无法验证日志文件。
Log file INVALID: not found 找不到日志文件,无法验证。

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

示例输出

详细

下面的示例 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://example-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://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1925Z_WZZw1RymnjCRjxXc.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_POuvV87nu6pfAV2W.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1930Z_l2QgXhAKVm1QXiIA.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_eQJteBBrfpBCqOqw.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1950Z_9g5A6qlR2B5KaRdq.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_i4DNCC12BuXd6Ru7.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_Sg5caf2RH6Jdx0EJ.json.gz valid Digest file s3://example-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://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1910Z_YYSFiuFQk4nrtnEW.json.gz valid [...] Log file s3://example-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1055Z_0Sfy6m9f6iBzmoPF.json.gz valid Log file s3://example-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1040Z_lLa3QzVLpOed7igR.json.gz valid Digest file s3://example-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://example-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://example-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T0830Z_eaFvO3dwHo4NCqqc.json.gz valid Digest file s3://example-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://example-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://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2245Z_mbJkEO5kNcDnVhGh.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2225Z_IQ6kXy8sKU03RSPr.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2230Z_eRPVRTxHQ5498ROA.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2255Z_IlWawYZGvTWB5vYN.json.gz valid Digest file s3://example-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 标志。在后面的示例输出中,出现一个错误。只返回了头、错误和摘要信息。

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://example-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 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

检查 CloudTrail 是否传送了特定文件

要检查 CloudTrail 是否在存储桶中提交了特定的文件,请针对包含此文件的时间段以详细模式运行 validate-logs。如果 validate-logs 输出中包含此文件,则 CloudTrail 已提交此文件。