

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 AWS WAF 來保護您的 AWS AppSync APIs
<a name="WAF-Integration"></a>

AWS WAF 是一種 Web 應用程式防火牆，可協助保護 Web 應用程式和 APIs免受攻擊。它可讓您設定一組稱為 Web 存取控制清單 (Web ACL) 的規則，根據您定義的可自訂 Web 安全規則和條件來允許、封鎖或監控 （計數） Web 請求。當您將 AWS AppSync API 與 整合時 AWS WAF，您可以對 API 接受的 HTTP 流量獲得更多控制和可見性。若要進一步了解 AWS WAF，請參閱《 AWS WAF 開發人員指南》中的 [AWS WAF 運作方式](https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html)。

您可以使用 AWS WAF 來保護 AppSync API 免受常見的 Web 入侵，例如 SQL Injection 和跨網站指令碼 (XSS) 攻擊。這些可能會影響 API 可用性和效能、危及安全性，或耗用過多的資源。例如，您可以建立規則，允許或封鎖來自指定 IP 地址、來自 CIDR 區塊的請求，或源自特定國家或區域，其中包含惡意 SQL 程式碼或惡意指令碼的請求。

您也可以建立規則，以符合在 HTTP 標頭、方法、查詢字串、URI 和請求本文 (限於前 8 KB) 的指定字串或常規表達式模式。此外，您可以建立規則以封鎖來自特定使用者代理程式、惡意機器人和內容抓取器的攻擊。例如，您可以使用以速率為基礎的規則，以指定每個用戶端 IP 在尾隨、持續更新的 5 分鐘期間，允許的 Web 請求數。

