Esempio 1: creare una semplice rete perimetrale usando un NSG con PowerShell classicoExample 1 – Build a simple DMZ using NSGs with classic PowerShell

Tornare alla pagina relativa alle procedure consigliate sui limiti di sicurezzaReturn to the Security Boundary Best Practices Page

Questo esempio descrive come creare una rete perimetrale primitiva con quattro server Windows e gruppi di sicurezza di rete.This example creates a primitive DMZ with four Windows servers and Network Security Groups. Questo esempio descrive tutti i comandi PowerShell pertinenti per un approfondimento di ogni passaggio.This example describes each of the relevant PowerShell commands to provide a deeper understanding of each step. È disponibile anche una sezione sugli scenari di traffico con istruzioni dettagliate sul percorso seguito dal traffico attraverso i livelli di difesa della rete perimetrale.There is also a Traffic Scenario section to provide an in-depth step-by-step how traffic proceeds through the layers of defense in the DMZ. La sezione Riferimenti, infine, include tutto il codice e istruzioni complete per creare l'ambiente per testare e sperimentare vari scenari.Finally, in the references section is the complete code and instruction to build this environment to test and experiment with various scenarios.

Rete perimetrale in ingresso con gruppo di sicurezza di reteInbound DMZ with NSG

Descrizione dell'ambienteEnvironment description

Una sottoscrizione in questo esempio include le risorse seguenti:In this example a subscription contains the following resources:

  • Due servizi cloud, "FrontEnd001" e "BackEnd001"Two cloud services: “FrontEnd001” and “BackEnd001”
  • Una rete virtuale, "CorpNetwork", con due subnet, "FrontEnd" e "BackEnd"A Virtual Network, “CorpNetwork”, with two subnets; “FrontEnd” and “BackEnd”
  • Un gruppo di sicurezza di rete applicato a entrambe le subnetA Network Security Group that is applied to both subnets
  • Un server Windows che rappresenta un server Web applicazioni ("IIS01")A Windows Server that represents an application web server (“IIS01”)
  • Due server Windows che rappresentano i server applicazioni back-end ("AppVM01", "AppVM02")Two windows servers that represent application back-end servers (“AppVM01”, “AppVM02”)
  • Un server Windows che rappresenta un server DNS ("DNS01")A Windows server that represents a DNS server (“DNS01”)

Nella sezione Riferimenti è disponibile uno script di PowerShell per creare la maggior parte dell'ambiente descritto in questo esempio.In the references section, there is a PowerShell script that builds most of the environment described in this example. La creazione di macchine virtuali e reti virtuali, anche se eseguita dallo script di esempio, non è descritta in dettaglio in questo documento.Building the VMs and Virtual Networks, although are done by the example script, are not described in detail in this document.

Per creare l'ambiente, eseguire queste operazioni:To build the environment;

  1. Salvare il file XML di configurazione di rete incluso nella sezione Riferimenti, aggiornandolo con i nomi, il percorso e gli indirizzi IP corrispondenti allo scenario specifico.Save the network config xml file included in the references section (updated with names, location, and IP addresses to match the given scenario)
  2. Aggiornare le variabili utente incluse nello script in modo che corrispondano all'ambiente in cui lo script verrà eseguito, ad esempio sottoscrizioni, nomi dei servizi e così via.Update the user variables in the script to match the environment the script is to be run against (subscriptions, service names, etc.)
  3. Eseguire lo script in PowerShell.Execute the script in PowerShell

Nota

L'area indicata nello script di PowerShell deve corrispondere all'area indicata nel file XML di configurazione di rete.The region signified in the PowerShell script must match the region signified in the network configuration xml file.

Se l'esecuzione dello script viene completata correttamente, è possibile effettuare alcuni passaggi facoltativi. Nella sezione Riferimenti sono disponibili due script per configurare il server Web e il server applicazioni con una semplice applicazione Web per consentire l'esecuzione dei test con questa configurazione della rete perimetrale.Once the script runs successfully additional optional steps may be taken, in the references section are two scripts to set up the web server and app server with a simple web application to allow testing with this DMZ configuration.

Le sezioni seguenti forniscono una descrizione dettagliata dei gruppi di sicurezza di rete e del relativo funzionamento per questo esempio spiegando le righe principali dello script di PowerShell.The following sections provide a detailed description of Network Security Groups and how they function for this example by walking through key lines of the PowerShell script.

Gruppi di sicurezza di rete (NGS)Network Security Groups (NSG)

Per questo esempio viene creato un gruppo di sicurezza di rete, in cui vengono caricate sei regole.For this example, an NSG group is built and then loaded with six rules.

Suggerimento

In genere, è consigliabile creare prima di tutto le regole specifiche di tipo "Consenti" e infine le regole di tipo "Nega" più generiche.Generally speaking, you should create your specific “Allow” rules first and then the more generic “Deny” rules last. La priorità assegnata determina quali regole vengono valutate per prime.The assigned priority dictates which rules are evaluated first. Quando si rileva che al traffico è applicabile una determinata regola, non vengono valutate altre regole.Once traffic is found to apply to a specific rule, no further rules are evaluated. Le regole del gruppo di sicurezza di rete possono essere applicate nella direzione in ingresso o in uscita, dal punto di vista della subnet.NSG rules can apply in either in the inbound or outbound direction (from the perspective of the subnet).

A livello dichiarativo, per il traffico in ingresso vengono create le righe seguenti:Declaratively, the following rules are being built for inbound traffic:

  1. Il traffico DNS interno (porta 53) è consentito.Internal DNS traffic (port 53) is allowed
  2. Il traffico RDP (porta 3389) da Internet a qualsiasi macchina virtuale è consentito.RDP traffic (port 3389) from the Internet to any VM is allowed
  3. Il traffico HTTP (porta 80) da Internet al server Web (IIS01) è consentito.HTTP traffic (port 80) from the Internet to web server (IIS01) is allowed
  4. Tutto il traffico (tutte le porte) da IIS01 ad AppVM1 è consentito.Any traffic (all ports) from IIS01 to AppVM1 is allowed
  5. Tutto il traffico (tutte le porte) da Internet all'intera rete virtuale (entrambe le subnet) viene bloccato.Any traffic (all ports) from the Internet to the entire VNet (both subnets) is Denied
  6. Tutto il traffico (tutte le porte) dalla subnet front-end alla subnet back-end viene bloccato.Any traffic (all ports) from the Frontend subnet to the Backend subnet is Denied

