你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure PowerShell 通过虚拟网络服务终结点策略管理数据外泄至 Azure 存储帐户
利用虚拟网络服务终结点策略,可以通过服务终结点在虚拟网络中应用对 Azure 存储帐户的访问控制。 这是保护工作负荷、管理允许的存储帐户和允许数据外泄的位置的关键。 在本文中,学习如何:
- 创建虚拟网络。
- 添加子网并启用 Azure 存储的服务终结点。
- 创建两个 Azure 存储帐户,并允许从上面创建的子网对其进行网络访问。
- 创建服务终结点策略以只允许访问其中一个存储帐户。
- 将虚拟机 (VM) 部署到每个子网。
- 确认从子网对允许的存储账户进行访问。
- 确认拒绝从子网对不允许的存储帐户进行访问。
注意
建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az。
如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
Azure Cloud Shell
Azure 托管 Azure Cloud Shell(一个可通过浏览器使用的交互式 shell 环境)。 可以将 Bash 或 PowerShell 与 Cloud Shell 配合使用来使用 Azure 服务。 可以使用 Cloud Shell 预安装的命令来运行本文中的代码,而不必在本地环境中安装任何内容。
若要启动 Azure Cloud Shell,请执行以下操作:
选项 | 示例/链接 |
---|---|
选择代码或命令块右上角的“试用”。 选择“试用”不会自动将代码或命令复制到 Cloud Shell。 | |
转到 https://shell.azure.com 或选择启动 Cloud Shell 按钮可在浏览器中打开 Cloud Shell。 | |
选择 Azure 门户右上角菜单栏上的 Cloud Shell 按钮。 |
若要使用 Azure Cloud Shell,请执行以下操作:
启动 Cloud Shell。
选择代码块(或命令块)上的“复制”按钮以复制代码或命令。
在 Windows 和 Linux 上选择 Ctrl+Shift+V,或在 macOS 上选择 Cmd+Shift+V 将代码或命令粘贴到 Cloud Shell 会话中。
选择“Enter”运行代码或命令。
如果选择在本地安装和使用 PowerShell,则本文需要 Azure PowerShell 模块 1.0.0 或更高版本。 运行 Get-Module -ListAvailable Az
查找已安装的版本。 如果需要进行升级,请参阅 Install Azure PowerShell module(安装 Azure PowerShell 模块)。 如果在本地运行 PowerShell,则还需运行 Connect-AzAccount
来创建与 Azure 的连接。
创建虚拟网络
创建虚拟网络之前,必须为虚拟网络创建资源组以及本文中创建的所有其他资源。 使用 New-AzResourceGroup 创建资源组。 以下示例创建名为 myResourceGroup 的资源组:
New-AzResourceGroup `
-ResourceGroupName myResourceGroup `
-Location EastUS
使用 New-AzVirtualNetwork 创建虚拟网络。 以下示例使用地址前缀 10.0.0.0/16 创建一个名为 myVirtualNetwork 的虚拟网络。
$virtualNetwork = New-AzVirtualNetwork `
-ResourceGroupName myResourceGroup `
-Location EastUS `
-Name myVirtualNetwork `
-AddressPrefix 10.0.0.0/16
启用服务终结点
在虚拟网络中创建子网。 在此示例中,将创建一个包含用于 Microsoft.Storage 的服务终结点且名为 Private 的子网:
$subnetConfigPrivate = Add-AzVirtualNetworkSubnetConfig `
-Name Private `
-AddressPrefix 10.0.0.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 将该网络安全组添加到 Private 子网,然后将子网配置写入到虚拟网络。 以下示例将 myNsgPrivate 网络安全组关联到 Private 子网:
Set-AzVirtualNetworkSubnetConfig `
-VirtualNetwork $VirtualNetwork `
-Name Private `
-AddressPrefix 10.0.0.0/24 `
-ServiceEndpoint Microsoft.Storage `
-NetworkSecurityGroup $nsg
$virtualNetwork | Set-AzVirtualNetwork
限制对 Azure 存储帐户的网络访问
对于通过为服务终结点启用的 Azure 服务创建的资源,限制对其的网络访问时所需的步骤因服务而异。 请参阅各个服务的文档来了解适用于每个服务的具体步骤。 作为示例,本文的剩余部分包括了针对 Azure 存储帐户限制网络访问的步骤。
创建两个存储帐户
使用 New-AzStorageAccount 创建 Azure 存储帐户。
$storageAcctName1 = 'allowedaccount'
New-AzStorageAccount `
-Location EastUS `
-Name $storageAcctName1 `
-ResourceGroupName myResourceGroup `
-SkuName Standard_LRS `
-Kind StorageV2
创建存储帐户后,使用 Get-AzStorageAccountKey 将存储帐户的密钥检索到一个变量中:
$storageAcctKey1 = (Get-AzStorageAccountKey -ResourceGroupName myResourceGroup -AccountName $storageAcctName1).Value[0]
在后面的步骤中将使用此密钥来创建文件共享。 输入 $storageAcctKey
并记下值,因为你在后面的步骤中将文件共享映射到 VM 中的驱动器时还需要手动输入该值。
现在请重复上述步骤以创建第二个存储帐户。
$storageAcctName2 = 'notallowedaccount'
New-AzStorageAccount `
-Location EastUS `
-Name $storageAcctName2 `
-ResourceGroupName myResourceGroup `
-SkuName Standard_LRS `
-Kind StorageV2
同时从此帐户中检索存储帐户密钥,以便以后使用来创建文件共享。
$storageAcctKey2 = (Get-AzStorageAccountKey -ResourceGroupName myResourceGroup -AccountName $storageAcctName2).Value[0]
在每个存储帐户中创建文件共享
使用 New-AzStorageContext 为存储帐户和密钥创建上下文。 该上下文封装了存储帐户名称和帐户密钥:
$storageContext1 = New-AzStorageContext $storageAcctName1 $storageAcctKey1
$storageContext2 = New-AzStorageContext $storageAcctName2 $storageAcctKey2
使用 New-AzStorageShare 创建一个文件共享:
$share1 = New-AzStorageShare my-file-share -Context $storageContext1
$share2 = New-AzStorageShare my-file-share -Context $storageContext2
拒绝对存储帐户的所有网络访问
默认情况下,存储帐户接受来自任何网络中的客户端的网络连接。 若要仅允许所选的网络进行访问,请使用 Update-AzStorageAccountNetworkRuleSet 将默认操作更改为 Deny。 在拒绝网络访问后,将无法从任何网络访问存储帐户。
Update-AzStorageAccountNetworkRuleSet `
-ResourceGroupName myresourcegroup `
-Name $storageAcctName1 `
-DefaultAction Deny
Update-AzStorageAccountNetworkRuleSet `
-ResourceGroupName myresourcegroup `
-Name $storageAcctName2 `
-DefaultAction Deny
启用仅从 VNet 子网的网络访问
使用 Get-AzVirtualNetwork 检索所创建的虚拟网络,然后使用 Get-AzVirtualNetworkSubnetConfig 将专用子网对象检索到一个变量中:
$privateSubnet = Get-AzVirtualNetwork `
-ResourceGroupName myResourceGroup `
-Name myVirtualNetwork `
| Get-AzVirtualNetworkSubnetConfig -Name Private
使用 Add-AzStorageAccountNetworkRule 允许从 Private 子网对存储帐户进行网络访问。
Add-AzStorageAccountNetworkRule `
-ResourceGroupName myresourcegroup `
-Name $storageAcctName1 `
-VirtualNetworkResourceId $privateSubnet.Id
Add-AzStorageAccountNetworkRule `
-ResourceGroupName myresourcegroup `
-Name $storageAcctName2 `
-VirtualNetworkResourceId $privateSubnet.Id
应用策略以允许访问有效的存储帐户
若要确保虚拟网络中的用户只能访问安全且允许的 Azure 存储帐户,可以在定义中使用允许的存储帐户列表创建服务终结点策略。 然后,此策略将应用于通过服务终结点连接到存储的虚拟网络子网。
创建服务终结点策略
本部分通过服务终结点使用允许的访问资源的列表创建策略定义
检索第一个(允许的)存储帐户的资源 ID
$resourceId = (Get-AzStorageAccount -ResourceGroupName myresourcegroup -Name $storageAcctName1).id
创建策略定义以允许上述资源
$policyDefinition = New-AzServiceEndpointPolicyDefinition -Name mypolicydefinition `
-Description "Service Endpoint Policy Definition" `
-Service "Microsoft.Storage" `
-ServiceResource $resourceId
使用前面创建的策略定义创建服务终结点策略
$sepolicy = New-AzServiceEndpointPolicy -ResourceGroupName myresourcegroup `
-Name mysepolicy -Location EastUS
-ServiceEndpointPolicyDefinition $policyDefinition
将服务终结点策略关联到虚拟网络子网
创建服务终结点策略后,将其与具有 Azure 存储的服务终结点配置的目标子网相关联。
Set-AzVirtualNetworkSubnetConfig -VirtualNetwork $VirtualNetwork `
-Name Private `
-AddressPrefix 10.0.0.0/24 `
-NetworkSecurityGroup $nsg `
-ServiceEndpoint Microsoft.Storage `
-ServiceEndpointPolicy $sepolicy
$virtualNetwork | Set-AzVirtualNetwork
验证对 Azure 存储帐户的访问限制
部署虚拟机
若要测试对存储帐户的网络访问,在子网中部署 VM。
使用 New-AzVM 在专用子网中创建虚拟机。 运行以下命令时,会提示输入凭据。 输入的值将配置为用于 VM 的用户名和密码。 -AsJob
选项会在后台创建 VM,因此可继续执行下一步。
New-AzVm -ResourceGroupName myresourcegroup `
-Location "East US" `
-VirtualNetworkName myVirtualNetwork `
-SubnetName Private `
-Name "myVMPrivate" -AsJob
将返回类似于以下示例输出的输出:
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Long Running... AzureLongRun... Running True localhost New-AzVM
确认对“允许”的存储账户进行访问
使用 Get-AzPublicIpAddress 返回 VM 的公共 IP 地址。 以下示例返回 myVmPrivate VM 的公共 IP 地址:
Get-AzPublicIpAddress `
-Name myVmPrivate `
-ResourceGroupName myResourceGroup `
| Select IpAddress
在以下命令中将 <publicIpAddress>
替换为前一个命令返回的公共 IP 地址,然后输入以下命令:
mstsc /v:<publicIpAddress>
此时会创建远程桌面协议 (.rdp) 文件,并下载到计算机。 打开下载的 rdp 文件。 出现提示时,选择“连接”。 输入在创建 VM 时指定的用户名和密码。 可能需要选择“更多选择” ,然后选择“使用其他帐户” ,以指定在创建 VM 时输入的凭据。 选择“确定” 。 你可能会在登录过程中收到证书警告。 如果收到警告,请选择“是”或“继续”以继续连接。
在“myVmPrivate” VM 上,使用 PowerShell 将 Azure 文件共享从允许的存储账户映射到驱动器 Z。
$acctKey = ConvertTo-SecureString -String $storageAcctKey1 -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList ("Azure\allowedaccount"), $acctKey
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\allowedaccount.file.core.windows.net\my-file-share" -Credential $credential
PowerShell 将返回类似于以下示例的输出:
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
Z FileSystem \\allowedaccount.file.core.windows.net\my-f...
Azure 文件共享已成功映射到驱动器 Z。
关闭与 myVmPrivate VM 建立的远程桌面会话。
确认已拒绝对“不允许”存储帐户的访问
在相同的“myVmPrivate” VM 上,尝试将 Azure 文件共享映射到驱动器 X。
$acctKey = ConvertTo-SecureString -String $storageAcctKey1 -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList "Azure\notallowedaccount", $acctKey
New-PSDrive -Name X -PSProvider FileSystem -Root "\\notallowedaccount.file.core.windows.net\my-file-share" -Credential $credential
对该共享的访问被拒绝,并且将收到 New-PSDrive : Access is denied
错误。 访问被拒绝,因为存储帐户“notallowedaccount”不在服务终结点策略的允许的资源列表中。
关闭与 myVmPublic VM 建立的远程桌面会话。
清理资源
如果不再需要资源组及其包含的所有资源,请使用 Remove-AzResourceGroup 将其删除:
Remove-AzResourceGroup -Name myResourceGroup -Force
后续步骤
在本文中,通过 Azure 虚拟网络服务终结点将服务终结点策略应用于 Azure 存储。 创建了 Azure 存储帐户,并且限制从虚拟网络子网仅访问特定存储帐户(因此拒绝其他访问)。 要详细了解服务终结点策略,请参阅服务终结点策略概述。