使用NSG安全Azure网络:逐步教程

Azure 网络安全组或 Azure NSGs 允许您过滤来自一个或多个 Azure 资源的网络流量,无论是入站还是出站。如果您需要阻止对 Azure 资源的访问,您必须了解 NSGs 的工作原理。

在本文中,您将学习 Azure NSG 的目的以及如何使用 PowerShell 脚本语言进行设置。

先决条件

  • 一个 Azure 资源作为目标。本教程将使用按使用量付费订阅和一个 Windows Server 2019 Azure 虚拟机。
  • PowerShell 7+。早期版本的 PowerShell 可能也能工作,但本教程使用 PowerShell 7.0.1 进行配置。
  • Azure Az 模块 PowerShell 模块

理解 Azure NSGs

将 Azure NSG 视为一个防火墙。防火墙由定义对进出流量采取操作的规则组成,称为规则集。防火墙通常带有默认的规则集,这些规则规定了什么可以和不能通过防火墙;Azure NSGs 有类似的

与传统防火墙不同,Azure NSG 还有一个名为服务标签的云概念。服务标签是 Azure 的一种抽象地址范围的方式,使其更易于管理。

让我们简要介绍一下这些重要主题。

使用服务标签简化规则配置

在云服务中,IP 地址和范围经常会发生变化。这可能会使得手动定义 Azure IP 范围规则集的维护变得困难。幸运的是,Azure 定义了许多不同的服务标签,您的 NSG 规则可以针对这些标签。

服务标签是一个概念,它始终使用最新的地址列表。服务标签是一种为了更容易管理而将占位符分配给一组地址范围的方式。

Azure service tags in the Azure portal

注意默认规则集

当您创建并应用 Azure NSG 时,您必须首先了解那些 NSG 自动应用的规则。这些默认规则集是不可变的,并且分别针对入站和出站流量创建。

Azure NSG 规则集中的每个规则都有一个优先级。优先级决定操作顺序或哪些规则会覆盖其他规则。例如,如果存在一个优先级为 65000 的规则阻止所有入站流量,并且您创建了一个优先级为 64999 的规则允许端口 80,那么 Azure NSG 将阻止所有流量除了端口 80。

Default Azure NSG rule priorities

默认规则集不能更改,但是您可以使用高优先级规则来覆盖它们,如上所示。这些规则适用于TCP、UDP和ICMP等所有协议。

请确保您的规则使用小于65500的编号来覆盖默认规则!

创建Azure NSG时,您将看到各种默认规则:

入站规则

  • AllowVNetInBound – 此入站规则包含为虚拟网络和所有连接的本地网络地址空间定义的所有IP地址范围。此外,此规则包含了已对等连接的虚拟网络、连接到虚拟网络网关的虚拟网络、主机的虚拟IP地址以及用户定义路由上使用的任何地址前缀。此规则设置了65000的优先级。
  • AllowAzureLoadBalancerInBoundAzureLoadBalancer服务标记对应于主机的虚拟IP地址168.63.129.16,Azure健康探测发起的地方。实际流量不会通过此处传输,如果您不使用Azure负载均衡,可以覆盖此规则。主机的虚拟IP地址存在于所有区域,专门提供关键的基础设施服务,如DHCP、DNS、IMDS和健康监控。此规则设置了65001的优先级。
  • DenyAllInbound – 作为最后一条规则,使用优先级65500,此规则拒绝所有未明确允许的入站流量。

出站规则

  • AllowVNetOutBound – 这包含了为虚拟网络定义的所有 IP 地址范围,所有连接的本地地址空间,对等连接的虚拟网络,连接到虚拟网络网关的虚拟网络,主机的虚拟 IP 地址,以及用户定义路由上使用的任何地址前缀。此规则设置了 65000 优先级。
  • AllowInternetOutBound – 虚拟网络之外并可由公共互联网访问的 IP 地址空间。包括 Azure 拥有的公共 IP 地址空间的地址范围。此规则设置了 65001 优先级。
  • DenyAllOutBound – 与入站规则集中的情况类似,此规则设置为最后一条规则,优先级为 65500。此出站规则将拒绝所有非明确允许的流量。

使用 PowerShell 构建 Azure NSG

够说了,让我们动手开始用 PowerShell 构建一些 Azure NSG 吧!假设您在 PowerShell 控制台中并已经进行了身份验证,请继续阅读。

相关:Connect-AzAccount:使用 PowerShell 连接到 Azure 的入口