Con queste regole associate a ogni subnet, se una richiesta HTTP proviene da Internet ed è diretta verso il server Web, le regole 3 (consenti) e 5 (nega) saranno applicabili, ma poiché la regola 3 ha una priorità maggiore, verrà applicata solo tale regola e la regola 5 non verrà presa in considerazione.With these rules bound to each subnet, if an HTTP request was inbound from the Internet to the web server, both rules 3 (allow) and 5 (deny) would apply, but since rule 3 has a higher priority only it would apply and rule 5 would not come into play. La richiesta HTTP verrà quindi consentita sul server Web.Thus the HTTP request would be allowed to the web server. Se lo stesso traffico prova a raggiungere il server DNS01, la regola 5 (nega) sarà la prima applicabile e il traffico non sarà autorizzato a passare al server.If that same traffic was trying to reach the DNS01 server, rule 5 (Deny) would be the first to apply and the traffic would not be allowed to pass to the server. La regola 6 (nega) impedisce alla subnet front-end di comunicare con la subnet back-end, ad eccezione del traffico consentito nelle regole 1 e 4; questo set di regole protegge la rete back-end nel caso in cui un utente malintenzionato comprometta l'applicazione Web sul front-end. L'utente malintenzionato avrà infatti accesso limitato alla rete "protetta" back-end, ovvero solo alle risorse esposte nel server AppVM01.Rule 6 (Deny) blocks the Frontend subnet from talking to the Backend subnet (except for allowed traffic in rules 1 and 4), this rule-set protects the Backend network in case an attacker compromises the web application on the Frontend, the attacker would have limited access to the Backend “protected” network (only to resources exposed on the AppVM01 server).

Esiste una regola in uscita predefinita che consente il traffico in uscita verso Internet.There is a default outbound rule that allows traffic out to the internet. Per questo esempio si consente il traffico in uscita e non si modificano le regole in uscita.For this example, we’re allowing outbound traffic and not modifying any outbound rules. Per bloccare il traffico in entrambe le direzioni, è obbligatorio il routing definito dall'utente, descritto nell'"Esempio 3" della pagina relativa alle procedure consigliate sui limiti di sicurezza.To lock down traffic in both directions, User Defined Routing is required and is explored in “Example 3” on the Security Boundary Best Practices Page.

