使用防火牆控管存取權

防火牆可為 App Engine 應用程式提供不區別身分的存取權控管方法。您最多可以為 App Engine 防火牆定義 1000 項個別規則,藉此允許或限制特定範圍的 IP 位址和子網路。

如要設定防火牆,您必須先定義規則,用於指定優先順序值以及允許或拒絕的 IP 位址範圍,也可以選擇是否加註說明。

如要確保您以安全的方式來設定應用程式,以及設定適當的存取權層級,請參閱應用程式安全防護存取權控管

建構防火牆規則

App Engine 防火牆由規則排序清單組成,這類規則可允許或拒絕指定的 IP 位址或範圍存取您的應用程式,涵蓋範圍包括 App Engine 應用程式的所有資源。

防火牆規則是依重要性排序,而重要性則根據您對每項規則以數值定義的優先順序而定。您必須為每項規則指定專屬的優先順序值,因為此值可定義各規則相對於防火牆中其他規則的重要性。規則的優先順序值從 1 (最重要的值) 排列到 2147483647 (最不重要的值)。

每個防火牆各包含一項按 2147483647 優先順序而自動建立的 default 規則,且適用於應用程式的整個 IP 範圍。default 規則的評估順序一律次於防火牆的其他所有規則,並適用於所有 IP 位址的所有要求。

防火牆會先評估優先順序最高的規則。接下來再按順序評估防火牆中的其他規則,直到某項規則符合該要求的 IP 範圍。找到相符的規則後,防火牆就會允許或拒絕連線,並略過防火牆中所有其餘的規則。如果防火牆中所有手動定義的規則皆不符合要求,就會評估 default 規則。

比方說,如果您建立優先順序為 1 的規則,則一律先評估這項規則。如果傳入要求與優先順序為 1 的規則相符,則只會評估這項規則,並且會略過防火牆的所有其他規則,包括 default 規則在內。

以下防火牆範例說明規則的優先順序如何改變防火牆行為。

事前準備

針對應用程式建立防火牆之前,您必須具備下列其中一種 App Engine 身分與存取權管理角色,這些角色均擁有建立或修改防火牆規則的必要權限:

  • App Engine 管理員
  • 編輯者
  • 擁有者

如要使用 gcloud 工具或 Admin API,請先安裝並設定該項工具:

  • 下載、安裝並初始化 Google Cloud SDK 以使用 gcloud 工具:

    下載並安裝 SDK

  • 如需設定 GCP 專案和必要憑證的詳細資訊,請參閱存取 Admin API

禁止存取快取內容

App Engine 防火牆的前方有網路 Proxy 和瀏覽器等負責快取內容的機制。當這類機制快取內容時,會自特定網址公開提供內容,直到快取內容到期為止,即使建立新的防火牆規則,這類機制仍可以存取快取內容。

快取內容的預設到期時間是 10 分鐘。如需瞭解如何設定到期時間,請參閱靜態快取效期

如要避免內容遭快取,請使用 Cache-ControlExpires HTTP 回應標頭。如要進一步瞭解 HTTP 標頭,包括如何控管快取,請參閱避免快取

您可以針對靜態內容設定標準環境應用程式,以利設定 HTTP 回應標頭。如需瞭解如何在應用程式設定檔中設定 HTTP 回應標頭,請參閱要求的處理方式app.yaml 參考資料

允許從您的服務提出要求

建立規則時應考量下列要點:

  • 根據預設,任何與規則不相符的要求皆可存取您的應用程式。如要封鎖所有不符合特定規則的要求,必須將 default 規則設為 deny
  • 防火牆允許工作佇列和 Cron 流量,即使 default 規則設為 deny 也一樣。
  • 如要針對來自其他 App Engine 應用程式或服務的要求控管存取權,則您可能需要建立規則,以利配合用於進行服務對服務通訊的 IP 位址。如果您的應用程式會與 App Engine 中的其他應用程式或服務進行通訊,則必須考慮如何處理來自下列 IP 位址的要求:

    • 來自網址擷取服務的要求:0.1.0.40
      • 在標準環境中接收的要求:0.1.0.40
      • 在彈性環境中接收的要求:0.1.0.4010.0.0.1
    • 來自 Blobstore 或 Cloud Storage 的要求:0.1.0.30
    • 只在標準環境中接收的要求:
      • 應用程式部署要求:10.1.0.41

    範例

    您的應用程式含有在標準環境中執行的後端服務 (backend_std)。此服務會使用網址擷取服務,以與 backend_flex 通訊。

    您需要建立兩項用於允許要求的防火牆規則:

    • 0.1.0.40 - 此規則允許 backend_flex 接收來自 backend_std 的網址擷取要求。
    • 10.0.0.1 - 此規則允許針對 backend_flex 中的網址擷取要求進行服務對服務通訊。

建立防火牆規則

使用以下任一方法建立防火牆規則。每次建立規則時,都要重複下列步驟:

主控台

使用 GCP 主控台的「防火牆規則」頁面來建立防火牆規則:

  1. 前往 GCP 主控台中的「建立防火牆規則」頁面:

    前往建立防火牆規則頁面

  2. 指定防火牆規則的詳細資料:

    1. 在「優先順序」中輸入整數,指定規則的相對重要性,以及定義規則的評估順序。

      有效值是 12147483646。優先順序為 1 的規則是最先評估的規則。優先順序為 2147483647 的規則會最後評估,且該值會保留給 default 規則使用。

    2. 在「相符時執行的動作」中,指定是要允許還是拒絕符合規則的請求存取。設定為 allow 的規則會將要求轉送至應用程式。設定為 deny 的規則會以 403 Forbidden 錯誤回應要求。
    3. 在「IP 範圍」中,定義適用該項規則的 IP 位址範圍。定義 IP 位址範圍時必須使用 CIDR 標示法,此範圍可包含子網路遮罩,而且同時支援 IPv4 和 IPv6。
    4. 選填項目:在「說明」中新增規則的相關說明,長度不可超過 100 個字元。
  3. 按一下 [儲存] 即可建立規則。
  4. 測試規則,確定優先順序和操作會出現合乎預期行為:
    1. 按一下 [測試 IP 位址]
    2. 輸入您要驗證的 IP 位址,然後按一下 [測試],確保系統能夠正確評估對應規則。
