〜リスト型攻撃やスクレイピングに対応する高度なBot対策〜F5 XC Bot Defense for Amazon CloudFront Connectorを触ってみた

F5 Distibuted Cloud Bot Defenseはリスト型攻撃やスクレイピングなどの悪質なBot攻撃を防ぐことが出来るBot対策ソリューションです。今回はCloudFrontと連携する機能を使ってみました。
2023.03.31

こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。

今回は、 先日検証したF5社のWAF、F5 Distributed Cloud WAAP(F5 XC WAAP) と同じF5 XC Servicesの中から、Bot対策を行える製品『F5 XC Bot Defense』の検証を行わせていただきました。

公式ページはこちら↓

F5 Distributed Cloud Bot Defense | F5

Bot Defenseのコネクター(※)は上記ページの構成図にもある通り、CDNやアプリケーションに組み込むことが可能です。

※F5社のサーバーにBot判定を行うためのデータを送信する部分

そのコネクターとしてAmazon CloudFrontが利用可能とのことなので、今回はコネクターとしてAmazon CloudFrontを使ってみました。

コネクターとしてCloudFrontを使用することで、リクエストをF5のネットワークに経由させる必要が無くなるというメリットがあります。Botかどうかの分析を行うためにテレメトリーデータとしてリクエスト内の一部を送る必要はありますが、リクエスト内の全てのデータを送る必要はありません。

F5 Distributed Cloud Bot Defense(XC Bot Defense) とは

概要

XC Bot Defenseは高度なBot対策のソリューションで、通常のWAFでは検知出来ない下記のようなBotからの攻撃を検知することが出来ます。

  • リスト型攻撃
  • スクレイピング
  • 買い占め行為
  • カーディング

このXC Bot Defenseは元々F5社が2019年に買収したShapeという製品のBot対策機能がリブランディングされたもので、アプリケーションへのリクエストから下記3つの情報をもとにそのリクエストが人間のものであるかBotのものであるかを判定しているそうです。

  • 環境情報(誰が)
  • 振る舞い検知(どのように)
  • ネットワーク情報(どこから)

XC Bot Defenseには下記2つのグレードがあります。(厳密にはシグネチャベースのBasicもあります)

  • XC Bot Defense Standard
    • 管理はセルフマネジメント(ユーザーが管理)
    • 今回使うものはこっち
  • XC Bot Defense Advanced
    • フルマネジメント
    • SOCやTAMなどのサービスも付いているため、Standardより高度なBot対策ソリューション

どのようなアプリケーションに向いているか

買い占め行為やスクレイピングなどを防ぐことが出来るため、ECサイトなどを運営している場合に導入を検討すると良さそうです。

アカウント作成時やログイン時、カートに商品を追加する時など、様々なシーンでのBotからの攻撃を防ぐことが出来ます。

料金

下記はXC Bot Defense StandardのAWS Marketplaceページです。

料金は月額だと$4,500、12ヶ月払いだと$54,000です。(※AWS LambdaやAmazon CloudWatch LogsなどのAWSリソースの利用料は含まれていません。)

弊社ではF5社とCPPO(コンサルティングパートナー・プライベートオファー)を結んでいるため上記価格よりも安くご提供することが可能です。

やってみた

ということで、実際にCloudFrontにコネクターとなるLambda@Edgeを噛ませて、用意したアプリケーションに対してBotでリクエストを飛ばしてみました。

構成図はちょっと雑ですがこんな感じ。EC2インスタンスにはアプリケーションとしてOWASP Juice Shopを載せています。

英語のドキュメントですが、このドキュメント内に詳細な手順が記載されています。

Bot Defense | F5 Distributed Cloud Tech Docs

動画もありました。

導入手順はざっくり下記

  • F5 XC側
    • Bot DefenseでApplication(設定)を追加
    • インストールツール、設定ファイルをダウンロード
  • AWS側
    • Serverless Application Repositoryで「F5BotDefense」を検索&デプロイ
    • AWS CLIでBot Defenseのインストールツールを使い設定ファイルを読み込んで、AWSリソースに設定を反映させる

※この手順を行うために、事前にCloudFrontや後段のアプリケーションは用意しておいてください。

それではやっていきます。

F5 XC側

まずはF5 XCコンソールにログインし、「Bot Defense」(下図赤枠部)にアクセスします。

