AzureFirewall

Deploy Azure Firewall (EDGE)(bash) infraestrutura

Olá, neste post iremos fazer o deploy do Azure Firewall em uma infraestrutura de Firewal EDGE (como ja feito com Palo Alto e Fortigate)
Nesta topologia teremos Azure Firewall como borda de toda rede Azure (neste exemplo)

Vamos aos objetos criados

ObjetoNameDescrição
Resource Grouprg01-fw-edge-shared-brazilsouthRG
Azure Firewallfw-edgeStandard
Public IPpip-fw-edge-shared-brazilsouth-nat-outxxx.xxx.xxx.xxx
Public IPpip-fw-edge-shared-brazilsouth-nat-rdpxxx.xxx.xxx.xxx
Public IPpip-fw-edge-shared-brazilsouth-nat-sshxxx.xxx.xxx.xxx
Route Tablert-fw-edge-shared-brazilsouthRoute Table
Virtual Networkvnet-fw-edge-shared-brazilsouth10.225.0.0/22

*Não criamos aqui as VMs (Windows/Linux), mas elas estão na SubNet AzureFirewallSubnet-Trust
Nossas Subnets

AzureFirewallSubnet = 10.225.0.0/24
AzureFirewallManagementSubnet = 10.225.1.0/24
AzureFirewallSubnet-Trust = 10.225.2.0/24

Vamos ao nosso script bash

##Declarando variaveis Subscription(obrigatórias)
export Subscription_Name="XXXXX" ###Insira aqui sua subscription Azure

##Declarando variaveis Resource Group(obrigatórias)
export Name_RG_01="rg01"
export Name_RG_02="fw-edge"
export Name_Environment="shared"
export Location_Region="brazilsouth"
export RG_FULL_NAME="${Name_RG_01}"-"${Name_RG_02}"-"${Name_Environment}"-"${Location_Region}"

###Declarando variaveis Firewall (Obrigatório)
export FW_Name01="fw"

##Declarando Variaveis da Vnet (Obrigatório)
export Vnet_Name01="vnet"
export Vnet_FULL_Name="${Vnet_Name01}"-"${Name_RG_02}"-"${Name_Environment}"-"${Location_Region}"
export CIDR="10.225.0.0/22"

##Declarando Variaveis da Subnet (Obrigatório)
export SubnetName="AzureFirewallSubnet"
export Prefix="10.225.0.0/24"
export SubnetName02="AzureFirewallManagementSubnet"
export Prefix02="10.225.1.0/24"
export SubnetName03="AzureFirewallSubnet-Trust"
export Prefix03="10.225.2.0/24"

##Declarando Variaveis SKU/TIER
export SKU="AZFW_VNet"
export TIER="Standard"
export NameIP_01="ifconfig1"
export NameIP_02="nat-ssh"
export NameIP_03="nat-rdp"

##Declarando variaveis de ZONA
export ZONES="1"

##Declarando Variaveis IP Publico
export Public_IP_01="pip"
export Public_IP_02="${Public_IP_01}"-"${Name_RG_02}"-"${Name_Environment}"-"${Location_Region}"-"${Collection_Name03}"
export Public_IP_03="${Public_IP_01}"-"${Name_RG_02}"-"${Name_Environment}"-"${Location_Region}"-"${Collection_Name01}"
export Public_IP_04="${Public_IP_01}"-"${Name_RG_02}"-"${Name_Environment}"-"${Location_Region}"-"${Collection_Name02}"
export SKU_IP="Standard"
export IP_Zone="1"
export AlLocation="Static"
export Tier_IP="Regional"

###Declarando Variaveis de Route Table
export RT_Name01="rt"
export RT_Name02="${RT_Name01}"-"${Name_RG_02}"-"${Name_Environment}"-"${Location_Region}"
export RT_Name03="Default"
export Prefix_Address01="0.0.0.0/0"

###Declarando Variaveis NAT RULE
export Collection_Name01="nat-ssh"
export Collection_Name02="nat-rdp"
export Collection_Name03="nat-out"
export Destination01="10.225.2.4"

###Declarando Variaveis para acesso a internet HTTP/HTTPs
export Colletion_Name_Internet="Acesso_Internet"

##Variaveis TAGs (Não Obrigatório)
export Description="Departamento"
export Value_Description="Redes/Telecom/Segurança/Infraestrutura"
export Cost_Center="Centro de Custo"
export Cost_Center_Value="Redes/Telecom/Segurança/Infraestrutura"
export Support_Description_Description="E-mail Suporte"
export Support_Description_Value="[email protected]"

