Construção de Firewall - 4

Especificando uma exceção

            Muitos parâmetros (como o endereço de origem/destino, protocolo, porta, mensagens ICMP, fragmentos, etc) podem ser precedidos pelo sinal "!" que significa exceção. Por exemplo:

     iptables -t filter -A INPUT ! -s 200.200.200.10 -j DROP

            Diz para rejeitar todos os pacotes EXCETO os que vem do endereço 200.200.200.10.

     iptables -A INPUT -p tcp ! --syn -s 200.200.200.10 ! -i eth0 -j DROP

            Diz para bloquear todos os pacotes EXCETO os que iniciam conexões (! --syn), EXCETO para pacotes vindos pela interface eth0 (! -i eth0).

     iptables -A INPUT -s 200.200.200.10 ! -p tcp -j DROP

            Bloqueia todos os pacotes vindos de 200.200.200.10, EXCETO os do protocolo tcp.

Especificando um alvo

            O alvo (-j) é o destino que um pacote terá quando conferir com as condições de uma regra, um alvo pode dizer para bloquear a passagem do pacote (-j DROP), aceitar a passagem do pacote (-j ACCEPT), registrar o pacote no sistema de log (-j LOG), rejeitar o pacote (-j REJECT), redirecionar um pacote -j REDIRECT, retornar ao chain anterior sem completar o processamento no chain atual (-j RETURN), passar para processamento de programas externos (-j QUEUE), fazer source nat (-j SNAT), destination nat (-j DNAT), etc. Podem existir mais alvos, pois o iptables é modularizável, e módulos que acrescentam mais funções podem ser carregados em adição aos já existentes no kernel.

            Nos exemplos anteriores vimos o uso de diversos alvos como o DROP e o ACCEPT. Apenas farei uma breve referência sobre os alvos mais usados em operações comuns dos chains. Os alvos REDIRECT, SNAT e DNAT serão explicados em uma seção seguinte:

ACCEPT

O pacote é ACEITO e o processamento das regras daquele chains é concluído. Pode ser usado como alvo em todos os chains de todas as tabelas do iptables e também pode ser especificado no policiamento padrão das regras do firewall.

DROP

Rejeita o pacote e o processamento das regras daquele chain é concluído. Pode ser usado como alvo em todos os chains de todas as tabelas do iptables e também pode ser especificado no policiamento padrão das regras do firewall.

REJECT

Este é um módulo opcional que faz a mesma função do alvo DROP com a diferença de que uma mensagem ICMP do tipo "icmp-port-unreachable" (TCP/UDP) ou "host-unreachable" (ICMP) é retornada para a máquina de origem. Pode ser usado como alvo somente nos chains da tabela (não como policiamento padrão).

LOG

Este módulo envia uma mensagem ao syslog caso a regra confira, o processamento continua normalmente para a próxima regra (o pacote não é nem considerado ACEITO ou REJEITADO).

RETURN

Retorna o processamento do chain anterior sem processar o resto do chain atual.

QUEUE

Passa o processamento para um programa a nível de usuário.

Alvo REJECT

            Para ser usado, o módulo ipt_REJECT deve ser compilado no kernel ou como módulo. Este alvo rejeita o pacote (como o DROP) e envia uma mensagem ICMP do tipo "icmp-port-unreachable" como padrão para a máquina de origem.

            É um alvo interessante para bloqueio de portas TCP, pois em alguns casos da a impressão que a máquina não dispõe de um sistema de firewall (o alvo DROP causa uma parada de muito tempo em alguns portscanners e tentativas de conexão de serviços, revelando imediatamente o uso de um sistema de firewall pela máquina). O alvo REJECT vem dos tempos do ipchains e somente pode ser usado na tabela filter. Quando um pacote confere, ele é rejeitado com a mensagem ICMP do tipo "port unreachable", é possível especificar outro tipo de mensagem ICMP com a opção --reject-with tipo_icmp.