Nel seguito le singole regole vengono descritte in modo più dettagliato. Nota: nell'elenco seguente tutte le voci che iniziano con il simbolo del dollaro (ad esempio, $NSGName) sono variabili definite dall'utente incluse nello script riportato nella sezione Riferimenti di questo documento:Each rule is discussed in more detail as follows (Note: any item in the following list beginning with a dollar sign (for example: $NSGName) is a user-defined variable from the script in the reference section of this document):

  1. È necessario prima di tutto creare un gruppo di sicurezza di rete in cui inserire le regole:First a Network Security Group must be built to hold the rules:

    New-AzureNetworkSecurityGroup -Name $NSGName `
        -Location $DeploymentLocation `
        -Label "Security group for $VNetName subnets in $DeploymentLocation"
    
  2. La prima regola in questo esempio consente il traffico DNS fra tutte le reti interne e il server DNS nella subnet back-end.The first rule in this example allows DNS traffic between all internal networks to the DNS server on the backend subnet. Nella regola sono inclusi alcuni parametri importanti:The rule has some important parameters:

    • "Type" indica in quale direzione del flusso di traffico verrà applicata questa regola.“Type” signifies in which direction of traffic flow this rule takes effect. La direzione è dal punto di vista del subnet o della macchina virtuale, in base al punto in cui è associato questo gruppo di sicurezza di rete.The direction is from the perspective of the subnet or Virtual Machine (depending on where this NSG is bound). Pertanto, se Type è impostato su "Inbound", la regola verrà applicata al traffico in ingresso nella subnet, ma non al traffico in uscita da essa.Thus if Type is “Inbound” and traffic is entering the subnet, the rule would apply and traffic leaving the subnet would not be affected by this rule.
    • "Priority" consente di impostare l'ordine in base al quale viene valutato un flusso di traffico.“Priority” sets the order in which a traffic flow is evaluated. Più è basso il numero, maggiore sarà la priorità.The lower the number the higher the priority. Quando un flusso di traffico specifico è applicabile a una determinata regola, non vengono elaborate altre regole.When a rule applies to a specific traffic flow, no further rules are processed. Se quindi una regola con priorità 1 consente il traffico e una regola con priorità 2 lo blocca ed entrambe le regole sono applicabili, il passaggio del traffico viene consentito perché viene applicata la regola 1 con priorità più alta e non vengono considerate altre regole.Thus if a rule with priority 1 allows traffic, and a rule with priority 2 denies traffic, and both rules apply to traffic then the traffic would be allowed to flow (since rule 1 had a higher priority it took effect and no further rules were applied).
    • "Action" indica se il traffico a cui si applica la regola viene bloccato o consentito.“Action” signifies if traffic affected by this rule is blocked or allowed.

      Get-AzureNetworkSecurityGroup -Name $NSGName | `
         Set-AzureNetworkSecurityRule -Name "Enable Internal DNS" `
         -Type Inbound -Priority 100 -Action Allow `
         -SourceAddressPrefix VIRTUAL_NETWORK -SourcePortRange '*' `
         -DestinationAddressPrefix $VMIP[4] `
         -DestinationPortRange '53' `
         -Protocol *
      
  3. Questa regola consente il flusso del traffico RDP da Internet alla porta RDP su qualsiasi server della subnet associata.This rule allows RDP traffic to flow from the internet to the RDP port on any server on the bound subnet. La regola usa due tipi speciali di prefissi per l'indirizzo: "VIRTUAL_NETWORK" e "INTERNET",This rule uses two special types of address prefixes; “VIRTUAL_NETWORK” and “INTERNET.” pertanto consente di gestire più facilmente una categoria più ampia di prefissi dell'indirizzo.These tags are an easy way to address a larger category of address prefixes.

    Get-AzureNetworkSecurityGroup -Name $NSGName | `
         Set-AzureNetworkSecurityRule -Name "Enable RDP to $VNetName VNet" `
         -Type Inbound -Priority 110 -Action Allow `
         -SourceAddressPrefix INTERNET -SourcePortRange '*' `
         -DestinationAddressPrefix VIRTUAL_NETWORK `
         -DestinationPortRange '3389' `
         -Protocol *
    
  4. Questa regola consente al traffico Internet in ingresso di raggiungere il server Web.This rule allows inbound internet traffic to hit the web server. Il comportamento di routing rimane invariato,This rule does not change the routing behavior. ma il traffico destinato a IIS01 può transitare.The rule only allows traffic destined for IIS01 to pass. Se quindi il traffico proveniente da Internet ha come destinazione il server Web, viene consentito e non vengono elaborate altre regoleThus if traffic from the Internet had the web server as its destination this rule would allow it and stop processing further rules. (nella regola con priorità 140 viene bloccato qualsiasi altro tipo di traffico Internet in ingresso).(In the rule at priority 140 all other inbound internet traffic is blocked). Se si elabora soltanto traffico HTTP, questa regola può essere limitata ulteriormente in modo da consentire esclusivamente la porta di destinazione 80.If you're only processing HTTP traffic, this rule could be further restricted to only allow Destination Port 80.

    Get-AzureNetworkSecurityGroup -Name $NSGName | `
         Set-AzureNetworkSecurityRule -Name "Enable Internet to $VMName[0]" `
         -Type Inbound -Priority 120 -Action Allow `
         -SourceAddressPrefix Internet -SourcePortRange '*' `
         -DestinationAddressPrefix $VMIP[0] `
         -DestinationPortRange '*' `
         -Protocol *
    
  5. Questa regola consente il passaggio del traffico dal server IIS01 al server AppVM01 e una regola successiva blocca tutto il resto del traffico dal front-end al back-end.This rule allows traffic to pass from the IIS01 server to the AppVM01 server, a later rule blocks all other Frontend to Backend traffic. Per migliorare la regola, è consigliabile aggiungere la porta, se è nota.To improve this rule, if the port is known that should be added. Ad esempio, se il server IIS ha necessità di raggiungere solo SQL Server in AppVM01, l'impostazione dell'intervallo delle porte di destinazione (DestinationPortRange) deve essere modificata da "" (qualsiasi) a 1433 (porta SQL), in modo da esporre una superficie di attacco più limitata in AppVM01 nel caso l'applicazione Web venisse compromessa.For example, if the IIS server is hitting only SQL Server on AppVM01, the Destination Port Range should be changed from “” (Any) to 1433 (the SQL port) thus allowing a smaller inbound attack surface on AppVM01 should the web application ever be compromised.

    Get-AzureNetworkSecurityGroup -Name $NSGName | `
        Set-AzureNetworkSecurityRule -Name "Enable $VMName[1] to $VMName[2]" `
        -Type Inbound -Priority 130 -Action Allow `
        -SourceAddressPrefix $VMIP[1] -SourcePortRange '*' `
        -DestinationAddressPrefix $VMIP[2] `
        -DestinationPortRange '*' `
        -Protocol *
    
  6. Questa regola blocca il traffico da Internet a qualsiasi server della rete.This rule denies traffic from the internet to any servers on the network. Insieme alla regola con priorità 110 e 120, consente esclusivamente il traffico Internet in ingresso diretto al firewall e alle porte RDP sui server e blocca tutto il traffico restante.With the rules at priority 110 and 120, the effect is to allow only inbound internet traffic to the firewall and RDP ports on servers and blocks everything else. Questa regola è di tipo fail-safe per bloccare tutti i flussi imprevisti.This rule is a "fail-safe" rule to block all unexpected flows.

    Get-AzureNetworkSecurityGroup -Name $NSGName | `
        Set-AzureNetworkSecurityRule `
        -Name "Isolate the $VNetName VNet from the Internet" `
        -Type Inbound -Priority 140 -Action Deny `
        -SourceAddressPrefix INTERNET -SourcePortRange '*' `
        -DestinationAddressPrefix VIRTUAL_NETWORK `
        -DestinationPortRange '*' `
        -Protocol *
    
  7. La regola finale blocca il traffico dalla subnet front-end alla subnet back-end.The final rule denies traffic from the Frontend subnet to the Backend subnet. Poiché si tratta di una regola solo di tipo Inbound, il traffico in direzione opposta è consentito (dal back-end al front-end).Since this rule is an Inbound only rule, reverse traffic is allowed (from the Backend to the Frontend).

    Get-AzureNetworkSecurityGroup -Name $NSGName | `
        Set-AzureNetworkSecurityRule `
        -Name "Isolate the $FESubnet subnet from the $BESubnet subnet" `
        -Type Inbound -Priority 150 -Action Deny `
        -SourceAddressPrefix $FEPrefix -SourcePortRange '*' `
        -DestinationAddressPrefix $BEPrefix `
        -DestinationPortRange '*' `
        -Protocol * 
    

Scenari di trafficoTraffic scenarios

