使用防火牆控管存取權

防火牆提供跨身分存取 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,接著將其初始化以使用 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 主控台的「防火牆規則」頁面建立防火牆規則:

  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 符合拒絕 198.51.100.0/24 範圍中所有非屬工程部門建築物的規則,而且這項規則優先於允許該名工程師 IP 位址存取的規則。

如要修正這個問題,可允許 198.51.100.2 存取的規則的優先順序必須高於拒絕 198.51.100.0/24 IP 範圍存取的規則。

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

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

這個網頁
Node.js 適用的 App Engine 彈性環境文件