Firewall

São dispositivos que têm com função regular o tráfego entre redes distintas restringindo o fluxo de informações.

Começou a ser utilizado no final da década de 80 quando roteadores faziam a separação de pequenas redes Firewall, também chamado de Porta corta-fogo.

Regras do tipo:

  • Alguém da rede A pode acessar a rede B, ou alguém da rede C não pode acessar a rede B.
  • Filtros de pacotes e de aplicativos.
  • Identificam o estado da conexão.

 

DMZ

É a sigla para de DeMilitarized Zone ou “zona desmilitarizada” ou ainda Rede de Perímetro.

É uma pequena rede situada entre uma rede confiável e uma não confiável, geralmente entre a rede local e a Internet.

Sua função é manter todos os serviços que possuem acesso externo (tais como servidores HTTP, FTP, de correio eletrônico, etc) separados da rede local

Limita o potencial dano em caso de comprometimento de algum destes serviços por um invasor.

 

Dicas de Planejamento

  • Antes da elaboração de regras, faça um levantamento da rede.
  • Configure seu firewall com a regra padrão de Deny ALL.
  • Caso a organização possua aplicativos que necessitem atravessar o firewall, certifique-se de que a aplicação é segura, que possua mecanismo de encriptação de dados. Libere o tráfego daquela porta apenas para uma origem e destino especificados.
  • Procure logar acessos a portas sensíveis, com por exemplo casos do item anterior;
  • Caso precise disponibilizar serviços na Internet, configure uma DMZ, ao invés de redirecionar portas do seu firewall para servidores internos.
  • Evite mapeamento de drivers através do firewall.
  • Configure o firewall para bloquear pacotes forjados, não permita que pacotes que possuam no campo de endereço de origem um endereço ip privado (10.0.0.0, 192.168.0.0, etc…) cheguem na interface externa do firewall.
  • Sempre que adicionar uma regra que permita um determinado tráfego, sempre especifique endereços IP de origem e destino, protocolo e porta.
  • Os serviços permitidos entre sua rede interna e sua DMZ, não devem ser permitidos entra a rede interna e a Internet e vice versa.
  • Antes de permitir o tráfego de um determinado protocolo, cheque se ele utiliza encriptação, de forma a evitar que as informações trafegadas possam ser snifadas.
  • Sempre realizem testes em seu firewall, utilizem ferramentas do tipo Nessus ou Nmap para verificar vulnerabilidades e portas abertas em seu firewall.

 

Implementação

Funções de Firewall são agregadas à própria arquitetura do kernel.

Implementações de Firewall de acordo com a versão do kernel.

Kernel 2.0 – IPFWADM

Kernel 2.2 – IPCHAINS