(Consentito) Da Internet a server Web(Allowed) Internet to web server

  1. Un utente Internet richiede una pagina HTTP a FrontEnd001.CloudApp.Net (servizio cloud per Internet)An internet user requests an HTTP page from FrontEnd001.CloudApp.Net (Internet Facing Cloud Service)
  2. Il servizio cloud passa il traffico attraverso l'endpoint aperto sulla porta 80 a IIS01 (server Web).Cloud service passes traffic through open endpoint on port 80 towards IIS01 (the web server)
  3. La subnet front-end inizia l'elaborazione delle regole in ingresso:Frontend subnet begins inbound rule processing:
    1. Regola gruppo di sicurezza di rete 1 (DNS) non applicabile, passa alla regola successiva.NSG Rule 1 (DNS) doesn’t apply, move to next rule
    2. Regola gruppo di sicurezza di rete 2 (RDP) non applicabile, passa alla regola successiva.NSG Rule 2 (RDP) doesn’t apply, move to next rule
    3. Regola gruppo di sicurezza di rete 3 (da Internet a IIS01) applicabile, il traffico è consentito, l'elaborazione delle regole si arresta.NSG Rule 3 (Internet to IIS01) does apply, traffic is allowed, stop rule processing
  4. Il traffico raggiunge l'indirizzo IP interno del server Web IIS01 (10.0.1.5).Traffic hits internal IP address of the web server IIS01 (10.0.1.5)
  5. IIS01 è in ascolto del traffico Web, riceve la richiesta e ne avvia l'elaborazione.IIS01 is listening for web traffic, receives this request and starts processing the request
  6. IIS01 chiede informazioni a SQL Server in AppVM01.IIS01 asks the SQL Server on AppVM01 for information
  7. Non essendoci regole in uscita sulla subnet front-end, il traffico è consentitoSince there are no outbound rules on Frontend subnet, traffic is allowed
  8. La subnet back-end inizia l'elaborazione delle regole in ingresso:The Backend subnet begins inbound rule processing:
    1. Regola gruppo di sicurezza di rete 1 (DNS) non applicabile, passa alla regola successiva.NSG Rule 1 (DNS) doesn’t apply, move to next rule
    2. Regola gruppo di sicurezza di rete 2 (RDP) non applicabile, passa alla regola successiva.NSG Rule 2 (RDP) doesn’t apply, move to next rule
    3. Regola gruppo di sicurezza di rete 3 (da Internet a firewall), non applicabile, passa alla regola successiva.NSG Rule 3 (Internet to Firewall) doesn’t apply, move to next rule
    4. Regola gruppo di sicurezza di rete 4 (da IIS01 ad AppVM01) applicabile, il traffico è consentito, l'elaborazione delle regole si arresta.NSG Rule 4 (IIS01 to AppVM01) does apply, traffic is allowed, stop rule processing
  9. AppVM01 riceve la query SQL e risponde.AppVM01 receives the SQL Query and responds
  10. Non essendoci regole in uscita sulla subnet back-end, la risposta è consentitaSince there are no outbound rules on the Backend subnet, the response is allowed
  11. La subnet front-end inizia l'elaborazione delle regole in ingresso:Frontend subnet begins inbound rule processing:
    1. Non sono presenti regole del gruppo di sicurezza di rete applicabili al traffico in ingresso dalla subnet back-end alla subnet front-end, quindi nessuna regola del gruppo di sicurezza di rete è applicabile.There is no NSG rule that applies to Inbound traffic from the Backend subnet to the Frontend subnet, so none of the NSG rules apply
    2. La regola di sistema predefinita che consente il traffico tra le subnet consentirebbe questo tipo di traffico, perciò è consentito.The default system rule allowing traffic between subnets would allow this traffic so the traffic is allowed.
  12. Il server IIS riceve la risposta SQL , completa la risposta HTTP e la invia al richiedente.The IIS server receives the SQL response and completes the HTTP response and sends to the requestor
  13. Non essendoci regole in uscita sulla subnet front-end, la risposta è consentita e l'utente Internet riceve la pagina Web richiesta.Since there are no outbound rules on the Frontend subnet the response is allowed, and the internet User receives the web page requested.

(Consentito) Traffico RDP al back-end(Allowed) RDP to backend

  1. L'amministratore del server su Internet richiede una sessione RDP ad AppVM01 su BackEnd001.CloudApp.Net:xxxxx, dove xxxxx è il numero di porta assegnato casualmente per RDP a AppVM01. Si può trovare la porta assegnata sul portale di Azure o tramite PowerShellServer Admin on internet requests RDP session to AppVM01 on BackEnd001.CloudApp.Net:xxxxx where xxxxx is the randomly assigned port number for RDP to AppVM01 (the assigned port can be found on the Azure portal or via PowerShell)
  2. La subnet back-end inizia l'elaborazione delle regole in ingresso:Backend subnet begins inbound rule processing:
    1. Regola gruppo di sicurezza di rete 1 (DNS) non applicabile, passa alla regola successiva.NSG Rule 1 (DNS) doesn’t apply, move to next rule
    2. Regola gruppo di sicurezza di rete 2 (RDP) applicabile, il traffico è consentito, l'elaborazione delle regole si arresta.NSG Rule 2 (RDP) does apply, traffic is allowed, stop rule processing
  3. Senza regole in uscita, sono applicabili le regole predefinite e il traffico restituito è consentito.With no outbound rules, default rules apply and return traffic is allowed
  4. La sessione RDP è abilitata.RDP session is enabled
  5. AppVM01 richiede il nome utente e la passwordAppVM01 prompts for the user name and password

