terça-feira, 15 de março de 2011

Proteção de camada 7 com iptables


Hoje em dia se ouve falar muito em proteção por camadas e firewall de aplicação
mas muitas pessoas me perguntam exatamente como é que isso funciona.

Vou tentar resumir aqui o funcionamento de um firewall em nível de aplicação
mas para isso precisamos entender a boa e velha camada OSI. Como sabemos
um firewall trabalha na camada 3 (rede )

| APLICAÇÃO |                        | APLICAÇÃO |

| APRESENTAÇÃO |               | APRESENTAÇÃO |

| SESSÃO |                              | SESSÃO |

| TRANSPORTE |                    | TRANSPORTE |

| REDE |      --firewall-->         | REDE |

| ENLACE |                             | ENLACE |

| FISICA |                                | FISICA |



Ja um firewall de aplicação trabalha como o próprio nome diz na camada
de aplicação do modelo OSI.


| APLICAÇÃO |   -firewall aplicação->    | APLICAÇÃO |

| APRESENTAÇÃO |                                | APRESENTAÇÃO |

| SESSÃO |                                               | SESSÃO |

| TRANSPORTE |                                     | TRANSPORTE |

| REDE |                                                   | REDE |

| ENLACE |                                              | ENLACE |

| FISICA |                                                 | FISICA |


Isso permite que o firewall tenha um controle muito maior sobre os
pacotes trafegados na rede ja que ele abre o pacote e consegue ver seu conteúdo,
por exemplo um requisição na porta 53 TCP para um firewall comum pode ser
simplesmente uma transferência de zona DNS, porem
ao abrir o pacote verificamos que existe o seguinte conteúdo:

"GET http://www.site.net/file.exe"

Opa ha algo de errado com esse pacote, um GET, tudo indica que o IP de destino na porta 53
é um proxy e que o usuário esta se valendo disso para acessar site indevidos.
Nesse caso um firewall trabalhando na camada de aplicação nos fornece o mecanismo para bloquear
este tipo de acesso.

           --- Iptables e firewall camada 7 ---

O iptables[1] nos fornece mecanismos bem funcionais para bloquear este tipo de acesso criando regras
baseadas no conteúdo do pacote com a opção "-m string" onde string 'o conteudo que você procura
no pacote, veja o exemplo a seguir:


iptables -I FORWARD -p tcp -m string --string "file.exe" --algo bm -j DROP


No exemplo acima queremos bloquear todos os pacotes que contenham a string "file.exe" em seu conteúdo

Explicando o comando:
* -m string
Chamando o helper string do iptables que faz pattern match do conteúdo do pacote.

* --string "file.exe"
É o conteúdo do pacote que queremos encontrar

* --algo bm
Algoritmo de busca para o pattern match, no nosso caso utilizamos o algoritmo bm (Boyer-Moore[2])
por ser mais rápido que o kpm (Knuth-Pratt-Morris[3])

Demais opções:

Alem das opções supra-citadas tambem temos as seguinte opções que nos permite uma enorme gama de detecções:

* --from
Define a partir de qual byte o pattern match será aplicado, exemplo "--from 64" começa a aplicar
o pattern match a partir do byte 64 do pacote (caso não especifique o padrão é 0)

* --to
Define até qual byte do pacote o pattern match vai ler, exemplo "--to 128" vai procurar a string
até alcançar 128 bytes.


Algo interessante é que podemos mesclar diversos componentes deixando a regram menos passivel de falsos positivos.

Ex.:

iptables -I FORWARD -p tcp -m string --string "GET http://" --algo bm --to 64 -m string \! --string "file.exe" --algo bm -j ACCEPT

Na regra acima estamos aceitando todos os "GET http://" exceto os que contiverem a string "file.exe"


Agora bastar analisar o que você deseja bloquear e criar seu firewall na camada de aplicação.

Dica:
Nesse caso é legal você utilizar o MARK e/ou CONNMARK do iptables e criar algumas categorias que você deseja bloquear,
tipo, chat mark 1, web, mark 2, p2p mark 3 e dai por diante ai basta você bloquear os pacotes marcados
(lembrando que o MARK só funciona na tabela mangle)

Enjoy it.

[1] http://www.netfilter.org
[2] http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm
[3] http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

Exemplo de funcionamento do algoritmo KPM

- http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/kpm-example.html

Exemplo de funcionamento do algoritmo BM

- http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/fstrpos-example.html



By CleBeeR

6 comentários:

Dicas de Shell Script disse...

Um artigo meu, que pode ajudar as pessoas a implementarem o Iptables Layer 7 em cima dos RedHat Like.

É bem antigo, mas, pode ser um ponto de ajuda :)

Espero que gostem :P

Segue o link :
http://www.gustavoroberto.blog.br/2007/12/09/implementando-iptables-layer-7-no-fedora-core-7-e-8/

CleBeer's Pub disse...

Na verdade o l7 é a implementação antiga do strings, ele é mais lento e não fornece tantas opções quanto o string, porem funciona bem.

marcos disse...

Gostei dessa dica. A primeira regra, mais simples, foi de boa. Mas a segunda deu erro: STRING match: You must specify `--algo'.

Anônimo disse...

A primeira regra foi de boa, mas ao tentar implementar a segunda, mais detalhada, recebo a seguinte mensagem de erro: iptables v1.4.4: STRING match: You must specify `--algo'
Try `iptables -h' or 'iptables --help' for more information.
Já tentei de tudo, mas não consegui colocar a segunda regra para funcionar.

CleBeer's Pub disse...

Ola, desculpe a regra esta errada mesmo, depois do --string "file.exe" é preciso adicionar a opção --algo br para definir o algorítimo de busca que será utilizado no match

Anônimo disse...

Obrigado, era isso mesmo!