概要
やりたいこと
前回、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 項目を追加する。
WAF ACL の作成については前回の記事参照。
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
コメント