###Selecionar subscription
az account set --subscription "${Subscription_Name}"

##Criando RG
az group create -n "${RG_FULL_NAME}" -l "${Location_Region}" --tags "${Description}"="${Value_Description}" "${Cost_Center}"="${Cost_Center_Value}" "${Support_Description_Description}"="${Support_Description_Value}"

####Criando Virtual Network (Vnet)
az network vnet create -g "${RG_FULL_NAME}" -n "${Vnet_FULL_Name}" --address-prefix "${CIDR}" -l "${Location_Region}" --tags "${Description}"="${Value_Description}" "${Cost_Center}"="${Cost_Center_Value}" "${Support_Description_Description}"="${Support_Description_Value}"

###Criando Subnet 
az network vnet subnet create -g "${RG_FULL_NAME}" --vnet-name "${Vnet_FULL_Name}" -n "${SubnetName}" --address-prefixes "${Prefix}"
az network vnet subnet create -g "${RG_FULL_NAME}" --vnet-name "${Vnet_FULL_Name}" -n "${SubnetName02}" --address-prefixes "${Prefix02}"
az network vnet subnet create -g "${RG_FULL_NAME}" --vnet-name "${Vnet_FULL_Name}" -n "${SubnetName03}" --address-prefixes "${Prefix03}"

###Criando IP Publico
az network public-ip create -n "${Public_IP_02}" -g "${RG_FULL_NAME}" -l "${Location_Region}" --zone "${IP_Zone}" --allocation-method "${AlLocation}" --sku "${SKU_IP}" --tier "${Tier_IP}" --tags "${Description}"="${Value_Description}" "${Cost_Center}"="${Cost_Center_Value}" "${Support_Description_Description}"="${Support_Description_Value}"
az network public-ip create -n "${Public_IP_03}" -g "${RG_FULL_NAME}" -l "${Location_Region}" --zone "${IP_Zone}" --allocation-method "${AlLocation}" --sku "${SKU_IP}" --tier "${Tier_IP}" --tags "${Description}"="${Value_Description}" "${Cost_Center}"="${Cost_Center_Value}" "${Support_Description_Description}"="${Support_Description_Value}"
az network public-ip create -n "${Public_IP_04}" -g "${RG_FULL_NAME}" -l "${Location_Region}" --zone "${IP_Zone}" --allocation-method "${AlLocation}" --sku "${SKU_IP}" --tier "${Tier_IP}" --tags "${Description}"="${Value_Description}" "${Cost_Center}"="${Cost_Center_Value}" "${Support_Description_Description}"="${Support_Description_Value}"

##Criando Azure Firewall
az network firewall create -g "${RG_FULL_NAME}" -n "${Name_RG_02}" --sku "${SKU}" --tier "${TIER}" -z "1" --threat-intel-mode "Alert"

##Associando IP Publico Azure Firewall
az network firewall ip-config create --firewall-name "${Name_RG_02}" --name "${NameIP_01}" --public-ip-address "${Public_IP_02}" -g "${RG_FULL_NAME}" --vnet-name "${Vnet_FULL_Name}"
az network firewall ip-config create --firewall-name "${Name_RG_02}" --name "${NameIP_02}" --public-ip-address "${Public_IP_03}" -g "${RG_FULL_NAME}"
az network firewall ip-config create --firewall-name "${Name_RG_02}" --name "${NameIP_03}" --public-ip-address "${Public_IP_04}" -g "${RG_FULL_NAME}"

###Declarando Variaveis para utilizar IP privado do Azure Firewall
fwprivaddr01="$(az network firewall ip-config list -g "${RG_FULL_NAME}" -f "${Name_RG_02}" --query "[?name=='ifconfig1'].privateIpAddress" --output tsv)"
fwprivaddr02="$(az network public-ip show -g "${RG_FULL_NAME}" -n "${Public_IP_03}" --query "{address: ipAddress}" --output tsv)"
fwprivaddr03="$(az network public-ip show -g "${RG_FULL_NAME}" -n "${Public_IP_04}" --query "{address: ipAddress}" --output tsv)"

###Crando Route Table
az network route-table create -n "${RT_Name02}" -g "${RG_FULL_NAME}" -l "${Location_Region}" --disable-bgp-route-propagation "true"

