【发布时间】:2022-08-19 03:08:25
【问题描述】:
我试图更好地了解 Web 应用程序和 sql 如何在 vnet 和不同的子网中一起运行,但是 Microsoft 文档让我很困惑。
为了开始这个工作,我得到了这个 terraform 脚本并更改了其中的一些内容。
terraform {
required_providers {
azurerm = {
source = \"hashicorp/azurerm\"
version = \"~>2.0\"
}
}
}
provider \"azurerm\" {
features {}
}
resource \"azurerm_resource_group\" \"rg-hri-private-link\" {
name = \"appservice-rg\"
location = \"westeurope\"
}
resource \"azurerm_virtual_network\" \"vnet\" {
name = \"vnet\"
location = azurerm_resource_group.rg-hri-private-link.location
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
address_space = [\"10.1.0.0/16\"]
}
resource \"azurerm_subnet\" \"integrationsubnet\" {
name = \"integrationsubnet\"
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = [\"10.1.1.0/24\"]
delegation {
name = \"delegation\"
service_delegation {
name = \"Microsoft.Web/serverFarms\"
}
}
}
resource \"azurerm_subnet\" \"endpointsubnet\" {
name = \"endpointsubnet\"
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = [\"10.1.2.0/24\"]
enforce_private_link_endpoint_network_policies = true
service_endpoints = [
\"Microsoft.Sql\"
]
delegation {
name = \"delegation\"
service_delegation {
actions = [
\"Microsoft.Network/virtualNetworks/subnets/join/action\",
\"Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action\",
\"Microsoft.Network/virtualNetworks/subnets/unprepareNetworkPolicies/action\",
]
name = \"Microsoft.Sql/managedInstances\"
}
}
}
resource \"azurerm_app_service_plan\" \"appserviceplan\" {
name = \"appserviceplan\"
location = azurerm_resource_group.rg-hri-private-link.location
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
sku {
tier = \"Premiumv2\"
size = \"P1v2\"
}
}
resource \"azurerm_app_service\" \"frontwebapp\" {
name = \"frontweba\"
location = azurerm_resource_group.rg-hri-private-link.location
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
app_service_plan_id = azurerm_app_service_plan.appserviceplan.id
app_settings = {
\"WEBSITE_DNS_SERVER\": \"168.63.129.16\",
\"WEBSITE_VNET_ROUTE_ALL\": \"1\"
}
}
resource \"azurerm_app_service_virtual_network_swift_connection\" \"vnetintegrationconnection\" {
app_service_id = azurerm_app_service.frontwebapp.id
subnet_id = azurerm_subnet.integrationsubnet.id
}
resource \"azurerm_sql_server\" \"srv-backend\" {
administrator_login = \"username\"
administrator_login_password = \"password!\"
location = azurerm_resource_group.rg-hri-private-link.location
name = \"serverbackend\"
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
version = \"12.0\"
}
resource \"azurerm_sql_virtual_network_rule\" \"privatesql\" {
name = \"azuresqldatabaseendpoint\"
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
server_name = azurerm_sql_server.srv-backend.name
subnet_id = azurerm_subnet.endpointsubnet.id
ignore_missing_vnet_service_endpoint = true
}
resource \"azurerm_sql_database\" \"sqlprivatedatabase\" {
location = azurerm_resource_group.rg-hri-private-link.location
name = \"sqlprivatedatabase\"
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
server_name = azurerm_sql_server.srv-backend.name
}
resource \"azurerm_private_dns_zone\" \"dnsprivatezone\" {
name = \"privatelink.azurewebsites.net\"
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
}
resource \"azurerm_private_dns_zone_virtual_network_link\" \"dnszonelink\" {
name = \"dnszonelink\"
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
private_dns_zone_name = azurerm_private_dns_zone.dnsprivatezone.name
virtual_network_id = azurerm_virtual_network.vnet.id
}
resource \"azurerm_private_endpoint\" \"privateendpoint\" {
name = \"backwebappprivateendpoint\"
location = azurerm_resource_group.rg-hri-private-link.location
resource_group_name = azurerm_resource_group.rg-hri-private-link.name
subnet_id = azurerm_subnet.endpointsubnet.id
private_dns_zone_group {
name = \"privatednszonegroup\"
private_dns_zone_ids = [azurerm_private_dns_zone.dnsprivatezone.id]
}
private_service_connection {
name = \"privateendpointconnection\"
private_connection_resource_id = azurerm_sql_server.srv-backend.id
subresource_names = [\"sqlServer\"]
is_manual_connection = false
}
}
我创建以下资源:
- 网络
- 集成子网
- 私有端点子网
- 使用专用 dns 区域的 Web 应用配置
- 将前端应用程序与集成子网连接
- 创建后端 sql server 和数据库
- 创建专用 DNS 区域
- 将区域链接到 vnet
- 创建到端点子网的专用端点后端
脚本运行得很好。我部署了一个 web 应用程序模板来测试 web 应用程序和后端 sql 数据库之间的连接,它工作得很好。
但是在这里我开始感到困惑。我的 Web 应用程序有它的默认 url .azurewebsites.net 并且我的 sql 数据库仍然可以从它的主机名访问。似乎dns区域没有做任何特别的事情。
我该如何测试这个。
我的想法是有一个zero trust 架构,只允许前端应用程序在入站流量中访问 sql 数据库,并在 sql 数据库的出站流量中只允许它访问前端 Web 应用程序。
我怎样才能做到这一点?
-
在同一个 VNET 中,通常不会过滤流量。然而,你想限制它。你看过nsg吗?在企业网络中,防火墙保护 VNET 中的设备免受外部流量的影响。在没有防火墙的情况下,可以使用 NSG 完成另一层保护。 NSG 可以在子网级别应用。
标签: terraform terraform-provider-azure azure-private-link azure-private-dns azure-private-dns-zone