Kernel 2.4/2.6 – IPTABLES

  • Considerado um dos Firewalls mais seguros da atualidade.
  • Opensource
  • Desenvolvido e suportado pelo Netfilter (http://www.netfilter.org/)
  • Netfilter é o nome do módulo que adiciona funcionalidade de Firewall, Nat e Log de rede ao Linux
  • Dividido em tabelas (Facilita o controle das regras).

 

Iptables

As regras são lidas de cima para baixo, são cadastradas e organizadas com a utilização de shell scritps.

Divido em três tabelas:

 

Filter: Regras aplicadas a um firewall do tipo filtro de pacotes.

Nat: Regras direcionadas a um Firewall Nat (Network Address Translation)

Mangle: Funções mais avançadas e complexas de tratamento de pacotes como TOS Todas as tabelas possuem situações de fluxo (Entrada, Saída e Redirecionamento).

 

Divido em três Situações (Chains):

INPUT: Tudo que entra no host (O destino do pacote é o próprio firewall).

FORWARD: Tudo que chega ao host mas deve ser redirecionado.

OUTPUT: Tudo o que sai do host (A origem do pacote é o próprio firewall).

 

Iptables – Aplicativos

Iptables: Aplicativo principal do pacote iptables para protocolos ipv4.

Ip6tables: Aplicativo principal do pacote iptables para protocolos ipv6

Iptables-save: Aplicativo que salva todas as regras inseridas na sessão ativa e ainda em memória em um determinado arquivo. Ex: iptables-save > iptables-save.txt

Iptables-restore: Aplicativo que restaura todas as regras salvas pelo aplicativo

iptables-save. Ex: iptables-restore < iptables-save.txt

Iptstate (não faz parte do iptables): Mostra informações em tempo real das tabelas do iptables

 

Iptables – Sintaxe

-t : Associa uma regra a uma tabela. (filter, nat, mangle). A tabela filter é a tabela padrão e não precisa ser especificada.

#iptables -t Nat

-A : Adiciona uma nova entrada ao final da lista de regas de uma determinada chain

#iptables -A INPUT

-L : Lista as regras existentres

#iptables -L (Lista todas as chains)

#iptables -L FORWARD (Regras da chain FORWARD)

-P : Altera a política padrão de uma chain. (Por padrão elas estão em ACCEPT – Aceitam todo tipo de tráfego)

#iptables -P FORWARD DROP

-F : Remove todas as regras adicionadas a uma chain, sem alterar a política padrão.

#iptables -F (Remove todas as regras)

#iptables -F INPUT (Remove todas as regras da chain INPT)

-N : Permite-nos criar uma nova chain a tabela especificada. Recurso usado para organizar as regras de firewall.

#iptables -t filter -N pacotes_maliciosos

-X : Apaga uma chain criada com a opção -N

#iptables -X pacotes_maliciosos

-p : Especifica o protocolo aplicado a regra. Pode ser qualquer valor numérico especificado em /etc/protocol ou o próprio nome do protocolo (tcp, udp, icmp)

#iptables -p icmp

-i : Especifica a interface de entrada (muito importante, pois firewalls possuem múltiplas interfaces).

#iptables -i eth0

-o : Especifica a interface de saída.

#iptables -o eth1

-s : Especifica a origem (source) do pacote ao qual a regra deve ser aplicada. Deve ser um host ou uma rede. Normalmente é utilizado o IP seguido da sub-rede

#iptables -s 189.1.100.0/255.255.255.0

#iptables -s 189.1.100.0/24

#iptables -s www.terra.com.br (Resol. de nomes deve estar ativa)

-d : Especifica o destino (destination) do pacote ao qual a regra deve ser aplicada. Deve ser um host ou uma rede. Normalmente é utilizado o IP seguido da sub-rede

# iptables -d 189.1.100.0/255.255.255.0

# iptables -d 189.1.100.0/24

# iptables -d www.terra.com.br (Resol. de nomes deve estar ativa)

! : Significa exclusão. Exceção a uma regra.

#iptables -p ! icmp (todos os protocolos com exceção do icmp)

–sport : porta de origem (source port), filtros aplicados com base na porta de origem. Só é aplicada aos protocolos TCP e UDP.

#iptables -p tcp –-sport 80

–dport : porta de destino (destination port), filtros aplicados com base naporta de destino. Só é aplicada aos protocolos TCP e UDP.

#iptables -p tcp –-dport 80

 

Quando um pacote se adequa a uma regra, ele deve ser direcionado a um alvo especificado na própria regra. O alvo é definido pela opção –j.

ACCEPT : Corresponde a aceitar o pacote. Permite a entrada/passagem do pacote.

DROP : Corresponde a descartar. O pacote é descartado imediatamente. Não informa ao dispositivo emissor o que houve.

REJECT: Corresponde a rejeitar. O pacote é descartado imediatamente. Sua diferença em relação ao anterior é que nesse alvo, o host emissor é notificado.

LOG : Cria uma entrada no arquivo de log /var/log/messages. Deve ser usada antes da regra em questão.

SNAT : Altera o endereço de origem das máquinas clientes antes dos pacotes serem roteados. (NAT padrão).

DNAT : Altera o endereço de destino das máquinas clientes. Recebe um pacote na porta 80 do host A e redireciona para a porta 3128 do host B. (proxy transparente).

REDIRECT: Redirecionamento de portas juntamente com a opção –toport.

 

Iptables – Nat

Dividida em três Situações (Chains):

PREROUTING: Alteração em pacotes antes que os mesmos sejam roteados.

OUTPUT: Trata de pacotes emitidos pelo host firewall.

POSTROUTING: Alteração em pacotes após o roteamento.

 

Qualquer regra que use SNAT (nat tradicional), a chain utilizada será POSTROUTING.

Para que o NAT funcione, é necessário ativar no kernel o redirecionamento de pacotes (vide atividade 6).

Ativando o NAT

#iptables -t nat -A POSTROUTING -s 10.0.3.1/32 -o eth1 -j SNAT –to192.111.22.33

Dessa forma, todo pacote que vier do host 10.0.3.1 terá seu endereço de origem alterado.

 

#iptables -t nat -A POSTROUTING -s source_net/24 -o eth1 -jMASQUERADE

Ativo o NAT para todos os hosts da rede source_net para o endereço IP da interface eth1.

 

Abaixo segue um modelo, aconselho que você, copie, entenda, corrija (se necessário) e adapte para sua realidade.

O script está comentado para o entendimento e para facilitar a compreensão de cada regra ou comando.

Identifica qual é o interpretador que será usado na execução do script:

#!/bin/sh
Título do script.

#Configuração do Firewall através do iptables
#Autoria do Script
#”| Script de Firewall – IPTABLES”
#”| Criado por: AUTOR”
#”| Técnico em Informática”
#”|Email: ???????”
#”| Uso: firewall start|stop|restart”

Nesta parte declaro a variável PATH por que ela indica as pastas onde estão os diversos softwares existentes no sistema que não serão necessárias as indicações completa do caminho deles, a variável IPTABLES recebe o caminho completo do executável do firewall, a variável MACLIST recebe o caminho completo do arquivo que contém os macs e os ips que estão amarrados pelo firewall, na variável PROGRAMA recebe o caminho absoluto do próprio script. Lembrando que o recomendável é fazer as alterações em uma pasta separada, a fim de obter mais organização e não se perder sem saber onde estão os scripts, então podemos fazer assim, coloco a maioria deles no diretório “/etc/configuracao_personalizada/”, e aqueles scripts que iniciam no boot, podemos deixar na pasta “/etc/init.d/”.

#Declaração de variáveis
PATH=/sbin:/bin:/usr/sbin:/usr/bin
IPTABLES=”/sbin/iptables”
MACLIST=”/etc/configuracao_personalizada/macsliberadosfirewall”
PROGRAMA=”/etc/init.d/firewall”

PORTSLIB e PORTSBLO recebem respectivamente o caminho absoluto das portas liberadas e bloqueadas pelo firewall

#portas liberadas e bloqueadas
PORTSLIB=”/etc/configuracao_personalizada/portslib”
PORTSBLO=”/etc/configuracao_personalizada/portsblo”

Identificar a interface de rede onde está a LAN e a WAN através de variáveis é muito importante para dar certa flexibilidade no script, pois uma pequena modificação na rede basta mudar a variável onde está LAN e a WAN e todo o restante do script vai mudar, isto serve também para a variável REDE.

#Interfaces de Rede
LAN=eth1
WAN=eth0
REDE=”192.168.253.0/24″

 

Esta variável receberá o caminho completo onde está localizado o arquivo que contém sites que serão negados pelo firewall.

SITESNEGADOS=/etc/configuracao_personalizada/sitesnegados

# Os diversos módulos do iptables são chamados através do modprobe
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_REJECT
modprobe ipt_MASQUERADE
modprobe ipt_state
modprobe ipt_multiport
modprobe iptable_mangle
modprobe ipt_tos
modprobe ipt_limit
modprobe ipt_mark
modprobe ipt_MARK

Agora veremos os comandos para a opção de start do script – “/etc/init.d/firewall start”.

 

case “$1” in

start)

