✔️ 适用于: 使用 Microsoft.Storage 资源提供程序创建的经典文件共享
✔️ 适用于:使用 Microsoft.FileShares 资源提供程序创建的文件共享
Azure 文件存储提供两种主要类型的终结点用于访问 Azure 文件共享:
- 公共终结点,具有公共 IP 地址,可从世界上的任何位置访问。
- 专用终结点:位于某个虚拟网络中,并使用该虚拟网络的地址空间内部的专用 IP 地址。
对于经典文件共享(使用Microsoft.Storage资源提供程序创建),Azure存储帐户具有公共终结点和专用终结点。 对于使用 Microsoft.FileShares 资源提供程序创建的文件共享,可以在文件共享级别而不是存储帐户级别创建公共终结点和专用终结点。
本文重点介绍如何配置专用终结点以直接访问Azure文件共享。 本文的大部分内容也适用于 Azure 文件同步如何与存储帐户的公共和专用终结点互操作。 有关 Azure 文件同步 网络考虑的更多信息,请参见配置 Azure 文件同步 代理和防火墙设置。
在阅读本指南之前,请查看Azure 文件存储网络注意事项。
Prerequisites
你可以配置终端限制对存储账户和文件共享的网络访问。 要限制对虚拟网络的访问,请采用以下方法之一:
-
创建一个或多个私有端点 ,并限制所有对公共端点的访问(推荐)。 此方法可确保只有源自所需虚拟网络中的流量才能访问Azure文件共享。 请参阅专用链接成本。
-
仅限一个或多个虚拟网络访问公共终结点。 此方法使用名为 服务终结点的虚拟网络的功能。 当你通过服务终结点将流量限制到某个存储帐户时,实际上你仍是通过公共 IP 地址访问该存储帐户或文件共享,但只有从你在配置中指定的位置才能进行访问。
创建专用终结点
为文件共享创建专用终结点时,请部署以下Azure资源:
-
专用终结点:表示专用终结点的Azure资源。 可以将此资源视为目标资源与网络接口之间的连接器。
-
网络接口(NIC):维护指定虚拟网络和子网中的专用 IP 地址的网络接口。 此资源与部署虚拟机时部署的资源相同。 不过,它不是分配给 VM,而是由专用终结点拥有。
-
专用域名系统(DNS)区域:如果以前未为此虚拟网络部署专用终结点,则会为虚拟网络部署新的专用 DNS 区域。 此 DNS 区域中还会创建 DNS 记录。 如果已在此虚拟网络中部署专用终结点,则会向现有 DNS 区域添加新记录。 部署 DNS 区域是可选操作。 不过,强烈建议执行此操作;如果使用 AD 服务主体或 FileREST API 装载 Azure 文件共享,则必须执行此操作。
注意
本文使用Azure公共区域core.windows.net的 DNS 后缀。 此说明也适用于 Azure 主权云,例如 Azure 美国政府云和由世纪互联运营的 Azure 等。 只需根据环境替换相应的后缀即可。
经典文件共享与新文件共享体验
私有端点的创建过程会根据你使用的是经典文件共享还是新的文件共享模型而略有不同。 对于经典文件共享,你需要为存储账户创建一个私有端点,包含文件共享。 对于使用 Microsoft.FileShares 创建的文件共享,需要为文件共享本身创建一个专用终结点。
许多步骤在两种体验中是相同的。 只有资源引用、组ID和DNS记录名称不同,如下表所示。
|
经典文件共享 (Microsoft.Storage) |
新文件共享(Microsoft.FileShares) |
|
专用终结点目标 |
存储帐户 |
文件共享 |
|
资源 Cmdlet |
Get-AzStorageAccount |
Get-AzFileShare |
|
组标识(子资源) |
file |
FileShare |
|
DNS A 记录的名称 |
存储帐户名称 |
主机名前缀(例如) fs-xxxxxxxxxxxxxxxxx |
转到要在其中创建专用终结点的资源组。 选择 “+ 创建”,并搜索 专用终结点。 选择专用终结点资源,然后选择“ 创建”。
向导有多个页面要完成。
在 “基本信息 ”页中,选择专用终结点的订阅、资源组、名称、网络接口名称和区域。 必须在要在其中创建专用终结点的虚拟网络所在的同一区域中创建专用终结点。 然后选择“下一步: 资源”。
如果你在存储账户中使用经典文件共享:
在资源页面上,从资源类型的下拉菜单中选择Microsoft.Storage/storageAccounts。 在 资源中,选择你想连接的具体存储账户。 对于 目标子资源,选择 file。 然后选择“下一步: 虚拟网络”。
如果你使用的是通过 Microsoft.FileShares 资源提供程序创建的文件共享:
在资源页面的资源类型下拉菜单中,选择Microsoft.FileShares/fileShares。 在 资源中,选择你想连接的具体文件共享。 目标子资源会自动填充 FileShare。 然后选择“下一步: 虚拟网络”。
在虚拟网络页面上,您可以选择要添加专用终结点的具体虚拟网络和子网。 为新的专用终结点选择动态或静态 IP 地址分配。 如果选择静态,则还需要提供名称和专用 IP 地址。 还可以选择指定应用程序安全组。 完成后,选择“下一步: DNS”。
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
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享,获取文件共享的引用:
$fileShareResourceGroupName = "<resource-group-name>"
$fileShareName = "<file-share-name>"
$fileShare = Get-AzFileShare `
-ResourceGroupName $fileShareResourceGroupName `
-ResourceName $fileShareName `
-ErrorAction SilentlyContinue
if ($null -eq $fileShare) {
$errorMessage = "File share $fileShareName not found "
$errorMessage += "in resource group $fileShareResourceGroupName."
Write-Error -Message $errorMessage -ErrorAction Stop
}
# Extract hostName and hostNamePrefix for DNS record
$hostName = $fileShare.HostName
$hostNamePrefix = $hostName.Split('.')[0]
# Set common variables for private endpoint creation
$resourceGroupName = $fileShareResourceGroupName
$privateLinkResourceId = $fileShare.Id
$groupId = "FileShare"
$dnsRecordName = $hostNamePrefix
设置通用变量后,对于这两种体验,其余步骤都是相同的。 获取虚拟网络和子网的引用:
$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。 虽然从创建私有端点的角度来看是可选的,但直接使用Active Directory(AD)用户主体挂载Azure文件共享或通过REST API访问时,这是明确要求的。
# Get the host name suffix (core.windows.net for public 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 public cloud, this will generate the following DNS suffix:
# privatelink.file.core.windows.net.
$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
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享,获取文件共享的引用:
# Install the fileshare extension
az extension add --name fileshare
fileShareResourceGroupName="<resource-group-name>"
fileShareName="<file-share-name>"
# Get the file share resource ID and host name
privateLinkResourceId=$(az fileshare show \
--resource-group $fileShareResourceGroupName \
--name $fileShareName \
--query "id" --output tsv)
hostName=$(az fileshare show \
--resource-group $fileShareResourceGroupName \
--name $fileShareName \
--query "properties.hostName" --output tsv)
hostNamePrefix=$(echo $hostName | cut -d'.' -f1)
# Set common variables for private endpoint creation
resourceGroupName=$fileShareResourceGroupName
groupId="FileShare"
dnsRecordName=$hostNamePrefix
设置通用变量后,对于这两种体验,其余步骤都是相同的。 获取虚拟网络和子网的引用:
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。 虽然从创建专用终结点的角度来看这是可选的,但如果要使用 AD 用户主体挂载 Azure 文件共享,或通过 FileREST API 进行访问,则这是必需的。
# Get the desired storage account suffix (core.windows.net for public cloud).
# This is done so the script will work for non-public Azure clouds.
storageAccountSuffix=$(az cloud show \
--query "suffixes.storageEndpoint" --output tsv)
# For public cloud, this generates the DNS suffix:
# privatelink.file.core.windows.net.
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
验证连接性
如果虚拟网络中有一个 VM,或者配置了 DNS 转发,如配置Azure 文件存储的 DNS 转发中所述,则可以测试是否已正确设置专用终结点。 从 PowerShell、命令行或终端运行以下命令(适用于 Windows、Linux 或 macOS)。
对于经典文件共享,请将 <storage-account-name> 替换为相应的存储帐户名称:
nslookup <storage-account-name>.file.core.windows.net
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享,请使用该文件共享的主机名。 在文件共享的“概述”选项卡中,从右上角选择 JSON 视图 。 在 JSON 视图中的属性下,复制 hostName 的值。 格式如下所示 fs-xxxxxxxxxxxxxxxxx.xx.file.storage.azure.net。
nslookup <file-share-host-name>
如果成功,您将看到类似于以下内容的输出,其中 192.168.0.5 是虚拟网络中的专用终结点的专用 IP 地址(以下显示的是 Windows 上的输出)。
对于经典文件共享:
Server: UnKnown
Address: 10.2.4.4
Non-authoritative answer:
Name: storageaccount.privatelink.file.core.windows.net
Address: 192.168.0.5
Aliases: storageaccount.file.core.windows.net
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享:
Server: UnKnown
Address: 10.2.4.4
Non-authoritative answer:
Name: <hostNamePrefix>.privatelink.file.core.windows.net
Address: 192.168.0.5
Aliases: <hostNamePrefix>.<zone>.file.storage.azure.net
如果虚拟网络中有一台虚拟机,或者按照 为 Azure 文件存储 配置 DNS 转发 中所述配置了 DNS 转发,则可以运行以下命令来测试专用终结点是否已正确配置:
对于经典文件共享:
$storageAccountHostName = [System.Uri]::new($storageAccount.PrimaryEndpoints.file) | `
Select-Object -ExpandProperty Host
Resolve-DnsName -Name $storageAccountHostName
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享:
Resolve-DnsName -Name $fileShare.HostName
如果成功,则会看到类似于以下内容的输出,其中 192.168.0.5 是虚拟网络中专用终结点的专用 IP 地址。
对于经典文件共享:
Name Type TTL Section NameHost
---- ---- --- ------- --------
storageaccount.file.core.windows CNAME 60 Answer storageaccount.privatelink.file.core.windows.net
.net
Name : storageaccount.privatelink.file.core.windows.net
QueryType : A
TTL : 600
Section : Answer
IP4Address : 192.168.0.5
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享:
Name Type TTL Section NameHost
---- ---- --- ------- --------
<hostNamePrefix>.<zone>.file.storage.azur CNAME 60 Answer <hostNamePrefix>.privatelink.file.core.windows.net
e.net
Name : <hostNamePrefix>.privatelink.file.core.windows.net
QueryType : A
TTL : 600
Section : Answer
IP4Address : 192.168.0.5
如果虚拟网络中有一台虚拟机,或者按照 为 Azure 文件存储 配置 DNS 转发 中所述配置了 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
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享:
hostName=$(az fileshare show \
--resource-group $fileShareResourceGroupName \
--name $fileShareName \
--query "properties.hostName" --output tsv)
nslookup $hostName
如果成功,则会看到类似于以下内容的输出,其中 192.168.0.5 是虚拟网络中专用终结点的专用 IP 地址。 你仍应使用原始主机名(经典版使用 storageaccount.file.core.windows.net,新体验使用文件共享的 hostName)来挂载文件共享,而不是使用 privatelink 路径。
对于经典文件共享:
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
storageaccount.file.core.windows.net canonical name = storageaccount.privatelink.file.core.windows.net.
Name: storageaccount.privatelink.file.core.windows.net
Address: 192.168.0.5
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享:
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
<hostNamePrefix>.<zone>.file.storage.azure.net canonical name = <hostNamePrefix>.privatelink.file.core.windows.net.
Name: <hostNamePrefix>.privatelink.file.core.windows.net
Address: 192.168.0.5
限制公共终结点访问
若要限制公共终结点访问,请先禁用对公共终结点的常规访问。 禁用对公共终结点的访问不会影响专用终结点。 禁用公共终结点后,选择可以继续访问它的特定网络或 IP 地址。 通常,大多数针对存储帐户的防火墙策略仅限一个或多个虚拟网络进行网络访问。
你还可以使用 网络安全边界 来集中管理进出访问规则。
禁止对公共终结点的访问
当你禁用公共网络访问时,你限制了入站访问,同时允许出站访问。 你仍然可以通过其私有端点访问存储账户。 否则,除非来自 特定允许的来源,否则对存储账户公用端点的请求会被拒绝。
要禁用经典文件共享的公共网络访问,请按照以下步骤操作:
- 转到要限制对公共终结点的所有入站访问的存储账户。
- 从服务菜单中的“安全性 + 网络”下,选择“网络”。
- 在 Public network access 下,选择 Manage。
- 选择 禁用,然后选择 继续。
- 选择“保存”。
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享:
转到要禁用公共访问的文件共享。 在服务菜单中的“设置”下,选择“配置”。 将 公用网络访问权限 设置为 “已禁用”,然后选择“ 保存”。
对于经典文件共享,以下 PowerShell 命令拒绝向存储帐户的公共终结点的所有流量。 将-Bypass参数设置为AzureServices允许受信任的第一方服务(例如Azure 文件同步)通过公共终结点访问存储帐户。
# This assumes $storageAccount is still defined from the beginning of this guide.
$storageAccount | Update-AzStorageAccountNetworkRuleSet `
-DefaultAction Deny `
-Bypass AzureServices `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Out-Null
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享,在该文件共享上将 -PublicNetworkAccess 设置为 Disabled。
# To learn more about the Az.FileShare module, see https://www.powershellgallery.com/packages/Az.FileShare/1.0.0
Install-Module -Name Az.FileShare -Repository PSGallery -RequiredVersion 1.0.0
$fileShareResourceGroupName = "<resource-group-name>"
$fileShareName = "<file-share-name>"
Update-AzFileShare `
-ResourceGroupName $fileShareResourceGroupName `
-ResourceName $fileShareName `
-PublicNetworkAccess Disabled
对于经典文件共享,以下 CLI 命令会阻止发到存储帐户的公共终结点的所有流量。 将--bypass参数设置为AzureServices允许受信任的第一方服务(例如Azure 文件同步)通过公共终结点访问存储帐户。
# This assumes $storageAccountResourceGroupName and $storageAccountName
# are still defined from the beginning of this guide.
az storage account update \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--bypass "AzureServices" \
--default-action "Deny" \
--output none
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享,在该文件共享上将 --public-network-access 设置为 Disabled。
# Install the fileshare extension
az extension add --name fileshare
fileShareResourceGroupName="<resource-group-name>"
fileShareName="<file-share-name>"
az fileshare update \
--name $fileShareName \
--resource-group $fileShareResourceGroupName \
--public-network-access Disabled
限制对公共端点的访问,仅限特定网络
当你限制公共端点访问特定网络时,你允许从指定的虚拟网络或IP地址内向公用端点请求。 该限制通过使用一种称为 服务端点的功能来实现。 你可以使用服务端点,也可以不带私有端点。
对于经典文件共享,请按照以下步骤限制公共端点只能使用特定网络。
- 转到要将公共终结点限制为仅供特定网络访问的存储帐户。
- 从服务菜单中的“安全性 + 网络”下,选择“网络”。
- 在 “公用网络访问范围”下, 从所选网络中选择“启用”。 此选项会显示多个用于控制对公共终结点访问限制的设置。
- 在 虚拟网络中,选择 添加虚拟网络>添加现有虚拟网络 以选择应允许通过公共端点访问存储账户的虚拟网络。 选择一个虚拟网络和该虚拟网络的子网,然后选择“启用”。 如果你想为此创建一个新的虚拟网络,请选择 添加虚拟网络>,添加新的虚拟网络,提供详细信息,然后选择 创建。
- 在 IPv4地址下,指定任何你希望访问存储账户的公共互联网IP地址。
- 选中“允许受信任的 Microsoft 服务访问此资源”复选框,以允许受信任的 Microsoft 第一方服务(例如 Azure 文件同步)访问该存储帐户。
- 选择“保存”。
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享:
转到要限制公共访问的文件共享。 在服务菜单中的 “设置”下,选择“ 配置”。 在 “公用网络访问”下, 从所选虚拟网络中选择“已启用”,添加允许访问共享的虚拟网络和子网,然后选择“ 保存”。
对于经典文件共享,请使用服务终结点将存储帐户的公共终结点的访问限制为特定的虚拟网络。 首先,收集有关存储帐户和虚拟网络的信息。 将以下步骤中的占位符值替换为你自己的值。
$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 `
-Bypass AzureServices `
-VirtualNetworkRule $networkRule `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Out-Null
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享,通过使用 Update-AzFileShare 直接将允许的子网资源 ID 传递给 -AllowedSubnet。 存储帐户上无需单独的服务终结点或网络规则配置。
# To learn more about the Az.FileShare module, see https://www.powershellgallery.com/packages/Az.FileShare/1.0.0
Install-Module -Name Az.FileShare -Repository PSGallery -RequiredVersion 1.0.0
$fileShareResourceGroupName = "<resource-group-name>"
$fileShareName = "<file-share-name>"
$virtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$virtualNetworkName = "<vnet-name>"
$subnetName = "<subnet-name>"
$subnet = Get-AzVirtualNetwork `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $virtualNetworkName | `
Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq $subnetName }
Update-AzFileShare `
-ResourceGroupName $fileShareResourceGroupName `
-ResourceName $fileShareName `
-AllowedSubnet @($subnet.Id)
对于经典文件共享,请使用服务终结点将存储帐户的公共终结点的访问限制为特定的虚拟网络。 首先,收集有关存储帐户和虚拟网络的信息。 将以下步骤中的占位符值替换为你自己的值。
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 \
--bypass "AzureServices" \
--default-action "Deny" \
--output none
对于使用 Microsoft.FileShares 资源提供程序创建的文件共享,通过使用 az fileshare update 直接将允许的子网资源 ID 传递给 --allowed-subnets。 存储帐户上无需单独的服务终结点或网络规则配置。
# Install the fileshare extension
az extension add --name fileshare
fileShareResourceGroupName="<resource-group-name>"
fileShareName="<file-share-name>"
virtualNetworkResourceGroupName="<vnet-resource-group-name>"
virtualNetworkName="<vnet-name>"
subnetName="<subnet-name>"
subnetId=$(az network vnet subnet show \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--query "id" --output tsv)
az fileshare update \
--name $fileShareName \
--resource-group $fileShareResourceGroupName \
--allowed-subnets $subnetId
另请参阅