透過使用 Azure CLI 的虛擬網路服務端點來限制對 PaaS 資源的網路存取

虛擬網路服務端點讓您能夠將對一些 Azure 服務資源的網路存取限制為一個虛擬網路子網路。 您也可以移除對資源的網際網路存取。 服務端點提供從您的虛擬網路到支援之 Azure 服務的直接連線,讓您能夠使用虛擬網路的私人位址空間來存取 Azure 服務。 透過服務端點流向 Azure 資源的流量,一律保持在 Microsoft Azure 骨幹網路上。 在本文中,您將學會如何:

  • 建立具有一個子網路的虛擬網路
  • 新增子網路,並啟用服務端點
  • 建立 Azure 資源,並僅允許從子網路對其進行網路存取
  • 將虛擬機器 (VM) 部署到每個子網路
  • 確認從子網路對資源的存取
  • 確認從子網路和網際網路對資源的存取遭到拒絕

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

  • 本文需要 2.0.28 版或更新版本的 Azure CLI。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。

建立虛擬網路

建立虛擬網路之前,您必須為虛擬網路以及在本文中建立的所有其他資源,建立資源群組。 使用 az group create 來建立資源群組。 下列範例會在 eastus 位置建立名為 myResourceGroup 的資源群組。

az group create \
  --name myResourceGroup \
  --location eastus

使用 az network vnet create 建立具有一個子網路的虛擬網路。

az network vnet create \
  --name myVirtualNetwork \
  --resource-group myResourceGroup \
  --address-prefix 10.0.0.0/16 \
  --subnet-name Public \
  --subnet-prefix 10.0.0.0/24

啟用服務端點

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

az network vnet list-endpoint-services \
  --location eastus \
  --out table

使用 az network vnet subnet create 在虛擬網路中建立其他的子網路。 在此範例中,系統會針對子網路建立 Microsoft.Storage 的服務端點:

az network vnet subnet create \
  --vnet-name myVirtualNetwork \
  --resource-group myResourceGroup \
  --name Private \
  --address-prefix 10.0.1.0/24 \
  --service-endpoints Microsoft.Storage

限制子網路的網路存取

使用 az network nsg create 建立網路安全性群組。 下列範例會建立名為 myNsgPrivate 的網路安全性群組。

az network nsg create \
  --resource-group myResourceGroup \
  --name myNsgPrivate

請使用 az network vnet subnet update 將網路安全性群組與「私人」子網路建立關聯。 下列範例會將 myNsgPrivate 網路安全性群組與「私人」子網路建立關聯:

az network vnet subnet update \
  --vnet-name myVirtualNetwork \
  --name Private \
  --resource-group myResourceGroup \
  --network-security-group myNsgPrivate

使用 az network nsg rule create 來建立安全性規則。 下列規則允許對指派給 Azure 儲存體服務之公用 IP 位址的輸出存取:

az network nsg rule create \
  --resource-group myResourceGroup \
  --nsg-name myNsgPrivate \
  --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 myResourceGroup \
  --nsg-name myNsgPrivate \
  --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 myResourceGroup \
  --nsg-name myNsgPrivate \
  --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"

限制對資源的網路存取

如果資源是透過已針對服務端點啟用的 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 myResourceGroup \
  --sku Standard_LRS \
  --kind StorageV2

建立儲存體帳戶之後,使用 az storage account show-connection-string 將儲存體帳戶的連接字串取出至變數中。 在稍後步驟中,會使用連接字串來建立檔案共用。

saConnectionString=$(az storage account show-connection-string \
  --name $storageAcctName \
  --resource-group myResourceGroup \
  --query 'connectionString' \
  --out tsv)

檢視變數的內容,並記下輸出中傳回的 AccountKey 值,因為後續步驟中會用到此值。

echo $saConnectionString

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

使用 az storage share create 在儲存體帳戶中建立檔案共用。 在稍後步驟中,會裝載此檔案共用,以確認其網路存取。

az storage share create \
  --name my-file-share \
  --quota 2048 \
  --connection-string $saConnectionString > /dev/null

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

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

az storage account update \
  --name $storageAcctName \
  --resource-group myResourceGroup \
  --default-action Deny

啟用子網路的網路存取