#mensagem de inicialização
echo “| Script de Firewall – IPTABLES”
echo “| Criado por: AUTOR”
echo “| Email: ????”
echo “| Uso: firewall start|stop|restart”
echo
echo “============================================= |”
echo “|:INICIANDO A CONFIGURAÇÃO DO FIREWALL NETFILTER ATRAVÉS :|”
echo “|: DO IPTABLES :|”
echo “============================================= |”

Neste ponto o iptables começa a trabalhar, nesta parte ele zera todas as regras do iptables (isso caso exista), para que as regras deste script sejam únicas presente na tabela do netfilter.

$IPTABLES -F

$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t mangle -F
$IPTABLES -t nat -F
$IPTABLES –X

 

A política padrão do iptables é aceitar qualquer pacote que não exista nenhuma regra para a bloqueando, e nesta parte o iptables é instruído a mudar esta política padrão (-P), no caso bloqueado as conexões de entrada e redirecionamento, menos a saída, que ficará aceitando o envio de pacotes originados pelo o nosso computador firewall, se não fosse assim ele não ficaria funcional.

$IPTABLES -P INPUT DROP

$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

Obs.: Se colocarmos para negar (DROP) por padrão o redirecionamento e entrada (recomendado) você deverá por obrigação liberar as portas principais do servidor se não ele ficará incomunicável, mas também não cometa o erro de bloquear algo e depois liberar o mesmo, só estará consumido recursos desnecessários do servidor.

