透過使用 PowerShell 和虛擬網路服務端點來限制對 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 中。 Screenshot that shows an example of Try It for Azure Cloud Shell.
請前往 https://shell.azure.com,或選取 [啟動 Cloud Shell] 按鈕,在瀏覽器中開啟 Cloud Shell。 Button to launch Azure Cloud Shell.
選取 Azure 入口網站右上方功能表列上的 [Cloud Shell] 按鈕。 Screenshot that shows the Cloud Shell button in the Azure portal

若要使用 Azure Cloud Shell:

  1. 啟動 Cloud Shell。

  2. 選取程式碼區塊 (或命令區塊) 上的 [複製] 按鈕以複製程式碼或命令。

  3. 透過在 Windows 和 Linux 上選取 Ctrl+Shift+V;或在 macOS 上選取 Cmd+Shift+V,將程式碼或命令貼到 Cloud Shell 工作階段中。

  4. 選取 Enter 鍵執行程式碼或命令。

如果您選擇在本機安裝和使用 PowerShell,本文會要求使用 Azure PowerShell 模組 1.0.0 版或更新版本。 執行 Get-Module -ListAvailable Az 以尋找安裝的版本。 如果您需要升級,請參閱安裝 Azure PowerShell 模組。 如果您在本機執行 PowerShell,則也需要執行 Connect-AzAccount 以建立與 Azure 的連線。

建立虛擬網路

建立虛擬網路之前,您必須為虛擬網路以及在本文中建立的所有其他資源,建立資源群組。 使用 New-AzResourceGroup 來建立資源群組。 下列範例會建立名為 myResourceGroup 的資源群組:

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

使用 New-AzVirtualNetwork 建立虛擬網路。 下列範例會建立名為 myVirtualNetwork 的虛擬網路,位址首碼為 10.0.0.0/16

$virtualNetwork = New-AzVirtualNetwork `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -Name myVirtualNetwork `
  -AddressPrefix 10.0.0.0/16

使用 New-AzVirtualNetworkSubnetConfig 建立子網路設定。 下列範例會建立名為 Public 之子網路的子網路組態:

$subnetConfigPublic = Add-AzVirtualNetworkSubnetConfig `
  -Name Public `
  -AddressPrefix 10.0.0.0/24 `
  -VirtualNetwork $virtualNetwork

使用 Set-AzureRmVirtualNetwork 將子網路設定寫入至虛擬網路,以在虛擬網路中建立子網路:

$virtualNetwork | Set-AzVirtualNetwork

啟用服務端點

您只能針對支援服務端點的服務啟用服務端點。 使用 Get-AzVirtualNetworkAvailableEndpointService 檢視在 Azure 位置中提供且已啟用服務端點的服務。 下列範例會傳回 eastus 區域中所提供且已啟用服務端點的服務。 隨著更多 Azure 服務啟用服務端點,所傳回的服務清單會隨著時間成長。

Get-AzVirtualNetworkAvailableEndpointService -Location eastus | Select Name

在虛擬網路中建立其他子網路。 在此範例中,系統會建立名為「Private (私人)」的子網路,當中包含適用於 Microsoft.Storage 的服務端點

$subnetConfigPrivate = Add-AzVirtualNetworkSubnetConfig `
  -Name Private `
  -AddressPrefix 10.0.1.0/24 `
  -VirtualNetwork $virtualNetwork `
  -ServiceEndpoint Microsoft.Storage

$virtualNetwork | Set-AzVirtualNetwork

限制子網路的網路存取

使用 New-AzNetworkSecurityRuleConfig 建立網路安全性群組安全性規則。 下列規則允許對指派給 Azure 儲存體服務之公用 IP 位址的輸出存取:

$rule1 = New-AzNetworkSecurityRuleConfig `
  -Name Allow-Storage-All `
  -Access Allow `
  -DestinationAddressPrefix Storage `
  -DestinationPortRange * `
  -Direction Outbound `
  -Priority 100 `
  -Protocol * `
  -SourceAddressPrefix VirtualNetwork `
  -SourcePortRange *

下列規則會拒絕對所有公用 IP 位址的存取。 上一個規則會因其具有較高優先順序而覆寫這項規則,從而允許對 Azure 儲存體之公用 IP 位址的存取。

$rule2 = New-AzNetworkSecurityRuleConfig `
  -Name Deny-Internet-All `
  -Access Deny `
  -DestinationAddressPrefix Internet `
  -DestinationPortRange * `
  -Direction Outbound `
  -Priority 110 `
  -Protocol * `
  -SourceAddressPrefix VirtualNetwork `
  -SourcePortRange *

下列規則允許從任何地方輸入子網路的遠端桌面通訊協定 (RDP) 流量。 允許遠端桌面對子網路的連線,因此您可以在稍後的步驟中確認對資源的網路存取。

$rule3 = New-AzNetworkSecurityRuleConfig `
  -Name Allow-RDP-All `
  -Access Allow `
  -DestinationAddressPrefix VirtualNetwork `
  -DestinationPortRange 3389 `
  -Direction Inbound `
  -Priority 120 `
  -Protocol * `
  -SourceAddressPrefix * `
  -SourcePortRange *

