AWS WAF で Bot からのアクセスを管理する Bot Control が利用可能になりました!

2021.04.12

AWS WAF で Bot によるアクセスを可視化、ルールでの許可・拒否の制御を行う AWS WAF Bot Control が利用可能になりました!

個人的に Bot には苦い思い出があるため、、これはよいのでは?!と早速やってみました!概要としては既に Amazon Web Services ブログ でも紹介されています。

新機能 – AWS WAF Bot Control でウェブサイトの不要なトラフィックを削減

この記事では、環境を整えるところから下記ドキュメントで、例として紹介されている 『 特定 Bot のみを許可する 』 シナリオをやってみます!

AWS WAF Bot Control example: Allow a specific blocked bot

やってみた

環境準備

対象サイト作成

Bot によるアクセスが可能な外部公開されたサイトを作成します。 今回は手っ取り早く Elastic Beanstalk で ALB + EC2(Tomcat) 環境を構築します。(手順は割愛します)

Bot によるアクセス確認

AWS WAF による設定を行う前に検証で利用する Bot からアクセスが可能なことを確認します。今回は Web ページのパフォーマンス解析ツールである PageSpeed Insights(chrome_lighthouse) を利用します。

先ほど作成したサイト URL を入力し、分析を実行すると正常にアクセスされ、分析が実行されました。

AWS WAF Bot Control 設定

AWS WAF にて Bot Control を設定していきます。

AWS WAF >>> Web ACLs >>> Asia Pacific(Tokyo) >>> Create Web ACLs を選択

Name を入力( CloudWatch metric name も自動で入力されます)

Add AWS resources から対象とするリソースを選択 >>> Add を選択

Next を選択

Add rules >>> AWS managed rule groups を選択

AWS managed rule groups >>> Add to web ACL を選択

Add rules を選択

Next を選択

Create web ACL を選択

作成に成功すると一覧に表示されます。

Bot によるアクセス確認

早速 AWS WAF Bot Control を作成する前に確認した PageSpeed Insights を再実行します。

403 でブロックされました!

念の為、ブラウザで直接アクセスなど、数回別方法でも試します。

機能チェック

AWS WAF Bot Control の結果を確認していきます。
作成した Web ACL を選択 >>> Bot Control タブ を選択

BotNon Bot のアクセスが可視化されています。

Bot アクセスが 許可拒否 が可視化されています。 AWS WAF Bot Control を設定する前後で両方記録されているのが確認できます。

Bot アクセスのカテゴリが表示されます。 他カテゴリは下記ドキュメントが参考になります。今回は content_fetcher となっています。

AWS WAF Bot Control rule group

プルダウンで対象 Bot を選択してフィルタリングすることが出来ます。

Bot アクセス履歴は AWS WAF コンソール以外にも CLouudWatch や Kinesis Firehose を利用してメトリクスやログを記録することが可能です。

特定 Bot を許可する設定を追加

AWS WAF Bot Control にて chrome_lighthouse を許可するルールを追加していきます。

作成した Web ACL を選択 >>> Rules >>> AWS-AWSManagedRulesBotControlRuleSet >>> Edit を選択

CategoryContentFetcher >>> Count >>> Save rule >>> Save を選択

この状態で、再度アクセスをすると正常にアクセスが出来ますが、これでは CategoryContentFetcher 全てが除外されています。そのため chrome_lighthouse のみ許可(=以外は拒否)を設定します。


作成した Web ACL を選択 >>> Rules >>> Add rules >>> Add my own rules and rule groups

JSON でルールを記載します。

content_fetcher に一致し chrome_lighthouse 以外のものは拒否する内容を記述します。

{
  "Name": "allow-bot",
  "Priority": 1,
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "LabelMatchStatement": {
            "Scope": "LABEL",
            "Key": "awswaf:managed:aws:bot-control:bot:category:content_fetcher"
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "LabelMatchStatement": {
                "Scope": "LABEL",
                "Key": "awswaf:managed:aws:bot-control:bot:name:chrome_lighthouse"
              }
            }
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "allow-bot"
  }
}

Add rule >>> Save を選択

Bot によるアクセス確認

まずは content_fetcher 以外のカテゴリで、アクセスしてみます。(wget)

$ wget http://wafbotblog-env.eba-8hduu7z7.ap-northeast-1.elasticbeanstalk.com/
--2021-04-12 07:34:29--  http://wafbotblog-env.eba-8hduu7z7.ap-northeast-1.elasticbeanstalk.com/
Resolving wafbotblog-env.eba-8hduu7z7.ap-northeast-1.elasticbeanstalk.com (wafbotblog-env.eba-8hduu7z7.ap-northeast-1.elasticbeanstalk.com)... 54.238.132.209, 52.194.35.87
Connecting to wafbotblog-env.eba-8hduu7z7.ap-northeast-1.elasticbeanstalk.com (wafbotblog-env.eba-8hduu7z7.ap-northeast-1.elasticbeanstalk.com)|54.238.132.209|:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
2021-04-12 07:34:29 ERROR 403: Forbidden.

アクセスが拒否されました。コンソールにも記録されています。

同じ content_fetcher で PageSpeed Insights(chrome_lighthouse) 以外のものが良かったのですが、すぐに用意出来なかったため、先ほど作成したルールを変更してマッチしないようにして、PageSpeed Insights(chrome_lighthouse) が拒否されることで代替します。

アクセスすると拒否されます。

さいごに

ラストの検証例が、適切なものが用意できず心残りではありますが、、概ね機能や設定方法を把握することは出来ました! 可視化を行う部分であればとても簡単に始められそうです! 最初から許可・拒否の制御までは行わず、機能を有効化しカウントして状況を可視化・把握するだけでも有益な情報となりそうですね。その上で、必要に応じて許可・拒否の制御設定を用いる方が良いかと思います。