# ativar o redirecionamento no arquivo ip_forward

echo “1” > /proc/sys/net/ipv4/ip_forward
echo “ativado o redirecionamento no arquivo ip_forward”
echo “ON …………………………………………….. [ OK ]”

#habilitando o fluxo interno entre os processos
$IPTABLES -I INPUT -i lo -j ACCEPT

$IPTABLES -I OUTPUT -o lo -j ACCEPT

echo “ativado o fluxo interno entre os processos”
echo “ON …………………………………………….. [ OK ]”

 

Nesta parte o laço “for” credita na variável i, uma linha de cada vez o conteúdo do arquivo, onde o caminho deste foi atribuído na variável PORTSLIB, então o comando cat $PORTSLIB terá como a saída o conteúdo do arquivo portslib (portas liberadas) e linha deste será atribuída de cada vez a variável i, assim fica possível configura diversas portas de uma vez só.

#liberar as portas principais do servidor
for i in `cat $PORTSLIB`; do
$IPTABLES -A INPUT -p tcp –dport $i -j ACCEPT
$IPTABLES -A FORWARD -p tcp –dport $i -j ACCEPT
$IPTABLES -A OUTPUT -p tcp –sport $i -j ACCEPT
done
$IPTABLES -I INPUT -m state –state ESTABLISHED -j ACCEPT
$IPTABLES -I INPUT -m state –state RELATED -j ACCEPT
$IPTABLES -I OUTPUT -p icmp -o $WAN -j ACCEPT
$IPTABLES -I INPUT -p icmp -j ACCEPT
echo “ativado as portas abertas para estabelecer conexões”
echo “ativado a liberação das portas principais do servidor $HOSTNAME”
echo “ON …………………………………………….. [ OK ]”

#ATIVAR O REDIRECIONAMENTO (para ambiente flexível)
#LIBERAR RADIO UOL (para ambiente flexível)

Este caso é muito parecido com anterior, mas este bloqueia sites que serão negados pelo firewall com o intuito de proteger a rede e o servidor.

#bloquear acesso de sites negados a rede interna
for i in `cat $SITESNEGADOS`; do
$IPTABLES -t filter -A FORWARD -s $REDE -d $i -j DROP
$IPTABLES -t filter -A FORWARD -s $i -d $REDE -j DROP
$IPTABLES -t filter -A INPUT -s $i -j DROP
$IPTABLES -t filter -A OUTPUT -d $i -j DROP
done
echo “ativado o bloqueio de envio de pacotes com origem aos sites negados”
echo “ON ……………………………………………… [ OK ]”

#Bloqueio ping da morte
echo “0” > /proc/sys/net/ipv4/icmp_echo_ignore_all
$IPTABLES -N PING-MORTE
$IPTABLES -A INPUT -p icmp –icmp-type echo-request -j PING-MORTE

$IPTABLES -A PING-MORTE -m limit –limit 1/s –limit-burst 4 -j RETURN

$IPTABLES -A PING-MORTE -j DROP
echo “ativado o bloqueio a tentativa de ataque do tipo ping da morte”
echo “ON ……………………………………………… [ OK ]”

