逐步教程:使用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 NSGs

言歸正傳,讓我們開始使用 PowerShell 建立一些 Azure NSGs!假設您已在 PowerShell 控制台中進行身份驗證,請繼續閱讀。

相關文章: Connect-AzAccount: 使用 PowerShell 連接到 Azure

要使用 PowerShell 建立 Azure NSG,您需要一個命令:New-AzNetworkSecurityGroup。使用此命令建立 NSG,提供名稱、要在其下建立 NSG 的資源群組名稱以及位置。

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

$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 的建議,我們可以使用上面提供的三個步驟,但這次創建一個具有多個埠和方向為出站的規則。

  • MS RPC – TCP 和 UDP 埠 135
  • NetBIOS/IP – TCP 和 UDP 埠 137-139
  • SMB/IP – TCP 埠 445
  • 簡單文件傳輸協議 (TFTP) – UDP 埠 69
  • Syslog – UDP 埠 514
  • 簡單網絡管理協議 (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
}

# 將更新的配置應用於子網配置,然後應用更改到虛擬網路
Set-AzVirtualNetworkSubnetConfig @Params
Set-AzVirtualNetwork -VirtualNetwork $VNet

接下來,了解如何使用網路介面進一步劃分和限制僅所需的 NSG,例如網路介面。

將 Azure NSG 應用於網路介面

與子網路的工作方式相似,您可以直接將NSG規則應用於網路介面。這個細分層級通常是不必要的,但當您的虛擬機器有多個網路介面時,根據需要對個別的網路介面應用不同的規則集可能是有意義的。

與限制子網路的方式類似,您可以對個別的網路介面應用規則。在這種情況下,您使用Get-AzNetworkInterface命令來擷取給定虛擬機器上的特定網路介面。這個網路介面將具有先前建立的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. 建立一個 Operational Insights 工作區 來儲存資料。
  3. 使用 Set-AzNetworkWatcherConfigFlowLog 指令啟用 NSG 流量記錄。

為了使 Azure NSG 流量記錄的設定更加容易,以下 PowerShell 程式碼將簡化所需的不同步驟。特別是,此程式碼將建立一個 Operational Insights 工作區,並將流量記錄設定與正確的訂閱、工作區和 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、目標 IP、連接埠、協議和時間戳記等屬性。版本 1 和版本 2 的記錄有一個重大差異,即版本 2 具有流量狀態的概念。這標記了流量的繼續和終止,以及流量帶寬資訊。

下一步

Azure NSG 是限制和審核資源流量的強大工具。有效使用時,您可以適當地保護您的資源和基礎架構。通過 NSG 流量記錄的審核功能以及將 NSG 限制在子網路或網路介面卡上的能力,您可以按需範圍設定規則並驗證所有流量是否符合預期。

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