练习 - 创建并管理网络安全组

已完成

作为制造公司的解决方案架构师,你现在希望开始将 ERP 应用和数据库服务器迁移到 Azure。 第一步是使用两个服务器来测试网络安全性计划。

在本单元中,将配置网络安全组和安全规则,以限制到特定服务器的网络流量。 你希望让应用服务器能通过 HTTP 连接到数据库服务器。 不希望数据库服务器通过 HTTP 连接到应用服务器。

Diagram of exercise scenario network security groups.

创建虚拟网络和网络安全组

首先要为服务器资源创建虚拟网络和子网。 然后创建网络安全组。

  1. 在 Azure Cloud Shell 中,运行以下命令将沙盒资源组分配给变量 rg

    rg="<rgn>[sandbox resource group name]</rgn>"
    
  2. 若要创建 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
    
  3. 若要创建 Databases 子网,请在 Cloud Shell 中运行以下命令:

    az network vnet subnet create \
        --resource-group $rg \
        --vnet-name ERP-servers \
        --address-prefixes 10.0.1.0/24 \
        --name Databases
    
  4. 若要创建 ERP-SERVERS-NSG 网络安全组,请在 Cloud Shell 中运行以下命令:

    az network nsg create \
        --resource-group $rg \
        --name ERP-SERVERS-NSG
    

创建运行 Ubuntu 的 VM

接下来,创建两个 VM,名称分别为 AppServer 和 DataServer。 需将 AppServer 部署到 Applications 子网,并将 DataServer 部署到 Databases 子网。 将 VM 网络接口添加到 ERP-SERVERS-NSG 网络安全组。 然后使用这些 VM 测试网络安全组。

  1. 若要生成 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>
    
  2. 若要生成 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>
    
  3. 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 建立 Secure Shell (SSH) 会话。 请记住,目前已采用默认规则部署网络安全组。

  1. 若要连接到 VM,可以直接从 Cloud Shell 使用 SSH。 此时,需要提供分配给 VM 的公共 IP 地址。 若要列出 IP 地址以便连接到 VM,请在 Cloud Shell 中运行以下命令:

    az vm list \
        --resource-group $rg \
        --show-details \
        --query "[*].{Name:name, PrivateIP:privateIps, PublicIP:publicIps}" \
        --output table
    
  2. 为了在此练习的其他环节更轻松地连接到 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)"
    
  3. 若要检查能否连接到 AppServer VM,请在 Cloud Shell 中运行以下命令:

    ssh azureuser@$APPSERVERIP -o ConnectTimeout=5
    

    将会收到一条 Connection timed out 消息。

  4. 若要检查能否连接到 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。

  1. 若要创建新的入站安全规则来允许 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"
    
  2. 若要检查现在能否连接到 AppServer VM,请在 Cloud Shell 中运行以下命令:

    ssh azureuser@$APPSERVERIP -o ConnectTimeout=5
    

    网络安全组规则可能需要一两分钟才会生效。 如果收到连接失败消息,请稍等片刻后重试。

  3. 现在应该可以进行连接。 在 Are you sure you want to continue connecting (yes/no)? 消息后,输入 yes

  4. 输入创建 VM 时定义的密码。

  5. 若要关闭 AppServer 会话,请输入 exit

  6. 若要检查现在能否连接到 DataServer VM,请在 Cloud Shell 中运行以下命令:

    ssh azureuser@$DATASERVERIP -o ConnectTimeout=5
    
  7. 现在应该可以进行连接。 在 Are you sure you want to continue connecting (yes/no)? 消息后,输入 yes

  8. 输入创建 VM 时定义的密码。

  9. 若要关闭 DataServer 会话,请输入 exit

创建安全规则以防止 Web 访问

现在要添加一条规则,让 AppServer 能通过 HTTP 与 DataServer 进行通信,但是 DataServer 不能通过 HTTP 与 AppServer 进行通信。 下面是这些服务器的内部 IP 地址:

服务器名称 IP 地址
AppServer 10.0.0.4
DataServer 10.0.1.4
  1. 若要创建新的入站安全规则来拒绝端口 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 进行通信。

  1. 若要连接到 AppServer VM,请在 Cloud Shell 中运行以下命令。 检查 AppServer 能否通过 HTTP 与 DataServer 进行通信。

    ssh -t azureuser@$APPSERVERIP 'wget http://10.0.1.4; exit; bash'
    
  2. 输入创建 VM 时定义的密码。

  3. 响应内容应包括一条 200 OK 消息。

  4. 若要连接到 DataServer VM,请在 Cloud Shell 中运行以下命令。 检查 DataServer 能否通过 HTTP 与 AppServer 进行通信。

    ssh -t azureuser@$DATASERVERIP 'wget http://10.0.0.4; exit; bash'
    
  5. 输入创建 VM 时定义的密码。

  6. 因为已阻止端口 80 上的访问,所以此访问应该不会成功。 几分钟后,会收到一条 Connection timed out 消息。 若要在超时之前中止命令,请按 Ctrl+C

部署应用安全组

接下来,创建数据库服务器的应用安全组,以便将相同的设置分配给此组中的所有服务器。 你计划部署更多数据库服务器,并要阻止这些服务器通过 HTTP 访问应用服务器。 通过在应用安全组中分配源,你无需手动维护网络安全组中的 IP 地址列表。 而只需将要管理的 VM 的网络接口分配到应用安全组。

Diagram of exercise scenario app security groups.

  1. 若要新建一个名为 ERP-DB-SERVERS-ASG 的应用安全组,请在 Cloud Shell 中运行以下命令:

    az network asg create \
        --resource-group $rg \
        --name ERP-DB-SERVERS-ASG
    
  2. 若要将 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
    
  3. 若要更新 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 安全规则

  1. 若要连接到 AppServer VM,请在 Cloud Shell 中运行以下命令。 检查 AppServer 能否通过 HTTP 与 DataServer 进行通信。

    ssh -t azureuser@$APPSERVERIP 'wget http://10.0.1.4; exit; bash'
    
  2. 输入创建 VM 时定义的密码。

  3. 与前面一样,响应内容应包括一条 200 OK 消息。 应用安全组设置可能需要一两分钟才会生效。 如果首次尝试时没有收到 200 OK 消息,请稍等片刻并重试。

  4. 若要连接到 DataServer,请在 Cloud Shell 中运行以下命令。 检查 DataServer 能否通过 HTTP 与 AppServer 进行通信。

    ssh -t azureuser@$DATASERVERIP 'wget http://10.0.0.4; exit; bash'
    
  5. 输入创建 VM 时定义的密码。

  6. 因为已阻止端口 80 上的访问,所以和之前一样,此访问应该不会成功。 几分钟后,会收到一条 Connection timed out 消息。 若要在超时之前中止命令,请按 Ctrl+C

现在,你已经使用应用安全组确认了网络安全组规则能正常运行,并且与使用源 IP 地址时相同。 如果我们添加了其他数据服务器,可以通过将新的服务器添加到 ERP-DB-SERVERS-ASG 来轻松地确保这些服务器具备适当的网络安全