练习 - 使用服务终结点限制对 Azure 存储的访问

已完成

作为一名解决方案架构师,需要将敏感的工程图文件移动到 Azure 存储中。 这些文件必须仅能通过公司网络内部的计算机进行访问。 需要创建 Azure 存储的虚拟网络服务终结点,以保护对存储帐户的连接。

在本单元中,将创建服务终结点,并使用网络规则来限制对 Azure 存储的访问。 将在 Databases 子网上为 Azure 存储创建虚拟网络服务终结点。 然后验证“DataServer”VM 是否能访问 Azure 存储。 最后要验证另一个子网上的 AppServer VM 是否无法访问存储

Diagram of exercise scenario service endpoint and rules.

将规则添加到网络安全组

在这里,你将确保通过服务终结点与 Azure 存储进行通信。 你将添加出站规则,以允许对存储服务的访问,同时拒绝所有其他 Internet 流量。

  1. 若要创建出站规则以允许对存储的访问,请在 Cloud Shell 中运行以下命令:

    az network nsg rule create \
        --resource-group $rg \
        --nsg-name ERP-SERVERS-NSG \
        --name Allow_Storage \
        --priority 190 \
        --direction Outbound \
        --source-address-prefixes "VirtualNetwork" \
        --source-port-ranges '*' \
        --destination-address-prefixes "Storage" \
        --destination-port-ranges '*' \
        --access Allow \
        --protocol '*' \
        --description "Allow access to Azure Storage"
    
  2. 若要创建出站规则以拒绝所有 Internet 访问,请在 Cloud Shell 中运行以下命令:

    az network nsg rule create \
        --resource-group $rg \
        --nsg-name ERP-SERVERS-NSG \
        --name Deny_Internet \
        --priority 200 \
        --direction Outbound \
        --source-address-prefixes "VirtualNetwork" \
        --source-port-ranges '*' \
        --destination-address-prefixes "Internet" \
        --destination-port-ranges '*' \
        --access Deny \
        --protocol '*' \
        --description "Deny access to Internet."
    

现在,ERP-SERVERS-NSG 中应该有以下规则:

规则名称 方向 优先级 目的
AllowSSHRule 入站 100 允许入站 SSH
httpRule 入站 150 在 80 上拒绝从 DataServer 到 AppServer 的访问
Allow_Storage 出站 190 允许对 Azure 存储的访问
Deny_Internet 出站 200 拒绝从 VNet 访问 Internet

此时,AppServer 和 DataServer 可以访问 Azure 存储服务

配置 Azure 存储帐户和文件共享

在本步骤中,将新建存储帐户,然后会将 Azure 文件共享添加到该帐户。 此文件共享用于存储工程图。

  1. 若要为工程文档创建存储帐户,请在 Cloud Shell 中运行以下命令:

    STORAGEACCT=$(az storage account create \
                    --resource-group $rg \
                    --name engineeringdocs$RANDOM \
                    --sku Standard_LRS \
                    --query "name" | tr -d '"')
    
  2. 若要将存储帐户的主键存储在变量中,请在 Cloud Shell 中运行以下命令:

    STORAGEKEY=$(az storage account keys list \
                    --resource-group $rg \
                    --account-name $STORAGEACCT \
                    --query "[0].value" | tr -d '"')
    
  3. 若要创建一个名为“erp-data-share”的 Azure 文件共享,请在 Cloud Shell 中运行以下命令

    az storage share create \
        --account-name $STORAGEACCT \
        --account-key $STORAGEKEY \
        --name "erp-data-share"
    

启用服务终结点

现在需要通过将存储终结点分配到 Databases 子网,将存储帐户配置为只可从数据库服务器访问。 然后需要将安全规则添加到存储帐户。

  1. 若要将 Microsoft.Storage 终结点分配到子网,请在 Cloud Shell 中运行以下命令

    az network vnet subnet update \
        --vnet-name ERP-servers \
        --resource-group $rg \
        --name Databases \
        --service-endpoints Microsoft.Storage
    
  2. 若要拒绝所有访问,请在 Cloud Shell 中运行以下命令以将默认操作更改为 Deny。 在网络访问被拒绝后,无法从任何网络访问存储帐户。

    az storage account update \
        --resource-group $rg \
        --name $STORAGEACCT \
        --default-action Deny
    
  3. 若要限制对存储帐户的访问,请在 Cloud Shell 中运行以下命令。 存储帐户在默认情况为开启状态,接受所有流量。 需要仅允许来自 Databases 子网的流量访问该存储

    az storage account network-rule add \
        --resource-group $rg \
        --account-name $STORAGEACCT \
        --vnet-name ERP-servers \
        --subnet Databases
    

测试对存储资源的访问权限

在此步骤中,将连接到两个服务器,并验证是否只有 DataServer 可以访问存储帐户上的 Azure 文件共享。

  1. 若要将 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)"
    
  2. 若要连接到“AppServer”VM 并尝试装载 Azure 文件共享,请在 Cloud Shell 中运行以下命令:

    ssh -t azureuser@$APPSERVERIP \
        "mkdir azureshare; \
        sudo mount -t cifs //$STORAGEACCT.file.core.windows.net/erp-data-share azureshare \
        -o vers=3.0,username=$STORAGEACCT,password=$STORAGEKEY,dir_mode=0777,file_mode=0777,sec=ntlmssp; findmnt \
        -t cifs; exit; bash"
    
  3. 输入创建 VM 时所用的密码。

  4. 响应内容应包括一条 mount error 消息。 不允许进行此连接,因为 Applications 子网上没有用于存储帐户的服务终结点。

  5. 若要连接到“DataServer”VM 并尝试装载 Azure 文件共享,请在 Cloud Shell 中运行以下命令

    ssh -t azureuser@$DATASERVERIP \
        "mkdir azureshare; \
        sudo mount -t cifs //$STORAGEACCT.file.core.windows.net/erp-data-share azureshare \
        -o vers=3.0,username=$STORAGEACCT,password=$STORAGEKEY,dir_mode=0777,file_mode=0777,sec=ntlmssp;findmnt \
        -t cifs; exit; bash"
    
  6. 输入创建 VM 时所用的密码。

  7. 该装载应会成功,并且响应中应该会有装入点的详细信息。 此连接是运行的,因为在 Databases 子网上为存储帐户创建了服务终结点。

现在,你已经通过使用 Databases 子网上的存储服务终结点验证了 DataServer 可以访问存储。 同时也验证了 AppServer 无法访问存储。 这是因为此服务器属于其他子网,无法访问虚拟网络服务终结点。