WAFのDDoS設定をTerraformで検証するお話
はじめに
こんにちは。
プロダクト開発本部 SREグループに所属する大城です。
SREとしては2年目となり、以前はQCとして、プロダクトの品質向上の業務に携わっていました。
また、私と同じ時期にQCからSREグループへ異動した宇根さんの記事も公開されていますので、ぜひご覧ください。
今回、はじめてのブログ執筆となりますが、私がSREとして対応した検証作業を1つご紹介したいと思います。
セキュリティ対策の検証
弊社ではAWSサービスを使い、Terraformによるコード管理(IaC)の運用をしています。
今回、AWSサービスのセキュリティの1つであるWAFにDDoS攻撃の対策をTerraformで導入できるか検証することになりました。
まず、WAFとDDoS攻撃について簡単にご説明をさせていただきます。
WAFとは
WAF(Web Application Firewall)とは、Webアプリケーションに対する攻撃を防御するためのセキュリティ対策の一つです。
WAFの設定を入れることで、よりセキュリティが強固になります。
DDoS攻撃とは
DDoS(Distributed Denial of Service)攻撃とは、複数のコンピュータから大量のリクエストを送りつけ、サービスを停止させる攻撃手法です。
WAFによるDDoS対策
WAFには、DDoS攻撃を防御するための機能が備わっています。
今回検証するものは、下記のAWSマネージドルールです。
AWSManagedRulesAntiDDoSRuleSet
※有償サービスとなりますので、導入・検証をする場合はご注意ください。
検証手順
今回の検証はTerraformによる操作となります。
WAFのルールに次のDDoSのルール名を渡します。
AWSManagedRulesAntiDDoSRuleSet
[重要] このルールを利用するには、Terraform AWSプロバイダーのバージョン 6.1.0 以上が必要です。
さっそく今回検証したソースコードになります。
関係する部分のみを抜粋しています。
resource "aws_wafv2_web_acl" "test_waf_acl" {
# [記述省略]
statement {
managed_rule_group_statement {
name = var.rule_name
vendor_name = "AWS"
# [記述省略]
# AWSManagedRulesAntiDDoSRuleSet専用
dynamic "managed_rule_group_configs" {
for_each = var.rule_name == "AWSManagedRulesAntiDDoSRuleSet" ? var.managed_rules_ddos : []
content {
aws_managed_rules_anti_ddos_rule_set {
sensitivity_to_block = managed_rule_group_configs.value.sensitivity_to_block
client_side_action_config {
challenge {
sensitivity = managed_rule_group_configs.value.sensitivity
usage_of_action = managed_rule_group_configs.value.usage_of_action
exempt_uri_regular_expression {
regex_string = managed_rule_group_configs.value.regex_string
}
}
}
}
}
}
}
}
}
今振り返ってみてみると、検証とはいえ色々詰め込んだためネストが深くなってみづらいですね(汗)
今回のポイントとしては、AWSManagedRulesAntiDDoSRuleSetを適用する場合、Terraform上でmanaged_rule_group_configsブロック内に専用のaws_managed_rules_anti_ddos_rule_set設定を追加する必要があります。
ただ、他のルールではこの設定は不要なため、dynamicブロックを使い、var.rule_nameに AWSManagedRulesAntiDDoSRuleSetが渡された場合にのみ、この設定が適用されるようにしてみました。
aws_managed_rules_anti_ddos_rule_setブロックの中身は、以下のようになります。
aws_managed_rules_anti_ddos_rule_set {
sensitivity_to_block = managed_rule_group_configs.value.sensitivity_to_block
client_side_action_config {
challenge {
sensitivity = managed_rule_group_configs.value.sensitivity
usage_of_action = managed_rule_group_configs.value.usage_of_action
exempt_uri_regular_expression {
regex_string = managed_rule_group_configs.value.regex_string
}
}
}
}
managed_rule_group_configs.value(var.managed_rules_ddos の各要素)には、ある程度決まった値を入れます。
それぞれの説明は下記の通りです。
-
sensitivity_to_block:"LOW" | "MEDIUM" | "HIGH"のいずれか設定する -
sensitivity:"LOW" | "MEDIUM" | "HIGH"のいずれかを設定する -
usage_of_action:"ENABLED" | "DISABLED"のいずれかを設定する -
regex_string: ここには各自で設定したい正規表現の値を入力する
オプションの詳細については下記のリファレンスもご参照ください。
Terraform Refistry(aws_wafv2_web_acl)
今回Terraformのコードで書いてみて良かったなと思ったことは、Terraformだとコードで定義した設定を一度に反映できるため効率的な点です。
マネージメントコンソールでは画面を遷移しながら設定する必要がありますが、Terraformならその手間がありません。
また、今回の検証では省略していますが、WAFのPriority(優先度)が自由に設定できる点も良かったです。
試しにマネージメントコンソールからWAFルールを追加すると、設定したい優先度の値を指定できなかったので不自由だなと感じました。
そして、私自身Terraformのコードにまだまだ慣れないので、頭を捻りながら考えるいい機会となりました。
終わりに
今回は、私の対応した検証作業の内容をご紹介させていただきました。
拙いコードではありますが、参考になれば幸いです。
これからもいろんな業務を通してSREとしての経験を積み、日々邁進していきます。
ここまでご覧いただきありがとうございました。
もし弊社のお仕事にご興味ありましたら、ぜひページの最後にあるリンクを覗いてみてください。
Discussion