OBS: REJECT pode ser usado somente como alvo na tabela filter e não é possível especifica-lo como policiamento padrão do chain filter (como acontecia no ipchains. Uma forma alternativa é inserir como última regra uma que pegue todos os pacotes restantes daquele chain e tenha como alvo REJECT (como iptables -A INPUT -j REJECT), desta forma ele nunca atingirá o policiamento padrão do chain.

     # Rejeita pacotes vindos de 200.200.200.1 pela interface ppp0:

     iptables -A INPUT -s 200.200.200.1 -i ppp+ -j REJECT

Especificando LOG como alvo

            Este alvo é usado para registrar a passagem de pacotes no syslog do sistema. É um alvo muito interessante para ser usado para regras que bloqueiam determinados tráfegos no sistema (para que o administrador tome conhecimento sobre tais tentativas), para regras de fim de chain (quando você tem um grande conjunto de regras em um firewall restritivo e não sabe onde suas regras estão sendo bloqueadas), para satisfazer sua curiosidade, etc.

     # Para registrar o bloqueio de pacotes vindos de 200.200.200.1 pela interface ppp0

     iptables -A INPUT -s 200.200.200.1 -i ppp+ -j LOG

     # Para efetuar o bloqueio

     iptables -A INPUT -s 200.200.200.1 -i ppp+ -j REJECT

            Note que no exemplo anterior a regra que registra o pacote (-j LOG) deve aparecer antes da regra que REJEITA (-j REJECT), caso contrário a regra de LOG nunca funcionará. A regra que REJEITA poderia também ser trocada por uma regra que ACEITA, caso queira registrar um pacote que deve ser aceito (se o policiamento padrão do seu firewall for restritivo (-P DROP). A única coisa que muda nas regras de log é o alvo da regra, isto facilita a implementação de grandes conjuntos de regras de firewall.

A regra acima mostrará a seguinte saída no syslog do sistema:

     Aug 25 10:08:01 debian kernel: IN=ppp0 OUT= MAC=10:20:30:40:50:60:70:80:90:00:00:00:08:00 SRC=200.200.200.1 DST=200.210.10.10 LEN=61 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=1031 DPT=53 LEN=41

Os campos possuem o seguinte significado:

Aug 25 10:08:01

Mês, dia e hora do registro do pacote.

debian

Nome do computador que registrou o pacote.

kernel:

Daemon que registrou a mensagem, no caso o iptables faz parte do próprio kernel.

IN=ppp0

Especifica a interface de entrada (de onde o pacote veio).

OUT=

Especifica a interface de saída (para onde o pacote foi).

MAC=10:20:30:40:50:60:70:80:90:00:00:00:08:00

Endereço mac da interface de rede (pode ser obtido com arp interface).

SRC=200.200.200.1

Endereço de origem do pacote.

DST=200.210.10.10

Endereço de destino do pacote.

SEQ=234234343

Número de seqüência da recepção. É ativado com a opção --log-tcp-sequence.

LEN=61

Tamanho em bytes do pacote IP.

TOS=0x00

Prioridade do cabeçalho TOS (Tipo).

PREC=0x00

Prioridade do cabeçalho TOS (Precedência). 

TTL=64

Tempo de vida do pacote. No exemplo, 64 roteadores (hops).

ID=0

Identificação única destes datagrama. Esta identificação também é usada pelos fragmentos seguintes deste pacote.

DF

Opção "Don't fragment" (não fragmentar) do pacote. Usada quando o pacote é pequeno o bastante para não precisar ser fragmentado.

MF

Opção "More Fragments" (mais fragmentos) estão para ser recebidos.

FRAG=100

Tamanho do fragmento especificado em pacotes de 8 bits. No exemplo acima, o pacote tem o tamanho de 800 bytes (100*8).

PROTO=UDP

Nome do protocolo. Pode ser TCP, UDP ou ICMP

SPT=1031

Porta de origem da requisição.

DPT=53

Porta de destino da requisição.

LEN=41

Tamanho do pacote.

            O log acima mostra uma consulta DNS (porta destino 53) para nossa máquina (INPUT) de 200.200.200.1 para 200.210.10.10.

            O problema é que em um grande número de regras será difícil saber qual regra conferiu (pois teríamos que analisar o endereço/porta origem/destino) e o destino do pacote (se ele foi ACEITO ou BLOQUEADO) pois você pode ter regras para ambas as situações. Por este motivo existem algumas opções úteis que podemos usar com o alvo LOG:

--log-prefix "descrição"

Permite especificar uma descrição para a regra do firewall de até 29 caracteres. Caso tiver espaços, devem ser usadas "aspas".

--log-level nível

Especifica o nível da mensagem no syslog.

--log-tcp-options

Registra campos do cabeçalho TCP nos logs do sistema.

--log-ip-options

Registra campos do cabeçalho IP nos logs do sistema

--log-tcp-sequence

Registra os números de seqüencia TCP. Evite ao máximo o uso desta opção, pois a seqüencia de números TCP pode ser a chave para um seqüestro de seção ou IP spoofing em seu sistema caso algum usuário tenha acesso a estes logs. Caso utilize tcp/ip em servidores públicos, o uso desta opção ajudará a entender bem os ataques DoS causados por syn-flood e porque ativar os SynCookies.

OBS1:Lembre-se que estas opções são referentes ao alvo LOG e devem ser usadas após este, caso contrário você terá um pouco de trabalho para analisar e consertar erros em suas regras do firewall.

OBS2:Caso esteja usando o firewall em um servidor público, recomenda-se associar um limite a regra de log, pois um ataque poderia causar um DoS enchendo sua partição.

 

     # Complementando o exemplo anterior:

     # Para registrar o bloqueio de pacotes vindos de 200.200.200.1 pela interface ppp0

     iptables -A INPUT -s 200.200.200.1 -i ppp+ -j LOG --log-prefix "FIREWALL: Derrubado "

     # Para efetuar o bloqueio

     iptables -A INPUT -s 200.200.200.1 -i ppp+ -j REJECT

            Retornará a seguinte mensagem no syslog:

     Aug 25 10:08:01 debian kernel: FIREWALL: Derrubado IN=ppp0 OUT= MAC=10:20:30:40:50:60:70:80:90:00:00:00:08:00 SRC=200.200.200.1 DST=200.210.10.10 LEN=61 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=1031 DPT=53 LEN=41

            Agora você sabe o que aconteceu com o pacote (Rejeitado). A padronização de mensagens de firewall é também importante para a criação de scripts de análise que poderão fazer a análise dos logs do seu firewall (para criação de estatísticas que podem servir como base para a criação de novas regras de firewall ou eliminação de outras).

OBS: Se você sente falta da função "-l" do ipchains que combina o alvo e log na mesma regra você pode criar um alvo como o seguinte:

     iptables -N log-drop

     iptables -A log-drop -j LOG

     iptables -A log-drop -j DROP

            E usar "log-drop" como alvo em suas regras. Mesmo assim esta solução é "limitada" em relação a "-l" do ipchains porque o iptables não inclui detalhes de qual chain bloqueou o pacote/qual pacote foi bloqueado, assim é necessário a especificação da opção --log-prefix para as mensagens se tornarem mais compreensíveis. Esta limitação pode ser contornada utilizando um firewall feito em linguagem shell script, desta forma você terá um controle maior sobre o seu programa usando funções e integração com outros utilitários.

 

Especificando RETURN como alvo

            O alvo RETURN diz ao iptables interromper o processamento no chain atual e retornar o processamento ao chain anterior. Ele é útil quando criamos um chain que faz um determinado tratamento de pacotes, por exemplo bloquear conexões vindas da internet para portas baixas, exceto para um endereço IP específico. Como segue:

     1-) iptables -t filter -A INPUT -i ppp0 -j internet

     2-) iptables -t filter -j ACCEPT

     3-) iptables -t filter -N internet

     4-) iptables -t filter -A internet -s www.debian.org -p tcp --dport 80 -j RETURN

     5-) iptables -t filter -A internet -p tcp --dport 21 -j DROP

     6-) iptables -t filter -A internet -p tcp --dport 23 -j DROP

     7-) iptables -t filter -A internet -p tcp --dport 25 -j DROP

     8-) iptables -t filter -A internet -p tcp --dport 80 -j DROP

            Quando um pacote com o endereço www.debian.org tentando acessar a porta www (80) de nossa máquina através da internet (via interface ppp0), o chain número 1 confere, então o processamento continua no chain número 4, o chain número 4 confere então o processamento volta para a regra número 2, que diz para aceitar o pacote.

            Agora se um pacote vem com o endereço www.dominio.com.br tentando acessar a porta www *80) de nossa máquina através da internet (via interface ppp0), o chain número 1 confere, então o processamento continua no chain número 4, que não confere. O mesmo acontece com os chains 5, 6 e 7. O chain número 8 confere, então o acesso é bloqueado.

            Como pode notou, o alvo RETURN facilita bastante a construção das regras do seu firewall, caso existam máquinas/redes que sejam exceções as suas regras. Se ela não existisse, seria necessário especificar diversas opções -s, -d, etc para poder garantir o acesso livre a determinadas máquinas.