使用 New-AzNetworkSecurityGroup 建立網路安全性群組。 下列範例會建立名為 myNsgPrivate 的網路安全性群組。

$nsg = New-AzNetworkSecurityGroup `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -Name myNsgPrivate `
  -SecurityRules $rule1,$rule2,$rule3

使用 Set-AzVirtualNetworkSubnetConfig 將網路安全性群組與「私人」子網路建立關聯,然後將子網路設定寫入虛擬網路。 下列範例會將 myNsgPrivate 網路安全性群組與「私人」子網路建立關聯:

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $VirtualNetwork `
  -Name Private `
  -AddressPrefix 10.0.1.0/24 `
  -ServiceEndpoint Microsoft.Storage `
  -NetworkSecurityGroup $nsg

$virtualNetwork | Set-AzVirtualNetwork

限制對資源的網路存取

如果資源是透過已針對服務端點啟用的 Azure 服務建立,則限制其網路存取的必要步驟會因為服務而有所差異。 請參閱個別服務的文件,以取得每個服務的特定步驟。 本文的其餘部分包含限制 Azure 儲存體帳戶網路存取的步驟 (以範例形式說明)。

建立儲存體帳戶

使用 New-AzStorageAccount 建立 Azure 儲存體帳戶。 請將 <replace-with-your-unique-storage-account-name> 取代為在所有 Azure 位置間具有唯一性、長度介於 3-24 個字元,且僅使用數字和小寫字母的名稱。

$storageAcctName = '<replace-with-your-unique-storage-account-name>'

New-AzStorageAccount `
  -Location EastUS `
  -Name $storageAcctName `
  -ResourceGroupName myResourceGroup `
  -SkuName Standard_LRS `
  -Kind StorageV2

建立儲存體帳戶之後,使用 Get-AzStorageAccountKey 將儲存體帳戶的金鑰擷取至變數:

$storageAcctKey = (Get-AzStorageAccountKey `
  -ResourceGroupName myResourceGroup `
  -AccountName $storageAcctName).Value[0]

在稍後步驟中,會使用金鑰來建立檔案共用。 輸入 $storageAcctKey 並將值記下,因為當您在稍後步驟中將檔案共用對應至 VM 中的磁碟機時,也需要以手動方式將它輸入。

在儲存體帳戶中建立檔案共用

使用 New-AzStorageContext 建立儲存體帳戶和金鑰的內容。 內容包含儲存體帳戶名稱和帳戶金鑰:

$storageContext = New-AzStorageContext $storageAcctName $storageAcctKey

使用 New-AzStorageShare 建立檔案共用:

$share = New-AzStorageShare my-file-share -Context $storageContext

拒絕所有對儲存體帳戶的網路存取

根據預設,儲存體帳戶會接受來自任何網路用戶端的網路連線。 若要限制對選取網路的存取,請使用 Update-AzStorageAccountNetworkRuleSet 將預設動作變更為「拒絕」。 一旦網路存取遭到拒絕後,就無法從任何網路存取儲存體帳戶。

Update-AzStorageAccountNetworkRuleSet  `
  -ResourceGroupName "myresourcegroup" `
  -Name $storageAcctName `
  -DefaultAction Deny

啟用子網路的網路存取

使用 Get-AzVirtualNetwork 擷取已建立的虛擬網路,然後使用 Get-AzVirtualNetworkSubnetConfig 將私人子網路物件擷取至變數:

$privateSubnet = Get-AzVirtualNetwork `
  -ResourceGroupName "myResourceGroup" `
  -Name "myVirtualNetwork" `
  | Get-AzVirtualNetworkSubnetConfig `
  -Name "Private"

使用 Add-AzStorageAccountNetworkRule 允許從「私人」子網路對儲存體帳戶進行網路存取。

Add-AzStorageAccountNetworkRule `
  -ResourceGroupName "myresourcegroup" `
  -Name $storageAcctName `
  -VirtualNetworkResourceId $privateSubnet.Id

建立虛擬機器

若要測試對儲存體帳戶的網路存取,請將 VM 部署到每個子網路。

建立第一部虛擬機器

使用 New-AzVMPublic 子網路中建立虛擬機器。 執行接下來的命令時,系統會提示您輸入認證。 您輸入的值會設定為 VM 的使用者名稱和密碼。 -AsJob 選項會在背景建立 VM,以便您繼續進行下一步。

New-AzVm `
    -ResourceGroupName "myResourceGroup" `
    -Location "East US" `
    -VirtualNetworkName "myVirtualNetwork" `
    -SubnetName "Public" `
    -Name "myVmPublic" `
    -AsJob

系統將傳回與下列範例輸出類似的輸出:

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
1      Long Running... AzureLongRun... Running       True            localhost            New-AzVM     

建立第二部虛擬機器

在「私人」子網路中建立虛擬機器:

New-AzVm `
    -ResourceGroupName "myResourceGroup" `
    -Location "East US" `
    -VirtualNetworkName "myVirtualNetwork" `
    -SubnetName "Private" `
    -Name "myVmPrivate"

