教學課程:使用虛擬網路服務端點限制對 PaaS 資源的網路存取
在此文章
虛擬網路服務端點讓您能夠將對一些 Azure 服務資源的網路存取限制為一個虛擬網路子網路。 您也可以移除對資源的網際網路存取。 服務端點提供從您的虛擬網路到支援之 Azure 服務的直接連線,讓您能夠使用虛擬網路的私人位址空間來存取 Azure 服務。 透過服務端點流向 Azure 資源的流量,一律保持在 Microsoft Azure 骨幹網路上。
在本教學課程中,您會了解如何:
建立具有一個子網路的虛擬網路
新增子網路,並啟用服務端點
建立 Azure 資源,並僅允許從子網路對其進行網路存取
將虛擬機器 (VM) 部署到每個子網路
確認從子網路對資源的存取
確認從子網路和網際網路對資源的存取遭到拒絕
必要條件
如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶 。
Azure Cloud Shell
Azure Cloud Shell 是裝載於 Azure 中的互動式殼層環境,可在瀏覽器中使用。 您可以使用 Bash 或 PowerShell 搭配 Cloud Shell,與 Azure 服務共同使用。 您可以使用 Cloud Shell 預先安裝的命令,執行本文提到的程式碼,而不必在本機環境上安裝任何工具。
要啟動 Azure Cloud Shell:
選項
範例/連結
選取程式碼或命令區塊右上角的 [試試看] 。 選取 [試試看] 並不會自動將程式碼或命令複製到 Cloud Shell 中。
請前往 https://shell.azure.com ,或選取 [啟動 Cloud Shell] 按鈕,在瀏覽器中開啟 Cloud Shell。
選取 Azure 入口網站 右上方功能表列上的 [Cloud Shell] 按鈕。
若要使用 Azure Cloud Shell:
啟動 Cloud Shell。
選取程式碼區塊 (或命令區塊) 上的 [複製] 按鈕以複製程式碼或命令。
透過在 Windows 和 Linux 上選取 Ctrl +Shift +V ;或在 macOS 上選取 Cmd +Shift +V ,將程式碼或命令貼到 Cloud Shell 工作階段中。
選取 Enter 鍵執行程式碼或命令。
如果您選擇在本機安裝和使用 PowerShell,本文會要求使用 Azure PowerShell 模組 1.0.0 版或更新版本。 執行 Get-Module -ListAvailable Az
以尋找安裝的版本。 如果您需要升級,請參閱安裝 Azure PowerShell 模組 。 如果正在本機執行 PowerShell,也需要執行 Connect-AzAccount
,以建立與 Azure 的連線。
如果您沒有 Azure 訂閱 ,請在開始之前,先建立 Azure 免費帳戶 。
本文需要 2.0.28 版或更新版本的 Azure CLI。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。
啟用服務端點
建立虛擬網路和 Azure Bastion 主機
下列程序會建立具有資源子網路、Azure Bastion 子網路和 Bastion 主機的虛擬網路:
在入口網站中,搜尋並選取 [虛擬網路] 。
在 [虛擬網路] 頁面上,選取 [+ 建立]。
在 [建立虛擬網路] 的 [基本] 索引標籤上,輸入或選取下列資訊:
設定
值
專案詳細資料
訂用帳戶
選取您的訂用帳戶。
資源群組
選取 [新建] 輸入 test-rg 作為名稱。 選取 [確定 ]。
[執行個體詳細資料]
名稱
輸入 vnet-1 。
區域
選取 [美國東部 2] 。
選取 [下一步] ,繼續前往 [安全性] 索引標籤。
在 [Azure Bastion] 區段中,選取 [啟用 Azure Bastion] 。
Bastion 會使用您的瀏覽器,透過安全殼層 (SSH) 或遠端桌面通訊協定 (RDP) 連線至虛擬網路中的 VM (使用其私人 IP 位址)。 VM 不需要公用 IP 位址、用戶端軟體或特殊設定。 如需詳細資訊,請參閱什麼是 Azure Bastion? 。
注意
無論輸出資料使用量為何,每小時價格都是從部署 Bastion 的那一刻開始計費。 如需詳細資訊,請參閱價格 和 SKU 。 如果您要在教學課程或測試期間部署 Bastion,建議您在使用完畢後刪除此資源。
在 Azure Bastion 中,輸入或選取下列資訊:
設定
值
Azure Bastion 主機名稱
輸入 bastion 。
Azure Bastion 公用 IP 位址
選取 [建立公用 IP 位址] 。 在 [名稱] 中輸入 public-ip-bastion 。 選取 [確定 ]。
選取 [下一步] ,繼續前往 [IP 位址] 索引標籤。
在 [子網路] 的 [位址空間] 方塊中,選取 [預設] 子網路。
在 [編輯子網路] 中,輸入或選取下列資訊:
設定
值
子網路用途
保留 Default 的預設值。
名稱
輸入 subnet-1 。
IPv4
IPv4 位址範圍
保留 10.0.0.0/16 的預設值。
起始位址
保留預設值 [10.0.0.0] 。
大小
保留 /24 (256 個位址) 的預設值。
選取 [儲存]。
選取視窗底部的 [檢閱 + 建立] 。 通過驗證後,選取 [建立] 。
依每個子網路、每個服務啟用服務端點。
在入口網站頁面頂端的搜尋方塊中,搜尋虛擬網路 。 選取搜尋結果中的 [虛擬網路] 。
在 [虛擬網路] 中,選取 [vnet-1] 。
在 vnet-1 的 [設定] 區段中,選取 [子網路] 。
選取 [+ 子網路] 。
在 [新增子網路] 頁面上,輸入,或選取下列資訊:
設定
值
名稱
subnet-private
子網路位址範圍
保留預設值 [10.0.2.0/24] 。
服務端點
服務
選取 [Microsoft.Storage]
選取 [儲存]。
警告
針對具有資源的現有子網路啟用服務端點之前,請參閱變更子網路設定 。
建立虛擬網路
建立虛擬網路之前,您必須為虛擬網路以及在本文中建立的所有其他資源,建立資源群組。 使用 New-AzResourceGroup 來建立資源群組。 下列範例會建立名為 test-rg 的資源群組:
$rg = @{
ResourceGroupName = "test-rg"
Location = "westus2"
}
New-AzResourceGroup @rg
使用 New-AzVirtualNetwork 建立虛擬網路。 以下範例會建立一個名為 vnet-1 且位址首碼為 10.0.0.0/16 的虛擬網路。
$vnet = @{
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "vnet-1"
AddressPrefix = "10.0.0.0/16"
}
$virtualNetwork = New-AzVirtualNetwork @vnet
使用 New-AzVirtualNetworkSubnetConfig 建立子網路設定。 下列範例會建立名為 [subnet-public] 之子網路的子網路組態:
$subpub = @{
Name = "subnet-public"
AddressPrefix = "10.0.0.0/24"
VirtualNetwork = $virtualNetwork
}
$subnetConfigPublic = Add-AzVirtualNetworkSubnetConfig @subpub
使用 Set-AzureRmVirtualNetwork 將子網路設定寫入至虛擬網路,以在虛擬網路中建立子網路:
$virtualNetwork | Set-AzVirtualNetwork
在虛擬網路中建立另一个子網路。 在此範例中,系統會建立名為 [subnet-private] 的子網路,當中包含適用於 [Microsoft.Storage] 的服務端點:
$subpriv = @{
Name = "subnet-private"
AddressPrefix = "10.0.2.0/24"
VirtualNetwork = $virtualNetwork
ServiceEndpoint = "Microsoft.Storage"
}
$subnetConfigPrivate = Add-AzVirtualNetworkSubnetConfig @subpriv
$virtualNetwork | Set-AzVirtualNetwork
部署 Azure Bastion
Azure Bastion 會使用您的瀏覽器,透過安全殼層 (SSH) 或遠端桌面通訊協定 (RDP) 連線至虛擬網路中的 VM (使用其私人 IP 位址)。 VM 不需要公用 IP 位址、用戶端軟體或特殊設定。 如需 Bastion 的詳細資訊,請參閱什麼是 Azure Bastion? 。
無論輸出資料使用量為何,每小時價格都是從部署 Bastion 的那一刻開始計費。 如需詳細資訊,請參閱價格 和 SKU 。 如果您要在教學課程或測試期間部署 Bastion,建議您在使用完畢後刪除此資源。
為您的虛擬網路設定 Bastion 子網路。 此子網路專門保留用於 Bastion 資源,且必須命名為 [AzureBastionSubnet] 。
$subnet = @{
Name = 'AzureBastionSubnet'
VirtualNetwork = $virtualNetwork
AddressPrefix = '10.0.1.0/26'
}
$subnetConfig = Add-AzVirtualNetworkSubnetConfig @subnet
設定組態:
$virtualNetwork | Set-AzVirtualNetwork
為 Bastion 建立公用 IP 位址。 Bastion 主機使用公用 IP 透過连接埠 443 存取 SSH 和 RDP。
$ip = @{
ResourceGroupName = 'test-rg'
Name = 'public-ip'
Location = 'westus2'
AllocationMethod = 'Static'
Sku = 'Standard'
Zone = 1,2,3
}
New-AzPublicIpAddress @ip
使用 [New-AzBastion] 命令,在 [AzureBastionSubnet] 中建立新的標準 Bastion 主機:
$bastion = @{
Name = 'bastion'
ResourceGroupName = 'test-rg'
PublicIpAddressRgName = 'test-rg'
PublicIpAddressName = 'public-ip'
VirtualNetworkRgName = 'test-rg'
VirtualNetworkName = 'vnet-1'
Sku = 'Basic'
}
New-AzBastion @bastion -AsJob
部署 Bastion 資源大約需要 10 分鐘。 當 Bastion 部署到您的虛擬網路時,您可以在下一節中建立 VM。
建立虛擬網路
建立虛擬網路之前,您必須為虛擬網路以及在本文中建立的所有其他資源,建立資源群組。 使用 az group create 來建立資源群組。 下列範例會在 westus2 位置建立名為 test-rg 的資源群組。
az group create \
--name test-rg \
--location westus2
使用 az network vnet create 建立具有一個子網路的虛擬網路。
az network vnet create \
--name vnet-1 \
--resource-group test-rg \
--address-prefix 10.0.0.0/16 \
--subnet-name subnet-public \
--subnet-prefix 10.0.0.0/24
您只能針對支援服務端點的服務啟用服務端點。 使用 az network vnet list-endpoint-services 來檢視 Azure 位置中所提供之已啟用服務端點的服務。 下列範例會傳回 [westus2] 區域中所提供且已啟用服務端點的服務。 隨著更多 Azure 服務啟用服務端點,所傳回的服務清單會隨著時間成長。
az network vnet list-endpoint-services \
--location westus2 \
--out table
使用 az network vnet subnet create 在虛擬網路中建立另一个子網路。 在此範例中,系統會針對子網路建立 Microsoft.Storage
的服務端點:
az network vnet subnet create \
--vnet-name vnet-1 \
--resource-group test-rg \
--name subnet-private \
--address-prefix 10.0.1.0/24 \
--service-endpoints Microsoft.Storage
限制子網路的網路存取
根據預設,子網路中的所有虛擬機器執行個體均可與任何資源進行通訊。 建立網路安全性群組,並將它與子網路產生關聯,即可限制與子網路中所有資源之間的通訊。
在入口網站頁面頂端的搜尋方塊中,搜尋網路安全性群組 。 在搜尋結果中選取 [網路安全性群組] 。
在 [網路安全性群組] 中,選取 [+ 新增] 。
在 [建立網路安全性群組] 的 [基本] 索引標籤中,輸入或選取下列資訊:
設定
值
專案詳細資料
訂用帳戶
選取您的訂用帳戶。
資源群組
選取 [test-rg] 。
[執行個體詳細資料]
名稱
輸入 nsg-storage 。
區域
選取 [美國東部 2] 。
選取 [檢閱 + 建立] ,然後選取 [建立] 。
使用 New-AzNetworkSecurityGroup 建立網路安全性群組。 下列範例會建立名為 [nsg-private] 的網路安全性群組。
$nsgpriv = @{
ResourceGroupName = 'test-rg'
Location = 'westus2'
Name = 'nsg-private'
}
$nsg = New-AzNetworkSecurityGroup @nsgpriv
使用 az network nsg create 建立網路安全性群組。 下列範例會建立名為 [nsg-private] 的網路安全性群組。
az network nsg create \
--resource-group test-rg \
--name nsg-private
建立輸出網路安全性群組 (NSG) 規則
在入口網站頁面頂端的搜尋方塊中,搜尋網路安全性群組 。 在搜尋結果中選取 [網路安全性群組] 。
選取 [nsg-storage] 。
選取 [設定] 中的 [輸出安全性規則] 。
選取 + 新增 。
建立規則,以允許對 Azure 儲存體服務的連出通訊。 在 [新增輸出安全性規則] 中輸入或選取下列資訊:
設定
值
來源
選取 [服務標記] 。
來源服務標籤
選取 [VirtualNetwork] 。
來源連接埠範圍
保留預設值 * 。
Destination
選取 [服務標記] 。
目的地服務標籤
選取儲存體 。
服務
保留預設值 [自訂] 。
目的地連接埠範圍
輸入 445 。
通訊協定
選取 [任何] 。
動作
選取允許 。
優先順序
保留 [100] 的預設值。
名稱
輸入 allow-storage-all 。
選取 + 新增 。
建立另一個連出安全性規則,以拒絕與網際網路的通訊。 此規則會覆寫所有網路安全性群組中允許輸出網際網路通訊的預設規則。 在 [新增輸出安全性規則] 中使用下列值完成上述步驟:
設定
值
來源
選取 [服務標記] 。
來源服務標籤
選取 [VirtualNetwork] 。
來源連接埠範圍
保留預設值 * 。
Destination
選取 [服務標記] 。
目的地服務標籤
選取 [網際網路] 。
服務
保留預設值 [自訂] 。
目的地連接埠範圍
輸入 * 。
通訊協定
選取 [任何] 。
動作
選取 [拒絕] 。
優先順序
保留預設值 110 。
名稱
輸入 deny-internet-all 。
選取 [新增]。
在入口網站頁面頂端的搜尋方塊中,搜尋網路安全性群組 。 在搜尋結果中選取 [網路安全性群組] 。
選取 [nsg-storage] 。
在 [設定] 中選取 [子網路] 。
選取 [+ 建立關聯] 。
在 [產生子網路關聯] 中,針對 [虛擬網路] 選取 vnet-1 。 在 [子網路] 中選取 [subnet-private] 。
選取 [確定]。
使用 New-AzNetworkSecurityRuleConfig 建立網路安全性群組安全性規則。 下列規則允許對指派給 Azure 儲存體服務之公用 IP 位址的輸出存取:
$r1 = @{
Name = "Allow-Storage-All"
Access = "Allow"
DestinationAddressPrefix = "Storage"
DestinationPortRange = "*"
Direction = "Outbound"
Priority = 100
Protocol = "*"
SourceAddressPrefix = "VirtualNetwork"
SourcePortRange = "*"
}
$rule1 = New-AzNetworkSecurityRuleConfig @r1
下列規則會拒絕對所有公用 IP 位址的存取。 上一個規則會因其具有較高優先順序而覆寫這項規則,從而允許對 Azure 儲存體之公用 IP 位址的存取。
$r2 = @{
Name = "Deny-Internet-All"
Access = "Deny"
DestinationAddressPrefix = "Internet"
DestinationPortRange = "*"
Direction = "Outbound"
Priority = 110
Protocol = "*"
SourceAddressPrefix = "VirtualNetwork"
SourcePortRange = "*"
}
$rule2 = New-AzNetworkSecurityRuleConfig @r2
使用 [Get-AzNetworkSecurityGroup] 將網路安全性群組物件擷取至變數中。 使用 [Set-AzNetworkSecurityRuleConfig] 將規則新增至網路安全性群組。
# Retrieve the existing network security group
$nsgpriv = @{
ResourceGroupName = 'test-rg'
Name = 'nsg-private'
}
$nsg = Get-AzNetworkSecurityGroup @nsgpriv
# Add the new rules to the security group
$nsg.SecurityRules += $rule1
$nsg.SecurityRules += $rule2
# Update the network security group with the new rules
Set-AzNetworkSecurityGroup -NetworkSecurityGroup $nsg
使用 Set-AzVirtualNetworkSubnetConfig 將網路安全性群組與 [subnet-private] 子網路建立關聯,然後將子網路設定寫入虛擬網路。 下列範例會將 [nsg-private] 網路安全性群組與 [subnet-private] 子網路建立關聯:
$subnet = @{
VirtualNetwork = $VirtualNetwork
Name = "subnet-private"
AddressPrefix = "10.0.2.0/24"
ServiceEndpoint = "Microsoft.Storage"
NetworkSecurityGroup = $nsg
}
Set-AzVirtualNetworkSubnetConfig @subnet
$virtualNetwork | Set-AzVirtualNetwork
使用 az network nsg rule create 來建立安全性規則。 下列規則允許對指派給 Azure 儲存體服務之公用 IP 位址的輸出存取:
az network nsg rule create \
--resource-group test-rg \
--nsg-name nsg-private \
--name Allow-Storage-All \
--access Allow \
--protocol "*" \
--direction Outbound \
--priority 100 \
--source-address-prefix "VirtualNetwork" \
--source-port-range "*" \
--destination-address-prefix "Storage" \
--destination-port-range "*"
每個網路安全性群組均包含數個預設的安全性規則 。 隨後的規則會覆寫允許對所有公用 IP 位址進行輸出存取的預設安全性規則。 destination-address-prefix "Internet"
選項會拒絕對所有公用 IP 位址的輸出存取。 上一個規則會因其具有較高優先順序而覆寫這項規則,從而允許對 Azure 儲存體之公用 IP 位址的存取。
az network nsg rule create \
--resource-group test-rg \
--nsg-name nsg-private \
--name Deny-Internet-All \
--access Deny \
--protocol "*" \
--direction Outbound \
--priority 110 \
--source-address-prefix "VirtualNetwork" \
--source-port-range "*" \
--destination-address-prefix "Internet" \
--destination-port-range "*"
下列規則允許 SSH 流量從任何地方輸入子網路。 此規則會覆寫會拒絕來自網際網路之所有連入流量的預設安全性規則。 允許透過 SSH 連線至子網路,以便在稍後步驟中測試連線能力。
az network nsg rule create \
--resource-group test-rg \
--nsg-name nsg-private \
--name Allow-SSH-All \
--access Allow \
--protocol Tcp \
--direction Inbound \
--priority 120 \
--source-address-prefix "*" \
--source-port-range "*" \
--destination-address-prefix "VirtualNetwork" \
--destination-port-range "22"
請使用 [az network vnet subnet update] 將網路安全性群組與 [subnet-private] 子網路建立關聯。 下列範例會將 [nsg-private] 網路安全性群組與 [subnet-private] 子網路建立關聯:
az network vnet subnet update \
--vnet-name vnet-1 \
--name subnet-private \
--resource-group test-rg \
--network-security-group nsg-private
限制對資源的網路存取
如果資源是透過已針對服務端點啟用的 Azure 服務建立,則限制其網路存取的必要步驟會因為服務不同而有所差異。 請參閱個別服務的文件,以取得每個服務的特定步驟。 此教學課程的其餘部分包括限制對 Azure 儲存體帳戶進行網路存取的步驟 (以範例形式說明)。
建立儲存體帳戶
請依照本文中的步驟建立 Azure 儲存體帳戶。 如果您已經有儲存體帳戶,您可以改用它。
在入口網站頂端的搜尋方塊中,輸入儲存體帳戶 。 選取搜尋結果中的儲存體帳戶 。
選取 + 建立 。
在 [建立儲存體帳戶] 的 [基本] 索引標籤中,輸入或選取下列資訊:
設定
值
專案詳細資料
訂用帳戶
選取 Azure 訂閱。
資源群組
選取 [test-rg] 。
[執行個體詳細資料]
儲存體帳戶名稱
輸入 storage1 。 如果名稱無法使用,請輸入唯一的名稱。
Location
選取 [(美國) 美國東部 2] 。
效能
保留預設值 [標準] 。
備援性
選取 [本地備援儲存體 (LRS)] 。
選取審查 。
選取 建立 。
使用 New-AzStorageAccount 建立 Azure 儲存體帳戶。 請將 <replace-with-your-unique-storage-account-name>
取代為在所有 Azure 位置間具有唯一性、長度介於 3-24 個字元,且僅使用數字和小寫字母的名稱。
$storageAcctName = '<replace-with-your-unique-storage-account-name>'
$storage = @{
Location = 'westus2'
Name = $storageAcctName
ResourceGroupName = 'test-rg'
SkuName = 'Standard_LRS'
Kind = 'StorageV2'
}
New-AzStorageAccount @storage
建立儲存體帳戶之後,使用 Get-AzStorageAccountKey 將儲存體帳戶的金鑰擷取至變數:
$storagekey = @{
ResourceGroupName = 'test-rg'
AccountName = $storageAcctName
}
$storageAcctKey = (Get-AzStorageAccountKey @storagekey).Value[0]
在本教學課程中,連接字串用於連線至儲存體帳戶。 Microsoft 建議您使用最安全的可用驗證流程。 此程序中所述的驗證流程在應用程式中需要高度信任,且具有其他流程中不存在的風險。 請僅在其他較安全的流程 (例如受控身分識別) 皆不具可行性的情況下,才使用這個流程。
如需使用受控識別連線至儲存體帳戶的詳細資訊,請參閱 [使用受控識別存取 Azure 儲存體] 。
在稍後步驟中,會使用金鑰來建立檔案共用。 輸入 $storageAcctKey
並記下值。 在稍後的步驟中,當您將檔案共用對應至虛擬機器中的磁碟機時,您可以手動輸入它。
如果資源是透過已針對服務端點啟用的 Azure 服務建立,則限制其網路存取的必要步驟會因為服務而有所差異。 請參閱個別服務的文件,以取得每個服務的特定步驟。 本文的其餘部分包含限制 Azure 儲存體帳戶網路存取的步驟 (以範例形式說明)。
建立儲存體帳戶
使用 az storage account create 建立 Azure 儲存體帳戶。 請將 <replace-with-your-unique-storage-account-name>
取代為在所有 Azure 位置間具有唯一性、長度介於 3-24 個字元,且僅使用數字和小寫字母的名稱。
storageAcctName="<replace-with-your-unique-storage-account-name>"
az storage account create \
--name $storageAcctName \
--resource-group test-rg \
--sku Standard_LRS \
--kind StorageV2
建立儲存體帳戶之後,使用 az storage account show-connection-string 將儲存體帳戶的連接字串取出至變數中。 在稍後步驟中,會使用連接字串來建立檔案共用。
在本教學課程中,連接字串用於連線至儲存體帳戶。 Microsoft 建議您使用最安全的可用驗證流程。 此程序中所述的驗證流程在應用程式中需要高度信任,且具有其他流程中不存在的風險。 請僅在其他較安全的流程 (例如受控身分識別) 皆不具可行性的情況下,才使用這個流程。
如需使用受控識別連線至儲存體帳戶的詳細資訊,請參閱 [使用受控識別存取 Azure 儲存體] 。
saConnectionString=$(az storage account show-connection-string \
--name $storageAcctName \
--resource-group test-rg \
--query 'connectionString' \
--out tsv)
在儲存體帳戶中建立檔案共用
在入口網站頂端的搜尋方塊中,輸入儲存體帳戶 。 選取搜尋結果中的儲存體帳戶 。
在 [儲存體帳戶] 中,選取您在上一個步驟中建立的儲存體帳戶。
在 [資料儲存體] 中,選取 [檔案共用] 。
選取 [+ 檔案共用] 。
在 [新檔案共用] 中輸入或選擇下列資訊:
設定
值
名稱
輸入 file-share 。
層
保留預設值 [交易最佳化] 。
選取 [下一步:備份] 。
取消選取 [啟用備份] 。
選取 [檢閱 + 建立] ,然後選取 [建立] 。
使用 New-AzStorageContext 建立儲存體帳戶和金鑰的內容。 內容包含儲存體帳戶名稱和帳戶金鑰:
$storagecontext = @{
StorageAccountName = $storageAcctName
StorageAccountKey = $storageAcctKey
}
$storageContext = New-AzStorageContext @storagecontext
使用 New-AzStorageShare 建立檔案共用:
$fs = @{
Name = "file-share"
Context = $storageContext
}
$share = New-AzStorageShare @fs
使用 az storage share create 在儲存體帳戶中建立檔案共用。 在稍後步驟中,會裝載此檔案共用,以確認其網路存取。
az storage share create \
--name file-share \
--quota 2048 \
--connection-string $saConnectionString > /dev/null
限制對子網路的網路存取
根據預設,儲存體帳戶接受來自任何網路 (包括網際網路) 之用戶端的網路連線。 您可以限制來自網際網路以及所有虛擬網路中所有其他子網路的網路存取 (vnet-1 虛擬網路中的 subnet-private 子網路除外。)
限制對子網路的網路存取:
在入口網站頂端的搜尋方塊中,輸入儲存體帳戶 。 選取搜尋結果中的儲存體帳戶 。
選取您的儲存體帳戶。
在 [安全性 + 網路] 中,選取 [網路] 。
在 [防火牆和虛擬網路] 索引標籤中,選取 [公用網路存取] 中的 [從選取的虛擬網路和 IP 位址啟用] 。
在 [虛擬網路] 中,選取 [+ 新增現有的虛擬網路] 。
在 [新增網路] 中,輸入或選取下列資訊:
設定
值
訂用帳戶
選取您的訂用帳戶。
虛擬網路
選取 [vnet-1] 。
子網路
選取 [subnet-private] 。
選取 [新增]。
選取 [儲存] ,以儲存虛擬網路設定。
根據預設,儲存體帳戶會接受來自任何網路用戶端的網路連線。 若要限制對選取網路的存取,請使用 Update-AzStorageAccountNetworkRuleSet 將預設動作變更為「拒絕」 。 網路存取遭到拒絕後,就無法從任何網路存取儲存體帳戶。
$storagerule = @{
ResourceGroupName = "test-rg"
Name = $storageAcctName
DefaultAction = "Deny"
}
Update-AzStorageAccountNetworkRuleSet @storagerule
使用 Get-AzVirtualNetwork 擷取已建立的虛擬網路,然後使用 Get-AzVirtualNetworkSubnetConfig 將私人子網路物件擷取至變數:
$subnetpriv = @{
ResourceGroupName = "test-rg"
Name = "vnet-1"
}
$privateSubnet = Get-AzVirtualNetwork @subnetpriv | Get-AzVirtualNetworkSubnetConfig -Name "subnet-private"
使用 Add-AzStorageAccountNetworkRule 允許從 [subnet-private] 子網路對儲存體帳戶進行網路存取。
$storagenetrule = @{
ResourceGroupName = "test-rg"
Name = $storageAcctName
VirtualNetworkResourceId = $privateSubnet.Id
}
Add-AzStorageAccountNetworkRule @storagenetrule
根據預設,儲存體帳戶會接受來自任何網路用戶端的網路連線。 若要限制對選取網路的存取,請使用 az storage account update 將預設動作變更為「拒絕」 。 網路存取遭到拒絕後,就無法從任何網路存取儲存體帳戶。
az storage account update \
--name $storageAcctName \
--resource-group test-rg \
--default-action Deny
使用 [az storage account network-rule add] 允許從 [subnet-private] 子網路對儲存體帳戶的網路存取。
az storage account network-rule add \
--resource-group test-rg \
--account-name $storageAcctName \
--vnet-name vnet-1 \
--subnet subnet-private
將虛擬機器部署至子網路
若要測試對儲存體帳戶的網路存取,請將虛擬機器部署至每個子網路。
建立測試虛擬機器
下列程序會在虛擬網路中建立名為 vm-1 的測試虛擬機器 (VM)。
在入口網站中,搜尋並選取 [虛擬機器] 。
在 [虛擬機器] 中,選取 [+ 建立] ,然後選取 [Azure 虛擬機器] 。
在 [建立虛擬機器] 的 [基本] 索引標籤上,輸入或選取下列資訊:
設定
值
專案詳細資料
訂用帳戶
選取您的訂用帳戶。
資源群組
選取 [test-rg] 。
[執行個體詳細資料]
虛擬機器名稱
輸入 vm-1 。
區域
選取 [美國東部 2] 。
可用性選項
選取 [不需要基礎結構備援] 。
安全性類型
保留預設值 [標準] 。
映像
選取 [Windows Server 2022 Datacenter - x64 Gen2] 。
VM 架構
保留預設值 [x64] 。
大小
選取大小。
系統管理員帳戶
驗證類型
選取 [密碼] 。
使用者名稱
輸入 azureuser 。
密碼
輸入密碼。
確認密碼
請重新輸入密碼。
輸入連接埠規則
公用輸入連接埠
選取 [無]。
選取頁面頂端的 [網路] 索引標籤。
在 [網路] 索引標籤中,輸入或選取以下資訊:
設定
值
網路介面
虛擬網路
選取 [vnet-1] 。
子網路
選取 [subnet-1 (10.0.0.0/24)] 。
公用 IP
選取 [無]。
NIC 網路安全性群組
選取進階 。
設定網路安全性群組
選取 [新建] 輸入 nsg-1 作為名稱。 將其餘項目保留為預設值,然後選取 [確定] 。
將其餘設定保留為預設值,然後選取 [檢閱 + 建立] 。
檢閱設定並選取 [建立] 。
注意
虛擬網路中的虛擬機器 (具有 Bastion 主機) 不需要公用 IP 位址。 Bastion 會提供公用 IP,而 VM 會使用私人 IP 在網路內通訊。 您可以從裝載了 Bastion 的虛擬網路中,移除任何 VM 的公用 IP。 如需詳細資訊,請參閱中斷公用 IP 位址與 Azure VM 的關聯 。
注意
無論是未獲指派公用 IP 位址的 VM,或位於內部基本 Azure 負載平衡器後端集區的 VM,Azure 都會為其提供預設輸出存取 IP。 預設輸出存取 IP 機制能提供無法自行設定的輸出 IP 位址。
發生下列其中一個事件時,會停用預設輸出存取 IP:
公用 IP 位址會指派給 VM。
無論有沒有輸出規則,都會將 VM 放在標準負載平衡器的後端集區中。
Azure NAT 閘道 資源會指派給 VM 的子網路。
您在彈性協調流程模式中使用虛擬機器擴展集建立的 VM 沒有預設輸出存取。
如需 Azure 中輸出連線的詳細資訊,請參閱 Azure 中的預設對外存取 與針對輸出連線,使用來源網路位址轉譯 (SNAT) 。
建立第二部虛擬機器
重複上一節中的步驟建立第二個虛擬機器。 在 [建立虛擬機器] 中,取代下列值:
設定
值
虛擬機器名稱
輸入 vm-private 。
子網路
選取 [subnet-private] 。
公用 IP
選取 [無]。
NIC 網路安全性群組
選取 [無]。
建立第一部虛擬機器
使用 [New-AzVM] 在 [subnet-public] 子網路中建立虛擬機器。 執行接下來的命令時,系統會提示您輸入認證。 您輸入的值會設定為 VM 的使用者名稱和密碼。
$vm1 = @{
ResourceGroupName = "test-rg"
Location = "westus2"
VirtualNetworkName = "vnet-1"
SubnetName = "subnet-public"
Name = "vm-public"
PublicIpAddressName = $null
}
New-AzVm @vm1
建立第二部虛擬機器
在 [subnet-private] 子網路中建立虛擬機器:
$vm2 = @{
ResourceGroupName = "test-rg"
Location = "westus2"
VirtualNetworkName = "vnet-1"
SubnetName = "subnet-private"
Name = "vm-private"
PublicIpAddressName = $null
}
New-AzVm @vm2
Azure 建立 VM 需要幾分鐘的時間。 在 Azure 建立 VM 並傳回 PowerShell 的輸出之前,請勿繼續執行後續步驟。
若要測試對儲存體帳戶的網路存取,請將 VM 部署到每個子網路。
建立第一部虛擬機器
使用 [az vm create] 在 [subnet-public] 子網路中建立虛擬機器。 如果預設金鑰位置中還沒有 SSH 金鑰,此命令將會建立這些金鑰。 若要使用一組特定金鑰,請使用 --ssh-key-value
選項。
az vm create \
--resource-group test-rg \
--name vm-public \
--image Ubuntu2204 \
--vnet-name vnet-1 \
--subnet subnet-public \
--admin-username azureuser \
--generate-ssh-keys
建立 VM 需要幾分鐘的時間。 建立虛擬機器之後,Azure CLI 會顯示類似下列範例的資訊:
{
"fqdns": "",
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm-public",
"location": "westus2",
"macAddress": "00-0D-3A-23-9A-49",
"powerState": "VM running",
"privateIpAddress": "10.0.0.4",
"publicIpAddress": "203.0.113.24",
"resourceGroup": "test-rg"
}
建立第二部虛擬機器
az vm create \
--resource-group test-rg \
--name vm-private \
--image Ubuntu2204 \
--vnet-name vnet-1 \
--subnet subnet-private \
--admin-username azureuser \
--generate-ssh-keys
建立 VM 需要幾分鐘的時間。
確認對儲存體帳戶的存取
您稍早建立的虛擬機器 (已指派給 subnet-private 子網路) 會用於確認對儲存體帳戶的存取。 您在上一節中建立的虛擬機器 (已指派給 subnet-1 子網路) 會用於確認對儲存體帳戶的存取遭到封鎖。
取得儲存體帳戶存取金鑰
在入口網站頂端的搜尋方塊中,輸入儲存體帳戶 。 選取搜尋結果中的儲存體帳戶 。
在 [儲存體帳戶] 中,選取您的儲存體帳戶。
在 [安全性 + 網路] 中,選取 [存取金鑰] 。
複製 key1 的值。 您可能需要選取 [顯示] 按鈕以顯示金鑰。
在入口網站頂端的搜尋方塊中,輸入虛擬機器 。 在搜尋結果中,選取 [虛擬機器 ]。
選取 [vm-private] 。
在 [作業] 中選取 [Bastion] 。
輸入在建立虛擬機器時指定的使用者名稱和密碼。 選取 Connect 。
請開啟 Windows PowerShell。 使用下列指令碼將 Azure 檔案共用對應至磁碟機 Z。
$key = @{
String = "<storage-account-key>"
}
$acctKey = ConvertTo-SecureString @key -AsPlainText -Force
$cred = @{
ArgumentList = "Azure\<storage-account-name>", $acctKey
}
$credential = New-Object System.Management.Automation.PSCredential @cred
$map = @{
Name = "Z"
PSProvider = "FileSystem"
Root = "\\<storage-account-name>.file.core.windows.net\file-share"
Credential = $credential
}
New-PSDrive @map
PowerShell 會傳回類似以下範例輸出的輸出:
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
Z FileSystem \\storage8675.file.core.windows.net\f...
Azure 檔案共用已成功對應到 Z 磁碟機。
關閉與 vm-private 的 Bastion 連線。
您稍早建立的虛擬機器 (已指派給 subnet-private 子網路) 會用於確認對儲存體帳戶的存取。 您在上一節中建立的虛擬機器 (已指派給 subnet-1 子網路) 會用於確認對儲存體帳戶的存取遭到封鎖。
取得儲存體帳戶存取金鑰
登入 Azure 入口網站 。
在入口網站頂端的搜尋方塊中,輸入儲存體帳戶 。 選取搜尋結果中的儲存體帳戶 。
在 [儲存體帳戶] 中,選取您的儲存體帳戶。
在 [安全性 + 網路] 中,選取 [存取金鑰] 。
複製 key1 的值。 您可能需要選取 [顯示] 按鈕以顯示金鑰。
在入口網站頂端的搜尋方塊中,輸入虛擬機器 。 在搜尋結果中,選取 [虛擬機器 ]。
選取 [vm-private] 。
在 [概觀] 中,選取 [連結] 和 [透過 Bastion 連結] 。
輸入在建立虛擬機器時指定的使用者名稱和密碼。 選取 Connect 。
請開啟 Windows PowerShell。 使用下列指令碼將 Azure 檔案共用對應至磁碟機 Z。
$key = @{
String = "<storage-account-key>"
}
$acctKey = ConvertTo-SecureString @key -AsPlainText -Force
$cred = @{
ArgumentList = "Azure\<storage-account-name>", $acctKey
}
$credential = New-Object System.Management.Automation.PSCredential @cred
$map = @{
Name = "Z"
PSProvider = "FileSystem"
Root = "\\<storage-account-name>.file.core.windows.net\file-share"
Credential = $credential
}
New-PSDrive @map
PowerShell 會傳回類似以下範例輸出的輸出:
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
Z FileSystem \\storage8675.file.core.windows.net\f...
Azure 檔案共用已成功對應到 Z 磁碟機。
確認 VM 沒有任何以其他公用 IP 位址為目標的輸出連線:
ping bing.com
您不會收到回應,因為與 [私人] 子網路相關聯的網路安全性群組只允許對指派給 Azure 儲存體服務的位址進行輸出存取,此位址以外的公用 IP 位址一律不允許。
關閉與 vm-private 的 Bastion 連線。
使用 SSH 連線到 [vm-private] VM。
執行以下命令,將 VM 的 IP 位址儲存為環境變數:
export IP_ADDRESS=$(az vm show --show-details --resource-group test-rg --name vm-private --query publicIps --output tsv)
ssh -o StrictHostKeyChecking=no azureuser@$IP_ADDRESS
建立裝載點的資料夾:
sudo mkdir /mnt/file-share
將 Azure 檔案共用裝載至您所建立的目錄。 執行下列命令之前,請將 <storage-account-name>
取代為帳戶名稱,並將 <storage-account-key>
取代為您在建立儲存體帳戶 中取出的金鑰。
sudo mount --types cifs //<storage-account-name>.file.core.windows.net/my-file-share /mnt/file-share --options vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino
您會收到 user@vm-private:~$
提示字元。 Azure 檔案共用已成功裝載到 [/mnt/file-share] 。
確認 VM 沒有任何以其他公用 IP 位址為目標的輸出連線:
ping bing.com -c 4
您不會收到回應,因為與 [subnet-private] 子網路相關聯的網路安全性群組只允許對指派給 Azure 儲存體服務的位址進行輸出存取,此位址以外的公用 IP 位址一律不允許。
結束對 [vm-private] VM 的 SSH 工作階段。
確認已拒絕存取儲存體帳戶
從 vm-1
在入口網站頂端的搜尋方塊中,輸入虛擬機器 。 在搜尋結果中,選取 [虛擬機器 ]。
選取 [vm-1] 。
在 [作業] 中選取 [Bastion] 。
輸入在建立虛擬機器時指定的使用者名稱和密碼。 選取 Connect 。
重複上述命令,嘗試將磁碟機對應至儲存體帳戶中的檔案共用。 針對此程序,您可能需要再次複製儲存體帳戶存取金鑰:
$key = @{
String = "<storage-account-key>"
}
$acctKey = ConvertTo-SecureString @key -AsPlainText -Force
$cred = @{
ArgumentList = "Azure\<storage-account-name>", $acctKey
}
$credential = New-Object System.Management.Automation.PSCredential @cred
$map = @{
Name = "Z"
PSProvider = "FileSystem"
Root = "\\<storage-account-name>.file.core.windows.net\file-share"
Credential = $credential
}
New-PSDrive @map
您應該會收到下列錯誤訊息:
New-PSDrive : Access is denied
At line:1 char:5
+ New-PSDrive @map
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Z:PSDriveInfo) [New-PSDrive], Win32Exception
+ FullyQualifiedErrorId : CouldNotMapNetworkDrive,Microsoft.PowerShell.Commands.NewPSDriveCommand
關閉與 vm-1 的 Bastion 連線。
從本機電腦
在入口網站頂端的搜尋方塊中,輸入儲存體帳戶 。 選取搜尋結果中的儲存體帳戶 。
在 [儲存體帳戶] 中,選取您的儲存體帳戶。
在 [資料儲存體] 中,選取 [檔案共用] 。
選取 [檔案共用] 。
選取左側功能表中的 [瀏覽] 。
您應該會收到下列錯誤訊息:
注意
存取遭到拒絕,因為您的電腦不在 vnet-1 虛擬網路的 subnet-private 子網路中。
從 vm-1
在入口網站頂端的搜尋方塊中,輸入虛擬機器 。 在搜尋結果中,選取 [虛擬機器 ]。
選取 [vm-1] 。
在 [作業] 中選取 [Bastion] 。
輸入在建立虛擬機器時指定的使用者名稱和密碼。 選取 Connect 。
重複上述命令,嘗試將磁碟機對應至儲存體帳戶中的檔案共用。 針對此程序,您可能需要再次複製儲存體帳戶存取金鑰:
$key = @{
String = "<storage-account-key>"
}
$acctKey = ConvertTo-SecureString @key -AsPlainText -Force
$cred = @{
ArgumentList = "Azure\<storage-account-name>", $acctKey
}
$credential = New-Object System.Management.Automation.PSCredential @cred
$map = @{
Name = "Z"
PSProvider = "FileSystem"
Root = "\\<storage-account-name>.file.core.windows.net\file-share"
Credential = $credential
}
New-PSDrive @map
您應該會收到下列錯誤訊息:
New-PSDrive : Access is denied
At line:1 char:5
+ New-PSDrive @map
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Z:PSDriveInfo) [New-PSDrive], Win32Exception
+ FullyQualifiedErrorId : CouldNotMapNetworkDrive,Microsoft.PowerShell.Commands.NewPSDriveCommand
關閉與 vm-1 的 Bastion 連線。
嘗試從您的電腦使用下列命令來檢視儲存體帳戶中的檔案共用:
$storage = @{
ShareName = "file-share"
Context = $storageContext
}
Get-AzStorageFile @storage
存取遭到拒絕。 您會收到類似於下列範例的輸出。
Get-AzStorageFile : The remote server returned an error: (403) Forbidden. HTTP Status Code: 403 - HTTP Error Message: This request isn't authorized to perform this operation
您的電腦不在 [vnet-1] 虛擬網路的 [subnet-private] 子網路中。
SSH 連線至 [vm-public] VM。
執行以下命令,將 VM 的 IP 位址儲存為環境變數:
export IP_ADDRESS=$(az vm show --show-details --resource-group test-rg --name vm-public --query publicIps --output tsv)
ssh -o StrictHostKeyChecking=no azureuser@$IP_ADDRESS
建立裝載點的目錄:
sudo mkdir /mnt/file-share
嘗試將 Azure 檔案共用裝載至您所建立的目錄。 本文假設您已部署最新版本的 Ubuntu。 如果您是使用舊版的 Ubuntu,請參閱 [Linux 上的裝載] ,以取得有關裝載檔案共用的更多指示。 執行下列命令之前,請將 <storage-account-name>
取代為帳戶名稱,並將 <storage-account-key>
取代為您在建立儲存體帳戶 中取出的金鑰:
sudo mount --types cifs //storage-account-name>.file.core.windows.net/file-share /mnt/file-share --options vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino
存取遭到拒絕,且您收到 mount error(13): Permission denied
錯誤,因為 [vm-public] VM 是部署在 [subnet-public] 子網路中。 [subnet-public] 子網路沒有已啟用的服務端點可供 Azure 儲存體使用,且儲存體帳戶只允許 [subnet-private] 子網路而不允許 [subnet-public] 子網路的網路存取。
結束對 [vm-public] VM 的 SSH 工作階段。
嘗試從您的電腦使用 az storage share list 來檢視儲存體帳戶中的共用。 將 <account-name>
和 <account-key>
取代為儲存體帳戶名稱和建立儲存體帳戶 中的金鑰:
az storage share list \
--account-name <account-name> \
--account-key <account-key>
存取遭到拒絕,且您收到 [此要求未獲授權執行此作業] 錯誤,因為您的電腦不在 [subnet-private] 虛擬網路的 [vnet-1] 子網路中。
當完成了使用您所建立的資源時,您可以刪除資源群組及其所有資源。
在 Azure 入口網站中,搜尋並選取 [資源群組]。
在 [資源群組] 頁面上,選取 [test-rg] 資源群組。
在 [test-rg] 頁面上,選取 [刪除資源群組] 。
在 [輸入資源群組名稱以確認刪除] 中輸入 test-rg ,然後選取 [刪除] 。
您可以使用 Remove-AzResourceGroup 來移除不再需要的資源群組,以及其所包含的所有資源:
$cleanup = @{
Name = "test-rg"
}
Remove-AzResourceGroup @cleanup -Force
清除資源
請使用 az group delete 來移除不再需要的資源群組以及其所包含的所有資源。
az group delete \
--name test-rg \
--yes \
--no-wait
下一步
在本教學課程中:
若要深入了解服務端點,請參閱服務端點概觀 和管理子網路 。
如果您的帳戶中有多個虛擬網路,建議您在這些虛擬網路之間建立連線,讓資源能夠彼此通訊。 若要了解如何連線虛擬網路,請移至下一個教學課程。