Salvando e Restaurando regras

            As regras que você está trabalhosamente criando e testando manualmente enquanto manipula o iptables podem ser salvas de 2 formas; uma delas é escrevendo um shell script que tenha todos os comandos, um por linha. Isto é recomendado quando tem um firewall grande e que exige uma boa padronização de regras, bem como sua leitura, comentários. O script shell também permite o uso de funções presente no interpretador de comando, portanto se você é uma pessoa que gosta de interagir com as funções do shell e deixar as coisas mais flexíveis, prefira esta opção.

            A outra forma é usando as ferramentas iptables-save e iptables-restore baseada na idéia do ipchains-save e ipchains-restore. O iptables-save deve ser usado sempre que modificar regras no firewall iptables da seguinte forma:

     iptables-save >/dir/iptables-regras

            Uma das vantagens do uso do iptables-save é ele também salvar os contadores de chains, ou seja, a quantidade de pacotes que conferiram com a regra. Isto também pode ser feito com algumas regras adicionais em seu shell script, caso tenha interesse nesses contadores para estatísticas ou outros tipos de relatórios.

            Para restaurar as regras salvas, utilize o comando:

     iptables-restore /dir/iptables-reras

A tabela nat (Network Address Translation)

- fazendo nat -

 

            A tabela nat serve para controlar a tradução dos endereços que atravessam o código de roteamento da máquina Linux. Existem 3 chains na tabela nat: PREROUTING, OUTPUT e POSTROUTING.

            A tradução de endereços tem inúmeras utilidades, uma delas é o Masquerading, onde máquinas de uma rede interna podem acessar a Internet através de uma máquina Linux, redirecionamento de porta, proxy transparente, etc. Esta seção abordará os tipos de NAT, exemplos de como criar rapidamente uma conexão IP masquerading e entender como a tradução de endereços funciona no iptables.