要使用 PowerShell 创建 Azure NSG,您需要一个命令;New-AzNetworkSecurityGroup。使用此命令创建 NSG 时,为其提供名称、要在其中创建 NSG 的资源组名称和位置。

以下代码示例使用New-AzNetworkSecurityGroup cmdlet 创建一个名为NSG-MyVM的NSG,该NSG位于位于eastus Azure 数据中心的 Articles 资源组中。

$Params = @{
  'Name'              = 'NSG-MyVM'
  'ResourceGroupName' = 'Articles' 
  'Location'          = 'centralus'
}

$NSG = New-AzNetworkSecurityGroup @Params

使用 PowerShell 创建 Azure NSG 规则

一旦你拥有了NSG,预设的规则可能不够用。您需要创建自己的规则。

配置用于远程桌面协议的入站规则

A common administrative task is the need to create an inbound rule for the Remote Desktop Protocol (RDP). In the tutorial’s example, perhaps it’s going to be applied to a Windows Server Azure VM and you need to access the VM via RDP. In that case, you need to open up port 3389 inbound.

向现有NSG添加新的入站规则需要三个步骤:

  1. 运行Get-AzNetworkSecurityGroup命令检索现有的NSG。
  2. 运行Add-AzNetworkSecurityRuleConfig 创建规则。
  3. 运行Set-AzNetworkSecurityGroup命令将该规则应用到NSG。

以下代码示例使用Get-AzNetworkSecurityGroup检索现有的NSG。接下来,使用Add-AzNetworkSecurityRuleConfig定义一个规则,然后使用Set-AzNetworkSecurityGroup cmdlet 将其应用到现有的NSG中。

$NSG = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

$Params = @{
  'Name'                     = 'allowRDP'
  'NetworkSecurityGroup'     = $NSG
  'Protocol'                 = 'TCP'
  'Direction'                = 'Inbound'
  'Priority'                 = 200
  'SourceAddressPrefix'      = 'my.ip.address'
  'SourcePortRange'          = '*'
  'DestinationAddressPrefix' = '*'
  'DestinationPortRange'     = 3389
  'Access'                   = 'Allow'
}

Add-AzNetworkSecurityRuleConfig @Params | Set-AzNetworkSecurityGroup

优先级参数确定规则的评估时间,200的值接近顶部,而4096是最低优先级规则。

通常情况下,出站流量不会被阻止,因为很难知道应用程序可能需要使用的所有可能端口。幸运的是,您可以从SANS学院获取一些专家出站过滤建议,SANS学院是一个广受信赖的信息安全标准组织。

为了执行SANS的建议,我们可以使用上面提供的相同三个步骤,但这次创建一个具有多个端口和Direction为出站而不是入站的规则。

  • MS RPC – TCP和UDP端口135
  • NetBIOS/IP – TCP和UDP端口137-139
  • SMB/IP – TCP端口445
  • Trivial File Transfer Protocol (TFTP) – UDP端口69
  • Syslog – UDP端口514
  • Simple Network Management Protocol (SNMP) – UDP端口161-162

以下代码使用Get-AzNetworkSecurityGroup cmdlet检索现有的NSG规则。使用Add-AzNetworkSecurityRuleConfig定义出站规则,并通过Set-AzNetworkSecurityGroup cmdlet应用。

$NSG = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

$Params = @{
  'Name'                     = 'DenySANSOutBound'
  'NetworkSecurityGroup'     = $NSG
  'Protocol'                 = '*'
  'Direction'                = 'Outbound'
  'Priority'                 = 4000
  'SourceAddressPrefix'      = '*'
  'SourcePortRange'          = '*'
  'DestinationAddressPrefix' = 'Internet'
  'DestinationPortRange'     = @('135', '137','139','445','69','514','161','162')
  'Access'                   = 'Deny'
}

Add-AzNetworkSecurityRuleConfig @Params | Set-AzNetworkSecurityGroup

当然,这些端口中有一些是有价值且必要的,具体取决于您提供的服务。很可能您需要根据应用程序的要求自定义此列表,这通常由供应商提供,或者使用诸如netstat之类的工具

相关: 使用Netstat和PowerShell查找端口

进行开放端口的查找。

配置Azure NSG以适用于特定子网

也许您已经通过子网对虚拟网络空间进行了分割。要更加细粒度地控制子网中的流量,您可以将NSG应用于特定的子网。

下面的代码片段是查找整个地址前缀并将NSG应用于它。

# 检索现有的虚拟网络
$VNet = Get-AzVirtualNetwork -Name 'Articles-vnet' -ResourceGroupName 'Articles'
# 检索现有的NSG
$NSG  = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