Azure 建立 VM 需要幾分鐘的時間。 在 Azure 建立 VM 並傳回 PowerShell 的輸出之前,請勿繼續執行後續步驟。

確認對儲存體帳戶的存取

請使用 Get-AzPublicIpAddress 來傳回 VM 的公用 IP 位址。 以下範例會傳回 myVmPrivate 虛擬機器的公用 IP 位址:

Get-AzPublicIpAddress `
  -Name myVmPrivate `
  -ResourceGroupName myResourceGroup `
  | Select IpAddress

使用前一個命令傳回的公用 IP 位址來取代下列命令中的 <publicIpAddress>,然後輸入下列命令:

mstsc /v:<publicIpAddress>

遠端桌面通訊協定 (.rdp) 檔案已建立並下載到您的電腦。 開啟下載的 rdp 檔案。 如果出現提示,請選取 [連接]。 輸入在建立 VM 時所指定的使用者名稱與密碼。 您可能需要選取 [其他選擇],然後選取 [使用不同的帳戶],以指定您在建立 VM 時輸入的認證。 選取 [確定]。 您可能會在登入程序期間收到憑證警告。 如果您收到警告,請選取 [是] 或 [繼續] 以繼續進行連線。

在 myVmPrivate VM 上,使用 PowerShell 將 Azure 檔案共用對應至磁碟機 Z。 在執行後續命令之前,請將 <storage-account-key><storage-account-name> 取代為您在建立儲存體帳戶中提供或取出的值。

$acctKey = ConvertTo-SecureString -String "<storage-account-key>" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList "Azure\<storage-account-name>", $acctKey
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\<storage-account-name>.file.core.windows.net\my-file-share" -Credential $credential

PowerShell 會傳回類似以下範例輸出的輸出:

Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
Z                                      FileSystem    \\vnt.file.core.windows.net\my-f...

Azure 檔案共用已成功對應到 Z 磁碟機。

確認 VM 沒有任何以其他公用 IP 位址為目標的輸出連線:

ping bing.com

您不會收到回應,因為與「私人」子網路相關聯的網路安全性群組只允許對指派給 Azure 儲存體服務的位址進行輸出存取,此位址以外的公用 IP 位址一律不允許。

關閉 myVmPrivate 虛擬機器的遠端桌面工作階段。

確認已拒絕存取儲存體帳戶

取得 myVmPublic VM 的公用 IP 位址:

Get-AzPublicIpAddress `
  -Name myVmPublic `
  -ResourceGroupName myResourceGroup `
  | Select IpAddress

使用前一個命令傳回的公用 IP 位址來取代下列命令中的 <publicIpAddress>,然後輸入下列命令:

mstsc /v:<publicIpAddress>

在 myVmPublic VM 上,嘗試將 Azure 檔案共用對應磁碟機 Z。在執行後續命令之前,請將 <storage-account-key><storage-account-name> 取代為您在建立儲存體帳戶中提供或取出的值。

$acctKey = ConvertTo-SecureString -String "<storage-account-key>" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList "Azure\<storage-account-name>", $acctKey
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\<storage-account-name>.file.core.windows.net\my-file-share" -Credential $credential

存取共用遭到拒絕,且您收到 New-PSDrive : Access is denied 錯誤。 存取遭到拒絕,因為 myVmPublic VM 是部署在「公用」子網路中。 「公用」子網路沒有已啟用的服務端點可供 Azure 儲存體使用,且儲存體帳戶只允許「私人」子網路而不允許「公用」子網路的網路存取。

關閉 myVmPublic VM 的遠端桌面工作階段。

嘗試從您的電腦使用下列命令來檢視儲存體帳戶中的檔案共用:

Get-AzStorageFile `
  -ShareName my-file-share `
  -Context $storageContext

存取遭到拒絕,且您收到「Get-AzStorageFile:遠端伺服器傳回一個錯誤:(403) 禁止。HTTP 狀態碼:403 - HTTP錯誤訊息:此要求未獲授權執行此作業」錯誤,因為您的電腦不在 MyVirtualNetwork 虛擬網路的「私人」子網路中。

清除資源

您可以使用 Remove-AzResourceGroup 來移除不再需要的資源群組,以及其所包含的所有資源:

Remove-AzResourceGroup -Name myResourceGroup -Force

下一步

在本文中,您已啟用虛擬網路子網路的服務端點。 您已了解可以針對使用多個 Azure 服務部署的資源啟用服務端點。 您已建立 Azure 儲存體帳戶,並將儲存體帳戶的網路存取限制為只能存取虛擬網路子網路內的資源。 若要深入了解服務端點,請參閱服務端點概觀管理子網路

如果您的帳戶中有多個虛擬網路,您可以同時連線兩個虛擬網路,讓每個虛擬網路內的資源都可互相進行通訊。 若要了解作法,請參閱連線虛擬網路