Proteção de camada 7 com iptables
Autor: CleBeer's Pub | Publicado: 2011-03-15T10:27:00-07:00


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   | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;           |  APLICAÇÃO   |

| APRESENTAÇÃO |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; | APRESENTAÇÃO |

|   SESSÃO     |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;            |   SESSÃO     |  

|  TRANSPORTE  | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;           |  TRANSPORTE  |

|     REDE     |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     --firewall--&gt; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;      |     REDE     | 

|    ENLACE    | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;           |    ENLACE    |

|    FISICA    | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;           |    FISICA    |



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


|  APLICAÇÃO   | &nbsp; -firewall aplicação-&gt;&nbsp;&nbsp;&nbsp;  |  APLICAÇÃO   |

| APRESENTAÇÃO | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;           | APRESENTAÇÃO |

|   SESSÃO     | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;            |   SESSÃO     |  

|  TRANSPORTE  | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;           |  TRANSPORTE  |

|     REDE     | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;                        |     REDE     | 

|    ENLACE    | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;           |    ENLACE    |

|    FISICA    | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;           |    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.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --- 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