如何启用 AWS WAF 日志记录并将日志发送到 CloudWatch、Amazon S3 或 Kinesis Data Firehose?

上次更新日期:2022 年 7 月 22 日

我想启用 AWS WAF 的日志记录,然后将日志发送到 Amazon CloudWatch、Amazon Simple Storage Service(Amazon S3)或 Amazon Kinesis Data Firehose。如何启用 AWS WAF 日志,需要哪些权限?

简短描述

首先,为您的 AWS WAF Web ACL 选择一个支持的目的地。AWS WAF 支持以下日志目标:

请确保您拥有开启 AWS WAF 日志所需的资源权限。然后,使用您选择的目标启用 AWS WAF 日志。

解决方法

支持以下目标存储您的 AWS WAF 日志:

Amazon CloudWatch Logs

要将日志发送到 CloudWatch Logs 日志组,请在启用 AWS WAF 日志时选择 CloudWatch Logs 日志组作为目标。

创建新日志组或使用现有日志组。启用后,AWS WAF 日志将发送到日志流中的日志组。您可以使用 Logs Insights 分析这些日志。有关更多信息,请参阅在分析存储在 CloudWatch 或 Amazon S3 中的 AWS WAF 日志时,我有哪些选项?

使用 CloudWatch 日志时,请考虑以下事项:

  • 日志组名称必须以前缀 aws-waf-logs- 开头。
  • 日志组必须与您的 Web ACL 位于相同的 AWS 账户和区域中。对于与 CloudFront 关联的全球 Web ACL,日志组必须位于美国东部(弗吉尼亚州北部)区域。
  • 日志组在存储日志时具有日志组的配额
  • 在日志组中创建的日志流具有以下格式:
Region_web-acl-name_log-stream-number

必要的权限

使用 CloudWatch Logs 日志组开启 AWS WAF 日志的账户必须具有以下权限:

  • wafv2:PutLoggingConfiguration
  • wafv2:DeleteLoggingConfiguration
  • logs:CreateLogDelivery
  • logs:DeleteLogDelivery
  • logs:PutResourcePolicy
  • logs:DescribeResourcePolicies
  • logs:DescribeLogGroups

这些权限是更改 Web ACL 日志记录配置、配置日志交付以及检索和编辑日志组权限所必需的。这些权限必须附加到管理 AWS WAF 的用户。

分配这些权限后,AWS 会自动在 CloudWatch Logs 基于资源的策略中添加以下策略。这允许交付服务将日志推送到 CloudWatch Logs 日志组。
注意:根据以下策略,账号和 Amazon 资源名称(ARN)将特定于您的账户。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSLogDeliveryWrite20150319",
      "Effect": "Allow",
      "Principal": {
        "Service": ["delivery.logs.amazonaws.com"]
      },
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": ["arn:aws:logs:us-east-1:0123456789:log-group:my-log-group:log-stream:*"],
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": ["0123456789"]
        },
        "ArnLike": {
          "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:*"]
        }
      }
    }
  ]
}

如果您在日志组中看不到日志,请使用 DescribeResourcePolicies API 检查是否将上述必要权限添加到日志组的基于资源的策略中。您可以使用 PutResourcePolicy 编辑日志服务的基于资源的策略。

有关日志组权限的更多信息,请参阅从某些 AWS 服务启用日志记录

Amazon S3 存储桶

要将日志发送到 Amazon S3 存储桶,请在打开 AWS WAF 日志时选择 S3 存储桶作为目标。

Web ACL 每隔五分钟将日志文件发布到 S3 存储桶。最大文件大小为 75MB。如果文件大小超过最大值,则会记录一个新文件。开启日志后,您可以使用 Amazon Athena 对其进行分析。有关更多信息,请参阅查询 AWS WAF 日志

用于 AWS WAF 日志记录的 S3 存储桶名称必须以前缀 aws-waf-logs- 开头。

必要的权限

使用 S3 存储桶打开 AWS WAF 日志的账户必须具有以下权限:

  • wafv2:PutLoggingConfiguration
  • wafv2:DeleteLoggingConfiguration
  • logs:CreateLogDelivery
  • logs:DeleteLogDelivery
  • s3:PutBucketPolicy
  • s3:GetBucketPolicy

这些权限是启用 AWS WAF 日志记录和为 S3 存储桶配置日志传输所必需的。还需要它们来检索和编辑存储桶策略以允许 AWS WAF 日志传输到 S3 存储桶。

分配这些权限后,以下示例策略将自动添加到存储桶策略中,以允许将日志传输到 S3 存储桶:
注意:根据以下策略,账号和 Amazon 资源名称(ARN)特定于您的账户。

