你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
保护发送到 Azure Front Door 源的流量
当流量仅流经 Front Door 时,Front Door 的功能最佳。 应将源配置为阻止尚未通过 Front Door 发送的流量。 否则,流量可能会绕过 Front Door 的 Web 应用程序防火墙、DDoS 防护和其他安全功能。
注意
本文中的“源”和“源组”指的是 Azure Front Door(经典版)配置的后端和后端池。
Front Door 提供多种方法用于限制源流量。
专用链接源
使用 Front Door 的高级 SKU 时,可以使用专用链接将流量发送到源。 详细了解专用链接源。
应将源配置为禁止不通过专用链接的流量。 限制流量的方式取决于所用的专用链接源类型:
- 使用专用链接时,Azure 应用服务和 Azure Functions 会自动禁用通过公共 Internet 终结点进行访问。 有关详细信息,请参阅对 Azure Web 应用使用专用终结点。
- Azure 存储提供可用于拒绝来自 Internet 的流量的防火墙。 有关详细信息,请参阅配置 Azure 存储防火墙和虚拟网络。
- 使用 Azure 专用链接服务的内部负载均衡器不可公开路由。 还可以配置网络安全组,以确保禁止从 Internet 访问虚拟网络。
基于公共 IP 地址的源
使用基于公共 IP 地址的源时,应该同时使用两种方法来确保流量流经 Front Door 实例:
- 配置 IP 地址筛选,以确保仅接受从 Front Door IP 地址范围对源发出的请求。
- 配置应用程序,以验证由 Front Door 附加到所有对源的请求中的
X-Azure-FDID
标头值,并确保其值与 Front Door 的标识符匹配。
IP 地址筛选
为源配置 IP 地址筛选,以仅接受来自 Azure Front Door 后端 IP 地址空间和 Azure 基础结构服务的流量。
AzureFrontDoor.Backend 服务标记提供可供 Front Door 用来连接到源的 IP 地址列表。 可以在网络安全组规则中使用此服务标记。 还可以下载 Azure IP 范围和服务标记数据集,该数据集中的 IP 地址会定期更新。
还应该允许 Azure 基本基础结构服务通过虚拟主机 IP 地址 168.63.129.16
和 169.254.169.254
发送的流量。
警告
Front Door 的 IP 地址空间会定期更改。 确保使用 AzureFrontDoor.Backend 服务标记,而不要硬编码 IP 地址。
Front Door 标识符
仅凭 IP 地址筛选并不足以保护发送到源的流量,因为其他 Azure 客户使用相同的 IP 地址。 还应该配置源以确保流量源自你的 Front Door 配置文件。
Azure 为每个 Front Door 配置文件生成唯一标识符。 可以在 Azure 门户中找到该标识符,它就是你的个人资料“概述”页中的“Front Door ID”值。
当 Front Door 向源发出请求时,它会添加 X-Azure-FDID
请求头。 源应检查传入请求中的标头,并拒绝其值与 Front Door 配置文件标识符不匹配的请求。
配置示例
以下示例演示如何保护不同类型的源。
可以使用应用服务访问限制来执行 IP 地址筛选和标头筛选。 该功能由平台提供,你无需更改应用程序或主机。
应用程序网关部署到虚拟网络中。 配置网络安全组规则以允许 AzureFrontDoor.Backend 服务标记在端口 80 和 443 上进行入站访问,并禁止 Internet 服务标记在端口 80 和 443 上发送入站流量。
使用自定义 WAF 规则检查 X-Azure-FDID
标头值。 有关详细信息,请参阅在应用程序网关上创建和使用 Web 应用程序防火墙 v2 自定义规则。
要使用容器的应用程序网关在 Azure Kubernetes 服务 (AKS) 中配置流量路由,请使用 X-Azure-FDID 标头设置 HTTPRoute 规则,以匹配来自 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
后续步骤