Bot Defenseのコンソールはこんな感じ。

ここで全てを見せることは出来ないですが、ざっくり何件Botからのアクセスが見れるOverviewや、どこからどのパスにリクエストが来たのかを見れるTraffic Analyzerなどのページが用意されています。

それでは左ペインの Manage > Applications に移動します。

画面上部にある 「Add Application」より保護するアプリケーションに関する設定を行います。

まずはメタデータの入力です。下記を入力します。

  • Name
    • XC上でのApplicationの名前です。任意の名前を入力します。
  • Description
    • Applicationの説明です。入力しなくても問題ありません。
  • Application Region
    • US, EU, Asiaから選択可能です。私はアプリケーションを北米リージョンで立てているのでUSを選択しましたが、保護対象のアプリケーションが日本国内にある場合はASIAで問題無いかと思います。
  • Connector Type
    • 今回はAmazon CloudFrontを選択しました。他にもF5 BIG-IP iAppやCustomが選択可能です。

Amazon CloudFrontを選択すると、CloudFrontを特定するための情報入力や保護対象のエンドポイント情報を入力する必要があります。

CloudFrontのConfigureを選択し、設定を行います。

まずはCloudFrontを特定するための情報です。いくつか選択肢がありますが、私はディストリビューションのIDを選択しました。

ConfigureでディストリビューションのIDを入力します。

Applyを押して設定を保存します。

次に保護したいエンドポイントの情報を入れます。エンドポイント情報は複数入れることが可能です。

それぞれに対して下記情報を入力します。

  • Name
    • 任意の名前を入力します。
  • Description
    • 任意の説明を入力します。
  • Domain Matcher
    • エンドポイントのドメインを指定することが可能です。
  • Path
    • 保護対象のパスを入力します。パスにはワイルドカード(*)を使用することも可能です。
  • Query
    • 「パラメータ名=パラメータ値」のように入力することでURLに含まれるクエリを指定して保護することが出来ます。
  • HTTP Methods
    • GET(XHR/Fetch)、POST、PUTの中から保護したいHTTPメソッドを指定します。(複数選択可)
  • Endpoint Label
    • どのようなエンドポイントなのか、用意されているラベルの中から適切なものを指定することが出来ます。
  • Client type
    • クライアントがWebなのかMobileなのか両方なのかを選びます。
    • また、Mitigationでは悪意のあるBotとして検知したリクエストをブロックするかそのまま通すかリダイレクトするかを選ぶことが出来ます。

入力が完了したらApplyを押して設定を保存します。

次は挿入するJavaScriptの設定です。XC Bot Defenseでは保護するアプリケーションにJavaScriptを組み込み、JavaScriptによってユーザーの挙動などの情報を取得します。Webアプリケーションの場合、この設定は必須です。

最初のページのWeb Client JavaScript Pathですが、ここからF5 Client JavaScriptが取得されます。ここアプリケーションで使用している他のパスと競合しないパスを指定してください。(私はデフォルトのまま使用しました。)

次は実際にBot Defenseの判断を行うBot Defense Client JavaScriptを埋め込むためのパスを指定します。JavaScript Insertion PathsのAdd Itemからパスを指定します。ここも複数作成することが出来ます。