Se sua intenção é ligar sua rede a Internet existem duas opções:

·       Você possui uma conexão que lhe oferece um endereço IP dinâmico (a cada conexão é dado um endereço IP - como uma conexão PPP) então o IP masquerading é o que precisa.

·       Você tem uma conexão que lhe oferece um endereço IP permanente (ADSL, por exemplo) então o SNAT é o que precisa.

Criando um novo chain na tabela NAT

O procedimento para criação de um novo chain nesta tabela é o mesmo descrito em Criando  um novo chain será necessário somente especificar a tabela nat (-t nat) para que o novo chain não seja criado na tabela padrão (-t filter).

     iptables -t nat -N intra-inter

Que criará o chain chamado intra-inter na tabela nat. Para inserir regras neste chain será necessário especificar a opção "-t nat".

Fazendo IP masquerading (para os apressados)

            Você precisará de um kernel com suporte ao iptables e ip_forward e então digitar os dois comandos abaixo para habilitar o masquerading para todas as máquinas da rede 192.168.1.*:

     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

     echo "1" >/proc/sys/net/ipv4/ip_forward

            A configuração do servidor Linux está completa, agora os clientes da rede precisarão ser configurados para usar o endereço IP do servidor Linux como gateway. É recomendável instalar um servidor proxy e DNS na máquina Linux para acelerar o desempenho das requisições/resolução de nomes das máquinas em rede. A utilização de bits TOS também pode trazer um grande aumento de velocidade para os diferentes serviços da rede.