(Consentito) Ricerca DNS del server Web sul server DNS(Allowed) Web server DNS look-up on DNS server

  1. Il server Web, IIS01, richiede un feed di dati all'indirizzo www.data.gov, ma deve risolvere l'indirizzo.Web Server, IIS01, needs a data feed at www.data.gov, but needs to resolve the address.
  2. La configurazione di rete per la rete virtuale elenca DNS01 (10.0.2.4 nella subnet back-end) come server DNS primario, IIS01 invia la richiesta DNS a DNS01.The network configuration for the VNet lists DNS01 (10.0.2.4 on the Backend subnet) as the primary DNS server, IIS01 sends the DNS request to DNS01
  3. Non sono impostate regole in uscita sulla subnet front-end, il traffico è consentito.No outbound rules on Frontend subnet, traffic is allowed
  4. La subnet back-end inizia l'elaborazione delle regole in ingresso:Backend subnet begins inbound rule processing:
    • Regola gruppo di sicurezza di rete 1 (DNS) applicabile, il traffico è consentito, l'elaborazione delle regole si arresta.NSG Rule 1 (DNS) does apply, traffic is allowed, stop rule processing
  5. Il server DNS riceve la richiesta.DNS server receives the request
  6. Il server DNS non ha l'indirizzo memorizzato nella cache e invia la richiesta a un server DNS radice su Internet.DNS server doesn’t have the address cached and asks a root DNS server on the internet
  7. Non sono impostate regole in uscita sulla subnet back-end, il traffico è consentito.No outbound rules on Backend subnet, traffic is allowed
  8. Il server DNS Internet risponde perché la sessione è stata avviata internamente, la risposta è consentita.Internet DNS server responds, since this session was initiated internally, the response is allowed
  9. Il server DNS memorizza la risposta nella cache e restituisce a IIS01 la risposta alla richiesta iniziale.DNS server caches the response, and responds to the initial request back to IIS01
  10. Non sono impostate regole in uscita sulla subnet back-end, il traffico è consentito.No outbound rules on Backend subnet, traffic is allowed
  11. La subnet front-end inizia l'elaborazione delle regole in ingresso:Frontend subnet begins inbound rule processing:
    1. Non sono presenti regole del gruppo di sicurezza di rete applicabili al traffico in ingresso dalla subnet back-end alla subnet front-end, quindi nessuna regola del gruppo di sicurezza di rete è applicabile.There is no NSG rule that applies to Inbound traffic from the Backend subnet to the Frontend subnet, so none of the NSG rules apply
    2. La regola di sistema predefinita che consente il traffico tra le subnet consentirebbe questo tipo di traffico, perciò è consentito.The default system rule allowing traffic between subnets would allow this traffic so the traffic is allowed
  12. IIS01 riceve la risposta da DNS01.IIS01 receives the response from DNS01

