Azure Web App+SQL私有端点零信任架构配置与测试咨询
Azure Web App与SQL零信任协作配置及问题排查
一、私有DNS生效验证方法
私有DNS仅在关联的VNet内部生效,测试需在VNet内资源(如你的Web App)中执行:
- 登录Web App的Kudu控制台,运行命令:
nslookup <你的SQL服务器名>.database.windows.net- 若返回私有端点所在子网的IP,说明私有DNS正常工作;
- 若返回公网IP,检查:
- 私有DNS区域
privatelink.database.windows.net是否已关联Web App所在的VNet; - SQL私有端点的DNS记录是否自动注册到该私有DNS区域;
- Web App的VNet集成是否已正确配置,确保其使用VNet内的DNS解析。
- 私有DNS区域
注:本地环境未通过VPN/ExpressRoute接入VNet时,直接nslookup会返回公网IP,属于正常现象。
二、关闭SQL公网访问
SQL仍能通过公网访问是因为默认公网访问处于开启状态,需关闭:
Terraform配置示例
resource "azurerm_mssql_server" "example" { # 其他基础配置... public_network_access_enabled = false # 关闭公网访问 }
关闭后,SQL仅接受来自私有端点、VNet集成资源或信任服务的流量。
三、实现零信任入站规则:仅允许Web App访问SQL
- 配置SQL VNet防火墙规则
添加Web App集成子网的CIDR到SQL允许列表,确保只有该子网的流量能访问SQL:
resource "azurerm_mssql_virtual_network_rule" "webapp_access" { name = "webapp-sql-access-rule" server_id = azurerm_mssql_server.example.id subnet_id = azurerm_subnet.webapp_integration.id ignore_missing_vnet_service_endpoint = true # 若子网未开启SQL服务端点可设为true,建议优先开启服务端点 }
- 强化身份验证(可选)
禁用SQL账号登录,改用Azure AD身份验证,让Web App通过托管标识访问SQL,进一步缩小授权范围:
resource "azurerm_mssql_active_directory_administrator" "example" { server_name = azurerm_mssql_server.example.name resource_group_name = azurerm_resource_group.example.name login_username = "sql-ad-admin" object_id = "<Azure AD组/用户的Object ID>" tenant_id = data.azurerm_client_config.current.tenant_id }
四、实现零信任出站规则:SQL仅能向Web App发起流量
通过SQL所在子网的NSG(网络安全组)限制出站流量:
- 拒绝默认所有出站流量
NSG默认允许所有出站,需添加优先级较高的拒绝规则:
resource "azurerm_network_security_rule" "deny_all_outbound" { name = "DenyAllOutbound" priority = 100 direction = "Outbound" access = "Deny" protocol = "*" source_port_range = "*" destination_port_range = "*" destination_address_prefix = "*" resource_group_name = azurerm_resource_group.example.name network_security_group_name = azurerm_network_security_group.sql_subnet.name }
- 添加允许访问Web App的出站规则
允许SQL访问Web App的出站IP(若Web App配置了私有端点,可替换为私有IP范围):
resource "azurerm_network_security_rule" "allow_sql_to_webapp" { name = "AllowSQLToWebApp" priority = 50 # 优先级高于拒绝规则 direction = "Outbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "443" # Web App HTTPS端口 destination_address_prefixes = split(",", azurerm_app_service.example.outbound_ip_addresses) resource_group_name = azurerm_resource_group.example.name network_security_group_name = azurerm_network_security_group.sql_subnet.name }
- 补充必要系统流量(可选)
若SQL需要Azure AD验证、日志上传等系统流量,可添加允许到特定Azure服务的规则(如destination_address_prefix = "AzureCloud.<你的区域>"),但需最小化授权范围。
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