Fazendo SNAT

            SNAT (source nat - nat no endereço de origem) consiste em modificar o endereço de origem das máquinas clientes antes dos pacotes serem enviados. A máquina roteadora é inteligente o bastante para lembrar dos pacotes modificados e reescrever os endereços assim que obter a resposta da máquina de destino, direcionando os pacotes ao destino correto. Toda operação de SNAT é feita no chain POSTROUTING.

            É permitido especificar endereços de origem/destino, protocolos, portas de origem/destino, interface de entrada/saída (dependendo do chain), alvos, etc. É desnecessário especificar fragmentos na tabela nat, pois eles serão remontados antes de entrar no código de roteamento.

            O SNAT é a solução quando você tem acesso a internet através de um único IP e deseja fazer que sua rede tenha acesso a Internet através da máquina Linux. Nenhuma máquina da Internet poderá ter acesso direto as máquinas de sua rede interna via SNAT.

 

OBS: A observação acima não leva em conta o controle de acesso externo configurado na máquina que estiver configurando o iptables, uma configuração mau realizada pode expor sua máquina a acessos externos indesejados e comprometer sua rede interna caso alguém consiga acesso direto ao servidor.

            É necessário especificar SNAT como alvo (-j SNAT) quando desejar que as máquinas de sua rede interna tenha acesso a Internet através do IP fixo da máquina Linux. O parâmetro --to IP:portas deve ser usado após o alvo SNAT. Ele serve para especificar um endereço IP, faixa de endereços e opcionalmente uma porta ou faixa de portas que será substituída. Toda a operação de SNAT é realizada através do chain POSTROUTING:

     # Modifica o endereço IP dos pacotes vindos da máquina 192.168.1.2 da rede interna

     # que tem como destino a interface eth1 para 200.200.217.40 (que é o nosso endereço

     # IP da interface ligada a Internet).

     iptables -t nat -A POSTROUTING -s 192.168.1.2 -o eth1 -j SNAT --to 200.200.217.40

            Os pacotes indo para a Internet (nossa conexão é feita via eth1, nossa interface externa) vindo do endereço 192.168.1.2, são substituídos por 200.241.200.40 e enviados para fora. Quando a resposta a requisição é retornada, a máquina com iptables recebe os pacotes e faz a operação inversa, modificando o endereço 200.241.200.40 novamente para 192.168.1.2 e enviando a resposta a máquina de nossa rede interna. Após definir suas regras de NAT, execute o comando echo "1" >/proc/sys/net/ipv4/ip_forward para habilitar o suporte a redirecionamento de pacotes no kernel.

            Também é possível especificar faixas de endereços e portas que serão substituídas:

     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 200.200.217.40-200.200.217.50

            Modifica o endereço IP de origem de todas as máquinas da rede 192.168.1.0/24 que tem o destino a interface eth0 para 200.241.200.40 a 200.241.200.50. O endereço IP selecionado é escolhido de acordo com o último IP alocado.

     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 200.200.217.40-200.200.217.50:1-1023

            Idêntico ao anterior, mas faz somente substituições na faixa de portas de origem de 1 a 1023.

     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 200.200.217.40-200.200.217.50 --to 200.200.217.70-200.200.217.73

            Faz o mapeamento para a faixa de portas 200.200.217.40 a 200.200.217.50 e de 200.200.217.70 a 200.200.217.73.

 

OBS1: Se por algum motivo não for possível mapear uma conexão NAT, ela será derrubada.

OBS2: Tenha certeza que as respostas podem chegar até a máquina que fez o NAT. Se estiver fazendo SNAT em um endereço livre em sua rede (como 200.200.217.73).

OBS3: Como notou acima, o SNAT é usado quando temos uma conexão externa com um ou mais IP's fixos. O Masquerading é uma forma especial de SNAT usada para funcionar em conexões que recebem endereços IP aleatórios (PPP).