###Associando Route Table a Subnet
az network vnet subnet update -n "${SubnetName03}" -g "${RG_FULL_NAME}" --vnet-name "${Vnet_FULL_Name}" --address-prefixes "${Prefix03}" --route-table "${RT_Name02}"

###Criando Static Route
az network route-table route create -g "${RG_FULL_NAME}" --name "${RT_Name03}" --route-table-name "${RT_Name02}" --address-prefix "${Prefix_Address01}" --next-hop-type "VirtualAppliance" --next-hop-ip-address $fwprivaddr01

###Criando regra de NAT para acessar uma VM com IP interno 10.255.2.4
az network firewall nat-rule create --collection-name "${Collection_Name}" \
--dest-addr "$fwprivaddr02" --destination-ports "22" --firewall-name "${Name_RG_02}" \
--name "nat-ssh-vm01" --protocols "tcp" -g "${RG_FULL_NAME}" --translated-port "22" \
--action "Dnat" --description "Acesso a VM01" --priority "200" \
--source-addresses "179.xxx.182.42/32" --translated-address "10.225.2.4"

###Criando regra de NAT para acessar uma VM com IP interno 10.255.2.5
az network firewall nat-rule create --collection-name "${Collection_Name02}" \
--dest-addr "$fwprivaddr03" --destination-ports "22" --firewall-name "${Name_RG_02}" \
--name "nat-rdp-vm02" --protocols "tcp" -g "${RG_FULL_NAME}" --translated-port "3389" \
--action "Dnat" --description "Acesso a VM02" --priority "201" \
--source-addresses "179.xxx.182.42/32" --translated-address "10.225.2.5"

###Criando Regras de acesso para Internet (somente HTTP/HTTPs)
az network firewall network-rule create --collection-name "${Colletion_Name_Internet}" \
--destination-ports "80" "443" --firewall-name "${Name_RG_02}" --name "Acesso a Internet" \
--protocols "tcp" --resource-group "${RG_FULL_NAME}" --action "Allow" \
--description "Acesso a Internet rede 10.225.2.0/24" --dest-addr "0.0.0.0/0" \
--priority "200" --source-addresses "10.225.2.0/24" 

###Fim do script

Vemos a VM Windows

Vemos a VM Linux

Agora vemos o NAT OutBound para acesso a internet

Windows (mesmo IP cadastrado no Firewall)

Linux (mesmo IP cadastrado no Firewall)

Em cima desta topologia podemos criar varias Vnets com peering e fazer do azure firewall nossa BORDA (EDGE), tudo contralado em um só lugar.

Seja Feliz!!!!

Infraestrutura de rede (Vnet) com Azure Firewall na Borda.

Neste artigo venho apresentar uma topologia utilizando Cloud Azure, com 7 Vnets ligadas por peering, gateway de VPN com BGP e Azure Firewall.

Nesta topologia todas as subnets estão com route table 0.0.0.0/0 para o IP da interface do nosso Azure Firewall

0.0.0.0/0 –> 10.128.0.68

Desta maneira temos total segregação da rede (Azure Vnet), onde cada projeto/departamento tem sua propria vnet.
Desta forma a vnet por exemplo do RH não fala com a Vnet de Marketing (Somente se for criada regras de Firewall) e o porque de utilizar desta forma.

Na minha visão tem que ser “cada um no seu quadrado”, não porque estamos em cloud que esse pensamento deve mudar, desta maneira tornamos nosso ambiente mais seguro, protegemos nossas cargas de trabalhos, deixamos cada ambiente totalmente isolado, segredado e seguro.

Na borda nos temos Azure Firewall com default route, onde ele controla tudo que entra e sai da nossa rede.

Topologia Azure Firewall

Exemplos de regras na pratica

Temos nesta topologia dois servidores de DNS (Windows Server 2019):

AZUEASTDNS01 e AZUEASTDNS02 (dentro do dominio glbx.corp)

AZUEASTDNS01.glbx.corp (10.128.8.4)
AZUEASTDNS02.glbx.corp (10.128.9.4)

Esses servidores são os DNS Server padrão de todas as nossas vnets

Veja como ficaria a regra de Azure Firewall para que toda “Resolução de Nomes” seja liberada: (Neste exemplo não estamos utilizando Firewall Manager)

Foi criada a seguinte regra

Name: dns vnet resoler
Protocol: TCP/UDP
Source: 10.128.0.0/16 (Estou utilizando este CIDR neste exemplo)
Destination Address: 10.128.8.4,10.128.9.4 (Nossos servidores DNS)
Destination Port: 53