# 使用数组表示法选择第一个子网,并使用位于索引0处的第一条记录
$Params = @{
    'VirtualNetwork'       = $VNet
    'Name'                 = ($VNet.Subnets[0]).Name
    'AddressPrefix'        = ($VNet.Subnets[0]).AddressPrefix
    'NetworkSecurityGroup' = $NSG
}

# 将更新后的配置应用于子网配置,然后将更改应用于VNet
Set-AzVirtualNetworkSubnetConfig @Params
Set-AzVirtualNetwork -VirtualNetwork $VNet

接下来,了解如何使用网络接口进一步分割和限制NSG,以仅限制所需的内容,比如网络接口。

将Azure NSG应用于网络接口

类似于子网的工作方式,您可以直接将 NSG 规则应用于网络接口。通常情况下,这种粒度级别是不必要的,但是当您的虚拟机有多个网络接口时,根据需要对各个 NIC 应用不同的规则集就变得有意义。

类似于子网限制的定义,您可以将规则应用于单个 NIC。在这种情况下,您可以使用 Get-AzNetworkInterface cmdlet 来检索给定 VM 上的特定 NIC。这将使之前创建的 NSG 设置为 NetworkSecurityGroup 属性。

$NSG = Get-AzNetworkSecurityGroup -Name "MyVM-nsg" -ResourceGroupName "Articles"
$NIC = Get-AzNetworkInterface -name "MyVM-vm-nic"
 
$NIC.NetworkSecurityGroup = $NSG
$NIC | Set-AzNetworkInterface

关于如何诊断和分析通过 NSG 的流量呢?继续阅读了解有关 NSG 流日志以及如何使用它们的信息!

使用 NSG 流日志进行调试和故障排除

在 NSG 的创建和使用过程中,您可能会发现需要进一步调试来排除故障或分析流量。流日志是 Azure Network Watcher 的一个特性,它记录有关通过 NSG 的 IP 流量的信息。

一旦 Azure Network Watcher 捕获了网络流量,它就会将数据存储在 Azure 存储账户中。使用 PowerShell,您可以配置 Azure NSG 流日志以遍历该 Azure 存储账户,并调试和更好地排除问题。

相关: 如何下载和安装 AzCopy 工具

启用 NSG 流日志大致包括 PowerShell 中的三个步骤:

  1. 注册Microsoft.Insights提供程序。
  2. 创建操作性洞察工作区以存储数据。
  3. 使用Set-AzNetworkWatcherConfigFlowLog命令启用NSG流日志。

为了使Azure NSG流日志的配置更加简单,以下PowerShell代码将简化不同的必需步骤。特别地,该代码将创建一个操作性洞察工作区,并将一个Flog Log配置与正确的订阅、工作区和NSG关联起来。

$resourceGroupName = '<some resource group name>'
$NetworkWatcher = Get-AzNetworkWatcher -Name '<some name>' -ResourceGroupName $resourceGroupName
$NSG            = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName $resourceGroupName
$StorageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name '<storage account name>'
$Subscription   = Get-AzSubscription -SubscriptionName '<your subscription name>'

$Workspace = New-AzOperationalInsightsWorkspace -Location 'centralus' -Name "DefaultWorkspace-$($NSG.Name)-Articles" -Sku 'Standard' -ResourceGroupName $resourceGroupName

$Params = @{
  'NetworkWatcher'         = $NetworkWatcher
  'TargetResourceId'       = $NSG.Id
  'StorageAccountId'       = $StorageAccount.Id
  'EnableFlowLog'          = $True
  'FormatType'             = 'JSON'
  'FormatVersion'          = 2
  'EnableTrafficAnalytics' = $True
  'WorkspaceResourceId'    = $Workspace.ResourceId
  'WorkspaceGUID'          = $Workspace.CustomerId
  'WorkspaceLocation'      = 'centralus'
}

Set-AzNetworkWatcherConfigFlowLog @Params

流日志包含许多不同的属性,如防火墙日志中常见的。这包括源和目标IP、端口、协议和时间戳等属性。版本1和2的日志有一个重大的区别,即版本2具有流状态的概念。这标记了流的继续和终止,以及流量带宽信息。

下一步

Azure NSG是限制和审计资源流量的强大工具。有效使用,您可以适当地保护资源和基础架构。通过NSG流日志的审计功能以及将NSG限制为子网或网络适配器的能力,您可以灵活地将规则范围设置为所需,并验证所有流量是否符合预期。

Source:
https://adamtheautomator.com/azure-nsg/