OBS4: Não se esqueça de habilitar o redirecionamento de pacotes após fazer suas regra de NAT com o comando: echo "1" >/proc/sys/net/ipv4/ip_forward, caso contrário o redirecionamento de pacotes não funcionará.

Fazendo IP Masquerading

            O IP Masquerading é um tipo especial de SNAT usado para conectar a sua rede interna a internet quando você recebe um IP dinâmico de seu provedor (como em conexões ppp). Todas as operações de IP Masquerading são realizadas no chain POSTROUTING.

            Para fazer IP Masquerading de uma máquina com o IP 192.168.1.2 para ter acesso a Internet, use o comando:

     iptables -t nat -A POSTROUTING -s 192.168.1.2/32 -o ppp0 -j MASQUERADE

            A diferença é que o alvo é -j MASQUERADE. O comando acima faz IP Masquerading de todo o tráfego de 192.168.1.2 indo para a interface ppp0: O endereço IP dos pacotes vindos de 192.168.1.2 são substituídos pelo IP oferecido pelo seu provedor de acesso no momento da conexão, quando a resposta é retornada a operação inversa é realizada para garantir que a resposta chegue ao destino. Nenhuma máquina da internet poderá ter acesso direto a sua máquina conectava via Masquerading.

            Para fazer o IP Masquerading de todas as máquinas da rede 192.168.1.*:

     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

            Após definir a regra para fazer Masquerading (SNAT), execute o comando echo "1" >/proc/sys/net/ipv4/ip_forward para habilitar o suporte a redirecionamento de pacotes no kernel.

Adonel  Bezerra

Pós-graduado em Teoria em Educação a Distância e Docência do Ensino Superior;

MBA Executivo em Coaching;

Coordenador de cursos de pós-graduação.

Experiência em Gestão de Negócios, envolvendo-se com as áreas administrativa, financeira, comercial, produção e logística;

Experiência de mais de 20 anos como professor conferencista na área de segurança da informação;

Sólida experiência na gestão de negócios e tecnologia da informação;

Sólida experiência no meio acadêmico; 

Consultor de Segurança da informação com mais de vinte anos de experiência;

Treinamentos e palestras ministrados para milhares de profissionais em todo o Brasil;

Livro publicado pela Editora Ciência Moderna e diversos artigos publicados.

 

ALGUMAS PARTICIPAÇÕES COMO CONFERENCISTA OU PALESTRANTE

Centro Universitário do Maranhão – UniCeuma/2009 – Apresentação “O MERCADO DE CONSULTORIA EM SEGURANÇA DE INFORMAÇÃO. 

Universidade de Fortaleza|UNIFOR – Apresentação “TÉCNICAS HACKERS PARA TESTES DE INVASÃO”.

Faculdades Integradas do Ceará – FIC/2010 – Apresentação “ SEGURANÇA DA INFORMAÇÃO”.

Escola de Gestão Pública do Estado do Ceará – /2012 – Apresentação “ SEGURANÇA DA INFORMAÇÃO COM SOFTWARE LIVRE”.

Faculdade La Salle – 2013 – Apresentação “ESPIONAGEM INTERNACIONAL”.

Estácio|FIC/2013 – Apresentação “ ANÁLISE DE VULNERABILIDADES COMO FATOR PRIMORDIAL NAS ORGANIZAÇÕES”.

Estácio|FIC/2015 – Apresentação “PROVA DE CONCEITO”.

Devry Brasil|FANOR Salvador/BA, Fortaleza/CE, Belém/PA, Caruaru/PE, Recife/PE, Teresina/PI    - Apresentação “ VULNERABILIDADES DE SISTEMAS COMPUTACIONAIS”.

 

PROJETO PESSOAL – 1998 – Até o momento

- Fundador e Mantenedor de um dos maiores portais de Segurança de sistema do Brasil, o portal Clube do Hacker; www.clubedohacker.com.br

Fundador e mantenedor da Academia Linux www.academialinux.com.br

Fundador da BUCOIN – www.bucoin.com.br