Esercizio: Creare e gestire i gruppi di sicurezza di rete

Completato

In qualità di architetto di soluzioni per l'azienda di produzione, ora si vuole iniziare a spostare i server di database e l'app ERP in Azure. Come primo passaggio, si intende testare il piano di sicurezza della rete, usando due server.

In questa unità: configurazione del gruppo di sicurezza di rete e delle regole di sicurezza per limitare il traffico di rete a server specifici. Si vuole che il server applicazioni sia in grado di connettersi al server di database tramite HTTP. Il server di database non deve poter usare HTTP per connettersi al server applicazioni.

Diagram of exercise scenario network security groups.

Creare una rete virtuale e un gruppo di sicurezza di rete

Per prima cosa si creano la rete virtuale e le subnet per le risorse del server. Quindi verrà creato un gruppo di sicurezza di rete.

  1. In Azure Cloud Shell eseguire il comando seguente per assegnare il gruppo di risorse sandbox alla variabile rg:

    rg="<rgn>[sandbox resource group name]</rgn>"
    
  2. Eseguire il comando seguente in Cloud Shell per creare la rete virtuale ERP-servers e la subnet Applications:

    az network vnet create \
        --resource-group $rg \
        --name ERP-servers \
        --address-prefixes 10.0.0.0/16 \
        --subnet-name Applications \
        --subnet-prefixes 10.0.0.0/24
    
  3. Eseguire il comando seguente in Cloud Shell per creare la subnet Databases:

    az network vnet subnet create \
        --resource-group $rg \
        --vnet-name ERP-servers \
        --address-prefixes 10.0.1.0/24 \
        --name Databases
    
  4. Eseguire il comando seguente in Cloud Shell per creare il gruppo di sicurezza di rete ERP-SERVERS-NSG:

    az network nsg create \
        --resource-group $rg \
        --name ERP-SERVERS-NSG
    

Creare macchine virtuali che eseguono Ubuntu

Verranno ora create due macchine virtuali denominate AppServer e DataServer. Si distribuisce AppServer nella subnet Applications e DataServer nella subnet Databases. Aggiungere le interfacce di rete delle macchine virtuali al gruppo di sicurezza di rete ERP-SERVERS-NSG. Quindi, per testare il gruppo di sicurezza di rete, usare queste macchine virtuali.

  1. Per compilare la macchina virtuale AppServer, eseguire il seguente comando in Cloud Shell. Per l'account amministratore sostituire <password> con una password complessa.

    wget -N https://raw.githubusercontent.com/MicrosoftDocs/mslearn-secure-and-isolate-with-nsg-and-service-endpoints/master/cloud-init.yml && \
    az vm create \
        --resource-group $rg \
        --name AppServer \
        --vnet-name ERP-servers \
        --subnet Applications \
        --nsg ERP-SERVERS-NSG \
        --image Ubuntu2204 \
        --size Standard_DS1_v2 \
         --generate-ssh-keys \
        --admin-username azureuser \
        --custom-data cloud-init.yml \
        --no-wait \
        --admin-password <password>
    
  2. Per compilare la macchina virtuale DataServer, eseguire il comando seguente in Cloud Shell. Per l'account amministratore sostituire <password> con una password complessa.

    az vm create \
        --resource-group $rg \
        --name DataServer \
        --vnet-name ERP-servers \
        --subnet Databases \
        --nsg ERP-SERVERS-NSG \
        --size Standard_DS1_v2 \
        --image Ubuntu2204 \
        --generate-ssh-keys \
        --admin-username azureuser \
        --custom-data cloud-init.yml \
         --no-wait \
        --admin-password <password>
    
  3. Prima che le macchine virtuali raggiungano lo stato di esecuzione possono trascorrere alcuni minuti. Eseguire il comando seguente in Cloud Shell per verificare se le macchine virtuali sono in esecuzione:

    az vm list \
        --resource-group $rg \
        --show-details \
        --query "[*].{Name:name, Provisioned:provisioningState, Power:powerState}" \
        --output table
    

    Al termine della creazione delle macchine virtuali verrà visualizzato l'output seguente:

    Name        Provisioned    Power
    ----------  -------------  ----------
    AppServer   Succeeded      VM running
    DataServer  Succeeded      VM running
    

Verificare la connettività predefinita