(Consentito) Il server Web richiede l'accesso a un file in AppVM01(Allowed) Web server access file on AppVM01

  1. IIS01 richiede un file in AppVM01.IIS01 asks for a file on AppVM01
  2. Non sono impostate regole in uscita sulla subnet front-end, il traffico è consentito.No outbound rules on Frontend subnet, traffic is allowed
  3. La subnet back-end inizia l'elaborazione delle regole in ingresso:The Backend subnet begins inbound rule processing:
    1. Regola gruppo di sicurezza di rete 1 (DNS) non applicabile, passa alla regola successiva.NSG Rule 1 (DNS) doesn’t apply, move to next rule
    2. Regola gruppo di sicurezza di rete 2 (RDP) non applicabile, passa alla regola successiva.NSG Rule 2 (RDP) doesn’t apply, move to next rule
    3. Regola gruppo di sicurezza di rete 3 (da Internet a IIS01) non applicabile, passa alla regola successiva.NSG Rule 3 (Internet to IIS01) doesn’t apply, move to next rule
    4. Regola gruppo di sicurezza di rete 4 (da IIS01 ad AppVM01) applicabile, il traffico è consentito, l'elaborazione delle regole si arresta.NSG Rule 4 (IIS01 to AppVM01) does apply, traffic is allowed, stop rule processing
  4. AppVM01 riceve la richiesta e risponde con il file (presupponendo che l'accesso sia autorizzato).AppVM01 receives the request and responds with file (assuming access is authorized)
  5. Non essendoci regole in uscita sulla subnet back-end, la risposta è consentitaSince there are no outbound rules on the Backend subnet, the response is allowed
  6. La subnet front-end inizia l'elaborazione delle regole in ingresso:Frontend subnet begins inbound rule processing:
    1. Non sono presenti regole del gruppo di sicurezza di rete applicabili al traffico in ingresso dalla subnet back-end alla subnet front-end, quindi nessuna regola del gruppo di sicurezza di rete è applicabile.There is no NSG rule that applies to Inbound traffic from the Backend subnet to the Frontend subnet, so none of the NSG rules apply
    2. La regola di sistema predefinita che consente il traffico tra le subnet consentirebbe questo tipo di traffico, perciò è consentito.The default system rule allowing traffic between subnets would allow this traffic so the traffic is allowed.
  7. Il server IIS riceve il file.The IIS server receives the file

(Negato) Traffico Web al server back-end(Denied) Web to backend server

  1. Un utente Internet prova ad accedere a un file in AppVM01 tramite il servizio BackEnd001.CloudApp.NetAn internet user tries to access a file on AppVM01 through the BackEnd001.CloudApp.Net service
  2. Non essendoci endpoint aperti per la condivisione file, il traffico non passa attraverso il servizio cloud e non raggiunge il serverSince there are no endpoints open for file share, this traffic would not pass the Cloud Service and wouldn’t reach the server
  3. In caso di apertura degli endpoint per qualunque motivo, la regola del gruppo di sicurezza di rete 5 (da Internet a rete virtuale) bloccherà questo traffico.If the endpoints were open for some reason, NSG rule 5 (Internet to VNet) would block this traffic

(Negato) Ricerca DNS Web sul server DNS(Denied) Web DNS look-up on DNS server

  1. L'utente Internet prova a cercare un record DNS interno su DNS01 tramite il servizio BackEnd001.CloudApp.NetAn internet user tries to look up an internal DNS record on DNS01 through the BackEnd001.CloudApp.Net service
  2. Non essendoci endpoint aperti per DNS, il traffico non passa attraverso il servizio cloud e non raggiunge il serverSince there are no endpoints open for DNS, this traffic would not pass the Cloud Service and wouldn’t reach the server
  3. In caso di apertura degli endpoint per qualunque motivo, la regola del gruppo di sicurezza di rete 5 (da Internet a rete virtuale) bloccherà questo traffico. Si noti che la regola 1 (DNS) non è applicabile per due motivi, prima di tutto l'indirizzo di origine è Internet e questa regola si applica solo quando l'origine è la rete virtuale locale, in secondo luogo questa è una regola di tipo Consenti e quindi non bloccherà mai il trafficoIf the endpoints were open for some reason, NSG rule 5 (Internet to VNet) would block this traffic (Note: that Rule 1 (DNS) would not apply for two reasons, first the source address is the internet, this rule only applies to the local VNet as the source, also this rule is an Allow rule, so it would never deny traffic)

(Negato) Accesso dal Web a SQL tramite il firewall(Denied) Web to SQL access through firewall

  1. Un utente Internet richiede dati SQL a FrontEnd001.CloudApp.Net (servizio cloud per Internet)An internet user requests SQL data from FrontEnd001.CloudApp.Net (Internet Facing Cloud Service)
  2. Non essendoci endpoint aperti per SQL, il traffico non passa attraverso il servizio cloud e non raggiunge il firewallSince there are no endpoints open for SQL, this traffic would not pass the Cloud Service and wouldn’t reach the firewall
  3. Se gli endpoint sono aperti per qualunque motivo, la subnet front-end inizia l'elaborazione delle regole in ingresso:If endpoints were open for some reason, the Frontend subnet begins inbound rule processing:
    1. Regola gruppo di sicurezza di rete 1 (DNS) non applicabile, passa alla regola successiva.NSG Rule 1 (DNS) doesn’t apply, move to next rule
    2. Regola gruppo di sicurezza di rete 2 (RDP) non applicabile, passa alla regola successiva.NSG Rule 2 (RDP) doesn’t apply, move to next rule
    3. Regola gruppo di sicurezza di rete 3 (da Internet a IIS01) applicabile, il traffico è consentito, l'elaborazione delle regole si arresta.NSG Rule 3 (Internet to IIS01) does apply, traffic is allowed, stop rule processing
  4. Il traffico raggiunge l'indirizzo IP interno di IIS01 (10.0.1.5).Traffic hits internal IP address of the IIS01 (10.0.1.5)
  5. IIS01 non è in ascolto sulla porta 1433, pertanto la richiesta non ottiene risposta.IIS01 isn't listening on port 1433, so no response to the request

ConclusioniConclusion

Questo esempio consente di isolare la subnet back-end dal traffico in ingresso in un modo relativamente semplice e diretto.This example is a relatively simple and straight forward way of isolating the back-end subnet from inbound traffic.

Altri esempi e una panoramica dei limiti di sicurezza della rete sono disponibili qui.More examples and an overview of network security boundaries can be found here.

RiferimentiReferences

Script principale e configurazione di reteMain script and network config

Salvare lo script completo in un file script di PowerShell.Save the Full Script in a PowerShell script file. Salvare la configurazione di rete in un file denominato "NetworkConf1.xml".Save the Network Config into a file named “NetworkConf1.xml.” Modificare le variabili definite dall'utente secondo le esigenze ed eseguire lo script.Modify the user-defined variables as needed and run the script.

Script completoFull script

In base alle variabili definite dall'utente, lo script consente di:This script will, based on the user-defined variables;

  1. Connettersi a una sottoscrizione di Azure.Connect to an Azure subscription
  2. Creare un account di archiviazioneCreate a storage account
  3. Creare una rete virtuale e due subnet, come definito nel file di configurazione di reteCreate a VNet and two subnets as defined in the Network Config file
  4. Compilare quattro macchine virtuali Windows ServerBuild four windows server VMs
  5. Configurare il gruppo di sicurezza di rete eseguendo queste operazioni:Configure NSG including:
    • Creazione di un gruppo di sicurezza di reteCreating an NSG
    • Inserimento delle regole.Populating it with rules
    • Associazione del gruppo di sicurezza di rete alle subnet appropriateBinding the NSG to the appropriate subnets

Questo script di PowerShell deve essere eseguito localmente in un server o un PC connesso a Internet.This PowerShell script should be run locally on an internet connected PC or server.

Importante

Quando si esegue lo script, in PowerShell potrebbero venire visualizzati avvisi o altri messaggi informativi.When this script is run, there may be warnings or other informational messages that pop in PowerShell. Solo i messaggi di errore formattati in rosso possono indicare un problema.Only error messages in red are cause for concern.

<# 
 .SYNOPSIS
  Example of Network Security Groups in an isolated network (Azure only, no hybrid connections)

 .DESCRIPTION
  This script will build out a sample DMZ setup containing:
   - A default storage account for VM disks
   - Two new cloud services
   - Two Subnets (FrontEnd and BackEnd subnets)
   - One server on the FrontEnd Subnet
   - Three Servers on the BackEnd Subnet
   - Network Security Groups to allow/deny traffic patterns as declared

  Before running script, ensure the network configuration file is created in
  the directory referenced by $NetworkConfigFile variable (or update the
  variable to reflect the path and file name of the config file being used).

 .Notes
  Security requirements are different for each use case and can be addressed in a
  myriad of ways. Please be sure that any sensitive data or applications are behind
  the appropriate layer(s) of protection. This script serves as an example of some
  of the techniques that can be used, but should not be used for all scenarios. You
  are responsible to assess your security needs and the appropriate protections
  needed, and then effectively implement those protections.

  FrontEnd Service (FrontEnd subnet 10.0.1.0/24)
   IIS01      - 10.0.1.5

  BackEnd Service (BackEnd subnet 10.0.2.0/24)
   DNS01      - 10.0.2.4
   AppVM01    - 10.0.2.5
   AppVM02    - 10.0.2.6

#>

# Fixed Variables
    $LocalAdminPwd = Read-Host -Prompt "Enter Local Admin Password to be used for all VMs"
    $VMName = @()
    $ServiceName = @()
    $VMFamily = @()
    $img = @()
    $size = @()
    $SubnetName = @()
    $VMIP = @()

# User-Defined Global Variables
  # These should be changes to reflect your subscription and services
  # Invalid options will fail in the validation section

  # Subscription Access Details
    $subID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

  # VM Account, Location, and Storage Details
    $LocalAdmin = "theAdmin"
    $DeploymentLocation = "Central US"
    $StorageAccountName = "vmstore02"

  # Service Details
    $FrontEndService = "FrontEnd001"
    $BackEndService = "BackEnd001"

  # Network Details
    $VNetName = "CorpNetwork"
    $FESubnet = "FrontEnd"
    $FEPrefix = "10.0.1.0/24"
    $BESubnet = "BackEnd"
    $BEPrefix = "10.0.2.0/24"
    $NetworkConfigFile = "C:\Scripts\NetworkConf1.xml"

  # VM Base Disk Image Details
    $SrvImg = Get-AzureVMImage | Where {$_.ImageFamily -match 'Windows Server 2012 R2 Datacenter'} | sort PublishedDate -Descending | Select ImageName -First 1 | ForEach {$_.ImageName}

  # NSG Details
    $NSGName = "MyVNetSG"

# User-Defined VM Specific Configuration
    # Note: To ensure proper NSG Rule creation later in this script:
    #       - The Web Server must be VM 0
    #       - The AppVM1 Server must be VM 1
    #       - The DNS server must be VM 3
    #
    #       Otherwise the NSG rules in the last section of this
    #       script will need to be changed to match the modified
    #       VM array numbers ($i) so the NSG Rule IP addresses
    #       are aligned to the associated VM IP addresses.

    # VM 0 - The Web Server
      $VMName += "IIS01"
      $ServiceName += $FrontEndService
      $VMFamily += "Windows"
      $img += $SrvImg
      $size += "Standard_D3"
      $SubnetName += $FESubnet
      $VMIP += "10.0.1.5"

    # VM 1 - The First Application Server
      $VMName += "AppVM01"
      $ServiceName += $BackEndService
      $VMFamily += "Windows"
      $img += $SrvImg
      $size += "Standard_D3"
      $SubnetName += $BESubnet
      $VMIP += "10.0.2.5"

    # VM 2 - The Second Application Server
      $VMName += "AppVM02"
      $ServiceName += $BackEndService
      $VMFamily += "Windows"
      $img += $SrvImg
      $size += "Standard_D3"
      $SubnetName += $BESubnet
      $VMIP += "10.0.2.6"

    # VM 3 - The DNS Server
      $VMName += "DNS01"
      $ServiceName += $BackEndService
      $VMFamily += "Windows"
      $img += $SrvImg
      $size += "Standard_D3"
      $SubnetName += $BESubnet
      $VMIP += "10.0.2.4"

# ----------------------------- #
# No User-Defined Variables or  #
# Configuration past this point #
# ----------------------------- #    

  # Get your Azure accounts
    Add-AzureAccount
    Set-AzureSubscription –SubscriptionId $subID -ErrorAction Stop
    Select-AzureSubscription -SubscriptionId $subID -Current -ErrorAction Stop

  # Create Storage Account
    If (Test-AzureName -Storage -Name $StorageAccountName) { 
        Write-Host "Fatal Error: This storage account name is already in use, please pick a different name." -ForegroundColor Red
        Return}
    Else {Write-Host "Creating Storage Account" -ForegroundColor Cyan 
          New-AzureStorageAccount -Location $DeploymentLocation -StorageAccountName $StorageAccountName}

  # Update Subscription Pointer to New Storage Account
    Write-Host "Updating Subscription Pointer to New Storage Account" -ForegroundColor Cyan 
    Set-AzureSubscription –SubscriptionId $subID -CurrentStorageAccountName $StorageAccountName -ErrorAction Stop

# Validation
$FatalError = $false

If (-Not (Get-AzureLocation | Where {$_.DisplayName -eq $DeploymentLocation})) {
     Write-Host "This Azure Location was not found or available for use" -ForegroundColor Yellow
     $FatalError = $true}

If (Test-AzureName -Service -Name $FrontEndService) { 
    Write-Host "The FrontEndService service name is already in use, please pick a different service name." -ForegroundColor Yellow
    $FatalError = $true}
Else { Write-Host "The FrontEndService service name is valid for use." -ForegroundColor Green}

If (Test-AzureName -Service -Name $BackEndService) { 
    Write-Host "The BackEndService service name is already in use, please pick a different service name." -ForegroundColor Yellow
    $FatalError = $true}
Else { Write-Host "The BackEndService service name is valid for use." -ForegroundColor Green}

If (-Not (Test-Path $NetworkConfigFile)) { 
    Write-Host 'The network config file was not found, please update the $NetworkConfigFile variable to point to the network config xml file.' -ForegroundColor Yellow
    $FatalError = $true}
Else { Write-Host "The network configuration file was found" -ForegroundColor Green
        If (-Not (Select-String -Pattern $DeploymentLocation -Path $NetworkConfigFile)) {
            Write-Host 'The deployment location was not found in the network config file, please check the network config file to ensure the $DeploymentLocation variable is correct and the network config file matches.' -ForegroundColor Yellow
            $FatalError = $true}
        Else { Write-Host "The deployment location was found in the network config file." -ForegroundColor Green}}

If ($FatalError) {
    Write-Host "A fatal error has occurred, please see the above messages for more information." -ForegroundColor Red
    Return}
Else { Write-Host "Validation passed, now building the environment." -ForegroundColor Green}

# Create VNET
    Write-Host "Creating VNET" -ForegroundColor Cyan 
    Set-AzureVNetConfig -ConfigurationPath $NetworkConfigFile -ErrorAction Stop

# Create Services
    Write-Host "Creating Services" -ForegroundColor Cyan
    New-AzureService -Location $DeploymentLocation -ServiceName $FrontEndService -ErrorAction Stop
    New-AzureService -Location $DeploymentLocation -ServiceName $BackEndService -ErrorAction Stop

# Build VMs
    $i=0
    $VMName | Foreach {
        Write-Host "Building $($VMName[$i])" -ForegroundColor Cyan
        New-AzureVMConfig -Name $VMName[$i] -ImageName $img[$i] –InstanceSize $size[$i] | `
            Add-AzureProvisioningConfig -Windows -AdminUsername $LocalAdmin -Password $LocalAdminPwd  | `
            Set-AzureSubnet  –SubnetNames $SubnetName[$i] | `
            Set-AzureStaticVNetIP -IPAddress $VMIP[$i] | `
            Set-AzureVMMicrosoftAntimalwareExtension -AntimalwareConfiguration '{"AntimalwareEnabled" : true}' | `
            Remove-AzureEndpoint -Name "PowerShell" | `
            New-AzureVM –ServiceName $ServiceName[$i] -VNetName $VNetName -Location $DeploymentLocation
            # Note: A Remote Desktop endpoint is automatically created when each VM is created.
        $i++
    }
    # Add HTTP Endpoint for IIS01
    Get-AzureVM -ServiceName $ServiceName[0] -Name $VMName[0] | Add-AzureEndpoint -Name HTTP -Protocol tcp -LocalPort 80 -PublicPort 80 | Update-AzureVM

# Configure NSG
    Write-Host "Configuring the Network Security Group (NSG)" -ForegroundColor Cyan

  # Build the NSG
    Write-Host "Building the NSG" -ForegroundColor Cyan
    New-AzureNetworkSecurityGroup -Name $NSGName -Location $DeploymentLocation -Label "Security group for $VNetName subnets in $DeploymentLocation"

  # Add NSG Rules
    Write-Host "Writing rules into the NSG" -ForegroundColor Cyan
    Get-AzureNetworkSecurityGroup -Name $NSGName | Set-AzureNetworkSecurityRule -Name "Enable Internal DNS" -Type Inbound -Priority 100 -Action Allow `
        -SourceAddressPrefix VIRTUAL_NETWORK -SourcePortRange '*' `
        -DestinationAddressPrefix $VMIP[3] -DestinationPortRange '53' `
        -Protocol *

    Get-AzureNetworkSecurityGroup -Name $NSGName | Set-AzureNetworkSecurityRule -Name "Enable RDP to $VNetName VNet" -Type Inbound -Priority 110 -Action Allow `
        -SourceAddressPrefix INTERNET -SourcePortRange '*' `
        -DestinationAddressPrefix VIRTUAL_NETWORK -DestinationPortRange '3389' `
        -Protocol *

    Get-AzureNetworkSecurityGroup -Name $NSGName | Set-AzureNetworkSecurityRule -Name "Enable Internet to $($VMName[0])" -Type Inbound -Priority 120 -Action Allow `
        -SourceAddressPrefix Internet -SourcePortRange '*' `
        -DestinationAddressPrefix $VMIP[0] -DestinationPortRange '*' `
        -Protocol *

    Get-AzureNetworkSecurityGroup -Name $NSGName | Set-AzureNetworkSecurityRule -Name "Enable $($VMName[0]) to $($VMName[1])" -Type Inbound -Priority 130 -Action Allow `
        -SourceAddressPrefix $VMIP[0] -SourcePortRange '*' `
        -DestinationAddressPrefix $VMIP[1] -DestinationPortRange '*' `
        -Protocol *

    Get-AzureNetworkSecurityGroup -Name $NSGName | Set-AzureNetworkSecurityRule -Name "Isolate the $VNetName VNet from the Internet" -Type Inbound -Priority 140 -Action Deny `
        -SourceAddressPrefix INTERNET -SourcePortRange '*' `
        -DestinationAddressPrefix VIRTUAL_NETWORK -DestinationPortRange '*' `
        -Protocol *

    Get-AzureNetworkSecurityGroup -Name $NSGName | Set-AzureNetworkSecurityRule -Name "Isolate the $FESubnet subnet from the $BESubnet subnet" -Type Inbound -Priority 150 -Action Deny `
        -SourceAddressPrefix $FEPrefix -SourcePortRange '*' `
        -DestinationAddressPrefix $BEPrefix -DestinationPortRange '*' `
        -Protocol *

    # Assign the NSG to the Subnets
        Write-Host "Binding the NSG to both subnets" -ForegroundColor Cyan
        Set-AzureNetworkSecurityGroupToSubnet -Name $NSGName -SubnetName $FESubnet -VirtualNetworkName $VNetName
        Set-AzureNetworkSecurityGroupToSubnet -Name $NSGName -SubnetName $BESubnet -VirtualNetworkName $VNetName

# Optional Post-script Manual Configuration
  # Install Test Web App (Run Post-Build Script on the IIS Server)
  # Install Backend resource (Run Post-Build Script on the AppVM01)
  Write-Host
  Write-Host "Build Complete!" -ForegroundColor Green
  Write-Host
  Write-Host "Optional Post-script Manual Configuration Steps" -ForegroundColor Gray
  Write-Host " - Install Test Web App (Run Post-Build Script on the IIS Server)" -ForegroundColor Gray
  Write-Host " - Install Backend resource (Run Post-Build Script on the AppVM01)" -ForegroundColor Gray
  Write-Host

File di configurazione di reteNetwork config file

Salvare questo file XML con il percorso aggiornato e aggiungere il collegamento a questo file nella variabile $NetworkConfigFile dello script precedente.Save this xml file with updated location and add the link to this file to the $NetworkConfigFile variable in the preceding script.

<NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
  <VirtualNetworkConfiguration>
    <Dns>
      <DnsServers>
        <DnsServer name="DNS01" IPAddress="10.0.2.4" />
        <DnsServer name="Level3" IPAddress="209.244.0.3" />
      </DnsServers>
    </Dns>
    <VirtualNetworkSites>
      <VirtualNetworkSite name="CorpNetwork" Location="Central US">
        <AddressSpace>
          <AddressPrefix>10.0.0.0/16</AddressPrefix>
        </AddressSpace>
        <Subnets>
          <Subnet name="FrontEnd">
            <AddressPrefix>10.0.1.0/24</AddressPrefix>
          </Subnet>
          <Subnet name="BackEnd">
            <AddressPrefix>10.0.2.0/24</AddressPrefix>
          </Subnet>
        </Subnets>
        <DnsServersRef>
          <DnsServerRef name="DNS01" />
          <DnsServerRef name="Level3" />
        </DnsServersRef>
      </VirtualNetworkSite>
    </VirtualNetworkSites>
  </VirtualNetworkConfiguration>
</NetworkConfiguration>

Script di applicazione di esempioSample application scripts

Se si vuole installare un'applicazione di esempio per questo e altri esempi di rete perimetrale, è possibile trovarne una in Script di applicazione di esempioIf you wish to install a sample application for this, and other DMZ Examples, one has been provided at the following link: Sample Application Script

Passaggi successiviNext steps

  • Aggiornare e salvare il file XMLUpdate and save XML file
  • Eseguire lo script di PowerShell per creare l'ambienteRun the PowerShell script to build the environment
  • Installare l'applicazione di esempioInstall the sample application
  • Testare diversi flussi di traffico attraverso la rete perimetraleTest different traffic flows through this DMZ