保護流向 Azure Front Door 來源的流量
Front Door 的功能在流量僅流經 Front Door 時的效果最佳。 您應該將來源設定為封鎖未透過 Front Door 傳送的流量。 否則,流量可能會略過 Front Door 的 Web 應用程式防火牆、DDoS 保護及其他安全性功能。
注意
本文章中的來源和來源群組是指 Azure Front Door (傳統) 設定的後端和後端集區。
Front Door 提供數種方法,可讓您用來限制原始流量。
Private Link 原點
當您使用 Front Door 的進階 SKU 時,可以使用 Private Link 將流量傳送至來源。 深入了解 Private Link 來源。
您應該將來源設定為不允許未通過 Private Link 的流量。 限制流量的方式取決於您使用的 Private Link 來源類型:
- 當您使用 Private Link 時,Azure App Service 和 Azure Functions 會自動停用透過公用網際網路端點的存取。 如需詳細資訊,請參閱針對 Azure Web 應用程式使用私人端點。
- Azure 儲存體提供防火牆,可讓您用於拒絕來自網際網路的流量。 如需詳細資訊,請參閱設定 Azure 儲存體防火牆和虛擬網路。
- 具有 Azure Private Link 服務的內部負載平衡器無法公開路由傳送。 您也可以設定網路安全性群組,以確保您不允許從網際網路存取您的虛擬網路。
公用 IP 位址型來源
當您使用公用 IP 位址型來源時,應該同時使用兩個方法來確保流量會流經 Front Door 執行個體:
- 設定 IP 位址篩選,以確保只接受來自 Front Door IP 位址範圍內對您來源的要求。
- 設定您的應用程式以驗證
X-Azure-FDID
標頭值,Front Door 會將其附加至對來源的所有要求,並確保其值符合您 Front Door 的識別碼。
IP 位址篩選
為您的來源設定 IP 位址篩選,僅接受來自 Azure Front Door 後端 IP 位址空間和 Azure 基礎結構服務的流量。
AzureFrontDoor.Backend 服務標籤會提供 Front Door 用於連線到來源的 IP 位址清單。 您可以在網路安全性群組規則內使用此服務標籤。 您也可以下載 Azure IP 範圍和服務標籤資料集,此資料集會定期以最新的 IP 位址更新。
您也應該允許透過虛擬化主機 IP 位址 168.63.129.16
和 169.254.169.254
且來自 Azure 基本基礎結構服務的流量。
警告
Front Door 的 IP 位址空間會定期變更。 請確定您使用的是 AzureFrontDoor.Backend 服務標籤,而不是將 IP 位址寫入程式碼。
Front Door 識別碼
單獨篩選 IP 位址並不足以保護流向您來源的流量,因為其他 Azure 客戶會使用相同的 IP 位址。 您也應該設定來源,以確保流量源自「您的」Front Door 設定檔。
Azure 會為每個 Front Door 設定檔產生唯一識別碼。 您可以在 Azure 入口網站中,於設定檔的 [概觀] 頁面中尋找「Front Door 識別碼」值,以找到識別碼。
當 Front Door 向您的來源提出要求時,它會新增 X-Azure-FDID
要求標頭。 您的來源應該檢查傳入要求上的標頭,並拒絕值與您 Front Door 設定檔識別碼不符的要求。
範例設定
下列範例示範如何保護不同類型的來源。
應用程式閘道會部署到您的虛擬網路。 設定網路安全性群組規則,以允許來自 AzureFrontDoor.Backend 服務標籤且在連接埠 80 和 443 上的輸入存取,而且不允許來自 Internet 服務標籤且在連接埠 80 和 443 上的輸入流量。
使用自訂 WAF 規則來檢查 X-Azure-FDID
標頭值。 如需詳細資訊,請參閱建立和使用應用程式閘道上的 Web 應用程式防火牆第 2 版自訂規則。
若要使用適用於容器的 應用程式閘道 在 Azure Kubernetes Service (AKS) 中設定流量路由,請設定 HTTPRoute 規則,以使用 X-Azure-FDID 標頭比對來自 Azure Front Door 的連入流量。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-route
namespace: {namespace}
spec:
parentRefs:
- name: {gateway-name}
rules:
- matches:
- headers:
- type: Exact
name: X-Azure-FDID
value: "xxxxxxxx-xxxx-xxxx-xxxx-xxx"
backendRefs:
- name: {backend-name}
port: {port}
當您在 Azure 裝載的虛擬機器上執行 Microsoft Internet Information Services (IIS) 時,您應該在裝載虛擬機器的虛擬網路中建立網路安全性群組。 設定網路安全性群組規則,以允許來自 AzureFrontDoor.Backend 服務標籤且在連接埠 80 和 443 上的輸入存取,而且不允許來自 Internet 服務標籤且在連接埠 80 和 443 上的輸入流量。
使用類似下列範例的 IIS 設定檔,來檢查您傳入要求上的 X-Azure-FDID
標頭:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Filter_X-Azure-FDID" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
<add input="{HTTP_X_AZURE_FDID}" pattern="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
當您使用 NGINX 輸入控制器執行 AKS 時,應該在裝載 AKS 叢集的虛擬網路中建立網路安全性群組。 設定網路安全性群組規則,以允許來自 AzureFrontDoor.Backend 服務標籤且在連接埠 80 和 443 上的輸入存取,而且不允許來自 Internet 服務標籤且在連接埠 80 和 443 上的輸入流量。
使用類似下列範例的 Kubernetes 輸入設定檔,來檢查您傳入要求上的 X-Azure-FDID
標頭:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontdoor-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/enable-modsecurity: "true"
nginx.ingress.kubernetes.io/modsecurity-snippet: |
SecRuleEngine On
SecRule &REQUEST_HEADERS:X-Azure-FDID \"@eq 0\" \"log,deny,id:106,status:403,msg:\'Front Door ID not present\'\"
SecRule REQUEST_HEADERS:X-Azure-FDID \"@rx ^(?!xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).*$\" \"log,deny,id:107,status:403,msg:\'Wrong Front Door ID\'\"
spec:
#section omitted on purpose
下一步