Terraform で AWS WAF のログを Kinesis Firehose 経由で logging する

2020年5月4日

概要

やりたいこと

前回、ALB 用の AWS WAF v1 を Terraform で構築した。

この AWS WAF で検知したアラートのログを保存したい。

AWS WAF のロギング

下記の Amazon Kinesis Data Firehose ストリームを利用して Amazon S3 に JSON 形式で保存する方法でロギングする。

利用するサービスは3つ。

  • AWS WAF : ログを作成する
  • Kinesis Data Firehose : ログを受け取り、目的地へ流す
  • Amazon S3 : ログを保存する

S3 と Kinesis Firehose は AWS WAF と同じリージョン内に存在しなければならない。

Kinesis Data Firehose

Amazon Kinesis Data Firehose はデータをデータレイクなどにリアルタイムに流し込めるマネージドサービス。

流し込み先には S3 の他に Amazon Redshift、Amazon Elasticsearch Service、Splunk などを設定できる。

1秒あたり10,000 件以上のリクエストを受信する場合は制限がかかるため注意。

実践

S3 + Firehose

Terraform で利用する Resource は3つです。

基本は kinesis のサンプルで、 Firehose のストリーム名に「aws-waf-logs-」プレフィックスをつけておく。

resource "aws_s3_bucket" "bucket" {
  bucket = "tf-test-bucket-waf"
  acl    = "private"
  region = "us-east-1"
}

resource "aws_iam_role" "firehose_role" {
  name = "firehose_test_role"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "firehose.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

resource "aws_kinesis_firehose_delivery_stream" "test_stream" {
  name        = "aws-waf-logs-terraform-kinesis-firehose-test-stream"
  destination = "s3"

  s3_configuration {
    role_arn   = aws_iam_role.firehose_role.arn
    bucket_arn = aws_s3_bucket.bucket.arn
  }
}

terraform で実行。

terraform plan
terraform apply

tf-test-bucket-waf という S3 バケットが作成されている。

aws-waf-logs-terraform-kinesis-firehose-test-stream という Kinesis Firehose が作成されている。

WebACL と Kinesis の連携

WebACL と Kinesis の連携するため、aws_wafregional_web_acl の resource 内に logging_configuration 項目を追加する。

resource "aws_wafregional_web_acl" "wafacl" {
  name        = "tfWebACL"
  metric_name = "tfWebACL"

  default_action {
    type = "ALLOW"
  }

  rule {
    action {
      type = "BLOCK"
    }

    priority = 1
    rule_id  = aws_wafregional_rule.wafrule.id
    type     = "REGULAR"
  }

  logging_configuration {
    log_destination = aws_kinesis_firehose_delivery_stream.test_stream.arn

    redacted_fields {
      field_to_match {
        type = "URI"
      }

      field_to_match {
        data = "referer"
        type = "HEADER"
      }
    }
  }
}

terraform で確認して実行する。

terraform plan
terraform apply

WebACL に Logging 設定が有効になっている。

WAF アラートログが S3 バケットにログが保存されていればOK。

全体は github にアップしてある。

参考

Resource: aws_wafregional_web_acl

AWS WAFのログをFirehoseでS3に出力しブロックログをS3Selectで確認してみた

Amazon S3 にログを保存するように AWS WAF の包括的なログ記録を設定する方法を教えてください。