Bot Defense Client JavaScriptは実際にユーザーのリクエスト情報を取得します。なので、ここで指定するパスにはユーザーが必ず経由するであろうページのパスを指定する必要があります。例えば /index.html/login/* などです。

  • Name
    • 任意の名前を入力します。
  • Description
    • 任意の説明を入力します。
  • Domain Matcher
    • ドメインを指定することが可能です。
  • Path
    • JavaScriptを挿入するパスを指定します。パスにはワイルドカード(*)を使用することも可能です。

それではJavaScript Insertion PathsとJavaScript自体の画面の両方でApplyを押して設定を保存します。

これで主な設定は完了です。

最後にオプションだけ見ておきます。オプションはデフォルトではTrusted Client Rules以外表示されていませんが、Show Advanced Fieldsをオンにすることで表示されます。

  • Trusted Client Rules
    • 信用するクライアントを指定出来ます。
  • Log Level
    • 後述するF5 Bot Defenseで使用されるLambda Functionのログレベルを指定することが出来ます。
  • Header Name For Continue Mitigation Action
    • MitigationでContinueを選択した際に付与するヘッダー名を指定します。
  • Timeout
    • Bot分析を行うためにBot Defense Engineに送信する際のリクエストのタイムアウト時間を指定します。
  • Body Sample Size Limit
    • 元々Bot分析に必要なF5テレメトリーデータ以外の追加bodyデータの容量を指定することが可能です。デフォルトは0MBです。

設定が完了したら適宜Applyを行い、最後にSave&ExitでApplicationを保存しましょう。

以上でF5 XC側の設定は完了です。

この設定をAWS側のリソースに反映させるためには、インストールツールと設定ファイルをダウンロードする必要があります。

先ほど作成したApplicationの右側Actionsの からInstallerとConfig Fileをダウンロードします。

F5 XC側での作業は以上です。

AWS側

次に、先ほど設定した内容をCloudFrontなどのAWSリソースに反映していきます。

まずはAWSのコンソールにサインインし、サービスの検索窓からServerless Application Repository(SAR)というサービスを検索します。

SARの「利用可能なアプリケーション」でF5BotDefenseと検索し、選択します。

するとLambdaアプリケーションのデプロイ画面に遷移します。そのままデプロイします。

serverlessrepo-F5BotDefense-F5BotDefense-*** というLambda関数が作成されていることを確認したら、次に進みます。

次はAWS CloudShellから先ほどF5のコンソールから取得したインストールツールを使って設定を反映します。

AWSコンソール右上にある下図赤枠のアイコン、もしくは画面左下の同様のアイコンを選択し、CloudShellを起動します。

それではCloudShellにインストールツールと設定ファイルをアップロードしましょう。CloudShellでは右上にある Actions > Upload file から任意のファイルをアップロードすることが出来ます。

アップロード画面が開いたらSelect fileで対象ファイルを選択し、Uploadします。

lsコマンドで両方のファイルが存在することを確認しましょう。

[cloudshell-user@ip-10-6-53-225 ~]$ ls
demo-bot-defense.json  f5tool

それでは作業を行います。設定の反映に使うコマンドは下記コマンドです。

bash f5tool --install 設定ファイル名 --lambda "Lambda関数名"

設定ファイル名には先ほどダウンロードしたF5 XCの設定ファイル名を、Lambda関数名には先ほどSARのパッケージからデプロイした serverlessrepo-F5BotDefense-F5BotDefense-*** というLambda関数名を入れてください。

実行するとこのような結果が表示されます。

[cloudshell-user@ip-10-6-53-225 ~]$ bash f5tool --install demo-bot-defense.json --lambda "serverlessrepo-F5BotDefense-F5BotDefense-afwJeT96is2u"

f5tool v1.0.3
 Reading Connector configuration from file 'demo-bot-defense.json'
 1 Distribution(s) to install: E1AP05JPXPQJHI
 Web clients will fetch F5 Client Javascript from '/common.js'

WARNING: F5 recommends against enabling Javascript insertion to the match-all
path pattern of /* because it may harm CloudFront performance and increase costs.
Please consider configuring more selective path-patterns.

 Will inject Client Javascript into specified web pages
Will handle 1 protected-endpoint and 1 JS-injection target(s): 'rest/user/login/*' '*'
Preparing to install F5 Bot Defense Connector for CloudFront Distribution E1AP05JPXPQJHI
 Fetching Distribution E1AP05JPXPQJHI current configuration data (may be slow)
 Distribution E1AP05JPXPQJHI supports aliases (virtual hosts): f5-bot-cf.becominn.classmethod.info
Will use specified F5 Bot Defense Connector Lambda Function --lambda 'serverlessrepo-F5BotDefense-F5BotDefense-afwJeT96is2u'
Checking for published version of 'serverlessrepo-F5BotDefense-F5BotDefense-afwJeT96is2u' (may be slow)
 Must publish a new version of 'serverlessrepo-F5BotDefense-F5BotDefense-afwJeT96is2u' that will use role 'F5BotDefense'
 Will assign role 'F5BotDefense' to F5 Connector Lambda Function 'serverlessrepo-F5BotDefense-F5BotDefense-afwJeT96is2u' (may be slow)
 Looking for existing F5 Connector IAM role 'F5BotDefense'
 Publishing initial/updated version of F5 Connector Lambda Function 'serverlessrepo-F5BotDefense-F5BotDefense-afwJeT96is2u' (may be slow)
 Distribution E1AP05JPXPQJHI has 0 non-Default Behaviors, path-patterns: 
Trying to fetch previous F5 Connector configuration for Distribution E1AP05JPXPQJHI from Secrets Manager
 Previous configuration timestamp is 20230313T052258Z
f5tool: Failed to remove 1 non-Default Behaviors for targets added by previous F5 Connector installation (timestamp 20230313T052258Z), path-patterns: 'rest/user*'
 Will add a Behavior for F5 web Client Javascript fetching to Distribution E1AP05JPXPQJHI
 Some targets did not match non-Default Behaviors of Distribution E1AP05JPXPQJHI
 Tried to add 2 Behaviors to filter protected endpoints and JS-injection pages
 Must attach F5 Connector to default (*) Behavior of Distribution E1AP05JPXPQJHI
 Saving a backup config file for Distribution in './E1AP05JPXPQJHI-20230327T115928Z'
 Will authorize F5 Connector Lambda Function to fetch its configuration(s) from Secrets Manager
 Looking for F5 Connector IAM policy attached to role 'F5BotDefense'
About to place F5 Connector configuration for Distribution E1AP05JPXPQJHI into Secrets Manager under the name 'F5BotDefense-E1AP05JPXPQJHI'
 (A one-time-only long delay may occur if the default KMS key 'aws/secretsmanager' has never been setup before)
 Only IAM principals with permissive role policies may access 'F5BotDefense-E1AP05JPXPQJHI'
About to modify Distribution E1AP05JPXPQJHI (may be slow)
Modified Distribution E1AP05JPXPQJHI to install F5 Connector
 Will (launch background job to) selectively-invalidate Distribution E1AP05JPXPQJHI cached objects that want refreshing with F5 Client Javascript injection
  WARNING: background job for selective cache-invalidation may fail if AWS CloudShell terminates or AWS credentials expire
Finished install of F5 Bot Defense Connector to 1 Distribution(s)

注: F5 XC Bot Defense 設定は機密性の高いセキュリティ情報であり、AWS Secrets Manager に保存されます。CLI のインストール後にconfig.jsonを削除する必要があります。

lsコマンドを実行してください。config.jsonを削除すれば、設定は全て完了です。

設定が反映されているかどうか、CloudFrontのビヘイビアを確認します。設定が反映されていれば、新たなビヘイビア設定とそのビヘイビアにLambda@Edgeがアタッチされています。

実際にアクセスしてみた

今回は普通にブラウザからのアクセスと、悪質なBot判定をされるためにSeleniumを使ってのアクセスも行いました。

今回はContinueで設定しているため、悪質なBotと判定されてもそのままリクエストは通ります。

対象ページはPOSTリクエストが送れるログイン画面。

ログインにはデフォルトで用意されているユーザー Jim を使いました。

Email:jim@juice-sh.op
Password:ncc-1701

ブラウザから人間(私)がリクエストを送ったところ、Bot Defenseのコンソールはこのようになっていました。

良かった。ちゃんとHumansとして認識されていますね。

ここで表示されているOthersというリクエストはBot DefenseのClient JavaScript(今回はcommon.js)へのアクセスが表示されているそうです。

続いてSeleniumでもリクエストを投げてみました。

Bot Defenseコンソールはこんな感じ。

悪質なBot(Malicious Bot)として判定されていますね。

AnalyzerではTraffic Type、Automation Typeも確認出来ます。

これ以上詳細なリクエストの情報を見たい場合にはWAFなどのログを確認する必要がありそうです。

最後に

私はAWS WAFのBot Controlに最近追加されたTargetedに関するアップデート記事を書いたこともあり、F5 XC Bot Defenseを触る前はAWS WAFの機能と何が違うんだろう?と思っていました。

ですが、そもそも取得するテレメトリーデータが異なるためその動作は大きく異なるものでした。

また、本製品はあくまでもBot対策のソリューションなので、Bot攻撃以外の攻撃を防ぐためにもF5 WAAPやAWS WAFといった通常のWAF製品と組み合わせて使う必要があります。

逆に言えば、 WAF製品だけでは防ぐことが出来ないBot攻撃に悩まれている方は本製品の導入を検討されてみてはいかがでしょうか。

次回は他のWAFに含まれるBot対策機能との比較記事を書いてみます。

本記事がどなたかのお役に立てば幸いです。

以上、べこみんでした。