使用 az storage account network-rule add 允許從「私人」子網路對儲存體帳戶的網路存取。

az storage account network-rule add \
  --resource-group myResourceGroup \
  --account-name $storageAcctName \
  --vnet-name myVirtualNetwork \
  --subnet Private

建立虛擬機器

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

建立第一部虛擬機器

使用 az vm create 在「公用」子網路中建立虛擬機器。 如果預設金鑰位置中還沒有 SSH 金鑰,此命令將會建立這些金鑰。 若要使用一組特定金鑰,請使用 --ssh-key-value 選項。

az vm create \
  --resource-group myResourceGroup \
  --name myVmPublic \
  --image Ubuntu2204 \
  --vnet-name myVirtualNetwork \
  --subnet Public \
  --generate-ssh-keys

建立 VM 需要幾分鐘的時間。 建立虛擬機器之後,Azure CLI 會顯示類似下列範例的資訊:

{
  "fqdns": "",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVmPublic",
  "location": "eastus",
  "macAddress": "00-0D-3A-23-9A-49",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "13.90.242.231",
  "resourceGroup": "myResourceGroup"
}

請記下傳回之輸出中的 publicIpAddress。 在稍後的步驟中,這個位址可用來從網際網路存取虛擬機器。

建立第二部虛擬機器

az vm create \
  --resource-group myResourceGroup \
  --name myVmPrivate \
  --image Ubuntu2204 \
  --vnet-name myVirtualNetwork \
  --subnet Private \
  --generate-ssh-keys

建立 VM 需要幾分鐘的時間。 在建立之後,請記下傳回之輸出中的 publicIpAddress。 在稍後的步驟中,這個位址可用來從網際網路存取虛擬機器。

確認對儲存體帳戶的存取

使用 SSH 連線到 myVmPrivate VM。 將 <publicIpAddress> 取代為您 myVmPrivate VM 的公用 IP 位址。

ssh <publicIpAddress>

建立裝載點的資料夾:

sudo mkdir /mnt/MyAzureFileShare

將 Azure 檔案共用裝載至您所建立的目錄。 執行下列命令之前,請將 <storage-account-name> 取代為帳戶名稱,並將 <storage-account-key> 取代為您在建立儲存體帳戶中取出的金鑰。

sudo mount --types cifs //<storage-account-name>.file.core.windows.net/my-file-share /mnt/MyAzureFileShare --options vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino

您會收到 user@myVmPrivate:~$ 提示字元。 Azure 檔案共用已成功裝載到 /mnt/MyAzureFileShare

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

ping bing.com -c 4

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

結束對 myVmPrivate VM 的 SSH 工作階段。

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

使用下列命令來建立使用 myVmPublic VM 的 SSH 工作階段。 以 myVmPublic VM 的公用 IP 位址取代 <publicIpAddress>

ssh <publicIpAddress>

建立裝載點的目錄:

sudo mkdir /mnt/MyAzureFileShare

嘗試將 Azure 檔案共用裝載至您所建立的目錄。 本文假設您已部署最新版本的 Ubuntu。 如果您是使用舊版的 Ubuntu,請參閱 Linux 上的裝載,以取得有關裝載檔案共用的其他指示。 執行下列命令之前,請將 <storage-account-name> 取代為帳戶名稱,並將 <storage-account-key> 取代為您在建立儲存體帳戶中取出的金鑰:

sudo mount --types cifs //storage-account-name>.file.core.windows.net/my-file-share /mnt/MyAzureFileShare --options vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino

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

結束對 myVmPublic VM 的 SSH 工作階段。

嘗試從您的電腦使用 az storage share list 來檢視儲存體帳戶中的共用。 將 <account-name><account-key> 取代為儲存體帳戶名稱和建立儲存體帳戶中的金鑰:

az storage share list \
  --account-name <account-name> \
  --account-key <account-key>

存取遭到拒絕,且您收到「此要求未獲授權執行此作業」錯誤,因為您的電腦不在 MyVirtualNetwork 虛擬網路的「私人」子網路中。

清除資源

請使用 az group delete 來移除不再需要的資源群組以及其所包含的所有資源。

az group delete --name myResourceGroup --yes

下一步

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

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