練習 - 建立和管理網路安全性群組
身為製造業公司的解決方案架構師,您現在想要開始將 ERP 應用程式和資料庫伺服器移至 Azure。 第一步是使用兩部伺服器來測試網路安全性計劃。
在本單元中,您將設定網路安全性群組和安全性規則,以限制對特定伺服器的網路流量。 您想要讓應用程式伺服器能夠透過 HTTP 連線至資料庫伺服器。 您不想要讓資料庫伺服器能夠使用 HTTP 連線至應用程式伺服器。
備註
此練習為選擇性項目。 如果您想要完成此練習,您必須先建立 Azure 訂用帳戶,才能開始。 如果您沒有 Azure 帳戶,或目前不想建立帳戶,您可以閱讀指示,以便瞭解所呈現的資訊。
備註
您必須使用資源群組來完成本練習中的步驟。 您可以使用已建立的資源群組,也可以專門為此練習建立新的資源群組。 如果您選擇建立新的資源群組,則可讓您更輕鬆地清除您在完成練習時建立的任何資源。 如果您沒有現有的資源群組,或想要針對此練習建立新的資源群組,您可以遵循 使用 Azure 入口網站和 Azure Resource Manager 管理資源群組 中的步驟,使用 Azure 入口網站建立資源群組,也可以遵循使用 Azure CLI 管理 Azure 資源群組 中的步驟,使用 Azure CLI 建立資源群組。
備註
在本單元中,您會使用 Azure Cloud Shell 作為終端機。 您可以透過 Azure 入口網站 或 Cloud Shell 登入來存取 Cloud Shell。 您無需在 PC 或筆記本電腦上安裝任何東西即可使用它。
建立虛擬網路與網路安全性群組
首先,您將為伺服器資源建立虛擬網路和子網路。 接著,您要建立網路安全性群組。
開啟 Azure Cloud Shell 並執行下列命令,將資源群組的名稱指派給變數
rg。 將 myResourceGroupName 取代為您的資源群組名稱。rg="myResourceGroupName"若要建立 ERP-servers 虛擬網路和 Applications 子網路,請在 Cloud Shell 中執行下列命令:
az network vnet create \ --resource-group $rg \ --name ERP-servers \ --address-prefixes 10.0.0.0/16 \ --subnet-name Applications \ --subnet-prefixes 10.0.0.0/24若要建立 Databases 子網路,在 Cloud Shell 中執行下列命令:
az network vnet subnet create \ --resource-group $rg \ --vnet-name ERP-servers \ --address-prefixes 10.0.1.0/24 \ --name Databases若要建立 ERP-SERVERS-NSG 網路安全性群組,請在 Cloud Shell 中執行下列命令:
az network nsg create \ --resource-group $rg \ --name ERP-SERVERS-NSG
建立執行 Ubuntu 的 VM
接著,您將建立名為 AppServer 和 DataServer 的兩部 VM。 您會將 AppServer 部署至應用程式子網路,以及將 DataServer 部署至資料庫子網路。 將 VM 網路介面新增至 ERP-SERVERS-NSG 網路安全性群組。 然後,若要測試網路安全性群組,請使用這些 VM。
若要建置 AppServer VM,請在 Cloud Shell 中執行下列命令。 針對系統管理員帳戶,將
<password>改為複雜密碼。wget -N https://raw.githubusercontent.com/MicrosoftDocs/mslearn-secure-and-isolate-with-nsg-and-service-endpoints/master/cloud-init.yml && \ az vm create \ --resource-group $rg \ --name AppServer \ --vnet-name ERP-servers \ --subnet Applications \ --nsg ERP-SERVERS-NSG \ --image Ubuntu2204 \ --size Standard_DS1_v2 \ --generate-ssh-keys \ --admin-username azureuser \ --custom-data cloud-init.yml \ --no-wait \ --admin-password <password>若要建置 DataServer VM,請在 Cloud Shell 中執行下列命令。 針對系統管理員帳戶,將
<password>改為複雜密碼。az vm create \ --resource-group $rg \ --name DataServer \ --vnet-name ERP-servers \ --subnet Databases \ --nsg ERP-SERVERS-NSG \ --size Standard_DS1_v2 \ --image Ubuntu2204 \ --generate-ssh-keys \ --admin-username azureuser \ --custom-data cloud-init.yml \ --no-wait \ --admin-password <password>VM 可能需要數分鐘的時間才能處於執行狀態。 若要確認 VM 正在執行,請在 Cloud Shell 中執行下列命令:
az vm list \ --resource-group $rg \ --show-details \ --query "[*].{Name:name, Provisioned:provisioningState, Power:powerState}" \ --output table當 VM 建立完成時,您應該會看到下列輸出:
Name Provisioned Power ---------- ------------- ---------- AppServer Succeeded VM running DataServer Succeeded VM running
檢查預設連線能力
現在,您將嘗試對每部 VM 開啟「安全殼層」(SSH) 工作階段。 請記住,到目前為止,您已部署一個具有預設規則的網路安全性群組。
若要連線至 VM,請直接從 Cloud Shell 使用 SSH。 若要這樣做,則需要已指派給 VM 的公用 IP 位址。 若要列出將用來連線至 VM 的 IP 位址,請在 Cloud Shell 中執行下列命令:
az vm list \ --resource-group $rg \ --show-details \ --query "[*].{Name:name, PrivateIP:privateIps, PublicIP:publicIps}" \ --output table為了在練習的剩餘期間能夠更輕鬆連線至 VM,請將公用 IP 位址指派給變數。 若要將 AppServer 和 DataServer 的公用 IP 位址儲存至變數,請在 Cloud Shell 中執行下列命令:
APPSERVERIP="$(az vm list-ip-addresses \ --resource-group $rg \ --name AppServer \ --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \ --output tsv)" DATASERVERIP="$(az vm list-ip-addresses \ --resource-group $rg \ --name DataServer \ --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \ --output tsv)"若要檢查是否可連線至 AppServer VM,請在 Cloud Shell 中執行下列命令:
ssh azureuser@$APPSERVERIP -o ConnectTimeout=5您將收到
Connection timed out訊息。若要檢查是否可連線至 DataServer VM,請在 Cloud Shell 中執行下列命令:
ssh azureuser@$DATASERVERIP -o ConnectTimeout=5您將收到相同的連線失敗訊息。
請記住,預設規則會拒絕所有傳送至虛擬網路的連入流量,除非此流量來自相同的虛擬網路。 「拒絕所有連入」規則會封鎖您剛才嘗試的連入 SSH 連線。
連入
| 名稱 | 優先順序 | 來源 IP | 目的地 IP | 存取 |
|---|---|---|---|---|
| 允許 VNet 連入 | 65000 | VIRTUAL_NETWORK | VIRTUAL_NETWORK | 允許 |
| 拒絕所有連入 | 65500 | * | * | 拒絕 |
建立 SSH 的安全性規則
如同您現在所體驗到的,ERP-SERVERS-NSG 網路安全性群組中的預設規則包含「拒絕所有連入」規則。 您現在將新增規則,以便使用 SSH 來連線至 AppServer 和 DataServer。
若要建立新的輸入安全性規則來啟用 SSH 存取,請在 Cloud Shell 中執行下列命令:
az network nsg rule create \ --resource-group $rg \ --nsg-name ERP-SERVERS-NSG \ --name AllowSSHRule \ --direction Inbound \ --priority 100 \ --source-address-prefixes '*' \ --source-port-ranges '*' \ --destination-address-prefixes '*' \ --destination-port-ranges 22 \ --access Allow \ --protocol Tcp \ --description "Allow inbound SSH"若要檢查現在是否可連線至 AppServer VM,請在 Cloud Shell 中執行下列命令:
ssh azureuser@$APPSERVERIP -o ConnectTimeout=5網路安全性群組規則可能需要一兩分鐘的時間才會生效。 如果您收到連線失敗訊息,請稍待片刻,然後再試一次。
您現在應該已能夠連線。 在
Are you sure you want to continue connecting (yes/no)?訊息之後,輸入yes。輸入您建立 VM 時定義的密碼。
若要關閉 AppServer 工作階段,請輸入
exit。若要檢查現在是否可連線至 DataServer VM,請在 Cloud Shell 中執行下列命令:
ssh azureuser@$DATASERVERIP -o ConnectTimeout=5您現在應該已能夠連線。 在
Are you sure you want to continue connecting (yes/no)?訊息之後,輸入yes。輸入您建立 VM 時定義的密碼。
若要關閉 DataServer 工作階段,請輸入
exit。
建立安全性規則以防止 Web 存取
現在新增規則,以便讓 AppServer 能夠透過 HTTP 與 DataServer 進行通訊,但讓 DataServer 無法透過 HTTP 與 AppServer 進行通訊。 以下是這些伺服器的內部 IP 位址:
| 伺服器名稱 | IP 位址 |
|---|---|
| AppServer | 10.0.0.4 |
| DataServer | 10.0.1.4 |
若要建立新的輸入安全性規則以拒絕透過連接埠 80 而來的 HTTP 存取,請在 Cloud Shell 中執行下列命令:
az network nsg rule create \ --resource-group $rg \ --nsg-name ERP-SERVERS-NSG \ --name httpRule \ --direction Inbound \ --priority 150 \ --source-address-prefixes 10.0.1.4 \ --source-port-ranges '*' \ --destination-address-prefixes 10.0.0.4 \ --destination-port-ranges 80 \ --access Deny \ --protocol Tcp \ --description "Deny from DataServer to AppServer on port 80"
測試虛擬機器之間的 HTTP 連線能力
在這裡,您將檢查新規則是否能夠運作。 AppServer 應該要能夠透過 HTTP 與 DataServer 進行通訊。 DataServer 應該要不能夠透過 HTTP 與 AppServer 進行通訊。
若要連線至 AppServer VM,請在 Cloud Shell 中執行下列命令。 檢查 AppServer 是否能夠透過 HTTP 與 DataServer 進行通訊。
ssh -t azureuser@$APPSERVERIP 'wget http://10.0.1.4; exit; bash'輸入您建立 VM 時定義的密碼。
回應應包含
200 OK訊息。若要連線至 DataServer VM,請在 Cloud Shell 中執行下列命令。 檢查 DataServer 是否能夠透過 HTTP 與 AppServer 進行通訊。
ssh -t azureuser@$DATASERVERIP 'wget http://10.0.0.4; exit; bash'輸入您建立 VM 時定義的密碼。
這應該要無法成功,因為您已封鎖透過連接埠 80 的存取。 在數分鐘之後,您應該收到
Connection timed out訊息。 若要在逾時前停止命令,請選取 [Ctrl+C]。
部署應用程式安全性群組
接著,為資料庫伺服器建立應用程式安全性群組,以便能夠為此群組中的所有伺服器指派相同設定。 您正打算部署更多資料庫伺服器,並想要防止這些伺服器透過 HTTP 存取應用程式伺服器。 藉由在應用程式安全性群組中指派來源,您即無需在網路安全性群組中手動維護一份 IP 位址清單。 您會改為將要管理 VM 的網路介面指派給應用程式安全性群組。
若要建立名為 ERP-DB-SERVERS-ASG 的新應用程式安全性群組,請在 Cloud Shell 中執行下列命令:
az network asg create \ --resource-group $rg \ --name ERP-DB-SERVERS-ASG若要將 DataServer 與應用程式安全性群組建立關聯,請在 Cloud Shell 中執行下列命令:
az network nic ip-config update \ --resource-group $rg \ --application-security-groups ERP-DB-SERVERS-ASG \ --name ipconfigDataServer \ --nic-name DataServerVMNic \ --vnet-name ERP-servers \ --subnet Databases若要更新 ERP-SERVERS-NSG 網路安全性群組中的 HTTP 規則,請在 Cloud Shell 中執行下列命令。 其應該參考 ERP-DB-Servers 應用程式安全性群組。
az network nsg rule update \ --resource-group $rg \ --nsg-name ERP-SERVERS-NSG \ --name httpRule \ --direction Inbound \ --priority 150 \ --source-address-prefixes "" \ --source-port-ranges '*' \ --source-asgs ERP-DB-SERVERS-ASG \ --destination-address-prefixes 10.0.0.4 \ --destination-port-ranges 80 \ --access Deny \ --protocol Tcp \ --description "Deny from DataServer to AppServer on port 80 using application security group"
測試已更新的 HTTP 安全性規則
若要連線至 AppServer VM,請在 Cloud Shell 中執行下列命令。 檢查 AppServer 是否能夠透過 HTTP 與 DataServer 進行通訊。
ssh -t azureuser@$APPSERVERIP 'wget http://10.0.1.4; exit; bash'輸入您建立 VM 時定義的密碼。
如先前一樣,回應應包含
200 OK訊息。 應用程式安全性群組設定可能需要一到兩分鐘的時間才會生效。 如果您一開始未收到200 OK訊息,請稍候一下,然後再試一次。若要連線至 DataServer,請在 Cloud Shell 中執行下列命令。 檢查 DataServer 是否能夠透過 HTTP 與 AppServer 進行通訊。
ssh -t azureuser@$DATASERVERIP 'wget http://10.0.0.4; exit; bash'輸入您建立 VM 時定義的密碼。
如先前一樣,這應該要無法成功,因為您已封鎖透過連接埠 80 的存取。 在數分鐘之後,您應該收到
Connection timed out訊息。 若要在逾時前停止命令,請選取 [Ctrl+C]。
您現在已使用應用程式安全性群組來確認網路安全性群組規則能夠運作,方法與使用來源 IP 位址時相同。 如果我們已新增額外的資料伺服器,我們便能藉由將新伺服器新增至 ERP-DB-SERVERS-ASG,輕鬆確保它們具備適當的網路安全性。