Sicurezza delle reti Azure con NSG: tutorial passo-passo

Azure Network Security Groups o Azure NSG ti consentono di filtrare il traffico di rete in ingresso e in uscita da una o più risorse di Azure. Se hai mai avuto bisogno di impedire l’accesso a una risorsa di Azure, devi capire come funzionano gli NSG.

In questo articolo, imparerai lo scopo degli Azure NSG e come configurarli con il linguaggio di scripting PowerShell.

Prerequisiti

  • Una risorsa di Azure da destinare. Questo tutorial utilizzerà una sottoscrizione pay-as-you-go e una macchina virtuale Azure con Windows Server 2019.
  • PowerShell 7+. Le versioni precedenti di PowerShell potrebbero funzionare, ma questo tutorial utilizza PowerShell 7.0.1 per la configurazione.
  • Il modulo PowerShell Azure Az

Comprensione degli Azure NSG

Pensa a un Azure NSG come a un firewall. Un firewall è costituito da regole che definiscono le azioni da intraprendere sul traffico in entrata e in uscita chiamate insiemi di regole. I firewall di solito sono dotati di insiemi di regole predefinite che stabiliscono cosa può attraversare il firewall e cosa no; gli Azure NSG hanno qualcosa di simile.

A differenza dei firewall tradizionali, le NSG di Azure hanno anche un concetto cloud chiamato tag di servizio. I tag di servizio sono il modo di Azure per astrare gli intervalli di indirizzi per semplificarne la gestione.

Vediamo brevemente ciascuno di questi argomenti importanti.

Utilizzo dei tag di servizio per semplificare la configurazione delle regole

Nei servizi cloud, gli indirizzi IP e gli intervalli possono spesso cambiare. Ciò può rendere difficile mantenere i set di regole degli intervalli di indirizzi di Azure definiti manualmente. Fortunatamente, Azure definisce molti diversi tag di servizio che possono essere presi di mira dalle regole NSG.

I tag di servizio sono un concetto che utilizzerà sempre l’elenco di indirizzi più aggiornato. I tag di servizio sono un modo per assegnare segnaposto a gruppi di intervalli di indirizzi per una gestione più semplice.

Azure service tags in the Azure portal

Attenzione ai set di regole predefiniti

Quando si crea e si applica una NSG di Azure, è necessario prima conoscere le regole che tali NSG automaticamente applicano. Queste regole predefinite sono immutabili e sono create sia per il traffico in ingresso che per quello in uscita.

Ogni regola in un set di regole NSG di Azure ha una priorità. La priorità determina l’ordine di esecuzione o quali regole sovrascrivono altre. Ad esempio, se esiste una regola con una priorità di 65000 che blocca tutto il traffico in ingresso e si crea una regola con una priorità di 64999 che consente la porta 80, la NSG di Azure bloccherà tutto il traffico escludendo la porta 80.

Default Azure NSG rule priorities

I set di set di regole predefinite non possono essere modificate, ma è possibile sovrascriverle utilizzando una regola con priorità più alta come mostrato sopra. Ciascuna di queste regole si applica a tutti i protocolli come TCP, UDP e ICMP.

Assicurati che le tue regole utilizzino un numero inferiore a 65500 per sovrascrivere le regole predefinite!

Quando crei un NSG di Azure, vedrai varie regole predefinite:

Regole di ingresso

  • AllowVNetInBound – Questa regola di ingresso contiene tutti gli intervalli di indirizzi IP definiti per la rete virtuale e tutti gli spazi di indirizzi on-premises collegati. Inoltre, questa regola contiene reti virtuali collegate, reti virtuali collegate a un gateway di rete virtuale, indirizzo IP virtuale dell’host e qualsiasi prefisso di indirizzo utilizzato nelle route definite dall’utente. Questa regola è impostata con priorità 65000.
  • AllowAzureLoadBalancerInBound – Il tag di servizio AzureLoadBalancer si traduce nell’indirizzo IP virtuale dell’host, 168.63.129.16, da cui proviene la sonda di integrità di Azure. Il traffico effettivo non transita da qui e se non si utilizza Azure Load Balancing, questa regola può essere sovrascritta. L’indirizzo IP virtuale dell’host esiste in tutte le regioni specificamente per fornire servizi infrastrutturali essenziali come DHCP, DNS, IMDS e monitoraggio della salute. Questa regola è impostata con priorità 65001.
  • DenyAllInbound – Impostata come ultima regola, utilizzando priorità 65500, questa regola nega tutto il traffico di ingresso non esplicitamente consentito.