若要進一步了解支援的規則類型和其他 AWS WAF 功能，請參閱 [AWS WAF 開發人員指南](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html)和 [AWS WAF API 參考](https://docs.aws.amazon.com/waf/latest/APIReference/API_Types_AWS_WAFV2.html)。

**重要**  
AWS WAF 是您防範 Web 入侵的第一道防線。在 API 上啟用 AWS WAF 時，會在其他存取控制功能之前評估 AWS WAF 規則，例如 API 金鑰授權、IAM 政策、OIDC 權杖和 Amazon Cognito 使用者集區。

## 將 AppSync API 與 整合 AWS WAF
<a name="integrate-API-with-WAF"></a>

您可以使用 AWS CLI AWS CloudFormation、 或任何其他相容的用戶端，將 Appsync API 與 AWS WAF AWS 管理主控台整合。

**將 AWS AppSync API 與 整合 AWS WAF**

1. 建立 AWS WAF Web ACL。如需使用[AWS WAF 主控台](https://console.aws.amazon.com/waf/)的詳細步驟，請參閱[建立 Web ACL](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-creating.html)。

1. 定義 Web ACL 的規則。規則會在建立 Web ACL 的過程中定義。如需如何建構規則的資訊，請參閱 [AWS WAF 規則](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html)。如需您可以為 AWS AppSync API 定義的實用規則範例，請參閱 [建立 Web ACL 的規則](#Creating-web-acl-rules)。

1. 將 Web ACL 與 AWS AppSync API 建立關聯。您可以在 [AWS WAF 主控台](https://console.aws.amazon.com/wafv2/)或 [AppSync 主控台](https://console.aws.amazon.com/appsync/)中執行此步驟。
   + 若要將 Web ACL 與 AWS WAF 主控台中的 AWS AppSync API 建立關聯，請遵循《 AWS WAF 開發人員指南》中[建立或取消 Web ACL 與 AWS 資源的關聯](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-associating-aws-resource.html)的指示。
   + 在主控台中 AWS AppSync 將 Web ACL 與 AWS AppSync API 建立關聯

     1. 登入 AWS 管理主控台 並開啟 [AppSync 主控台](https://console.aws.amazon.com/appsync/)。

     1. 選擇您要與 Web ACL 建立關聯的 API。

     1. 在導覽窗格中，選擇**設定**。

     1. 在 **Web 應用程式防火牆**區段中，開啟**啟用 AWS WAF**。

     1. 在 **Web ACL** 下拉式清單中，選擇要與您的 API 建立關聯的 Web ACL 名稱。

     1. 選擇**儲存**，將 Web ACL 與您的 API 建立關聯。

   

**注意**  
在 AWS WAF 主控台中建立 Web ACL 之後，可能需要幾分鐘的時間才能使用新的 Web ACL。如果您在 Web **應用程式防火牆**功能表中沒有看到新建立的 Web ACL，請等待幾分鐘，然後重試將 Web ACL 與您的 API 建立關聯的步驟。

**注意**  
AWS WAF 整合僅支援即時端點`Subscription registration message`的事件。 AWS AppSync 會以錯誤訊息回應，而不是針對 `Subscription registration message`封鎖的任何`start_ack`訊息 AWS WAF。

將 Web ACL 與 AWS AppSync API 建立關聯後，您將使用 AWS WAF APIs管理 Web ACL。除非您想要將 AWS AppSync API 與不同的 Web ACL 建立關聯，否則您不需要重新建立 Web ACL 與 AWS AppSync API 的關聯。

## 建立 Web ACL 的規則
<a name="Creating-web-acl-rules"></a>

規則定義如何檢查 Web 請求，以及當 Web 請求符合檢查條件時該怎麼做。規則本身不存在於 中 AWS WAF 。您可以在規則群組中或定義規則的 Web ACL 中，依名稱存取規則。如需詳細資訊，請參閱 [AWS WAF 規則](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html)。下列範例示範如何定義和關聯有助於保護 AppSync API 的規則。

**Example 限制請求內文大小的 Web ACL 規則**  
以下是限制請求內文大小的規則範例。在 AWS WAF 主控台中建立 Web 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
        }
}
```
使用上述範例規則建立 Web ACL 之後，您必須將其與 AppSync API 建立關聯。除了使用 之外 AWS 管理主控台，您也可以 AWS CLI 執行下列命令，在 中執行此步驟。  

```
aws waf associate-web-acl --web-acl-id waf-web-acl-arn --resource-arn appsync-api-arn
```
變更可能需要幾分鐘的時間才能傳播，但在執行此命令之後，包含大於 1024 個位元組內文的請求將被 拒絕 AWS AppSync。  
在 AWS WAF 主控台中建立新的 Web ACL 之後，可能需要幾分鐘的時間，Web ACL 才能與 API 建立關聯。如果您執行 CLI 命令並發生錯誤`WAFUnavailableEntityException`，請等待幾分鐘，然後重試執行命令。

**Example 限制來自單一 IP 地址請求的 Web ACL 規則**  
以下是將 AppSync API 從單一 IP 地址調節至 100 個請求的規則範例。在 AWS WAF 主控台中使用以速率為基礎的規則建立 Web ACL 時，這會輸入**規則 JSON 編輯器**。  

```
{
  "Name": "Throttle",
  "Priority": 0,
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "Throttle"
  },
  "Statement": {
    "RateBasedStatement": {
      "Limit": 100,
      "AggregateKeyType": "IP"
    }
  }
}
```
使用上述範例規則建立 Web ACL 之後，您必須將其與 AppSync API 建立關聯。您可以執行下列命令 AWS CLI ，在 中執行此步驟。  

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

**Example Web ACL 規則，以防止 GraphQL \$1\$1結構描述對 API 的自我檢查查詢**  
以下是防止 GraphQL \$1\$1schema 向 API 進行自我檢查的規則範例。任何包含字串 "\$1\$1schema" 的 HTTP 內文都會遭到封鎖。在 AWS WAF 主控台中建立 Web 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
        }
      ]
    }
  }
}
```
使用上述範例規則建立 Web ACL 之後，您必須將其與 AppSync API 建立關聯。您可以執行下列命令 AWS CLI ，在 中執行此步驟。  

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