Firewall Rule DNS Vnet

Conforme regra criada acima, todas as vnet que estão fazendo peering, e com route default 0.0.0.0/0 para o IP no nosso Azure Firewall, iram conseguir resolver nomes utilizando nossos servidores DNSs.

Vamos a outro exemplo pratico.

Em nosso ambiente temos dois servidores web (Windows Server 2019 com IIS) que hospeda a intranet da empresa, na frente deste servidores temos um load balance fazendo o balanceamento da carga, que possui o IP 10.128.11.196

Para os colaboradores acessarem a infraestrutura da empresa, existe uma VPN IPSec com BGP comunicando o ambiente OnPremises e o ambiente do Azure

A regra para liberar o acesso dos colaboradores ao nosso ambiente “intranet” seria assim:

Name: acesso rede interna – intranet
Protocol: TCP
Source: 10.127.0.0/22 (Este CIDR é da rede OnPremises)
Destination Address: 10.128.11.196 (IP do Load Balance)
Destinaton Port: 80/443

Nossos colaboradores seguiram este caminho

Notebook –> Firewall OnPremises –> Rota BGP –> Gateway Azure –> Route Default Azure –> Azure Firewall –> IP do Load Balance

Nossa intranet utiliza banco de dados Azure Database SQL (PaaS), para este modelo criamos um Azure Database SQL (PaaS) com private link e bloqueamos totalmente o acesso externo (Internet) ele só é acessivel via rede interna.

Link para utilização de private link com DNS Personal (Neste exemplo utilizamos desta forma)

https://docs.microsoft.com/pt-br/azure/private-link/private-endpoint-dns

Regra de Firewall

Name: acesso rede interna – intranet
Protocol: TCP
Source: 10.128.10.4,10.128.11.4
Destination Address: 10.128.4.10 (IP do Private Link que criamos)
Destinaton Port: 1433

Com esta regra nossa aplicação “intranet” conseguirá acessar o banco de dados PaaS via rede interna.

Outro exemplo pratico, neste cenário iremos expor uma aplicação para internet

Iremos expor nosso Site Institucional para a internet, temos este ambiente

Frontend: Application Gateway com IP Privado, peering com nossa vnet master, porém na subnet onde esta hospedado nossa application gateway não possui route default 0.0.0.0/0 para nosso AzureFirewall

Iremos utilizar o recurso de NAT para expor nosso site com destino um Appplication Gateway (não irei ensinar neste exemplo com criar/configurar um application gatewaY)

Name: acesso site institucional
Protocol: TCP
Source: * (qualquer lugar da internet)
Destination Address: 20.72.175.158 (IP previamente criado a atachado ao azure firewall)
Destinaton Port: 443
Translate Adress: 10.128.4.10 (IP privado do Application Gateway)
Translate Port: 443

Com a regra de firewall criada acima nosso site institucional ficará exposto para a internet com proteção de anti-DDoS do Azure que esta em nossa borda e por Application Gateway (WAF) na frente da aplicação.

Essa topologia não esta certa nem errada, eu acredito que é possivel deixar seu ambiente totalmente segredado, seguro, com um ponto unico de acesso e ainda conseguir utilizar todos os recurso do Azure de forma segura.

Bom é isso pessoal, fiquem a vontade para criticar/sugestionar

Outra coisa importante que se deve levar em conta, se no seu ambiente se faz necessário estabelecer comunicação com outras empresas, parceiros cliente etc….pense em utilizar a o proprio gateway de VPN BGP, porém pense que seu cliente da VPN IPSec não poderá utilizar a mesma rede que seu ambiente, neste exemplo o CIDR 10.128.0.0/16 e nem 10.127.0.0/22, para resolver essa questão você pode estabelecer a VPN IPSec em seu ambiente OnPremises e fazer o roteamento dos pacotes para seu ambiente no Azure (recomendo somente se não for critico, pois se seu ambiente OnPremises ficar indisponivel a VPN ficará também), outra solução seria criar um nova Vnet (Para deixar o ambiente segredado) e criar um Virtual Appliance como por exemplo “Fortigate” (Pode ser Palo Alto, SonicWall, PFSense), com a Vnet criada, faça o peering com a vnet master para propagação BGP, e NÃO deixe como rota default as subnets do fortigate para o AzureFirewall, depois disso bastas estabelecer o tunnel IPSec com seu parceiro e criar as devidas rotas na tabela de roteamento e as regras no Azure Firewall.