Regole di uscita

  • AllowVNetOutBound – Questo contiene tutti gli intervalli di indirizzi IP definiti per la rete virtuale, tutti gli spazi di indirizzi locali connessi, le reti virtuali connessi tramite peering, le reti virtuali collegate a un gateway di rete virtuale, l’indirizzo IP virtuale dell’host e tutti i prefissi degli indirizzi utilizzati nelle route definite dall’utente. Questa regola è impostata con una priorità 65000.
  • AllowInternetOutBound – Spazio di indirizzi IP al di fuori della rete virtuale e raggiungibile tramite Internet pubblico. Include l’intervallo di indirizzi IP pubblici di Azure. Questa regola è impostata con una priorità 65001.
  • DenyAllOutBound – Come nelle regole di ingresso, questa regola è impostata come ultima regola, utilizzando la priorità 65500. Questa regola di uscita negherà tutto il traffico non esplicitamente consentito.

Creazione di NSG di Azure con PowerShell

Basta parlare, mettiti le mani in pasta e inizia a creare alcuni NSG di Azure con PowerShell! Presumendo che tu sia nella console di PowerShell e autenticato, continua a leggere.

Correlato: Connect-AzAccount: il tuo accesso ad Azure con PowerShell

Per creare un NSG di Azure con PowerShell, hai bisogno di un comando; New-AzNetworkSecurityGroup. Per creare un NSG con questo comando, fornisci il nome, il nome del gruppo di risorse in cui creare l’NSG e la posizione.

L’esempio di codice seguente utilizza il cmdlet New-AzNetworkSecurityGroup per creare un NSG chiamato NSG-MyVM nel gruppo di risorse “Articles” che si trova nel datacenter di Azure eastus.

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

$NSG = New-AzNetworkSecurityGroup @Params

Creazione di regole NSG di Azure con PowerShell

Una volta ottenuto l’NSG, probabilmente il set predefinito di regole non è sufficiente. Sarà necessario creare le proprie regole.

Configurazione di una regola in ingresso per il protocollo Desktop remoto

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.

Per aggiungere una nuova regola in ingresso a un NSG esistente sono necessari tre passaggi:

  1. Eseguire il comando Get-AzNetworkSecurityGroup per recuperare l’NSG esistente.
  2. Eseguire il comando Add-AzNetworkSecurityRuleConfig per creare la regola.
  3. Eseguire il comando Set-AzNetworkSecurityGroup per applicare quella regola all’NSG.

L’esempio di codice seguente utilizza il cmdlet Get-AzNetworkSecurityGroup per recuperare un NSG esistente. Successivamente viene definita una regola utilizzando Add-AzNetworkSecurityRuleConfig, che viene quindi applicata all’NSG esistente utilizzando il cmdlet Set-AzNetworkSecurityGroup.

$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

Il parametro Priorità determina quando viene valutata la regola, il valore di 200 è vicino all’inizio poiché 4096 è la regola con la priorità più bassa.

Spesso il traffico in uscita non viene bloccato in quanto può essere difficile conoscere tutte le porte possibili che un’applicazione potrebbe utilizzare. Fortunatamente, è possibile trovare alcune raccomandazioni esperte sulla filtraggio in uscita dall’istituto SANS, un’organizzazione ampiamente affidabile per gli standard di sicurezza delle informazioni.

Per implementare le raccomandazioni di SANS, possiamo utilizzare gli stessi tre passaggi forniti in precedenza, ma questa volta creare una regola con più porte e con una Direzione in uscita anziché in ingresso.

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

Il codice seguente recupera una regola NSG esistente utilizzando il cmdlet Get-AzNetworkSecurityGroup. Una regola in uscita viene definita utilizzando Add-AzNetworkSecurityRuleConfig e applicata tramite il cmdlet Set-AzNetworkSecurityGroup.

$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

Ovviamente, alcune di queste porte sono preziose e necessarie, a seconda dei servizi che stai fornendo. Molto probabilmente, dovrai personalizzare questa lista in base alle esigenze della tua applicazione, che sono tipicamente fornite dal fornitore o utilizzando uno strumento come netstat per trovare le porte aperte.

Argomento correlato: Trovare le porte con Netstat e PowerShell

Configurare un NSG di Azure per una subnet specifica

