コンテンツにスキップ

Amazon CloudFront向けWallarmコネクタ

CloudFrontはAmazon Web Servicesが運用するコンテンツ配信ネットワークです。Wallarmはコネクタとして動作し、CloudFront経由で配信されるトラフィックを保護および監視できます。

CloudFront向けコネクタとしてWallarmを使用するには、Wallarmノードを外部にデプロイし、Wallarm提供のLambda@Edge関数を実行して、分析のためにトラフィックをWallarmノードへルーティングする必要があります。

CloudFrontコネクタは、インラインおよびアウトオブバンドの両方のトラフィック解析をサポートします:

Wallarmが悪意のあるアクティビティをブロックするように設定されている場合:

WallarmとCloudFront - インライン構成

WallarmとCloudFront - アウトオブバンド構成

セキュリティに関する注意

提示のソリューションは最小権限の原則に従って設計されています。関数はCloudFrontおよびWallarmノードで動作するのに必要最小限の権限のみをリクエストし、デフォルトで安全なデプロイを実現します。

ユースケース

サポートされているWallarmのデプロイオプションの中でも、Amazon CloudFront経由でトラフィックを配信する場合に本ソリューションの利用を推奨します。

制限事項

  • Lambda@Edge関数レベルの制約:

    • HTTPステータスコード4xxのviewer responseではLambda@Edge関数はトリガーされません。
    • Lambda@Edgeはorigin responseおよびviewer responseイベントのいずれでもレスポンスボディへのアクセスを許可しないため、レスポンス内容に基づく処理は実行できません。
    • ボディサイズはviewer requestで40KB、origin requestで1MBに制限されます。
    • Wallarmノードからの最大応答時間はviewer requestで5秒、origin requestで30秒です。
    • Lambda@Edgeはプライベートネットワーク(VPC)をサポートしません。
    • 同時リクエストのデフォルト上限はリージョンあたり1,000ですが、数万まで引き上げることができます。
    • WallarmのLambda@Edge関数はoriginレベルで動作するため、CDNキャッシュで処理されるリクエストは監視しません。そのため、そのようなリクエストに含まれる潜在的な攻撃は検出されません。
  • 機能上の制約:

前提条件

デプロイを進める前に、以下の要件を満たしていることを確認してください。

  • AWS CloudFrontおよびLambdaの技術に関する理解があること。

  • CloudFront CDNを経由するAPIまたはトラフィックがあること。

デプロイ

1. Wallarmノードをデプロイする

WallarmノードはWallarmプラットフォームの中核コンポーネントで、受信トラフィックを検査し、不正なアクティビティを検出し、脅威を緩和するように設定できます。

必要な管理レベルに応じて、Wallarmがホストするノードとして、またはお客様のインフラストラクチャ内に自己ホストでデプロイできます。

コネクタ用のWallarmホスト型ノードをデプロイするには、手順に従ってください。

自己ホストノードのデプロイに使用するアーティファクトを選択し、各手順に従ってください:

2. WallarmのLambda@Edge関数を取得してデプロイする

CloudFront CDNをWallarmノードに接続するには、AWS上にWallarmのLambda@Edge関数をデプロイする必要があります。

Pythonベースの関数が2つあります: リクエストの転送と解析を行う関数と、レスポンスの転送と解析を行う関数です。

  1. Wallarm Console → Security EdgeConnectorsDownload code bundleに進み、プラットフォーム用のコードバンドルをダウンロードします。

    自己ホストノードを使用している場合は、コードバンドルの入手についてsales@wallarm.comにお問い合わせください。

  2. AWS Console → ServicesLambdaFunctionsに進みます。

  3. Lambda@Edge関数に必要なリージョンであるus-east-1(N. Virginia)を選択します。
  4. Create functionで次の設定を行います:

    • Runtime: Python 3.x。
    • Execution role: Create a new role from AWS policy templatesBasic Lambda@Edge permissions (for CloudFront trigger)
    • その他の設定はデフォルトのままで問題ありません。
  5. 関数が作成されたら、CodeタブでWallarmのリクエスト処理コードを貼り付けます。

  6. コード内の次のパラメータを更新します:

    • wlrm_node_addr: お使いのWallarmノードのURL。
    • wlrm_inline: 非同期(アウトオブバンド)モードを使用する場合はFalseに設定します。
    • 必要に応じて他のパラメータも調整します。
  7. ActionsDeploy to Lambda@Edgeに進み、次を指定します:

    • Configure new CloudFront trigger。
    • Distribution: 保護したいオリジンへトラフィックをルーティングするCDNを選択します。
    • Cache behavior: Lambda関数に適用するキャッシュビヘイビア。通常は*です。
    • CloudFront event:

      • Origin request: CloudFront CDNがバックエンドへデータを要求するときのみ関数を実行します。CDNがキャッシュレスポンスを返す場合は実行されません。
      • Viewer request: CloudFront CDNへのすべてのリクエストに対して関数を実行します。
    • Include bodyにチェックを入れます。

    • Confirm deploy to Lambda@Edgeにチェックを入れます。

    CloudFront関数のデプロイ

  8. レスポンス用のWallarm提供関数についても同様の手順を繰り返し、トリガーとしてレスポンスを選択します。

    レスポンストリガーがリクエストトリガーと一致していることを確認してください(Origin requestにはorigin response、Viewer requestにはviewer response)。

