Azure 文件存储提供两种主要类型的终结点用于访问 Azure 文件共享:
- 公共端点,拥有公网IP地址。 访问取决于协议和网络规则。 NFS客户端使用来自允许子网的服务端点。
- 专用终结点存在于某个虚拟网络中,拥有该虚拟网络地址空间内的一个专用 IP 地址。
本文介绍如何配置专用终结点并限制公共终结点访问。 经典文件共享指南同样适用于与 Azure 文件同步 配合使用的存储账户,后者支持经典的 SMB 文件共享。 关于文件同步网络需求,请参见配置 Azure 文件同步 代理和防火墙设置。
在阅读本指南之前,请查看Azure 文件存储网络注意事项。
先决条件
- 本文假设你已经创建了一个 Azure 订阅。 如果还没有订阅,请创建 一个试用帐户。
- 你需要一个想要连接的Azure文件共享。 若要了解如何创建Azure文件共享,请参阅“创建经典文件共享”。
- 如果你打算使用 Azure PowerShell,请安装最新版本。
- 如果你打算使用 Azure CLI,请安装最新版本。
可以通过为经典共享配置存储帐户来限制对文件共享的网络访问。 要限制对虚拟网络的访问,请采用以下方法之一:
创建专用终结点
为文件共享创建专用终结点时,请部署以下Azure资源:
-
专用终结点:表示专用终结点的Azure资源。 可以将此资源视为目标资源与网络接口之间的连接器。
-
网络接口(NIC):维护指定虚拟网络和子网中的专用 IP 地址的网络接口。 此资源与部署虚拟机时部署的资源相同。 不过,它不是分配给 VM,而是由专用终结点拥有。
-
专用域名系统(DNS)区域:如果以前未为此虚拟网络部署专用终结点,则会为虚拟网络部署新的专用 DNS 区域。 此 DNS 区域中还会创建 DNS 记录。 如果已在此虚拟网络中部署专用终结点,则会向现有 DNS 区域添加新记录。 部署 DNS 区域是可选操作。 不过,强烈建议执行此操作;如果使用 AD 服务主体或 FileREST API 装载 Azure 文件共享,则必须执行此操作。
转到要在其中创建专用终结点的资源组。 选择 “+ 创建”,并搜索 专用终结点。 选择专用终结点资源,然后选择“ 创建”。
向导有多个页面要完成。
在 “基本信息 ”页中,选择专用终结点的订阅、资源组、名称、网络接口名称和区域。 必须在要在其中创建专用终结点的虚拟网络所在的同一区域中创建专用终结点。 然后选择“下一步: 资源”。
在资源页上,从资源类型的下拉菜单中选择Microsoft.Storage/storageAccounts。 在 资源中,选择你想连接的具体存储账户。 对于 目标子资源,选择 file。 然后选择“下一步: 虚拟网络”。
“虚拟网络”页允许选择要向其添加专用终结点的特定virtual network和子网。 为新的专用终结点选择动态或静态 IP 地址分配。 如果选择静态,则还需要提供名称和专用 IP 地址。
DNS 页包含用于将专用终结点与专用 DNS 区域集成的信息。 确保订阅和资源组正确,然后选择“ 下一步:标记”。
可以选择性地应用标记来对资源进行分类,如将名称“环境”和值“测试”应用于所有测试资源。 输入名称/值对(如果需要),然后选择“下一步: 查看 + 创建”。
选择“创建”以创建专用终结点。
若要创建专用终结点,请先获取对存储帐户或文件共享以及要在其中添加专用终结点的虚拟网络子网的引用。 将以下代码中的占位符值替换为你自己的值。
获取对存储帐户的引用:
$storageAccountResourceGroupName = "<storage-account-resource-group-name>"
$storageAccountName = "<storage-account-name>"
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-ErrorAction SilentlyContinue
if ($null -eq $storageAccount) {
$errorMessage = "Storage account $storageAccountName not found "
$errorMessage += "in resource group $storageAccountResourceGroupName."
Write-Error -Message $errorMessage -ErrorAction Stop
}
# Set common variables for private endpoint creation
$resourceGroupName = $storageAccountResourceGroupName
$privateLinkResourceId = $storageAccount.Id
$groupId = "file"
$dnsRecordName = $storageAccountName
获取对虚拟网络和子网的引用:
$virtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$virtualNetworkName = "<vnet-name>"
$subnetName = "<vnet-subnet-name>"
# Get virtual network reference, and throw error if it doesn't exist
$virtualNetwork = Get-AzVirtualNetwork `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $virtualNetworkName `
-ErrorAction SilentlyContinue
if ($null -eq $virtualNetwork) {
$errorMessage = "Virtual network $virtualNetworkName not found "
$errorMessage += "in resource group $virtualNetworkResourceGroupName."
Write-Error -Message $errorMessage -ErrorAction Stop
}
# Get reference to virtual network subnet, and throw error if it doesn't exist
$subnet = $virtualNetwork | `
Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq $subnetName }
if ($null -eq $subnet) {
Write-Error `
-Message "Subnet $subnetName not found in virtual network $virtualNetworkName." `
-ErrorAction Stop
}
若要创建专用终结点,必须创建专用链接服务连接。 专用链接服务连接是创建专用终结点时使用的输入。
# Disable private endpoint network policies
$subnet.PrivateEndpointNetworkPolicies = "Disabled"
$virtualNetwork = $virtualNetwork | `
Set-AzVirtualNetwork -ErrorAction Stop
# Create a private link service connection.
$privateEndpointConnection = New-AzPrivateLinkServiceConnection `
-Name "$dnsRecordName-Connection" `
-PrivateLinkServiceId $privateLinkResourceId `
-GroupId $groupId `
-ErrorAction Stop
# Create a new private endpoint.
$privateEndpoint = New-AzPrivateEndpoint `
-ResourceGroupName $resourceGroupName `
-Name "$dnsRecordName-PrivateEndpoint" `
-Location $virtualNetwork.Location `
-Subnet $subnet `
-PrivateLinkServiceConnection $privateEndpointConnection `
-ErrorAction Stop
将 Azure 私有 DNS 区域连接到虚拟网络,使客户端将文件共享的原始主机名解析为私有端点的 IP 地址。
# Get the host name suffix (core.chinacloudapi.cn for Azure China cloud).
# This is done like this so this script will seamlessly work for non-public Azure.
$hostNameSuffix = Get-AzContext | `
Select-Object -ExpandProperty Environment | `
Select-Object -ExpandProperty StorageEndpointSuffix
# For Azure China cloud, this will generate the following DNS suffix:
# privatelink.file.core.chinacloudapi.cn.
$dnsZoneName = "privatelink.file.$hostNameSuffix"
# Find a DNS zone matching desired name attached to this virtual network.
$dnsZone = Get-AzPrivateDnsZone | `
Where-Object { $_.Name -eq $dnsZoneName } | `
Where-Object {
$privateDnsLink = Get-AzPrivateDnsVirtualNetworkLink `
-ResourceGroupName $_.ResourceGroupName `
-ZoneName $_.Name `
-ErrorAction SilentlyContinue
$privateDnsLink.VirtualNetworkId -eq $virtualNetwork.Id
}
if ($null -eq $dnsZone) {
# No matching DNS zone attached to virtual network, so create new one.
$dnsZone = New-AzPrivateDnsZone `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $dnsZoneName `
-ErrorAction Stop
$privateDnsLink = New-AzPrivateDnsVirtualNetworkLink `
-ResourceGroupName $virtualNetworkResourceGroupName `
-ZoneName $dnsZoneName `
-Name "$virtualNetworkName-DnsLink" `
-VirtualNetworkId $virtualNetwork.Id `
-ErrorAction Stop
}
拥有对专用 DNS 区域的引用后,必须创建一条记录。
$privateEndpointIP = $privateEndpoint | `
Select-Object -ExpandProperty NetworkInterfaces | `
Select-Object @{
Name = "NetworkInterfaces";
Expression = { Get-AzNetworkInterface -ResourceId $_.Id }
} | `
Select-Object -ExpandProperty NetworkInterfaces | `
Select-Object -ExpandProperty IpConfigurations | `
Select-Object -ExpandProperty PrivateIpAddress
$privateDnsRecordConfig = New-AzPrivateDnsRecordConfig `
-IPv4Address $privateEndpointIP
New-AzPrivateDnsRecordSet `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $dnsRecordName `
-RecordType A `
-ZoneName $dnsZoneName `
-Ttl 600 `
-PrivateDnsRecords $privateDnsRecordConfig `
-ErrorAction Stop | `
Out-Null
若要创建专用终结点,请先获取对存储帐户或文件共享的引用,以及要在其中添加专用终结点的虚拟网络子网。 将以下步骤中的占位符值替换为你自己的值。
获取对存储帐户的引用:
storageAccountResourceGroupName="<storage-account-resource-group-name>"
storageAccountName="<storage-account-name>"
# Get storage account ID
privateLinkResourceId=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "id" --output tsv)
# Set common variables for private endpoint creation
resourceGroupName=$storageAccountResourceGroupName
groupId="file"
dnsRecordName=$storageAccountName
设置通用变量后 获取对虚拟网络和子网的引用:
virtualNetworkResourceGroupName="<vnet-resource-group-name>"
virtualNetworkName="<vnet-name>"
subnetName="<vnet-subnet-name>"
virtualNetwork=$(az network vnet show \
--resource-group $virtualNetworkResourceGroupName \
--name $virtualNetworkName \
--query "id" --output tsv)
subnet=$(az network vnet subnet show \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--query "id" --output tsv)
若要创建专用终结点,请确保子网的专用终结点网络策略已禁用,然后使用 创建专用终结点 az network private-endpoint create。
# Disable private endpoint network policies
az network vnet subnet update \
--ids $subnet \
--disable-private-endpoint-network-policies \
--output none
# Get virtual network location
region=$(az network vnet show \
--ids $virtualNetwork \
--query "location" --output tsv)
# Create a private endpoint
privateEndpoint=$(az network private-endpoint create \
--resource-group $resourceGroupName \
--name "$dnsRecordName-PrivateEndpoint" \
--location $region \
--subnet $subnet \
--private-connection-resource-id $privateLinkResourceId \
--group-id $groupId \
--connection-name "$dnsRecordName-Connection" \
--query "id" --output tsv)
将 Azure 私有 DNS 区域连接到虚拟网络,使客户端将文件共享的原始主机名解析为私有端点的 IP 地址。
# Get the desired storage account suffix (core.chinacloudapi.cn for Azure China cloud).
# This is done so the script will work for non-public Azure clouds.
storageAccountSuffix=$(az cloud show \
--query "suffixes.storageEndpoint" --output tsv)
# For Azure China cloud, this generates the DNS suffix:
# privatelink.file.core.chinacloudapi.cn.
dnsZoneName="privatelink.file.$storageAccountSuffix"
# Find a DNS zone matching the desired name attached to this virtual network.
possibleDnsZones=$(az network private-dns zone list \
--query "[?name == '$dnsZoneName'].id" \
--output tsv)
dnsZone=""
for possibleDnsZone in $possibleDnsZones
do
possibleResourceGroupName=$(az resource show \
--ids $possibleDnsZone \
--query "resourceGroup" --output tsv)
link=$(az network private-dns link vnet list \
--resource-group $possibleResourceGroupName \
--zone-name $dnsZoneName \
--query "[?virtualNetwork.id == '$virtualNetwork'].id" \
--output tsv)
if [ -n "$link" ]
then
dnsZoneResourceGroup=$possibleResourceGroupName
dnsZone=$possibleDnsZone
break
fi
done
if [ -z "$dnsZone" ]
then
# No matching DNS zone attached to the virtual network, so create a new one.
dnsZone=$(az network private-dns zone create \
--resource-group $virtualNetworkResourceGroupName \
--name $dnsZoneName \
--query "id" --output tsv)
az network private-dns link vnet create \
--resource-group $virtualNetworkResourceGroupName \
--zone-name $dnsZoneName \
--name "$virtualNetworkName-DnsLink" \
--virtual-network $virtualNetwork \
--registration-enabled false \
--output none
dnsZoneResourceGroup=$virtualNetworkResourceGroupName
fi
现在你已经有了对专用 DNS 区域的引用,请创建一条 A 记录。
privateEndpointNIC=$(az network private-endpoint show \
--ids $privateEndpoint \
--query "networkInterfaces[0].id" --output tsv)
privateEndpointIP=$(az network nic show \
--ids $privateEndpointNIC \
--query "ipConfigurations[0].privateIPAddress" --output tsv)
az network private-dns record-set a create \
--resource-group $dnsZoneResourceGroup \
--zone-name $dnsZoneName \
--name $dnsRecordName \
--output none
az network private-dns record-set a add-record \
--resource-group $dnsZoneResourceGroup \
--zone-name $dnsZoneName \
--record-set-name $dnsRecordName \
--ipv4-address $privateEndpointIP \
--output none
验证连接性
可以从虚拟网络中的客户端运行这些检查,或者从已配置 DNS 以解析私有终结点的连接网络中运行这些检查。 挂载共享时使用原始主机名,而不是 privatelink 名称。
在 Windows、Linux 或 macOS 上,通过 PowerShell、命令行或终端运行以下 DNS 查询。
用适当的存储帐户名称替换 <storage-account-name>:
nslookup <storage-account-name>.file.core.chinacloudapi.cn
如果成功,您将看到类似于以下内容的输出,其中 192.168.0.5 是虚拟网络中的专用终结点的专用 IP 地址(以下显示的是 Windows 上的输出)。
Server: UnKnown
Address: 10.2.4.4
Non-authoritative answer:
Name: storageaccount.privatelink.file.core.chinacloudapi.cn
Address: 192.168.0.5
Aliases: storageaccount.file.core.chinacloudapi.cn
请执行以下PowerShell命令以验证DNS解析:
$storageAccountHostName = [System.Uri]::new($storageAccount.PrimaryEndpoints.file) | `
Select-Object -ExpandProperty Host
Resolve-DnsName -Name $storageAccountHostName
如果成功,则会看到类似于以下内容的输出,其中 192.168.0.5 是虚拟网络中专用终结点的专用 IP 地址。
Name Type TTL Section NameHost
---- ---- --- ------- --------
storageaccount.file.core.chinacloudapi.cn CNAME 60 Answer storageaccount.privatelink.file.core.chinacloudapi.cn
Name : storageaccount.privatelink.file.core.chinacloudapi.cn
QueryType : A
TTL : 600
Section : Answer
IP4Address : 192.168.0.5
执行以下命令以获取主机名称并验证DNS解析:
httpEndpoint=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "primaryEndpoints.file" --output tsv)
hostName=$(echo $httpEndpoint | cut -c7-$(expr length $httpEndpoint) | tr -d "/")
nslookup $hostName
如果成功,则会看到类似于以下内容的输出,其中 192.168.0.5 是虚拟网络中专用终结点的专用 IP 地址。 仍应使用原始主机名 (storageaccount.file.core.chinacloudapi.cn) 装载文件共享,而不是 privatelink 路径。
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
storageaccount.file.core.chinacloudapi.cn canonical name = storageaccount.privatelink.file.core.chinacloudapi.cn.
Name: storageaccount.privatelink.file.core.chinacloudapi.cn
Address: 192.168.0.5
限制公共终结点访问
你可以禁用公共网络访问,或者在选定的网络上保持开放。 专用终结点继续工作。
在存储帐户上配置公共访问权限。 经典文件共享也可以使用 网络安全边界,但受到其协议限制。 在强制模式下,安全边界会阻止通过服务端点的 NFS 流量。
禁止对公共终结点的访问
当你禁用公共网络访问时,客户端无法通过公共端点进行连接,包括通过服务端点进行的连接。 客户端仍可通过专用终结点连接。 这个设置并不限制客户端的出站流量。
若要禁用公用网络访问,请执行以下步骤:
- 转到要限制对公共终结点的所有入站访问的存储账户。
- 从服务菜单中的“安全性 + 网络”下,选择“网络”。
- 在 “公用网络访问”下,选择“ 禁用”。
- 选择“保存”。
将存储帐户上的 -PublicNetworkAccess 设置为 Disabled。
# Use the storage account variables from the beginning of this guide.
Set-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-PublicNetworkAccess Disabled `
-ErrorAction Stop |
Out-Null
将存储帐户上的 --public-network-access 设置为 Disabled。
# This assumes $storageAccountResourceGroupName and $storageAccountName
# are still defined from the beginning of this guide.
az storage account update \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--public-network-access Disabled \
--output none
限制对公共端点的访问,仅限特定网络
为了允许来自选定子网的客户端,保持公共网络访问为开启,在这些子网上启用服务端点,并将子网添加到资源的网络规则中。 你可以使用服务端点,也可以不带私有端点。 经典的SMB和FileRest访问也可以使用IP地址规则;NFS访问需要允许的子网。
PowerShell和CLI的示例假设公共网络访问已经被启用。 要配置该端点,请参见 “在子网启用服务端点”。
请通过这些步骤将公共终结点限制为特定网络。
- 转到要将公共终结点限制为仅供特定网络访问的存储帐户。
- 从服务菜单中的“安全性 + 网络”下,选择“网络”。
- 在 “公用网络访问范围”下, 从选定的虚拟网络和 IP 地址中选择“已启用”。 此选项会显示多个用于控制对公共终结点访问限制的设置。
- 在 虚拟网络中,选择 添加虚拟网络>添加现有虚拟网络 以选择应允许通过公共端点访问存储账户的虚拟网络。 选择虚拟网络并为该虚拟网络选择子网,然后选择“启用”。 如果你想为此创建一个新的虚拟网络,请选择 添加虚拟网络>,添加新的虚拟网络,提供详细信息,然后选择 创建。
- 对于SMB或FileREST访问,使用 IPv4地址 指定你希望允许的公共互联网IP地址。 IP地址规则不会授予NFS访问权。
- 如果服务集成需要可信服务访问,请选择“允许受信任的 Microsoft 服务访问此资源”复选框。
- 选择“保存”。
使用服务终结点将存储帐户的公共终结点的访问限制为特定的虚拟网络。 首先,收集有关存储帐户和虚拟网络的信息。 将以下步骤中的占位符值替换为你自己的值。
$storageAccountResourceGroupName = "<storage-account-resource-group>"
$storageAccountName = "<storage-account-name>"
$restrictToVirtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$restrictToVirtualNetworkName = "<vnet-name>"
$subnetName = "<subnet-name>"
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-ErrorAction Stop
$virtualNetwork = Get-AzVirtualNetwork `
-ResourceGroupName $restrictToVirtualNetworkResourceGroupName `
-Name $restrictToVirtualNetworkName `
-ErrorAction Stop
$subnet = $virtualNetwork | `
Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq $subnetName }
if ($null -eq $subnet) {
Write-Error `
-Message "Subnet $subnetName not found in virtual network $restrictToVirtualNetworkName." `
-ErrorAction Stop
}
若要允许来自虚拟网络的流量,Azure 网络结构必须向虚拟网络的子网开放 Microsoft.Storage 服务终结点。 以下 PowerShell 命令将 Microsoft.Storage 服务终结点添加到子网(如果尚不存在)。
$serviceEndpoints = $subnet | `
Select-Object -ExpandProperty ServiceEndpoints | `
Select-Object -ExpandProperty Service
if ($serviceEndpoints -notcontains "Microsoft.Storage") {
if ($null -eq $serviceEndpoints) {
$serviceEndpoints = @("Microsoft.Storage")
} elseif ($serviceEndpoints -is [string]) {
$serviceEndpoints = @($serviceEndpoints, "Microsoft.Storage")
} else {
$serviceEndpoints += "Microsoft.Storage"
}
$virtualNetwork = $virtualNetwork | Set-AzVirtualNetworkSubnetConfig `
-Name $subnetName `
-AddressPrefix $subnet.AddressPrefix `
-ServiceEndpoint $serviceEndpoints `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Set-AzVirtualNetwork `
-ErrorAction Stop
}
限制到存储帐户的流量的最后一步是创建网络规则并将其添加到存储帐户的网络规则集。
$networkRule = $storageAccount | Add-AzStorageAccountNetworkRule `
-VirtualNetworkResourceId $subnet.Id `
-ErrorAction Stop
$storageAccount | Update-AzStorageAccountNetworkRuleSet `
-DefaultAction Deny `
-VirtualNetworkRule $networkRule `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Out-Null
这些命令保留已有的旁通设置。 如果集成需要可信服务访问,请将 -Bypass AzureServices 添加到更新命令中。 该参数取代了旁通设置,因此请包含你的工作负载仍需的任何其他旁通选项。
使用服务终结点将存储帐户的公共终结点的访问限制为特定的虚拟网络。 首先,收集有关存储帐户和虚拟网络的信息。 将以下步骤中的占位符值替换为你自己的值。
storageAccountResourceGroupName="<storage-account-resource-group>"
storageAccountName="<storage-account-name>"
restrictToVirtualNetworkResourceGroupName="<vnet-resource-group-name>"
restrictToVirtualNetworkName="<vnet-name>"
subnetName="<subnet-name>"
storageAccount=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "id" --output tsv)
virtualNetwork=$(az network vnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--name $restrictToVirtualNetworkName \
--query "id" --output tsv)
subnet=$(az network vnet subnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--vnet-name $restrictToVirtualNetworkName \
--name $subnetName \
--query "id" --output tsv)
若要允许来自虚拟网络的流量,Azure 网络结构必须向虚拟网络的子网开放 Microsoft.Storage 服务终结点。 以下 CLI 命令将 Microsoft.Storage 服务终结点添加到子网(如果尚不存在)。
serviceEndpoints=$(az network vnet subnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--vnet-name $restrictToVirtualNetworkName \
--name $subnetName \
--query "serviceEndpoints[].service" \
--output tsv)
foundStorageServiceEndpoint=false
for serviceEndpoint in $serviceEndpoints
do
if [ $serviceEndpoint = "Microsoft.Storage" ]
then
foundStorageServiceEndpoint=true
fi
done
if [ $foundStorageServiceEndpoint = false ]
then
serviceEndpointList=""
for serviceEndpoint in $serviceEndpoints
do
serviceEndpointList+=$serviceEndpoint
serviceEndpointList+=" "
done
serviceEndpointList+="Microsoft.Storage"
az network vnet subnet update \
--ids $subnet \
--service-endpoints $serviceEndpointList \
--output none
fi
限制到存储帐户的流量的最后一步是创建网络规则并将其添加到存储帐户的网络规则集。
az storage account network-rule add \
--resource-group $storageAccountResourceGroupName \
--account-name $storageAccountName \
--subnet $subnet \
--output none
az storage account update \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--default-action "Deny" \
--output none
这些命令保留已有的旁通设置。 如果集成需要可信服务访问,请将 --bypass AzureServices 添加到更新命令中。 这个选项取代了旁通设置,所以请包含你的工作负载仍需的其他旁通选项。
限制对特定存储帐户的出站访问
文件共享的网络规则控制入站访问。 它们不限制客户端可以访问哪些其他存储资源。 对于经典文件共享,你可以选择使用 服务端点策略 来限制子网内客户端可通过服务端点访问哪些存储帐户。 该策略对绕过 Azure 防火墙 和网络虚拟设备的流量的目标地址进行过滤。 它不会限制其他出站路径,也不会取代目的地的网络规则和授权要求。 欲了解更多信息,请参见 用服务端点策略限制出站访问。
服务端点策略为关联子网中的客户端定义了允许的存储目标。 它阻止这些客户端通过服务端点访问其他存储账户。 请记住以下几点:
- 在将策略与子网关联之前,先添加子网中的客户端使用的所有存储账户。 该列表包括子网中其他工作负载使用的存储账户。
- 服务端点策略必须与虚拟网络处于同一区域和订阅范围内。
- 一个策略只能包含一个针对
Microsoft.Storage 服务的策略定义。 为了允许更多存储账户,将它们的资源ID添加到相同的策略定义中。 你也可以允许资源组或订阅中的所有存储账户。
- 在你将策略与子网关联后,该策略适用于发往所有区域中存储帐户的流量。
- 这些步骤假设子网没有服务端点策略。 如果已经关联了策略,请审查并更新这些策略,而不是替换这些关联关系。 PowerShell和CLI的示例如果发现已有关联就会停止。
要创建服务端点策略并将其关联到子网,请遵循以下步骤。 有关详细步骤,请参见 创建和关联服务端点策略。
- 在 Azure 门户顶部的搜索框中,输入服务端点策略。 在搜索结果中选择服务终结点策略。
- 选择 + 新建。
- 在 基础 标签页中,选择虚拟网络的订阅和地区。 选择资源组,输入该策略的名称。
- 选择下一步:策略定义。
- 选择 + 添加资源。 选择服务,选择Microsoft.Storage。 对于 范围,选择 单个账户,然后选择包含你的文件共享项的存储账户。 选择 并添加。 对子网中客户端使用的每个存储账户重复此步骤。
- 选择查看 + 创建,然后选择创建。
- 转到新的服务端点策略。 在服务菜单中,在 设置中选择 关联子网。
- 选择 + 编辑子网关联,选择虚拟网络和子网,然后选择 应用。
以下PowerShell命令创建服务端点策略并将其关联到子网。 该策略限制客户端从该子网通过服务端点访问一个存储账户。 子网必须已具有 Microsoft.Storage 服务终结点。 将占位符中的值替换为您自己的值。
$storageAccountResourceGroupName = "<storage-account-resource-group>"
$storageAccountName = "<storage-account-name>"
$virtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$virtualNetworkName = "<vnet-name>"
$subnetName = "<subnet-name>"
$policyName = "<service-endpoint-policy-name>"
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-ErrorAction Stop
$virtualNetwork = Get-AzVirtualNetwork `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $virtualNetworkName `
-ErrorAction Stop
$subnet = $virtualNetwork.Subnets | Where-Object { $_.Name -eq $subnetName }
if ($null -eq $subnet) {
throw "Subnet '$subnetName' wasn't found in virtual network '$virtualNetworkName'."
}
if ($subnet.ServiceEndpointPolicies.Count -gt 0) {
throw "The subnet already has service endpoint policies. Review and update them before changing the configuration."
}
# To allow clients to access more storage accounts, add their resource IDs to -ServiceResource.
$policyDefinition = New-AzServiceEndpointPolicyDefinition `
-Name "allowed-storage-accounts" `
-Service "Microsoft.Storage" `
-ServiceResource @($storageAccount.Id) `
-ErrorAction Stop
$policy = New-AzServiceEndpointPolicy `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $policyName `
-Location $virtualNetwork.Location `
-ServiceEndpointPolicyDefinition $policyDefinition `
-ErrorAction Stop
$subnet.ServiceEndpointPolicies = @($policy)
$virtualNetwork | Set-AzVirtualNetwork -ErrorAction Stop | Out-Null
以下 CLI 命令创建服务端点策略并将其关联到子网。 该策略限制客户端从该子网通过服务端点访问一个存储账户。 子网必须已具有 Microsoft.Storage 服务终结点。 将占位符中的值替换为您自己的值。
storageAccountResourceGroupName="<storage-account-resource-group>"
storageAccountName="<storage-account-name>"
virtualNetworkResourceGroupName="<vnet-resource-group-name>"
virtualNetworkName="<vnet-name>"
subnetName="<subnet-name>"
policyName="<service-endpoint-policy-name>"
existingPolicyIds=$(az network vnet subnet show \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--query "serviceEndpointPolicies[].id" --output tsv) || exit 1
if [ -n "$existingPolicyIds" ]; then
echo "The subnet already has service endpoint policies. Review and update them before changing the configuration." >&2
exit 1
fi
storageAccountId=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "id" --output tsv) || exit 1
location=$(az network vnet show \
--resource-group $virtualNetworkResourceGroupName \
--name $virtualNetworkName \
--query "location" --output tsv) || exit 1
az network service-endpoint policy create \
--resource-group $virtualNetworkResourceGroupName \
--name $policyName \
--location $location \
--output none || exit 1
# To allow clients to access more storage accounts, add their resource IDs to --service-resources.
az network service-endpoint policy-definition create \
--resource-group $virtualNetworkResourceGroupName \
--policy-name $policyName \
--name "allowed-storage-accounts" \
--service "Microsoft.Storage" \
--service-resources $storageAccountId \
--output none || exit 1
az network vnet subnet update \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--service-endpoint-policy $policyName \
--output none || exit 1
另请参阅