AWS WAF を使用して API を保護する - AWS AppSync

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS WAF を使用して API を保護する

AWS WAF は、ウェブアプリケーションと API を攻撃から保護するウェブアプリケーションファイアウォールです。お客様が定義するカスタマイズ可能なウェブセキュリティルールと条件に基づいて、ウェブリクエストを許可、ブロック、またはモニタリング (カウント) する一連のルール (ウェブアクセスコントロールリストまたはウェブ ACL と呼ばれます) を設定することができます。AWS AppSync API を AWS WAF と統合すると、API で受け入れられる HTTP トラフィックをより詳細に制御し、可視化できます。AWS WAF の詳細については、「AWS WAF開発者ガイド」のどのようにAWS WAF機能するかを参照してください。

AWS WAF を使用して、SQL インジェクションやクロスサイトスクリプティング (XSS) 攻撃など、一般的なウェブエクスプロイトから AppSync API を保護できます。これらは、API の可用性とパフォーマンスに影響を与え、セキュリティを侵害したり、過剰なリソースを消費したりする可能性があります。例えば、指定した IP アドレス範囲からのリクエスト、CIDR ブロックからのリクエスト、特定の国またはリージョンからのリクエスト、悪意のある SQL コードを含むリクエスト、悪意のあるスクリプトを含むリクエストを許可またはブロックするルールを作成できます。

また、HTTP ヘッダー、メソッド、クエリ文字列、URI、およびリクエストボディの指定された文字列または定型表現パターン (最初の 8 KB に制限されます) に一致するルールを作成することもできます。さらに、特定のユーザーエージェント、悪質なボット、またはコンテンツスクレーパーからの攻撃をブロックするルールを作成できます。例えば、レートベースのルールを使用して、継続的に更新される後続の 5 分間で、各クライアント IP によって許可されるウェブリクエストの数を指定できます。

サポートされているルールのタイプと追加の AWS WAF 機能の詳細については、「AWS WAFデベロッパーガイド」と「AWS WAFAPI リファレンス」を参照してください。

重要

AWS WAF は、ウェブの脆弱性に対する防御の最前線です。API で AWS WAF が有効になっている場合は、API キー認証、IAM ポリシー、OIDC トークン、および Amazon Cognito ユーザープールなど他のアクセスコントロール機能の前に AWS WAF ルールが評価されます。

AppSync API の AWS WAF との統合

AWS Management Console、AWS CLI、AWS CloudFormation、またはその他の互換性のあるクライアントを使用すると、Appsync API を AWS WAF と統合することができます。

AWS AppSync API を AWS WAF と統合するには
  1. AWS WAF Web ACL を作成する AWS WAFコンソールを使用する詳細なステップについては、「ウェブ ACL の作成」を参照してください。

  2. ウェブ ACL のルールを定義します。1 つまたは複数のルールが、ウェブ ACL を作成するプロセスで定義されます。ルールを構成する方法の詳細については、AWS WAFルールを参照してください。AWS AppSync API に定義できる便利なルールの例については、ウェブ ACL のルールの作成 を参照してください。

  3. AWS AppSync API をウェブ ACL に関連付けます。このステップは、AWS WAFコンソールまたは、AppSync コンソールで実行できます。

    • ウェブ ACL を AWS WAF コンソールの AWS AppSync API に関連付けるには、AWS WAFデベロッパーガイドのウェブ ACL の AWS リソースとの関連付けまたは関連付けの解除の指示に従ってください。

    • ウェブ ACL をAWS AppSync コンソールの AWS AppSync API に関連付けるには

      1. AWS Management Console にサインインしてAppSync コンソールを開きます。

      2. ウェブ ACL に関連付ける API を選択します。

      3. ナビゲーションペインで [設定] を選択します。

      4. Web アプリケーションファイアウォールセクションで、有効化AWS WAFをオンにします。

      5. ウェブ ACLドロップダウンリストで、API に関連付けるウェブ ACL の名前を選択します。

      6. 保存を選択してウェブ ACL を API に関連付けます。

注記

AWS WAF コンソールでウェブ ACL を作成した後、新しいウェブ ACL が利用できるようになるまで、数分かかります。Web アプリケーションファイアウォールメニューで新しく作成されたウェブ ACL が表示されない場合、数分待ってから、ウェブ ACL を API に関連付ける手順を再試行します。

