Configurando DMZ no Azure com Azure Security Groups (ASG)

Artigo Escrito por: Fernando Silva

Olá Pessoal

Por padrão, não é possível implementar uma DMZ em uma infraestrutura de VM no azure de forma tão simples quanto no ambiente on-premisses, onde é possível utilizar uma estrutura de firewall com pelo menos 2 conexões de rede para esta finalidade. As máquinas virtuais criadas no Azure estão limitadas a 1 conexão de rede, neste ponto começa o desafio para criar uma rede de perímetro.

Felizmente, o Azure permite a configuração de um recurso de segurança chamado ASG – Azure Security Groups, onde é possíveldefinir regras de acesso para protocolos e redes, funcionando de forma parecida com as regras que definimos em um firewall. Uma vez que um ASG é criado, podemos associar estas regras diretamente a uma subnet, ou a uma VM.

Vou demonstrar aqui a criação de 2 ASGs, um para rede interna, que terá conexão limitada, e outra para rede de perímetro, que terá exposição total a internet. Ambas serão associadas as respectivas subnets.

1. Configurando as SUBNETs:

O primeiro passo é criar uma VIRTUAL NETWORK (VNET). Caso a mesma já tenha sido criada, é possível criar as SUBNETS necessárias na guia CONFIGURAÇÃO, dentro da rede selecionada:

Defina as subnets, range e endereços de acordo com sua preferência.

2. Definindo a SUBNET de suas VMS

Quando uma VM é criada, você associa esta VM a uma VNET, e este processo se torna definitivo. Para alterar uma VM de VNET, o que deve ser feito é remover a VM, mantendo o VHD, criar uma nova VM, associar o VHD, e então associar a VNET correta. Mais informações: http://blogs.msdn.com/b/walterm/archive/2013/05/29/moving-a-virtual-machine-from-one-virtual-network-to-another.aspx

Entretanto, como as subnets são criadas dentro de uma VNET, é alterar a SUBNET de uma VM, para outra que esteja dentro da mesma VNET. Para isto, o seguinte comando pode ser utilizado:

Get-AzureVM –ServiceName TestVMCloud –Name TestVM | Set-AzureSubnet –SubnetNames Subnet-2 | Update-AzureVM

Caso a máquina virtual possua um DIP estático, primeiramente essa reserva deve ser removida:

Get-AzureVM -ServiceName TestVMCloud -Name TestVM | Remove-AzureStaticVNetIP | Update-AzureVM
Get-AzureVM -ServiceName TestVMCloud -Name TestVM | Set-AzureSubnet -SubnetNames Subnet-2 | Update-AzureVM

Mais informações: https://msdn.microsoft.com/en-us/library/azure/dn643636.aspx

3. Criando um ASG

O seguinte comando deve ser utilizado:

New-AzureNetworkSecurityGroup -Name “DMZ”

New-AzureNetworkSecurityGroup -Name “Internal”

Nota importante: este recurso deve ser criado na mesma região de sua VNET, para que posteriormente seja possível fazer a associação. No meu caso, como a VNET foi criada na região sul dos EUA, usei o valor USSOUTH em region, durante a criação do ASG.

4. Configurando as regras de seu ASG

Por padrão, cada ASG vem com as seguintes regras predefinidas:

Name Priority Source IP Source Port Destination IP Destination Port Protocol Access
ALLOW VNET INBOUND 65000 VIRTUAL_NETWORK * VIRTUAL_NETWORK * * ALLOW
ALLOW AZURE LOAD BALANCER INBOUND 65001 AZURE_LOADBALANCER * * * * ALLOW
DENY ALL INBOUND 65500 * * * * * DENY

Outbound

Name Priority Source IP Source Port Destination IP Destination Port Protocol Access
ALLOW VNET OUTBOUND 65000 VIRTUAL_NETWORK * VIRTUAL_NETWORK * * ALLOW
ALLOW INTERNET OUTBOUND 65001 * * INTERNET * * ALLOW
DENY ALL OUTBOUND 65500 * * * * * DENY

From <https://msdn.microsoft.com/en-us/library/azure/dn848316.aspx>

Veja que a prioridade destas regras está definida com valor alto, o que permite que as regras que iremos criar na sequência tem precedência na aplicação.

Para minha configuração, eu preciso que o ASG DMZ tenha full access para internet, então criei uma regra de inbound e outra de outbound da seguinte forma:

Get-AzureNetworkSecurityGroup -Name “DMZ” | Set-AzureNetworkSecurityRule -Name WEB -Type Inbound -Priority 100 -Action Allow -SourceAddressPrefix ‘INTERNET’ -SourcePortRange ‘*’ -DestinationAddressPrefix ‘*’ -DestinationPortRange ‘*’ -Protocol TCP

Get-AzureNetworkSecurityGroup -Name “DMZ” | Set-AzureNetworkSecurityRule -Name WEB -Type Outbound -Priority 100 -Action Allow -SourceAddressPrefix ‘INTERNET’ -SourcePortRange ‘*’ -DestinationAddressPrefix ‘*’ -DestinationPortRange ‘*’ -Protocol TCP

A minha ASG INTERNAL deve ter acesso limitado, então relizei a seguinte configuração:

#Negando tudo inbound:

Get-AzureNetworkSecurityGroup -Name “internal” | Set-AzureNetworkSecurityRule -Name CUSTOM_DENY_IN -Type Inbound

-Priority 200 -Action Deny -SourceAddressPrefix ‘*’ -SourcePortRange ‘*’ -DestinationAddressPrefix ‘*’ -DestinationPor

tRange ‘*’ -Protocol TCP

#negando tudo outbound:

Get-AzureNetworkSecurityGroup -Name “internal” | Set-AzureNetworkSecurityRule -Name CUSTOM_DENY_OUT -Type Outbound -Priority 200 -Action Deny -SourceAddressPrefix ‘*’ -SourcePortRange ‘*’ -DestinationAddressPrefix ‘*’ -DestinationP

ortRange ‘*’ -Protocol TCP

Aqui eu defini as regras de comunicação entre as subnets da mesma VNET:

#Custom HTTP in

PS C:> Get-AzureNetworkSecurityGroup -Name “internal” | Set-AzureNetworkSecurityRule -Name CUSTOM_HTTP_in -Type Inbound-Priority 100 -Action Allow -SourceAddressPrefix ‘192.168.1.16/28’ -SourcePortRange ‘*’ -DestinationAddressPrefix ‘192.168.1.0/28′ -DestinationPortRange ’80’ -Protocol TCP

#Custom HTTP out

Get-AzureNetworkSecurityGroup -Name “internal” | Set-AzureNetworkSecurityRule -Name CUSTOM_HTTP_Out -Type Outbound -Priority 100 -Action Allow -SourceAddressPrefix ‘*’ -SourcePortRange ‘192.168.1.0/28’ -DestinationAddressPrefix ‘192.168.1.16/28′ -DestinationPortRange ’80’ -Protocol TCP

#HTTPS OUT

Get-AzureNetworkSecurityGroup -Name “internal” | Set-AzureNetworkSecurityRule -Name CUSTOM_HTTPS_Out -Type Outbound -Priority 101 -Action Allow -SourceAddressPrefix ‘*’ -SourcePortRange ‘192.168.1.0/28’ -DestinationAddressPrefix ‘192.168.1.16/28’ -DestinationPortRange ‘443’ -Protocol TCP

#HTTPS IN

Get-AzureNetworkSecurityGroup -Name “internal” | Set-AzureNetworkSecurityRule -Name CUSTOM_HTTPS_in -Type Inbound-Priority 101 -Action Allow -SourceAddressPrefix ‘192.168.1.16/28’ -SourcePortRange ‘*’ -DestinationAddressPrefix ‘192.168.1.0/28’ -DestinationPortRange ‘443’ -Protocol TCP

É importante também adicionar uma regra que permita a conexão RDP, caso contrário não será mais possível acessar a máquina pelo Remote desktop Connection:

#RDP IN

PS C:> Get-AzureNetworkSecurityGroup -Name “internal” | Set-AzureNetworkSecurityRule -Name CUSTOM_RDP_in -Type Inbound -Priority 102 -Action Allow -SourceAddressPrefix ‘*’ -SourcePortRange ‘*’ -DestinationAddressPrefix ‘*’ -DestinationPortRange ‘3389’ -Protocol TCP

5. Associando um ASG a uma SUBNET:

Agora finalmente, vamos associar os 2 ASGs criados às 2 SUBETS:

Get-AzureNetworkSecurityGroup -Name “DMZ” | Set-AzureNetworkSecurityGroupToSubnet -VirtualNetworkName ‘Fsilva’ -SubnetName ‘DMZ’

Get-AzureNetworkSecurityGroup -Name “Internal” | Set-AzureNetworkSecurityGroupToSubnet -VirtualNetworkName ‘Fsilva’ -SubnetName ‘Internal’

Agora é só testar! Espero que tudo dê certo! 😀

Links úteis:

About NSG: https://msdn.microsoft.com/en-us/library/azure/dn848316.aspx

Creating a DMZ on Azure: http://www.rajinders.com/2014/11/08/creating-dmz-in-azure-part-ii/

Secure Azure VM: http://blog.kloud.com.au/2014/11/07/secure-azure-virtual-network-and-create-dmz-on-azure-vnet-using-network-security-groups-nsg/

Lista de comandos úteis para ASG:

Create a Network Security Group

New-AzureNetworkSecurityGroup -Name “MyVNetSG” -Location uswest -Label “Security group for my Vnet in West US”

Add or Update rules

Get-AzureNetworkSecurityGroup -Name “MyVNetSG” | Set-AzureNetworkSecurityRule -Name WEB -Type Inbound -Priority 100 -Action Allow -SourceAddressPrefix ‘INTERNET’ -SourcePortRange ‘*’ -DestinationAddressPrefix ‘*’ -DestinationPortRange ‘*’ -Protocol TCP

Delete a rule from an NSG

Get-AzureNetworkSecurityGroup -Name “MyVNetSG” | Remove-AzureNetworkSecurityRule -Name WEB

Associate an NSG to a VM

Get-AzureVM -ServiceName “MyWebsite” -Name “Instance1” | Set-AzureNetworkSecurityGroupConfig -NetworkSecurityGroupName “MyVNetSG” | Update-AzureVM

Remove an NSG from a VM

Get-AzureVM -ServiceName “MyWebsite” -Name “Instance1” | Remove-AzureNetworkSecurityGroupConfig -NetworkSecurityGroupName “MyVNetSG” | Update-AzureVM

Associate an NSG to a subnet

Get-AzureNetworkSecurityGroup -Name “MyVNetSG” | Set-AzureNetworkSecurityGroupToSubnet -VirtualNetworkName ‘VNetUSWest’ -SubnetName ‘FrontEndSubnet’

Remove an NSG from the subnet

Get-AzureNetworkSecurityGroup -Name “MyVNetSG” | Remove-AzureNetworkSecurityGroupFromSubnet -VirtualNetworkName ‘VNetUSWest’ -SubnetName ‘FrontEndSubnet’

Delete an NSG

Remove-AzureNetworkSecurityGroup -Name “MyVNetSG”

Get the details of an NSG along with rules

Get Details of Network Security group along with rules
Get-AzureNetworkSecurityGroup -Name “MyVNetSG” -Detailed

Qualquer dúvida, estou a disposição!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s