#bloquear ataque do tipo SYN-FLOOD
echo “0” > /proc/sys/net/ipv4/tcp_syncookies
$IPTABLES -N syn-flood
$IPTABLES -A INPUT -i $WAN -p tcp –syn -j syn-flood
$IPTABLES -A syn-flood -m limit –limit 1/s –limit-burst 4 -j RETURN
$IPTABLES -A syn-flood -j DROP
echo “ativado o bloqueio a tentativa de ataque do tipo SYN-FLOOD”
echo “ON ……………………………………………… [ OK ]”

#Bloqueio de ataque ssh de força bruta
$IPTABLES -N SSH-BRUT-FORCE
$IPTABLES -A INPUT -i $WAN -p tcp –dport 22 -j SSH-BRUT-FORCE
$IPTABLES -A SSH-BRUT-FORCE -m limit –limit 1/s –limit-burst 4 -j RETURN
$IPTABLES -A SSH-BRUT-FORCE -j DROP
echo “ativado o bloqueio a tentativa de ataque do tipo SSH-BRUT-FORCE”
echo “ON ……………………………………………… [ OK ]”
A mesma coisa que no caso anterior, mas neste as portas serão bloqueadas, a fim de evitar possíveis ataques. Mesmo com a política padrão de bloquear as portas cuja liberação só seria possível com regras do IPTABLES, constam neste exemplo como bloquear portas, apenas para ilustrar a possibilidade esta possibilidade de bloqueio.

#Bloqueio de portas
for i in `cat $PORTSBLO`; do
$IPTABLES -A INPUT -p tcp -i $WAN –dport $i -j DROP
$IPTABLES -A INPUT -p udp -i $WAN –dport $i -j DROP
$IPTABLES -A FORWARD -p tcp –dport $i -j DROP
$IPTABLES -A FORWARD -p udp –dport $i -j DROP
$IPTABLES -A OUTPUT -p tcp –dport $i -j DROP
$IPTABLES -A OUTPUT -p udp –dport $i -j DROP
done
Este tipo de ataque origina-se da seguinte forma: um atacante que visa destabilizar o servidor, tentará enviar pacotes cuja origem deste não existe ou são inválidos e assim o servidor enviar respostas a destinos inalcançáveis pela rede. Estas regras bloqueiam esta tentativa de ataque.

#bloqueio Anti-Spoofings
$IPTABLES -A INPUT -s 10.0.0.0/8 -i $WAN -j DROP
$IPTABLES -A INPUT -s 127.0.0.0/8 -i $WAN -j DROP

$IPTABLES -A INPUT -s 172.16.0.0/12 -i $WAN -j DROP

$IPTABLES -A INPUT -s 192.168.1.0/16 -i $WAN -j DROP
echo “ativado o bloqueio de tentativa de ataque do tipo Anti-spoofings”
echo “ON ………………………………………………. [ OK ]”
Esta regra Limitará os pacotes através do módulo limit do iptables.

#Bloqueio de scanners ocultos (Shealt Scan)
$IPTABLES -A FORWARD -p tcp –tcp-flags SYN,ACK, FIN, -m limit –limit 1/s -j ACCEPT
echo “bloqueado scanners ocultos”
echo “ON ………………………………………………. [ OK ]”

#amarrar ip ao mac
for i in `cat $MACLIST`; do
#aqui cada linha do maclist é atribuída de cada vez

STATUS=`echo $i | cut -d ‘;’ -f 1`
#o comando echo exibe o conteúdo da variável e o pipe “|” repassa a saída para outro comando, o cut por sua vez reparte cada linha em pedaços onde o delimitador (-d) é o ‘;’ no parâmetro -f imprime na tela conteúdo da 1º coluna (status), a saída deste é enviada para STATUS;

IPSOURCE=`echo $i | cut -d ‘;’ -f 2`
MACSOURCE=`echo $i | cut -d ‘;’ -f 3`
MARK= `echo $IPSOURCE | cut -d ‘.’ -f 4`