注記

AWS WAF 統合では、AWS AppSync がリアルタイムエンドポイントの Subscription registration message イベントのみをサポートしています。Subscription registration message が AWS WAF によってブロックされた場合は、start_ack メッセージではなくエラーメッセージで応答します。

ウェブ ACL を AWS AppSync APIに関連付けると、ウェブ ACL はAWS WAF API でを使用して管理できます。別のウェブ ACL に AWS AppSync API を関連付ける場合を除いて、ウェブ ACL に AWS AppSync API を再度関連付ける必要はありません。

ウェブ ACL のルールの作成

ルールは、ウェブリクエストの検査方法と、ウェブリクエストが検査基準に一致した場合の処理を定義します。ルールは、AWS WAF に単独で存在するわけではありません。ルールが定義されているルールグループまたはウェブ ACL に含まれる名前を使用してルールにアクセスします。詳細については、「AWS WAF ルール」を参照してください。次の例は、AppSync API の保護に役立つルールを定義し、関連付ける方法を示しています。

例 リクエストボディのサイズを制限するウェブ ACL ルール

次に、リクエストのボディサイズを制限するルールの例を示します。AWS WAF コンソールでウェブ ACL を作成する場合、これがルール JSON エディタに入力されます。

{ "Name": "BodySizeRule", "Priority": 1, "Action": { "Block": {} }, "Statement": { "SizeConstraintStatement": { "ComparisonOperator": "GE", "FieldToMatch": { "Body": {} }, "Size": 1024, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } }, "VisibilityConfig": { "CloudWatchMetricsEnabled": true, "MetricName": "BodySizeRule", "SampledRequestsEnabled": true } }

前述のルール例を使用してウェブ ACL を作成したら、それを AppSync API に関連付ける必要があります。この手順は、AWS Management Console を使用するかわりに、AWS CLI で次のコマンドを実行することでも実行できます。

aws waf associate-web-acl --web-acl-id waf-web-acl-arn --resource-arn appsync-api-arn

変更が伝播されるまで数分かかる場合がありますが、このコマンドを実行した後、1024 バイトを超える本文を含む要求は、AWS AppSync によって拒否されます。

注記

AWS WAF コンソールで新しいウェブ ACL を作成した後、ウェブ ACL と API との関連付けが利用できるようになるまで、数分かかります。CLI コマンドを実行して、WAFUnavailableEntityException エラーを取得し、数分待ってからコマンドを再実行してください。

例 単一の IP アドレスからの要求を制限するウェブ ACL ルール

以下は、5 分間の単一の IP アドレスからの 100 リクエストに AppSync API をスロットリングするルールの例です。AWS WAF コンソールのレートベースのルールを使用してウェブ ACL を作成する場合、これはルール JSON エディタに入力されます。

{ "Name": "Throttle", "Priority": 0, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "Throttle" }, "Statement": { "RateBasedStatement": { "Limit": 100, "AggregateKeyType": "IP" } } }

前述のルール例を使用してウェブ ACL を作成したら、それを AppSync API に関連付ける必要があります。次のコマンドを実行して、AWS CLI のこのステップを実行します。

aws waf associate-web-acl --web-acl-id waf-web-acl-arn --resource-arn appsync-api-arn
例 API に対するすべての GraphQL __schema イントロスペクションクエリを防止するためのウェブ ACL ルール

次に、API に対するすべての G GraphQL __schema イントロスペクションクエリを禁止するルールの例を示します。文字列「__schema」を含む HTTP ボディはすべてブロックされまtあとす。AWS WAF コンソールでウェブ ACL を作成する場合、これがルール JSON エディタに入力されます。

{ "Name": "BodyRule", "Priority": 5, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "BodyRule" }, "Statement": { "ByteMatchStatement": { "FieldToMatch": { "Body": {} }, "PositionalConstraint": "CONTAINS", "SearchString": "__schema", "TextTransformations": [ { "Type": "NONE", "Priority": 0 } ] } } }

前述のルール例を使用してウェブ ACL を作成したら、それを AppSync API に関連付ける必要があります。次のコマンドを実行して、AWS CLI のこのステップを実行します。

aws waf associate-web-acl --web-acl-id waf-web-acl-arn --resource-arn appsync-api-arn