両方の関数はAWS Serverless Application Repository(SAR)から直接デプロイできます。関数は、Lambda@Edge関数に必要なリージョンであるus-east-1(N. Virginia)にデプロイされます。

  1. Wallarm policies on AWS Serverless Application RepositoryDeployに進みます。
  2. デプロイ設定はデフォルトのままとします。
  3. デプロイ完了後、作成されたIAMロール → Trust relationshipsに進み、以下のポリシーで両方のロール(リクエスト用とレスポンス用)を更新します:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": [
                        "edgelambda.amazonaws.com",
                        "lambda.amazonaws.com"
                    ]
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    
  4. AWS Console → ServicesLambdaFunctionsに進みます。

  5. serverlessrepo-wallarm-connector-RequestHandler-xxx関数を開きます。
  6. Codeタブで次のパラメータを更新します:

  7. ActionsDeploy to Lambda@Edgeに進み、次を指定します:

    • Configure new CloudFront trigger。
    • Distribution: 保護したいオリジンへトラフィックをルーティングするCDNを選択します。
    • Cache behavior: Lambda関数に適用するキャッシュビヘイビア。通常は*です。
    • CloudFront event:

      • Origin request: CloudFront CDNがバックエンドへデータを要求するときのみ関数を実行します。CDNがキャッシュレスポンスを返す場合は実行されません。
      • Viewer request: CloudFront CDNへのすべてのリクエストに対して関数を実行します。
    • Include bodyにチェックを入れます。

    • Confirm deploy to Lambda@Edgeにチェックを入れます。

    CloudFront関数のデプロイ

  8. AWS Console → ServicesLambdaFunctionsに戻ります。

  9. serverlessrepo-wallarm-connector-ResponseHandler-xxx関数を開きます。
  10. レスポンスをトリガーに選択して、同様の手順を繰り返します。

    レスポンストリガーがリクエストトリガーと一致していることを確認してください(Origin requestにはorigin response、Viewer requestにはviewer response)。

テスト

デプロイ済み関数の動作をテストするには、次の手順に従います:

  1. CloudFront CDNにテスト用のPath Traversal攻撃リクエストを送信します:

    curl http://<CLOUDFRONT_CDN>/etc/passwd
    
  2. Wallarm Console → AttacksセクションをUS CloudまたはEU Cloudで開き、攻撃が一覧に表示されていることを確認します。

    インターフェースのAttacks

    Wallarmノードのモードがblockingに設定され、トラフィックがインラインで流れている場合は、リクエストもブロックされます。

Lambda@Edge関数のアップグレード

デプロイ済みのLambda@Edge関数を新しいバージョンにアップグレードするには:

  1. Wallarm Console → Security EdgeConnectorsDownload code bundleに進み、更新版のWallarm Lambda@Edge関数をダウンロードします。

    自己ホストノードを使用している場合は、更新されたコードバンドルの入手についてsales@wallarm.comにお問い合わせください。

  2. デプロイ済みのLambda@Edge関数のコードを、更新版のバンドルに置き換えます。

    wlrm_node_addrwlrm_inlineなどの既存のパラメータ値は保持します。

    既存の関数トリガーは変更しません。

  3. Deployを実行して更新済み関数を反映します。

  1. 新しいバージョンの関数を用いて、2番目の手順で記載した手順を繰り返します。
  2. 更新版の関数をディストリビューションに関連付けた後、競合を避けるためにCloudFrontのトリガーから以前のバージョンの関数を削除します。

関数のアップグレードでは、特にメジャーバージョンアップの場合、Wallarmノードのアップグレードが必要になることがあります。自己ホストノードのリリースノートおよびアップグレード手順についてはNative Nodeの変更履歴を、エッジコネクタのアップグレード手順についてはEdge connectorのアップグレード手順を参照してください。非推奨を避け、将来のアップグレードを容易にするため、ノードの定期的な更新を推奨します。