

# 在 API Gateway 中使用 AWS WAF 保护 REST API
<a name="apigateway-control-access-aws-waf"></a>

AWS WAF 是一个 Web 应用程序防火墙，可帮助保护 Web 应用程序和 API 免受攻击。通过它，您可以配置一组规则（称为 Web 访问控制列表，即 Web ACL），基于可自定义的 Web 安全规则以及您定义的条件，允许、阻止或统计 Web 请求。有关更多信息，请参阅 [AWS WAF 的工作原理](https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html)。

您可以使用 AWS WAF 保护 API Gateway REST API 免受常见的 Web 漏洞攻击，例如 SQL 注入和跨站脚本攻击（XSS）。这些威胁可能会影响 API 的可用性和性能、损害安全性或消耗过多的资源。例如，您可以创建规则以允许或阻止以下请求：来自指定 IP 地址范围的请求；来自 CIDR 块的请求；源自特定国家/地区或区域的请求；包含恶意 SQL 代码的请求；或者包含恶意脚本的请求。

您还可以创建与 HTTP 标头、方法、查询字符串、URI 和请求正文中的指定字符串或正则表达式模式匹配的规则（限制为前 64 KB）。此外，您可以创建规则来阻止来自特定用户代理、恶意机器人和内容抓取程序的攻击。例如，您可以使用基于速率的规则来指定每个客户端 IP 在尾随的、不断更新的 5 分钟期间内允许的 Web 请求数。

**重要**  
AWS WAF 是抵御 Web 漏洞攻击的第一道防线。在 API 上启用 AWS WAF 时，会先评估 AWS WAF 规则，然后再评估其他访问控制特征，例如[资源策略](apigateway-resource-policies.md)、[IAM 策略](permissions.md)、[Lambda 授权方](apigateway-use-lambda-authorizer.md)和 [Amazon Cognito 授权方](apigateway-integrate-with-cognito.md)。例如，如果 AWS WAF 阻止从资源策略允许的 CIDR 块进行访问，AWS WAF 将优先进行并且不评估资源策略。

要为 API 启用 AWS WAF，您需要执行以下操作：

1. 使用 AWS WAF 控制台、AWS SDK 或 CLI 创建一个 Web ACL，其中包含 AWS WAF 托管式规则和您自己的自定义规则的所需组合。有关更多信息，请参阅 [Getting Started with AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/getting-started.html) 和 [Web access control lists (web ACLs)](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl.html)。
**重要**  
API Gateway 需要区域应用程序的 AWS WAFV2 Web ACL 或 AWS WAF Classic Regional Web ACL。

1. 将 AWS WAF Web ACL 与 API 阶段关联。您可以使用 AWS WAF 控制台、AWS SDK、CLI 或使用 API Gateway 控制台来完成此操作。

## 使用 API Gateway 控制台将 AWS WAF Web ACL 与 API Gateway API 阶段相关联
<a name="apigateway-control-access-aws-waf-console"></a>

要使用 API Gateway 控制台将 AWS WAF Web ACL 与现有的 API Gateway API 阶段相关联，请按以下步骤操作：

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择现有 API 或者创建新 API。

1. 在主导航窗格中，选择**阶段**，然后选择一个阶段。

1. 在**阶段详细信息**部分中，选择**编辑**。

1. 在 **Web 应用程序防火墙（AWS WAF）**下，选择您的 Web ACL。

   如果您正在使用 AWS WAFV2，请为区域应用程序选择 AWS WAFV2 Web ACL。Web ACL 及其使用的任何其它 AWS WAFV2 资源都必须与您的 API 位于同一区域中。

   如果您使用的是 AWS WAF Classic Regional，请选择区域 Web ACL。

1. 选择 **Save changes（保存更改）**。

## 使用 AWS CLI 将 AWS WAF Web 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 Web 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 Web 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 Web ACL 与 API 阶段相关联
<a name="apigateway-control-access-aws-waf-api"></a>

要使用 AWS WAFV2 REST API 将区域应用程序的 AWS WAFV2 Web 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 Web 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'
)
```