AWS WAF のBot Control で検証済みBotをブロックする
こんにちは、なおにしです。
AWS WAF Bot Control で検証済みのBotからのアクセスをブロックする機会がありましたのでご紹介します。
はじめに
AWS WAF Bot Control は、一般的なBotによるアクセスを可視化・ルールによる抑制を行うことが出来る機能です。
Bot Controlでは検出したBotアクセスのうち、AWS によって一般的かつ検証可能なBotとして認識されている既知のBotについては、検証済み(verified)として扱われます。この検証済みBot以外はBot Control によってアクセスがブロックされますが、検証済みBotは以下に記載のとおりブロックされない動作となっています。
AWS WAF Bot Control doesn't block bots that are known by AWS to be common and verifiable bots.
今回環境を確認していたところ、WAF を関連付けていたCloudFrontのオリジン配下のWebサーバにおいて、Amazonbot によるアクセスが多数記録されていたことが判明しました。
上記の公式ドキュメントに記載のとおり、Amazonbot 自体はAlexa のサービス向上に使用されるWebクローラーであり、通常であれば特にブロックする必要のないものかと思います。
しかし、Amazonbotのアクセスの挙動を確認したところ、偶然かもしれませんが今回は以下のように一時的にそれなりのアクセスが来ていて、かつBot Control によってブロックされないためアクセスがWebサーバに到達していた状況でした。
上記のアクセスによってWebサーバの負荷に影響が発生するかどうかは環境次第ですが、場合によっては一時的にアクセスをブロックしたいこともあるかと思います。
Amazonbotのドキュメントには以下の記載もあるため、今回は検証済みBot と判断されたAmazonbotのアクセスを明示的にブロックしてみます。
Amazonbot respects standard robots.txt rules.
やってみた
特定の検証済みBotをブロックするための方法は、公式ドキュメントに例として記述がありますので、その内容のとおりに適用してみます。
今回はブロック対象のBot名が「amazonbot」のため、Bot Control マネージドルールグループ(AWSManagedRulesBotControlRuleSet)の後に実行するamazonbotブロックのためのルールでは、以下2つのラベルを持っていることを条件とします。
- awswaf:managed:aws:bot-control:bot:name:amazonbot
- awswaf:managed:aws:bot-control:bot:verified
上記ドキュメントではJSON表記の内容になっていますが、AWSマネジメントコンソールでvisual editorを用いて設定する場合は、以下のような内容になります。
上記ルールをBot Control マネージドルールグループ(AWSManagedRulesBotControlRuleSet)の後に評価されるように設定するため、ルール一覧では以下のような順番になります。
また、参考までにBot Control マネージドルールグループ(AWSManagedRulesBotControlRuleSet)およびamazonbotをブロックするルールを作成するCloudFormation テンプレート(CloudFrontへの関連付け用)も記載します。
AWSTemplateFormatVersion: "2010-09-09"
Description: Block verified bots with AWS WAF Bot Control.
Parameters:
TargetBotName:
Description: Target verified bot name
Type: String
Default: amazonbot
Resources:
WAFWebACL:
Type: AWS::WAFv2::WebACL
Properties:
Name: test-block-verified-webacl
Description: Web ACL to test blocking verified bots.
Scope: CLOUDFRONT
DefaultAction:
Allow: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: test-block-verified-webacl
Rules:
- Name: test-AWSManagedRulesBotControlRuleSet
Priority: 10
OverrideAction:
None: {}
Statement:
ManagedRuleGroupStatement:
ManagedRuleGroupConfigs:
- AWSManagedRulesBotControlRuleSet:
InspectionLevel: TARGETED
EnableMachineLearning: true
VendorName: AWS
ExcludedRules: []
Name: AWSManagedRulesBotControlRuleSet
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: test-AWSManagedRulesBotControlRuleSet
- Name: test-bot-control-block-verified-rule
Priority: 20
Action:
Block: {}
Statement:
AndStatement:
Statements:
- LabelMatchStatement:
Key: !Sub "wswaf:managed:aws:bot-control:bot:name:${TargetBotName}"
Scope: LABEL
- LabelMatchStatement:
Key: awswaf:managed:aws:bot-control:bot:verified
Scope: LABEL
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: test-bot-control-block-verified-rule
CloudFormationでCloudFront用のWebACL を作成する際は、以下の記事に記載されているとおりus-east-1 (バージニア北部) リージョンでCloudFormationを実行する必要がありますのでご注意ください。(私もハマりました)
ブロック設定の適用結果
実際にAmazonbot によるリクエストがブロックされたかどうかは、対象Web ACLs のoverviewページやBot control dashboard のページにて、「Browse bot activity」から確認することができます。
以下はWeb ACLs のoverviewページでAmazonbot のリクエスト結果を表示したものとなります。明示的なブロックのルールを追加した後は、リクエストがブロックされるようになったことが分かります。
まとめ
AWS WAF Bot Control でAmazonbotからのアクセスをブロックしてみました。 Bot Control は自動的にBotからのアクセスを許可・拒否してくれる便利なサービスですが、今回のように必要に応じて特定のBotをブロックすることもできますし、逆に意図しないブロックに対してはブロックしないように構成する必要があります。
今回は検証済みBotを対象にブロックしていますが、元々はAWSで特に問題のないBotと判断されているものでもありますので、Amazonbotのドキュメントに記載があるとおり、必要な場合は恒久的にはrobots.txtで抑制を行い、その他の悪意のあるBotをWAFでブロックするという方があるべきかもしれません。
本記事がどなたかのお役に立てれば幸いです。