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:
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/
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.
Gostei dessa dica. A primeira regra, mais simples, foi de boa. Mas a segunda deu erro: STRING match: You must specify `--algo'.
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.
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
Obrigado, era isso mesmo!
Postar um comentário