Azure 檔案儲存體提供兩種主要的端點類型來存取 Azure 檔案共用:
- 公共端點,具有公共 IP 位址。 存取權限取決於協定和網路規則。 NFS 用戶端會使用來自允許子網路的服務端點。
- 私人端點,存在於虛擬網路內,並具有該虛擬網路位址空間內的私人 IP 位址。
對於經典檔案分享(與Microsoft.Storage資源提供者建立),Azure 儲存帳號有公開端點和私有端點。 對於與 Microsoft.FileShares 資源提供者建立的檔案分享,你會在檔案共享層級建立公有端點和私有端點,而非儲存帳號層級。
本文說明如何配置私有端點並限制兩個資源提供者的公共端點存取。 經典檔案分享指引同樣適用於與 Azure 檔案同步 搭配的儲存帳號,該系統支援經典 SMB 檔案分享。 關於檔案同步網路需求,請參見配置 Azure 檔案同步 代理與防火牆設定。
在閱讀本指南前,請先檢視 Azure 檔案儲存體 網路相關的注意事項。
先決條件
你可以透過設定儲存體帳戶以用於傳統檔案共用,或設定個別的 Microsoft.FileShares 資源,來限制對檔案共用的網路存取。 要限制對虛擬網路的存取,請使用以下方法之一:
建立私人端點
當你為檔案分享建立私人端點時,你會部署以下 Azure 資源:
-
私有端點:代表私有端點的 Azure 資源。 你可以把這個資源想像成目標資源與網路介面之間的連接器。
-
網路介面(NIC):在指定的虛擬網路及子網路中維護私有 IP 位址的網路介面。 這個資源與你部署虛擬機(VM)時部署的資源相同。 不過,私有端點並非指派給虛擬機,而是擁有它。
-
私有網域名稱系統(DNS)區域:這些步驟建立或重用一個連結到虛擬網路的 Azure 私有 DNS 區域,並為私有端點新增 A 紀錄。 你可以改用自己的 DNS 基礎設施,前提是客戶端能將檔案分享的主機名稱解析成私有端點的 IP 位址。
附註
在 Azure 公有雲中,兩個資源提供者都使用 private DNS 區域privatelink.file.core.windows.net。 它們的用戶端主機名稱不同;範例請參見 驗證連線能力。 對於其他 Azure 雲端的經典檔案分享,請使用該雲端的儲存端點後綴。 部署 Microsoft.FileShares 前,請先確認區域可用性。
經典版與 Microsoft.FileShares
私有端點建立的流程會因你使用的是經典檔案分享還是新的檔案共享模式而略有不同。 對於傳統檔案共用,您需為包含這些檔案共用的儲存體帳戶建立私人端點。 對於使用 Microsoft.FileShares 建立的檔案共用,您需為檔案共用本身建立私人端點。
許多步驟在兩種經驗中是相同的。 只有資源參考、群組 ID 和 DNS 記錄名稱不同,如下表所示。
|
傳統檔案共用 (Microsoft.Storage) |
檔案共用 (Microsoft.FileShares) |
|
私有端點目標 |
記憶體帳戶 |
檔案共用 |
|
資源指令檔 |
Get-AzStorageAccount |
Get-AzFileShare |
|
群組識別碼(子資源) |
file |
FileShare |
|
DNS A 記錄名稱 |
儲存體帳戶名稱 |
主機名稱前綴(例如, fs-xxxxxxxxxxxxxxxxx) |
前往您要建立私人端點的資源群組。 選擇 + 建立 並搜尋 「私人端點」。 選擇私有端點資源,然後選擇 建立。
巫師有好幾頁要完成。
在 基礎 頁面,選擇訂閱、資源群組、名稱、網路介面名稱及私有端點的區域。 你必須在與要建立私有端點的虛擬網路相同的區域中建立該私有端點。 然後選取 [下一步:資源]。
在資源頁面上,從資源類型的下拉式選單中選取Microsoft.Storage/storageAccounts。 在 資源區,選擇你想連接的特定儲存帳號。 對於 目標子資源,請選擇 file。 然後選取 [下一步:虛擬網路]。
在 資源 頁面上,從 資源類型 的下拉式選單中選取 Microsoft.FileShares/fileShares。 在 資源中,選擇你想連接的特定檔案分享。 目標子資源會自動填入FileShare。 然後選取 [下一步:虛擬網路]。
虛擬網路 頁面可讓您選取要新增私人端點的特定虛擬網路和子網路。 為新的私人端點選取動態或靜態 IP 位址配置。 如果你選擇靜態,還需要提供名稱和私人 IP 位址。 您也可以選擇性指定應用程式安全性群組。 完成後,選取 [下一步:DNS]。
DNS 頁面包含整合私人端點與私有 DNS 區域的資訊。 請確認訂閱和資源群組正確,然後選擇 「下一頁:標籤」。
您可以選擇性地套用標籤來分類您的資源,例如將 Environment 名稱和 Test 值套用到所有測試資源。 視需要輸入名稱/值組,然後選取 [下一步:檢閱 + 建立]。
選取 [建立] 以建立私人端點。
若要建立私人端點,請先取得儲存體帳戶或檔案共用的參考,以及要新增私人端點的虛擬子網路。 請將以下程式碼中的佔位值替換成你自己的值。
取得儲存帳戶的參考資料:
$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
取得檔案共用的參考:
$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 位址。 以下步驟適用於這兩個資源提供者。
# 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
取得檔案共用的參考:
# 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 位址。 以下步驟適用於這兩個資源提供者。
# 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
驗證連線能力
從虛擬網路中的用戶端,或是已將 DNS 設定為可解析私人端點的連線網路執行檢查。 關於資源提供者之間的差異,請參見 DNS 解析。 用原始主機名稱來掛載分享,而不是 privatelink 名稱。
請在 Windows、Linux 或 macOS 上,使用 PowerShell、命令列或終端機執行以下 DNS 查詢。
請用適當的儲存帳號名稱替換 <storage-account-name> :
nslookup <storage-account-name>.file.core.windows.net
如果成功,你會看到類似以下的輸出,其中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
使用檔案分享的主機名稱。 在檔案分享的概覽標籤中,從右上角選擇 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: <hostNamePrefix>.privatelink.file.core.windows.net
Address: 192.168.0.5
Aliases: <hostNamePrefix>.<zone>.file.storage.azure.net
執行以下 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.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
Resolve-DnsName -Name $fileShare.HostName
如果成功,你會看到類似以下的輸出,其中 192.168.0.5 是虛擬網路中私有端點的私有 IP 位址。
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
執行以下指令以取得主機名稱並驗證 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.windows.net)來掛載您的檔案共用,而不是使用 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
hostName=$(az fileshare show \
--resource-group $fileShareResourceGroupName \
--name $fileShareName \
--query "properties.hostName" --output tsv)
nslookup $hostName
如果成功,你會看到類似以下的輸出,其中 192.168.0.5 是虛擬網路中私有端點的私有 IP 位址。 你仍應使用檔案共用原本的 hostName 來掛載檔案共用,而不是使用 privatelink 路徑。
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
限制公用端點存取
你可以關閉公共網路存取,或在特定網路上保持啟用。 這些是不同的配置。 私有端點在任一配置下都能正常運作。
對於經典檔案分享,請在儲存帳號設定公開存取權限。 針對 Microsoft.FileShares,請在個別檔案分享中設定。 經典檔案分享也可以使用 網路安全邊界,但須受其通訊協定限制。 在強制模式下,周邊防護會阻擋 NFS 透過服務端點的流量。
停用公用端點的存取權
當你停用公用網路存取時,用戶端無法透過公用端點連線,包括透過服務端點。 用戶端仍可透過私用端點連線。 這個設定不會限制用戶端的輸出流量。
附註
對於經典檔案分享,現有的受信任服務與資源實例例外在你停用公共網路存取後仍可維持有效。 如果你只需要透過私有端點存取,請檢視這些例外。 請參閱 Azure 儲存體 網路安全限制。
要停用經典檔案分享的公共網路存取,請依照以下步驟操作:
- 移至您想要限制對公用端點所有輸入存取的儲存體帳戶。
- 在服務選單中,在安全 + 網路中選擇網路。
- 在公用網路存取下,選取 [管理]。
- 選擇 停用,然後選擇 繼續。
- 選取 [儲存]。
到你想關閉公開存取的檔案分享頁面。 在服務功能表的 [設定] 底下,選取 [組態]。 將 公共網路存取 設為 停用,然後選擇 儲存。
對於傳統檔案共用,請在儲存體帳戶上,將 -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
在檔案共用上,將 -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
對於經典檔案分享,請在儲存體帳戶上,將 --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
在檔案共用上,將 --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
限制對公共端點的存取僅限特定網路
若要允許來自特定子網的用戶端,請保持公共網路存取啟用,啟用該子網的服務端點,並將子網加入資源的網路規則中。 你可以使用服務端點,也可以不使用私有端點。 經典的 SMB 與 FileREST 存取也可使用 IP 位址規則;NFS 存取需要允許的子網。
PowerShell 和 CLI 範例假設已啟用公開網路存取。 Microsoft.FileShares 的例子也假設客戶端子網路已經有 Microsoft.Storage 服務端點。 要設定該端點,請參見 「在子網路啟用服務端點」。
對於經典檔案分享,請依照以下步驟限制公共端點只能使用特定網路。
- 移至您要將公用端點限制為僅供特定網路存取的儲存體帳戶。
- 在服務選單中,在安全 + 網路中選擇網路。
- 在 公共網路存取範圍中,選擇 從所選網路啟用。 此選擇揭示了控制公共端點限制的多種設定。
- 在虛擬網路中,選擇新增虛擬網路>「新增現有虛擬網路」以選擇應允許透過公共端點存取儲存帳號的虛擬網路。 選取虛擬網路和該虛擬網路的子網路,然後選取 [啟用]。 如果你想為此目的建立一個新的虛擬網路,請選擇 新增虛擬網路>新增虛擬網路,提供詳細資訊,然後選擇 建立。
- 對於 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 。 這個參數取代了略過設定,所以請包含你工作負載項目中仍需的其他略過選項。
使用 -AllowedSubnet 將允許的子網路資源識別碼傳遞給 Update-AzFileShare。 網路規則直接套用至檔案共用,因此沒有可供設定的儲存體帳戶。 用戶端子網仍需服務端點,如上述前置條件所述。
# 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 \
--default-action "Deny" \
--output none
這些指令保留現有的繞過設定。 如果整合需要受信任的服務存取權限,請在更新指令中加入 --bypass AzureServices 。 這個選項取代了繞過設定,所以請包含你的工作負載仍需要的其他繞過選項。
使用 --allowed-subnets 將允許的子網路資源 ID 傳遞給 az fileshare update。 網路規則直接適用於檔案共用,所以沒有可設定的儲存體帳戶。 用戶端子網仍需服務端點,如上述前置條件所述。
# 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
限制對特定儲存體帳戶的對外存取
用於控制檔案共用輸入存取的網路規則。 它們不限制客戶端能存取哪些其他儲存資源。 對於經典檔案分享,你可以選擇使用 服務端點政策 ,限制子網中用戶端能透過服務端點存取哪些儲存帳號。 該原則會篩選會繞過 Azure 防火牆 和網路虛擬設備的流量目的地。 它不會限制其他出站路徑,也不會取代目的地的網路規則和授權要求。 欲了解更多資訊,請參閱 「以服務端點政策限制外出存取」。
Important
服務端點原則目前不支援用於 Microsoft.FileShares 檔案共用。 用戶端子網路的原則會封鎖透過服務端點存取這些檔案共用,即使該原則允許其訂閱或資源群組。 此限制同樣適用於同時存取經典與 Microsoft.FileShares 檔案共用的子網路。 該子網中的用戶端必須使用 私人端點 才能存取 Microsoft.FileShares 檔案共用。
服務端點政策定義了用戶端在相關子網路中允許的儲存目的地。 它會阻止這些用戶端透過服務端點存取其他儲存帳號。 請記住以下幾點:
- 在把原則與子網關聯之前,先先把子網中的用戶端所使用的所有儲存帳號都先加一遍。 此清單包含子網路中其他工作負載使用的儲存帳號。
- 服務端點政策必須與虛擬網路位於相同的區域,且屬於相同的訂用帳戶。
- 一個政策對於
Microsoft.Storage 服務只能包含一個政策定義。 若要允許更多儲存帳號,請將它們的資源 ID 加入相同的政策定義。 你也可以允許資源群組或訂閱中的所有儲存帳號。
- 當你將政策與子網關聯後,該政策會適用於前往所有區域儲存帳戶的流量。
- 這些步驟假設子網路沒有服務端點政策。 如果政策已經被關聯,請檢視並更新這些政策,而不是替換它們的關聯。 PowerShell 和 CLI 範例如果找到已有關聯就會停止。
要建立服務端點政策並將其關聯到子網,請遵循以下步驟。 詳細步驟請參閱 建立與關聯服務端點政策。
- 在 Azure 入口網站頂端的搜尋框中,輸入 Service endpoint policy。 在搜尋結果中,選取服務端點原則。
- 選擇 + 創建。
- 在 基本 標籤中,選擇訂閱內容和虛擬網路的區域。 選擇資源群組,並輸入原則名稱。
- 選取 下一步:原則定義。
- 選取 + 新增資源。
服務,選擇 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
若要從具有服務端點政策的子網存取 Microsoft.FileShares 檔案共用,請為該檔案共用建立私人端點。 服務端點政策不適用於經過私有端點的流量。
另請參閱