

# AWS WAF を使用して API Gateway の REST API を保護する
<a name="apigateway-control-access-aws-waf"></a>

AWS WAF は、ウェブアプリケーションと API を攻撃から保護するウェブアプリケーションファイアウォールです。お客様が定義するカスタマイズ可能なウェブセキュリティルールと条件に基づいて、ウェブリクエストを許可、ブロック、またはカウントする一連のルール (ウェブアクセスコントロールリスト (ウェブ ACL) と呼ばれます) を設定することができます。詳細については、「[AWS WAF の仕組み](https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html)」を参照してください。

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

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

**重要**  
AWS WAF は、ウェブの脆弱性に対する防御の最前線です。API で AWS WAF が有効になっている場合は、[リソースポリシー](apigateway-resource-policies.md)、[IAM ポリシー](permissions.md)、[Lambda オーソライザー](apigateway-use-lambda-authorizer.md)、および [Amazon Cognito オーソライザー](apigateway-integrate-with-cognito.md)など他のアクセスコントロール機能の前に AWS WAF ルールが評価されます。たとえば、AWS WAF がリソースポリシーで許可されている CIDR ブロックからのアクセスをブロックした場合、AWS WAF が優先され、リソースポリシーは評価されません。

API に対して AWS WAF を有効にするには、次の操作を行う必要があります。

1. AWS WAF コンソール、AWS SDK、または CLI を使用して、AWS WAF マネージドルールと独自のカスタムルールを自由に組み合わせたウェブ ACL を作成します。詳細については、「[AWS WAF の開始方法](https://docs.aws.amazon.com/waf/latest/developerguide/getting-started.html)」と「[ウェブアクセスコントロールリスト (ウェブ ACL)](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl.html)」を参照してください。
**重要**  
API Gateway には、リージョナルアプリケーション用の AWS WAFV2 ウェブ ACL または AWS WAF Classic Regional ウェブ ACL が必要です。

1. AWS WAF ウェブ ACL を API ステージに関連付けます。これを行うには、AWS WAF コンソール、AWS SDK、CLI、または API Gateway コンソールを使用できます。

## API Gateway コンソールを使用して AWS WAF ウェブ ACL を API Gateway API ステージに関連付けるには
<a name="apigateway-control-access-aws-waf-console"></a>

API Gateway コンソールを使用して AWS WAF ウェブ ACL を既存の API Gateway API ステージに関連付けるには、次の手順を使用します。

1. API Gateway コンソール ([https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)) にサインインします。

1. 既存の API を選択するか、新しい API を作成します。

1. メインナビゲーションペインで、**[ステージ]** を選択してから、ステージを選択します。

1. **[ステージの詳細]** セクションで、**[編集]** を選択します。

1. **[ウェブアプリケーションファイアウォール (AWS WAF)]** で、ウェブ ACL を選択します。

   AWS WAFV2 を使用している場合は、リージョナルアプリケーション用の AWS WAFV2 ウェブ ACL を選択します。使用するウェブ ACL やその他の AWS WAFV2 リソースは、API と同じリージョンに存在している必要があります。

   AWS WAF Classic Regional を使用している場合は、リージョナルウェブ ACL を選択します。

1. [**Save changes**] (変更の保存) をクリックします。

## AWS CLI を使用して AWS WAF ウェブ ACL を API Gateway API ステージに関連付ける
<a name="apigateway-control-access-aws-waf-awscli"></a>

次の [associate-web-acl](https://docs.aws.amazon.com/cli/latest/reference/wafv2/associate-web-acl.html) コマンドは、リージョン別アプリケーションの AWS WAFV2 ウェブ ACL を既存の API Gateway API ステージに関連付けます。

```
aws wafv2 associate-web-acl \
--web-acl-arn  arn:aws:wafv2:{region}:111122223333:regional/webacl/test-cli/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
--resource-arn arn:aws:apigateway:{region}::/restapis/4wk1k4onj3/stages/prod
```

次の [associate-web-acl](https://docs.aws.amazon.com/cli/latest/reference/waf-regional/associate-web-acl.html) コマンドは、AWS WAF Classic Regional ウェブ ACL を既存の API Gateway API ステージに関連付けます。

```
aws waf-regional associate-web-acl \
--web-acl-id 'aabc123a-fb4f-4fc6-becb-2b00831cadcf' \
--resource-arn 'arn:aws:apigateway:{region}::/restapis/4wk1k4onj3/stages/prod'
```

## AWS WAF REST API を使用して AWS WAF ウェブ ACL を API ステージに関連付ける
<a name="apigateway-control-access-aws-waf-api"></a>

AWS WAFV2 REST API を使用してリージョナルアプリケーション用の AWS WAFV2 ウェブ ACL を既存の API Gateway API ステージに関連付けるには、次の例に示すように、[AssociateWebACL](https://docs.aws.amazon.com/waf/latest/APIReference/API_AssociateWebACL.html) コマンドを呼び出します。

```
import boto3
 
wafv2 = boto3.client('wafv2')

wafv2.associate_web_acl(
    WebACLArn='arn:aws:wafv2:{region}:111122223333:regional/webacl/test/abc6aa3b-fc33-4841-b3db-0ef3d3825b25',
    ResourceArn='arn:aws:apigateway:{region}::/restapis/4wk1k4onj3/stages/prod'
)
```

AWS WAF REST API を使用して AWS WAF Classic Regional ウェブ ACL を既存の API Gateway API ステージに関連付けるには、次の例に示すように、[AssociateWebACL](https://docs.aws.amazon.com/waf/latest/APIReference/API_wafRegional_AssociateWebACL.html) コマンドを呼び出します。

```
import boto3
 
waf = boto3.client('waf-regional')
 
waf.associate_web_acl(
    WebACLId='aabc123a-fb4f-4fc6-becb-2b00831cadcf',
    ResourceArn='arn:aws:apigateway:{region}::/restapis/4wk1k4onj3/stages/prod'
)
```