3 nov 06

A pouco tempo atrás a empresa em que trabalhava me enviou a um cliente para implantar um sistema de controle de acesso a internet utilizando um firewall com Iptables e sem um Proxy. Não sei porque eles me mandaram fazer isto, talvez por redução de custo por parte do cliente.
O fato é que, embora possamos fazer o iptables trabalhar como se fosse um proxy, isto não é nada recomendado e no final das contas foi mais complicado para mim executar esta tarefa do que se eu tivesse instalado um Squid como proxy. Mas isso me possibilitou avançar no estudo de alguns módulos do iptables pouco conhecidos e utilizados.

Normalmente utilizamos um proxy como firewall em nivel de aplicação, para efetuarmos filtragem baseado no conteudo do pacote. Assim podemos bloquear determinadas paginas e anexos, baseado em nomes de URLs e extensões de arquivos.
Embora, não seja o mais recomendado podemos fazer com que o iptables trabalhe “simulando” no nível de aplicação.

Podemos dividir os tipos de firewall basicamente em dois tipos (retirado do foca-linux):

1 – Firewall de Aplicação: Este tipo de firewall analisam o conteúdo do pacote para tomar suas decisões de filtragem. Servidores proxy, como o Squid, são um exemplo deste tipo de firewall.

2) Firewall de Pacotes: Este tipo de firewall toma as decisòes baseadas nos parametros dos pacotes como porta/endereço de origem/destino, estado da conexão e, e outros parametros do pacote. Exemplos são o próprio iptables, ipfw, ipfilter e o Pix.

O iptables trouxe o conceito de arquitetura modular, agora user-code módulos são possíveis. Os modulos são programados no nível do kernel mas podem ser carregados no espaço no usuario com o uso do comando modprobe.

Dois móulos são interessantes pois fazem uma inspeção em todo o payload do pacote e elevam a funcionalidade do iptables para além de uma simples inspeção do modelo TCP/IP: Modulo String e Módulo Pkttype.

1) Modulo String:
Disponivel no Iptables desde a versão 1.2.3 (antes era experimental). O uso deste módulo permite elevar o iptables para filtragem no layer 7 (aplicação) e torna a filtragem muito mais rápida (3 a 10 vezes) em relação a um proxy como squid.

## Bloqueando acesso a pacotes que contem “playboy” e gerando log
iptables -A FORWARD -m string –string “playboy” -j LOG — log-prefix ” Acesso a Playboy”
iptables -A FORWARD -m string –string “playboy” -j DROP

## Limitando acesso a qualquer dados que contenham no payload “orkut” a 1/m
iptables -A FORWARD -m string –string “orkut” -m limit –limit 1/m -j ACCEPT

## Bloqueando o acesso a mp3 e logando
iptables -A FORWARD -m string –string “.mp3″ -j LOG –log-prefix “Download: mp3″
iptables -A FORWARD -m string –string “.mp3″ -j DROP

Também é possivel fazer, com algumas ressalvas, um pequeno IDS em substituição ao SNORT com o uso deste modulo. Aqui você encontra scrips para fazer esta conversão:

Regras no Snort:

1. alert udp $EXTERNAL_NET any -> $HOME_NET 518
  (msg:"EXPLOIT ntalkd x86 linux overflow";
  content:"|0103 0000 000 0 0001 0002 02e8|";
 reference:bugtraq,210;  classtype:attempted-admin; sid:313; rev:2;)  

2. alert tcp $EXTERNAL_NET any -> $HOME_NET 53
  (msg:"EXPLOIT named tsig infoleak";
 content: "|AB CD 09 80 00 00 00 01 00 00 00 00 00 00 01 00 01 20 20 20 20 02 61|";
 reference:cve,CAN-2000-0010; reference:bugtraq,2302; reference:arachnids,482;
  classtype:attempted-admin; sid:303; rev:3;)

3. alert udp $EXTERNAL_NET any -> $HOME_NET 635
 (msg:"EXPLOIT x86 linux mountd overflow";
 content:"|5eb0 0289 06fe c889 4604 b006 8946|";
reference:cve,CVE-1999-0002; classtype:attempted-admin; sid:315; rev:1;)

Convertidos para o Iptables:

1. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 518 -m
string --string "   è" -j LOG --log-prefix "SID313 " # "EXPLOIT ntalkd x86
 linux overflow" bugtraq,210 classtype:
attempted-admin sid:313
2. iptables -A SnortRules -p tcp -s $EXTERNAL_NET -d $HOME_NET --dport 53 -m
string --string "«Í .a" -j LOG --log-prefix "
SID303 " # "EXPLOIT named tsig infoleak" cve,CAN-2000-0010 bugtraq,2302
 arachnids,482 classtype:attempted-admin sid:303
3. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 635 -m
string --string "^° ‰ þȉF ° ‰F" -j LOG --log-prefix " cve-CVE-1999-0002
 " # "EXPLOIT x86 linux mountd overflow" classtype:attempted-admin sid:315


2) Modulo lenght:
Este módulo permite limitar o tamanho dos pacotes que passam pelo firewall. Assim como os outros módulos podem ser usados em conjunto com os módulos mais conhecidos. Pode ser usado para limitar downloads, por exemplo.

## Bloqueia qualquer pacote UDP maior que 10kb
iptables -A FORWARD -p udp -m length –lentgh 10000 -j DROP

## Bloqueia qualquer pacote icmp vindo da eth0 entre 1 e 15kb
iptables -A FORWARD -p icmp -i eth0 -m lenght –length 1000:15000

Outro módulo que trabalha no nível de aplicação:
Modulo Owner: Permite um controle em cima do usuario que inicia a conexão, tomando como paramentros o UID, GID e PID.

Abaixo está o gráfico dos caminhos percorridos pelos pacotes nas tabelas e chains. Somente após entender bem este processo você poderá dizer que conhece iptables!!

 

Outros Links Relacionados:

[atulização] Achei um ótimo texto no VivaoLinux de como instalar o Módulo Layer7 no Debian Etch e a partir dele poder fazer filtros no iptables por aplicação. É melhor do que fazer via string e muito mais eficiente, mas tem o inconveniente de usar um módulo experimental e recompilar o kernel …

Abraços


Arquivado em: Gnu/Linux, Security

Trackback Uri