使用防火牆控管存取權

防火牆能夠為 App Engine 應用程式提供規則化的權限控制方式,不須依賴身分驗證機制。您最多可以為 App Engine 防火牆定義 1000 項個別規則,藉此允許或限制特定範圍的 IP 位址和子網路。

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

如要確保您已採取了安全的應用程式設定方式,同時也設定了適當的存取權層級,請參閱應用程式安全防護存取權控管等文。

建構防火牆規則

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

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

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

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

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

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

事前準備

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

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

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

  • 請下載、安裝 Google Cloud SDK,然後將 Google Cloud SDK 初始化,以便使用 gcloud 工具:

    下載並安裝 SDK

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

避免存取快取內容

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

如要避免內容遭到快取,請使用 Cache-ControlExpires HTTP 回應標頭。如要進一步瞭解這些 HTTP 標頭 (包含如何控制快取),請參閱避免快取

允許服務發出的要求

我們建議您在建立規則時,考慮到下列幾點事項:

  • 根據預設,所有與規則不相符的要求皆可存取您的應用程式。如要封鎖所有不符合特定規則的要求,您必須將 default 規則設為 deny
  • 即使 default 規則已設為 deny,防火牆還是會允許工作佇列和 Cron 流量通過。
  • 如要控管來自其他 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 主控台的「Firewall rules」(防火牆規則) 頁面來建立防火牆規則:

  1. 前往 GCP 主控台中的「Create a firewall rule」(建立防火牆規則) 頁面:

    前往「Create a firewall rule」(建立防火牆規則) 頁面

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

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

      有效值是 12147483646。優先順序為 1 的規則,會最先受到評估。優先順序 2147483647 則保留給「預設」規則,這項規則最後才會受到評估。

    2. 在「Action on match」(相符時執行的動作) 中,指定要允許或拒絕符合規則的存取要求。設定為 allow 的規則會把要求轉送至應用程式。而設定為 deny 的規則,會以 403 Forbidden 錯誤來回應要求。
    3. 在「IP range」(IP 範圍) 中,定義適用於該規則的 IP 位址範圍。IP 位址範圍必須以 CIDR 標示法來定義,且可包含子網路遮罩,同時支援 IPv4 和 IPv6。
    4. 選填項目:在「Description」(說明) 中新增規則的相關說明,但長度不可超過 100 個字元。
  3. 按一下 [Save] (儲存) 來建立規則。
  4. 測試規則,以確保優先順序和動作會提供合乎您預期的行為:
    1. 按一下 [Test IP address] (測試 IP 位址)
    2. 輸入您要驗證的 IP 位址,然後按一下 [測試] (Test),以確保對應的規則會受到正確的評估。
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 則保留給「預設」規則,這項規則最後才會受到評估。
    • 「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 存取的規則,把優先順序設定為高於拒絕 IP 範圍 198.51.100.0/24 存取的規則。

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

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

這個網頁
Java 適用的 App Engine 彈性環境文件