gcloud

執行下列 gcloud app firewall-rules 指令來建立防火牆規則:

  1. 執行下列指令,建立防火牆規則:

    gcloud app firewall-rules create PRIORITY --action ALLOW_OR_DENY --source-range IP_RANGE --description DESCRIPTION
    其中:
    • 「PRIORITY」是介於 12147483646 之間的整數,用來定義規則的重要性,以及規則的評估順序。首先會評估優先順序為 1 的規則。優先順序 2147483647 會保留供 default 規則使用,並在最後才進行評估。
    • 「ALLOW_OR_DENY」指定允許或拒絕存取符合規則的要求。有效值為 allowdeny。設定為 allow 的規則會將要求轉送至應用程式。設定為 deny 的規則會以 403 Forbidden 錯誤回應要求。
    • 「IP_RANGE」定義適用該項規則的 IP 位址範圍。定義 IP 位址範圍時必須使用 CIDR 標示法,此範圍可包含子網路遮罩且同時支援 IPv4 和 IPv6。
    • 「DESCRIPTION」是選填的規則說明,長度不超過 100 個字元。
  2. 執行以下指令測試規則,確認優先順序和操作會出現合乎預期的行為:
    gcloud app firewall-rules test-ip IP_ADDRESS
    其中「IP_ADDRESS」是您要對防火牆進行測試的 IP 位址。
  3. 執行下列指令,查看現有規則的清單:
    gcloud app firewall-rules list
  4. 執行下列指令,刪除現有規則:
    gcloud app firewall-rules delete PRIORITY
    其中「PRIORITY」是待刪除規則的優先順序值。
範例:
以下範例可協助您建立防火牆:
  • 新增允許 IPv6 位址和子網路遮罩的規則,接著測試該項規則,確保其評估順序高於其他規則:

    gcloud app firewall-rules create 123 --source-range fe80::3636:3bff:fecc:8778/128 --action allow
    gcloud app firewall-rules test-ip fe80::3636:3bff:fecc:8778
  • 新增拒絕 IPv4 位址和子網路遮罩的規則,接著進行測試,確保系統會正確評估這項規則:

    gcloud app firewall-rules create 123456 --source-range "74.125.0.0/16" --action deny
    gcloud app firewall-rules test-ip 74.125.0.8
  • 更新並測試預設規則,確保這項規則會限制所有不符合其他任何規則的 IP 位址:

    gcloud app firewall-rules update default --action deny
    gcloud app firewall-rules test-ip 123.456.7.89
API

如要透過程式建立 App Engine 應用程式的防火牆規則,您可以在 Admin API 中使用 apps.firewall.ingressRules 方法。

如要測試防火牆規則以確保有預期的優先順序和動作,您可以使用 apps.firewall.ingressRules.list 方法,並在 matchingAddress 參數內指定您要測試的 IP 位址。

防火牆範例

在此範例中,某公司設定了防火牆,將工程小組和內部公司網路的存取權授予開發中應用程式。建立防火牆規則時,每個優先順序之間保留了較大的間隔值,以利因應增加規則之需。

優先順序 動作 IP 範圍 說明
1000 拒絕 192.0.2.1 拒絕 DoS 攻擊者存取。
2000 允許 198.51.100.2 允許分區辦公室的某位工程師存取。
3000 拒絕 198.51.100.0/24 拒絕所有非工程建築物的網路存取。
5000 允許 203.0.113.0/24 允許主建築物的網路存取。
2147483647 拒絕 * 預設動作

建立防火牆之後,假設系統會將下列要求導向範例應用程式,請注意應用程式的回應:

  • 來自 198.51.100.2 的要求符合優先順序為 2000 的規則,並且獲得允許。
  • 來自 198.51.100.100 的要求符合優先順序為 3000 的規則,因此遭到拒絕。
  • 來自 203.0.113.54 的要求符合優先順序為 5000 的規則,並且獲得允許。
  • 來自 45.123.35.242 的要求符合預設規則,因此遭到拒絕。

解決發生衝突的規則

舉例來說,假設將公司防火牆的兩個優先順序互換,如果將優先順序 2000 和 3000 的規則互換,請留意以下非預期的行為。

優先順序 動作 IP 範圍 說明
1000 拒絕 192.0.2.1 拒絕 DoS 攻擊者存取。
2000 拒絕 198.51.100.0/24 拒絕所有非工程建築物的網路存取。
3000 允許 198.51.100.2 允許分區辦公室的某位工程師存取。
5000 允許 203.0.113.0/24 允許主建築物的網路存取。
2147483647 拒絕 * 預設動作

由於新的規則優先順序會讓該規則永遠不受評估,因此分區辦公室裡的工程師將無法存取公司的應用程式。儘管規則允許存取該名工程師的 IP 位址 198.51.100.2,但該名工程師的 IP 位址符合拒絕 198.51.100.0/24 此一範圍中所有非工程師的這項規則。

如要修正這個問題,您為允許存取 198.51.100.2 之規則所設定的優先順序,必須高於拒絕存取 198.51.100.0/24 此一 IP 範圍之規則的優先順序。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Java 適用的 App Engine 標準環境