# neste caso o IPSOURCE e o MACSOURCE recebem as outras colunas da mesma linha, faço uma ressalva para o nome do computador que eu coloquei apenas para a organização do maclist, pois neste do script contará até a 3º coluna.

#aqui neste caso o comando if está dentro do laço for
#Se status = a então iptables libera a conexão através destes comandos construídos na tabela filter

if [ $STATUS = “a” ]; then
$IPTABLES -t filter -A FORWARD -d 0/0 -s $IPSOURCE -m mac –mac-source $MACSOURCE -j ACCEPT
$IPTABLES -t filter -A FORWARD -d $IPSOURCE -s 0/0 -j ACCEPT
$IPTABLES -t filter -A INPUT -s $IPSOURCE -d 0/0 -m mac –mac-source $MACSOURCE -j ACCEPT
$IPTABLES -t filter -A OUTPUT -s $IPSOURCE -d 0/0 -j ACCEPT
$IPTABLES -t filter -A OUTPUT -s 0/0 -d $IPSOURCE -j ACCEPT
$IPTABLES -t mangle -A PREROUTING -s $IPSOURCE -j MARK –set-mark $MARK

# Se for = b então bloqueia o MAC, ele só executa este comandos se STATUS não for igual a “a”.

elif [ $STATUS = “b” ]; then
$IPTABLES -t filter -A FORWARD -m mac –mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -A INPUT -m mac –mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -A OUTPUT -m mac –mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -I INPUT -s $IPSOURCE -j DROP
$IPTABLES -t filter -I FORWARD -s $IPSOURCE -d 0/0 -j DROP
$IPTABLES -t filter -I FORWARD -s 0/0 -d $IPSOURCE -j DROP
$IPTABLES -t filter -I OUTPUT -d $IPSOURCE -j DROP

# Senão for igual a “a” nem “b” então bloqueia todos os ips que não estão sendo usados

else
$IPTABLES -t filter -I INPUT -s $IPSOURCE -j DROP
$IPTABLES -t filter -I FORWARD -s $IPSOURCE -d 0/0 -j DROP
$IPTABLES -t filter -I FORWARD -s 0/0 -d $IPSOURCE -j DROP
$IPTABLES -t filter -I OUTPUT -d $IPSOURCE -j DROP

fi #fim do elif
done #fim do for
echo “Ativado a amarração do ip ao mac”
echo “ON ………………………………………….[ OK ]”
Na versão original do script de amarrar ip ao mac não inclui bloquear todos os IPs.

#proxy transparente
$IPTABLES -t nat -A PREROUTING -i $LAN -p tcp –dport 80 -j REDIRECT –to-port 3128
echo “Proxy Transparente ativado”
echo “ON ………………………………………………………………………………[ OK ]”

# ativar o mascaramento
$IPTABLES -t nat -A POSTROUTING -o $WAN -j MASQUERADE

# Carrega controlador de banda
/etc/init.d/cbq start #Para Debian
#/etc/rc.d/init.d/cbq start #Para Slackware
echo
echo “============================================= |”
echo “::TERMINADA A CONFIGURAÇÃO DO FIREWALL NETFILTER ATRAVÉS::|”
echo “:: DO IPTABLES :: |”

echo “============================================= |”

echo “FIREWALL ATIVADO – SISTEMA PREPARADO”
echo “SCRIPT DE FIREWALL CRIADO POR : AUTOR”
;;

stop)
$IPTABLES -F
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t mangle -F
$IPTABLES -t nat -F
$IPTABLES -X
$IPTABLES -Z

$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

/etc/init.d/cbq stop #Para Debian

#/etc/rc.d/init.d/cbq stop #Para Slackware
echo “FIREWALL DESCARREGADO – SISTEMA LIBERADO”
;;

restart)
$PROGRAMA stop
$PROGRAMA start
;;
*)
echo “Use: $N {start|stop|restart}” >&2
echo -e “{TEXTO}33[01;31mATENÇÃO”; tput sgr0
echo “Você não colocou nenhum argumento ou algum conhecido, então Por Padrão será dado em 5 segundos um restart no firewall”
sleep 5
$PROGRAMA restart
exit 1
esac
exit 0