Firewalls em Sistemas BSD
Unix
Alexandre Vasconcelos Administrador de Sistemas Unix SSP/GO
Agenda
Introdução/Conceitos
Opções disponíveis
Introdução
Necessidade de Segurança
De onde vem o problema?
Preciso de proteção?
Identificando o que deve ser
protegido
Conceitos
Modelos
Preventivo Reativo
Preventivo + Reativo
Onde estão os ativos
Pontos de vulnerabilidade
Segurança Física
Política de Segurança
Preventivo + Reativo
Treinamento
Educação
Backup
Política de Segurança
Conteúdo
Explicações Linguagem simples Autoridade Responsabilidade de todos Problemas não relacionados a
Tecnologias de Firewall
Filtragem de Pacotes
Serviços de Proxy
NAT (Network Address Translation)
VPN (Virtual Private Networks)
Arquiteturas de Firewall
Roteadores
Bastion Hosts
Subredes
Estratégias de Segurança
Menor Privilégio
Defesa em Profundidade
Opções Disponíveis
Sistemas Operacionais
FreeBSD NetBSD OpenBSD Firewalls
IPFILTER IPFW PFFreeBSD
Robusto
Estável
Seguro
Limpo
IPFILTER
Leve
Estável
Portado para outros sistemas Unix
Curva de aprendizado baixa
PF e OpenBSD
Hardware
Qualquer Pentium?
32, 64, 128MB de RAM..
4GB de HD
2 ou mais interfaces de rede
Melhor hardware = Maior
estabilidade
Instalando o FreeBSD
Instalação básica, seguindo o roteiro:
http://www.abdv.net/roteiro.html
Atualização do sistema
Ajustes no /etc/rc.conf
sshd_flags=“-4”
Como particionar o disco?
Particionamento do disco
/ - 128MB
Swap – Por volta de 2 x a memória RAM /var – 256MB
/tmp – 256MB
Compilação do Kernel para
suporte ao IPFILTER
Fontes em /usr/src/sys/i386/conf
Arquivo de configuração padrão:
GENERIC
Vamos criar nosso próprio arquivo:
cp GENERIC SERVER (nome da sua
máquina)
vi SERVER
Localize a entrada ident GENERIC por
Compilação do Kernel para
suporte ao IPFILTER
Localize a entrada “options INET6” e,
logo abaixo, insira:
options IPFILTER
options IPFILTER_LOG
Edite o arquivo /etc/make.conf e adicione
a linha:
Compilação do Kernel para
suporte ao IPFILTER
Compilando e instalando o kernel:
make buildkernel make installkernel make clean
Espere 1 minuto, próximo slide por
favor...
IPFILTER
Configurações no /etc/rc.conf
ipfilter_enable=“YES” ipfilter_flags=“” ipmon_enable=“YES” ipmon_flags=“-Dsv” ipnat_enable=“YES”
Verifique se o IPFILTER “subiu”:
IPFILTER
Mais configurações em /etc/rc.conf
para trabalhar com o IPFILTER:
gateway_enable=“yes” ifconfig_lo0=“127.0.0.1”
network_interfaces=“xl0 xl1 lo0” icmp_drop_redirects=“YES” (para
IPFILTER
Outras opções de incialização do
IPFILTER, IPNAT e IPMON:
Criando aquivos de logs
separados para o IPFILTER
# touch /var/log/firewall_logs # chmod 600 /var/log/firewall_logs # vi /etc/syslog.conf, acrescente: security*. /var/log/firewall_logs # vi /var/log/messages, acrescente: security.none
Rotacione os logs, # vi /etc/newsyslog.conf,
adicione a linha:
/var/log/firewall_logs 600 14 100 * J /var/log/ipmon.pid Reinicialize o daemon syslogd
Conceitos básicos para criar
os arquivos de regras
Filtragem egressa (egress filtering) Interfaces: interna e externa
Múltiplos critérios de filtragem in/out, block/pass, proto
A palavra-chave “quick” Leitura das regras:
Top – down
First match wins (using “quick”)
Arquivo de regras do IPFILTER: /etc/ipf.rules Arquivo de regras do IPNAT: /etc/ipnat.rules
/etc/ipf.rules
Nosso primeiro conjunto de regras:
pass in all block in all
/etc/ipf.rules
Controlando as regras com a
palavra-chave “quick” (first match
wins)
block in quick all
pass in all
/etc/ipf.rules
Filtragem básica por endereço:
block in quick from 10.3.18.20/32 to any pass in all
/etc/ipf.rules
Filtragem por interface
Nossas Interfaces: xl0 (interna) e xl1
(externa) pass in all
block in quick on xl0 all
Interface + endereço IP
block in quick on xl0 from 10.3.18.20/32 to any pass in all
/etc/ipf.rules
Comportamento padrão definido na
compilação do kernel (block ou pass)
Filtragem bi-direcional,
palavra-chave out
pass out quick on xl1 from 10.3.18.4/32 to any block out quick on xl1 from any to any
/etc/ipf.rules
Registrando o que acontece com a
palavra-chave “log”
pass out quick on xl1 from 10.3.18.0/24 to any block in log quick on xl1 from any to any
/etc/ipf.rules
Ao criar as regras, lembre-se, os
pacotes entram (in) e saem (out) de
cada interface
Ainda temos mais alguns critérios
para filtragem, até aqui filtramos por
interface, por endereço e fizemos
/etc/ipf.rules
Filtragem por protocolo,
palavra-chave “proto”
block in log quick on xl0 proto icmp
block in log quick on xl0 proto udp
/etc/ipf.rules
Portas TCP e UDP, a palavra-chave
“port”
block in quick on xl0 proto tcp from any to
10.3.18.30/24 port = 25
block in quick on xl0 proto udp from any to
/etc/ipf.rules
Conjunto completo de regras
“stateless”
pass in on xl0 from 10.3.18.0/24 to any pass out on xl0 from 10.3.18.0/24 to any pass in on xl1 from 10.3.18.0/24 to any pass out xl1 from 10.3.18.0/24 to any
/etc/ipf.rules
Permissão implícita - “keep state”
Conexões têm: início, meio e fim Filtramos o início
Tabela de estados
pass out quick on xl0 proto tcp from any to any keep state (agora sim, estamos “stateful”)
/etc/ipf.rules
Stateful UDP
Como se o UDP não é orientado à
conexão?
60s na tabela de estados Serviço de DNS
Stateful ICMP
Mesma idéia
pass out quick on xl1 proto icmp from any to any icmp-type 8 keep state
/etc/ipf.rules
Detectando scan FIN
Palavra-chave “flags”
pass in quick on xl1 proto tcp from any to
10.3.18.6/32 port = 22 flags S keep state
Exceção: pacotes fragmentados
Para resolver usamos “keep frags”
pass in quick on xl1 proto tcp from any to 10.3.18.6/32 port = 22 flags S keep state keep frags
/etc/ipf.rules
Respondendo a um pacote bloqueado
Com TCP – RST (Reset). Nossa
palavra-chave: “return-rst”
block return-rst in log on xl1 proto tcp from any
to 10.3.18.6/32 port = 22
block in log quick on xl1
Atenção! Apenas para TCP, por isso
precisamos da segunda regra block para descartar os pacotes UDP e ICMP
“connection refused” ao invés de
/etc/ipf.rules
Respondendo pacotes UDP
bloqueados
Use as mensagens ICMP (return-icmp)
block return-icmp(port-unr) in log quick on xl1 proto udp from any to 10.3.18.6/32 port = 111
/etc/ipf.rules
Problema, a regra anterior retorna o
endereço IP do firewall! Para evitar
isso usamos a seguinte sintaxe:
block return-rst-as-dest(port-unr) in log on xl1 proto udp from any to 10.3.18.6/32 port = 111
NAT e Proxies
Falta de endereçamento
Reescrevendo o endereço de saída
map xl1 10.3.18.0/24 -> 200.100.1.10/32
Para endereços dinâmicos:
map tun0 10.3.18.0/24 -> 0/32 1 pra 1
NAT
Policy NAT
map tun0 from 10.3.18.0/24 ! to 200.1.2.0/24 -> 200.100.1.2/32
map tun0 from 10.3.18.1/32 port = 5555 to 199.2.6.1/32 -> 200.100.1.3/32
NAT
Oferecendo serviços atrás do firewall
através de redirect (rdr)
rdr xl1 200.1.2.3/32 port 80 -> 10.3.18.5 port = 80 tcp rdr xl1 200.1.2.3/32 port 22 -> 10.3.18.7 port = 22 tcp
Filtrando serviços
redirecionados com rdr
Não basta criar o redirect, precisamos
criar as regras para permitir a entrada
em /etc/ipnat.rules:
rdr xl1 200.1.2.3/32 port = 80 -> 10.3.18.5 port = 80 tcp
em /etc/ipf.rules:
pass in quick on xl1 proto tcp from any to 10.3.18.5/32 port = 80 flags S keep state
Algumas “mágicas” do NAT
Proxies de Aplicação
Controle de sessões FTP
map xl0 10.3.18.0/24 -> 200.100.1.3/32 proxy port
ftp ftp/tcp
Balanceamento de carga
Palavra-chave “round-robin”
rdr xl1 200.100.1.3/32 port 80 -> 10.3.18.6, 10.3.18.7 port 80 tcp round-robin
Carregando e Manipulando as
regras
O utilitário ipf:
-F<i,o,a> Flush (i, input; o, output; a, all) -f <nome do arquivo>
-V versão do IPFILTER
O utilitário ipnat:
-l mostra as entradas da tabela NAT
-C apaga as entradas NAT carregadas,
exceto as que estão ativas
-F apaga as entradas NAT carregadas -f <nome do arquivo>
Monitorando e Depurando
O utilitário ipfstat:
Sem flags – mostra informações
interessantes, estatísticas
-i lista as regras de input -o lista as regras de output -h hit count
-n número da regra
Monitorando e Depurando
O utilitário ipmon
Mostra o que está acontecendo em
tempo real
-o especifica qual dos logs ler (N – NAT, S
– state log, I – normal IPFilter)
-a lê todos os logs ao mesmo tempo,
Conjunto completo de regras
Checklist:
Quais as minhas interfaces de rede O que pretendo bloquear/liberar?
Pretendo fazer mudanças nas regras com
frequência?
Qual a carga que este equipamento
suporta?
Conjunto de regras “stateful”
pass in quick on xl0 from 10.3.18.0/24 to any keep state pass out quick on xl1 from 10.3.18.0/24 to any keep
Mais segurança
Você quer mais segurança?
Edite seu /etc/fstab (mas faça um backup
antes – cp /etc/fstab /etc/fstab.bkp)
Todos as suas partições (exceto a de
swap e /dev/acd0) devem estar rw – READ/WRITE
Mais Segurança
Modifique para o seguinte:
/ ufs rw,nosuid 1 1 /tmp ufs rw,noexec,nosuid,nodev 2 2
/usr ufs ro 2 2
/usr/home ufs rw,noexec,nosuid 2 2 /usr/local ufs ro,nosuid 2 2 /var ufs rw,noexec,nosuid 2 2
Observe que o layout das partições é
diferente ao sugerido no início deste
material, mas isso não impede que
façamos uma configuração restritiva
Exercícios Práticos
Obtenha os seguintes dados da sua
máquina:
Nome da interface de rede Endereço IP
Exercícios Práticos
Crie um conjunto de regras que
satisfaça as seguintes condições:
Permita a saída do tráfego nas interfaces
locais (incluindo a de loopback)
Permita a entrada de tráfego SSH apenas
para as máquinas à sua esquerda e à sua direita (quando aplicável)
Bloqueie o tráfego para os demais Ips da
mesma classe de endereços da sua
Bloqueie o tráfego para as redes de
Exercícios Práticos
Após o tempo limite de criação de
regras tente conectar-se à qualquer
máquina da rede via SSH, caso
obtenha sucesso anote o endereço IP.
Obtenha informações (IP) a partir dos
logs ou em tempo real das máquinas
que estão tentando conectar-se à sua,
caso você detecte falhas tente
corrigi-las em tempo real.
Exercícios Práticos
Instale o scanner de segurança NMAP
através do comando:
# pkg_install -r nmap
Digite nmap -h, leia com atenção as
opções e faça as seguintes operações
nos endereços IP da sua rede:
Tente descobrir a versão dos programas
em execução na máquina remota
Faça um scan do tipo Ping
Faça scan de TCP connect(), TCP SYN Faça scan de portas UDP
Exercícios Práticos
Utilizando os utilitários do IPFILTER
colha os seguintes dados estatísticos
do seu firewall:
Input packets Output packes
Exercícios Práticos
Sugestão:
Use vários terminais para agilizar suas
operações de scan e monitoramento
Antes de tentar conectar-se à outras
máquinas certifique-se de que a sua está bem protegida
Se estiver em dificuldades não trabalhe
Isto foi só o início, agora é por
sua conta..
Configurar um firewall leva tempo, é
preciso fazer muitos testes para ter
certeza de que tudo está como
planejado. Lembre-se, segurança é um
processo contínuo, não um produto.
Você encontra esta apresentação e outros artigos atualizados em:
http://www.abdv.net alex.vasconcelos@gmail.com