{
  "Version": "2012-10-17",
  "Id": "AWSLogDeliveryWrite20150319",
  "Statement": [
    {
      "Sid": "AWSLogDeliveryAclCheck",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::my-bucket",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": [
            "0123456789"
          ]
        },
        "ArnLike": {
          "aws:SourceArn": [
            "arn:aws:logs:us-east-1:0123456789:*"
          ]
        }
      }
    },
    {
      "Sid": "AWSLogDeliveryWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-bucket/AWSLogs/account-ID/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control",
          "aws:SourceAccount": [
            "0123456789"
          ]
        },
        "ArnLike": {
          "aws:SourceArn": [
            "arn:aws:logs:us-east-1:0123456789:*"
          ]
        }
      }
    }
  ]
}

如果您在 S3 存储桶中没有看到 AWS WAF 日志,请使用 GetBucketPolicy API 检查存储桶策略中是否存在必要的权限。您可以使用 PutBucketPolicy API 编辑存储桶策略。

要将日志发送到其他 AWS 账户或区域,请参阅如何将 AWS WAF 日志发送到集中式日志账户中的 Amazon S3 存储桶?

Amazon Kinesis Data Firehose

要将 AWS WAF 日志发送到 Kinesis Data Firehose 流,您必须创建传输流。传输流具有不同的目标来存储日志。

使用 Kinesis Data Firehose 时,请考虑以下几点:

  • Kinesis Data Firehose 名称必须以前缀 aws-waf-logs- 开头。
  • Kinesis Data Firehose 传输流必须与您的 Web ACL 位于相同的 AWS 账户和区域中。对于与 CloudFront 关联的全球 Web ACL,Kinesis Data Firehose 必须位于美国东部(弗吉尼亚州北部)区域。
  • 一个 AWS WAF 日志相当于一个 Kinesis Data Firehose 记录,并受 Amazon Kinesis Data Firehose 配额的约束。
    重要提示:如果您每秒收到超过 10000 个请求,则您的数据将受到限制,并且不会记录所有请求。要防止限制,您必须申请提高 Kinesis Data Firehose 的配额

必要的权限

使用 Kinesis Data Firehose 目标打开 AWS WAF 日志的账户必须具有以下权限:

  • wafv2:PutLoggingConfiguration
  • wafv2:DeleteLoggingConfiguration
  • iam:CreateServiceLinkedRole
  • firehose:ListDeliveryStreams

有关服务相关角色和 iam:CreateServiceLinkedRole 权限的信息,请参阅将服务相关角色用于 AWS WAF

要创建 Kinesis Data Firehose 传输流,请按照以下步骤操作:

  1. 打开 Amazon Kinesis 控制台
  2. 对于 Region(区域),选择您创建 Web ACL 的 AWS 区域。
    注意:如果您的 Web ACL 是为 Amazon CloudFront 设置的,请选择 Global(全球)。
  3. 在导航窗格中,选择 Delivery streams(传输流)。
  4. 选择 Create delivery stream(创建传输流)。
  5. 对于 Source(来源),选择 Direct PUT
  6. 对于 Destination(目标),从 Kinesis Firehose 的目标中进行选择。
  7. 对于Delivery stream name(传输流名称),输入一个以 aws-waf-logs- 开头的传输流名称。
  8. 确认数据转换记录格式转换已禁用
  9. 根据您在步骤 6 中选择的目标方式输入目标设置
  10. (可选)对于缓冲区提示、压缩和加密,请根据您的规范进行配置或保留默认设置。
  11. (可选)对于 高级设置,请根据您的规范进行配置或保留默认设置。
  12. 查看传输流的设置。如果设置与您的规范相符,请选择 Create delivery stream(创建传输流)。

启用 AWS WAF 日志

确定要将 AWS WAF 日志发送到的目标后,请通过执行以下操作开启 AWS WAF 日志记录:

  1. 打开 AWS WAF 控制台
  2. 对于 Region(区域),选择您创建 Web ACL 的 AWS 区域。
    注意:如果您的 Web ACL 是为 Amazon CloudFront 设置的,请选择 Global(全球)。
  3. 选择您的 Web ACL。
  4. 选择 Logging and Metrics(日志记录和指标),然后选择 Enable(启用)。
  5. 从支持的目标中选择要存储 AWS WAF 日志的目标
  6. 对于 Redacted fields(编辑的字段),选择您想要从日志中省略的字段。
  7. 对于 Filter logs(筛选日志),添加筛选条件以控制您想要存储哪些请求。
  8. 选择 Save(保存)。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?