Ora si proverà ad aprire una sessione SSH (Secure Shell) in ognuna delle macchine virtuali. Tenere presente che finora è stato distribuito un gruppo di sicurezza di rete con regole predefinite.

  1. Per connettersi alle macchine virtuali, usare SSH direttamente da Cloud Shell. A questo scopo sono necessari gli indirizzi IP pubblici assegnati alle macchine virtuali. Eseguire il comando seguente in Cloud Shell per elencare gli indirizzi IP che verranno usati per la connessione alle macchine virtuali:

    az vm list \
        --resource-group $rg \
        --show-details \
        --query "[*].{Name:name, PrivateIP:privateIps, PublicIP:publicIps}" \
        --output table
    
  2. Per semplificare la connessione alle macchine virtuali nella parte rimanente di questo esercizio, assegnare gli indirizzi IP pubblici a variabili. Eseguire il comando seguente in Cloud Shell per salvare gli indirizzi IP pubblici di AppServer e DataServer in una variabile:

    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)"
    
  3. Eseguire il comando seguente in Cloud Shell per verificare se è possibile connettersi alla macchina virtuale AppServer:

    ssh azureuser@$APPSERVERIP -o ConnectTimeout=5
    

    Verrà visualizzato un messaggio Connection timed out.

  4. Eseguire il comando seguente in Cloud Shell per verificare se è possibile connettersi alla macchina virtuale DataServer:

    ssh azureuser@$DATASERVERIP -o ConnectTimeout=5
    

    Si otterrà lo stesso messaggio di errore di connessione.

Ricordare che le regole predefinite rifiutano tutto il traffico in ingresso in una rete virtuale, a meno che il traffico non provenga dalla stessa rete virtuale. La regola Deny All Inbound (Nega tutto in ingresso) ha bloccato le connessioni SSH in ingresso appena tentate.

In entrata

Nome Priorità IP di origine IP destinazione Accesso
Allow VNet Inbound 65000 VIRTUAL_NETWORK VIRTUAL_NETWORK Consenti
Deny All Inbound 65500 * * Nega

Creare una regola di sicurezza per SSH

Come si è visto, le regole predefinite nel gruppo di sicurezza di rete ERP-SERVERS-NSG includono una regola che nega tutte le connessioni in ingresso. Ora si aggiungerà una regola che consente di usare SSH per connettersi ad AppServer e DataServer.

  1. Eseguire il comando seguente in Cloud Shell per creare una nuova regola di sicurezza in ingresso per abilitare l'accesso SSH:

    az network nsg rule create \
        --resource-group $rg \
        --nsg-name ERP-SERVERS-NSG \
        --name AllowSSHRule \
        --direction Inbound \
        --priority 100 \
        --source-address-prefixes '*' \
        --source-port-ranges '*' \
        --destination-address-prefixes '*' \
        --destination-port-ranges 22 \
        --access Allow \
        --protocol Tcp \
        --description "Allow inbound SSH"
    
  2. Eseguire il comando seguente in Cloud Shell per verificare se è ora possibile connettersi alla macchina virtuale AppServer:

    ssh azureuser@$APPSERVERIP -o ConnectTimeout=5
    

    La regola del gruppo di sicurezza di rete può richiedere un minuto o due per diventare operativa. Se viene visualizzato un messaggio di errore di connessione, attendere un attimo e riprovare.

  3. Ora dovrebbe essere possibile effettuare la connessione. Dopo il messaggio Are you sure you want to continue connecting (yes/no)? immettere yes.

  4. Immettere la password definita quando è stata creata la macchina virtuale.

  5. Per chiudere la sessione di AppServer, immettere exit.

  6. Eseguire il comando seguente in Cloud Shell per verificare se è ora possibile connettersi alla macchina virtuale DataServer:

    ssh azureuser@$DATASERVERIP -o ConnectTimeout=5
    
  7. Ora dovrebbe essere possibile effettuare la connessione. Dopo il messaggio Are you sure you want to continue connecting (yes/no)? immettere yes.

  8. Immettere la password definita quando è stata creata la macchina virtuale.

  9. Per chiudere la sessione di DataServer, immettere exit.

Creare una regola di sicurezza per impedire l'accesso Web

A questo punto aggiungere una regola in modo che AppServer possa comunicare con DataServer su HTTP, ma DataServer non possa comunicare con AppServer su HTTP. Questi sono gli indirizzi IP interni per questi server:

Nome server Indirizzo IP
AppServer 10.0.0.4
DataServer 10.0.1.4
  1. Eseguire il comando seguente in Cloud Shell per creare una nuova regola di sicurezza in ingresso per negare l'accesso HTTP sulla porta 80:

    az network nsg rule create \
        --resource-group $rg \
        --nsg-name ERP-SERVERS-NSG \
        --name httpRule \
        --direction Inbound \
        --priority 150 \
        --source-address-prefixes 10.0.1.4 \
        --source-port-ranges '*' \
        --destination-address-prefixes 10.0.0.4 \
        --destination-port-ranges 80 \
        --access Deny \
        --protocol Tcp \
        --description "Deny from DataServer to AppServer on port 80"
    

Testare la connettività HTTP tra le macchine virtuali

