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