Forse hai suddiviso lo spazio della tua rete virtuale tramite subnet. Per ottenere una maggiore granularità, puoi applicare gli NSG solo a una subnet specifica, controllando in modo granulare il traffico in quella subnet.

Il frammento di codice di seguito sta individuando un intero prefisso di indirizzi e applicando un NSG ad esso.

# Recupera una rete virtuale esistente
$VNet = Get-AzVirtualNetwork -Name 'Articles-vnet' -ResourceGroupName 'Articles'
# Recupera un NSG esistente
$NSG  = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

# Seleziona la prima subnet utilizzando la notazione degli array e il primo record situato all'indice 0
$Params = @{
    'VirtualNetwork'       = $VNet
    'Name'                 = ($VNet.Subnets[0]).Name
    'AddressPrefix'        = ($VNet.Subnets[0]).AddressPrefix
    'NetworkSecurityGroup' = $NSG
}

# Applica la configurazione aggiornata alla configurazione della subnet e quindi applica la modifica alla VNet
Set-AzVirtualNetworkSubnetConfig @Params
Set-AzVirtualNetwork -VirtualNetwork $VNet

In seguito, scopri come utilizzare le interfacce di rete per suddividere ulteriormente e limitare gli NSG solo a ciò che potrebbe essere necessario, ad esempio un’interfaccia di rete.

Applicazione di un NSG di Azure a un’interfaccia di rete

Simile a come funzionano le subnet, è possibile applicare regole NSG direttamente a un’interfaccia di rete. Questo livello di granularità di solito non è necessario, ma quando si hanno più interfacce di rete per macchina virtuale, può avere senso applicare diversi set di regole alle singole NIC, se necessario.

Simile a come viene definita la limitazione delle subnet, è possibile applicare regole a una singola NIC. In questo caso, si utilizza il cmdlet Get-AzNetworkInterface per recuperare una specifica NIC sulla VM specificata. Questa avrà l’NSG precedentemente creato impostato come proprietà NetworkSecurityGroup.

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

Cosa succede se si desidera diagnosticare ed analizzare il traffico attraverso un NSG? Continua a leggere per scoprire di più sui log di flusso NSG e su come utilizzarli!

Risoluzione dei problemi con i log di flusso NSG

Durante la creazione e l’utilizzo di NSG, potresti trovarvi nella necessità di effettuare ulteriori debug per risolvere un problema con una regola o analizzare il traffico. I log di flusso sono una funzionalità di Azure Network Watcher che registra informazioni sul traffico IP che passa attraverso un NSG.

Una volta che Azure Network Watcher cattura il traffico di rete, archivia i dati in un account di archiviazione di Azure. Utilizzando PowerShell, è possibile configurare i log di flusso NSG di Azure per analizzare tale account di archiviazione di Azure e risolvere i problemi in modo migliore.

Articolo correlato: Come scaricare e installare lo strumento AzCopy

Abilitare i log di flusso NSG consiste in tre passaggi approssimativi in PowerShell:

  1. Registra il provider Microsoft.Insights.
  2. Crea uno Operational Insights Workspace per memorizzare i dati.
  3. Abilita il log di flusso NSG con il comando Set-AzNetworkWatcherConfigFlowLog.

Per semplificare la configurazione dei log di flusso NSG di Azure, il seguente codice PowerShell semplificherà i diversi passaggi necessari. In particolare, questo codice crea uno spazio di lavoro Operational Insights e associa una configurazione di log di flusso all’abbonamento, al workspace e all’NSG corretti.

$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

I log di flusso contengono molte proprietà diverse, come tipico nei log dei firewall. Questo include proprietà come l’IP di origine e di destinazione, le porte, i protocolli e i timestamp. I log delle versioni 1 e 2 hanno una grande differenza, ossia la versione 2 include il concetto di stato del flusso. Questo contrassegna la continuazione e la terminazione di un flusso insieme alle informazioni sulla larghezza di banda del traffico.

Passaggi successivi

Gli NSG di Azure sono strumenti potenti per limitare e verificare il traffico verso una risorsa. Utilizzati in modo efficace, è possibile proteggere correttamente le risorse e l’infrastruttura. Con le capacità di auditing tramite i log di flusso NSG e la possibilità di limitare gli NSG a subnet o adattatori di rete, si ha la flessibilità necessaria per definire regole come necessario e verificare che tutto il traffico sia conforme alle aspettative.

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