Ora si deve verificare se la nuova regola funziona. AppServer deve essere in grado di comunicare con DataServer su HTTP. DataServer non deve essere in grado di comunicare con AppServer su HTTP.

  1. Eseguire il comando seguente in Cloud Shell per connettersi alla macchina virtuale AppServer. Controllare se AppServer può comunicare con DataServer su HTTP.

    ssh -t azureuser@$APPSERVERIP 'wget http://10.0.1.4; exit; bash'
    
  2. Immettere la password definita quando è stata creata la macchina virtuale.

  3. La risposta deve includere un messaggio 200 OK.

  4. Eseguire il comando seguente in Cloud Shell per connettersi alla macchina virtuale DataServer. Controllare se DataServer può comunicare con AppServer su HTTP.

    ssh -t azureuser@$DATASERVERIP 'wget http://10.0.0.4; exit; bash'
    
  5. Immettere la password definita quando è stata creata la macchina virtuale.

  6. L'esito non deve essere positivo, perché l'accesso sulla porta 80 è stato bloccato. Dopo alcuni minuti, dovrebbe essere visualizzato un messaggio Connection timed out. Per interrompere il comando prima del timeout, premere CTRL+C.

Distribuire un gruppo di sicurezza delle app

A questo punto, creare un gruppo di sicurezza delle app per i server di database, in modo che a tutti i server nel gruppo possano essere assegnate le stesse impostazioni. Si prevede di distribuire altri server di database e si vuole impedire che questi server accedano ai server applicazioni tramite HTTP. Assegnando le origini nel gruppo di sicurezza delle app, non è necessario gestire manualmente un elenco di indirizzi IP nel gruppo di sicurezza di rete. Occorre invece assegnare le interfacce di rete delle macchine virtuali da gestire al gruppo di sicurezza delle app.

Diagram of exercise scenario app security groups.

  1. Eseguire il comando seguente in Cloud Shell per creare un nuovo gruppo di sicurezza delle app denominato ERP-DB-SERVERS-ASG:

    az network asg create \
        --resource-group $rg \
        --name ERP-DB-SERVERS-ASG
    
  2. Eseguire il comando seguente in Cloud Shell per associare DataServer al gruppo di sicurezza delle app:

    az network nic ip-config update \
        --resource-group $rg \
        --application-security-groups ERP-DB-SERVERS-ASG \
        --name ipconfigDataServer \
        --nic-name DataServerVMNic \
        --vnet-name ERP-servers \
        --subnet Databases
    
  3. Eseguire il comando seguente in Cloud Shell per aggiornare la regola HTTP nel gruppo di sicurezza di rete ERP-SERVERS-NSG. Dovrebbe fare riferimento al gruppo di sicurezza delle app ERP-DB-Servers.

    az network nsg rule update \
        --resource-group $rg \
        --nsg-name ERP-SERVERS-NSG \
        --name httpRule \
        --direction Inbound \
        --priority 150 \
        --source-address-prefixes "" \
        --source-port-ranges '*' \
        --source-asgs ERP-DB-SERVERS-ASG \
        --destination-address-prefixes 10.0.0.4 \
        --destination-port-ranges 80 \
        --access Deny \
        --protocol Tcp \
        --description "Deny from DataServer to AppServer on port 80 using application security group"
    

Testare la regola di sicurezza HTTP aggiornata

  1. Eseguire il comando seguente in Cloud Shell per connettersi alla macchina virtuale AppServer. Controllare se AppServer può comunicare con DataServer su HTTP.

    ssh -t azureuser@$APPSERVERIP 'wget http://10.0.1.4; exit; bash'
    
  2. Immettere la password definita quando è stata creata la macchina virtuale.

  3. Come in precedenza, la risposta deve includere un messaggio 200 OK. Le impostazioni del gruppo di sicurezza delle app possono richiedere un paio di minuti per diventare effettive. Se non si riceve inizialmente il messaggio 200 OK, attendere un minuto e riprovare.

  4. Eseguire il comando seguente in Cloud Shell per connettersi alla macchina virtuale DataServer. Controllare se DataServer può comunicare con AppServer su HTTP.

    ssh -t azureuser@$DATASERVERIP 'wget http://10.0.0.4; exit; bash'
    
  5. Immettere la password definita quando è stata creata la macchina virtuale.

  6. Come prima, l'esito non deve essere positivo, perché l'accesso sulla porta 80 è stato bloccato. Dopo alcuni minuti, dovrebbe essere visualizzato un messaggio Connection timed out. Per interrompere il comando prima del timeout, premere CTRL+C.

Ora si è confermato che la regola del gruppo di sicurezza di rete funziona usando un gruppo di sicurezza delle app, esattamente come quando è stato usato un indirizzo IP di origine. Se sono stati aggiunti altri server dati, è possibile assicurarsi che abbiano la sicurezza di rete appropriata aggiungendo i nuovi server al ERP-DB-SERVERS-ASG.