HACKER
FIRE WALL
uma das grandes preocupações na área de segurança de redes é
a vulnerabilidade de um computador, que pode comprometer as
transmissões pelo meio físico da rede na qual está ligado.
Muito se tem feito para que o host (equipamento computacional)
esteja seguro isoladamente, impedindo o acesso indevido a seus
dados e monitorando qualquer tentativa de invasão. Entretanto,
um outro método tem se mostrado bastante eficiente: impedir que
informações indesejadas entrem na rede como um todo.
Não é um método substituto à segurança do host, mas
complementar, e consiste no seguinte: na ligação da rede
interna com a Internet, instala-se um equipamento que permitirá,
ou não, a entrada e saída de informação, baseado em uma lista
de restrições e permissões, devidamente configurada para
suprir as necessidades básicas de comunicação da rede interna
com a Internet e vice-versa. Nem mais, nem menos. Esta
configuração é a chave do sucesso ou fracasso de um firewall.
É importante lembrar que o firewall deve estar presente em todas
as conexões da rede interna com a Internet. Não adianta nada
colocar um firewall super sofisticado na ligação do backbone
se, dentro da rede interna, existir um micro com um modem
conectado em outra rede...
Em tempo: Firewall não é "Parede contra fogo", como
muitos dizem, e sim "Parede de fogo", feita para
impedir a passagem de alguém (ou de algo). Mas isso é só um
detalhe... Tem gente que ainda chama CD-Rom de CD-Room... ;-)
Aviso: É extremamente recomendado que se tenha conhecimentos de
TCP/IP: endereçamento IP, portas de conexão e pacotes
TCP/UDP/ICMP, antes de prosseguir na leitura desta página.
A Filtragem de Pacotes
Essa é a maneira mais simples de se construir um firewall.
Geralmente utilizadas em roteadores, as listas de acesso têm uma
ótima relação custo x benefício: os roteadores já possuem
estas facilidades, basta sentar e aprender a configurá-los; a
filtragem é bem eficiente, invisível e rápida (se o roteador
for de boa qualidade).
Mas então, o que vamos configurar? Os roteadores (que toda rede
com conexão à internet possui) têm um papel muito simples:
interligam duas redes e fazem o transporte de pacotes de
informação de uma rede para outra, conforme sua necessidade.
Mas muitos destes roteadores, além de identificar o destino do
pacote e encaminhá-lo na direção certa, eles checam ainda: a
direção dos pacotes; de onde veio e para onde vai (rede interna
e Internet); endereço de origem e destino; tipo de pacote;
portas de conexão; e flags do pacote.
Estes pontos de conexão da Internet com a rede interna podem
receber uma série de regras para avaliar a informação
corrente. São as listas de acesso que definem o que deve e o que
não deve passar por este ponto de conexão. Elas são mais ou
menos assim:
[nº da regra] [sim/não] [protocolo] [origem] [destino]
[opções]
A opção "sim/não" equivale a "permitir a
passagem do pacote/negar a passagem do pacote" e em
"opções" definiremos os flags do pacote e portas de
destino. Claro, esta é uma generalização das sintaxes mais
comuns, o que nos permite ter uma idéia geral de como isto pode
ser configurado. Consulte o manual do seu roteador para checar a
sintaxe correta das listas de acesso. Algumas coisas podem estar
fora de ordem, portanto, é melhor entender o conceito e não
tentar copiar...
Vamos supor que eu queira impedir o acesso à minha rede interna
para que não seja possível uma conexão Telnet (pacotes TCPs da
porta 23) com meus hosts (pelo menos as conexões vindas da
Internet). Este filtro, logicamente, deveria ser colocado na
interface de entrada dos pacotes externos na rede interna. Pela
sintaxe do exemplo, ficaria assim:
[nº da regra] [sim/não] [protocolo] [origem] [destino]
[opções]
Regra #1 Não TCP Qualquer Interno Porta 23
Ou seja, negar todos os pacotes TCP para a porta 23 vindos da
Internet em direção à qualquer máquina da rede interna. Isto
funciona muito bem! Mas vamos supor que, em algum canto da
Internet, exista um funcionário da minha empresa que precise
abrir sessões Telnet. Ele vai ficar meio chateado comigo... ;-)
Então poderíamos fazer o seguinte: procurar saber *exatamente*
de onde ele está tentando se conectar e permitir a entrada dos
seus pacotes.
[nº da regra] [sim/não] [protocolo] [origem] [destino]
[opções]
Regra #1 Não TCP Qualquer Interno Porta 23
Regra #2 Sim TCP 200.254.36.147 Interno Porta 23
Dessa forma, os pacotes vindo de 200.254.36.147 (isto é apenas
um exemplo!) poderiam passar pelo roteador. É uma brecha na
segurança? Sem dúvida! Mas cabe a este funcionário tomar conta
do seu computador, impedindo que ataques se originem debaixo do
seu nariz...
Um detalhe: precisamos criar uma regra nova para cada restrição
ou permissão? Não, necessariamente. Se duas restrições não
forem excludentes (o que NÃO é o caso do exemplo acima) elas
podem fazer parte da mesma regra (i.e., terem o mesmo número).
Mas, mais uma vez, é melhor consultar o manual do seu roteador
para certificar-se de "como" ele dá prioridade às
regras.
Outro detalhe: baseado nesta ordem, podemos definir uma política
para a segurança da rede. A primeira opção seria liberar tudo
e negar os serviços perigosos; a segunda seria negar tudo e
liberar os serviços necessários. Sem sombra de dúvidas, a
segunda é mais segura, entretanto, os funcionários da rede
interna podem precisar acessar livremente à Internet como forma
de trabalho, e a manutenção desta lista seria tão trabalhosa,
visto a proliferação de programas Internet que, em pouco tempo
estaríamos completamente perdidos em um emaranhado de regras sem
sentido...
Então vamos pelo caminho mais simples, negar apenas os serviços
perigosos. Não entrarei no mérito do "por quê" um
serviço é considerado perigoso. Seria uma discussão sem fim.
Então vamos nos prender a um pressuposto simples: os serviços
disponibilizados em portas menores que 1024 são perigosos. Caso
não saiba, estas portas são destinadas a serviços que precisam
ser executados com privilégios de root (o todo poderoso), e o
comprometimento de um serviço nesta porta estaria pondo as
chaves de casa na mão do ladrão. (obs: os serviços NFS, porta
2049 e X-window, porta 6000, apesar de não estarem rodando nas
portas privilegiadas, são considerados perigosos demais e
também serão bloqueados)
[nº da regra] [sim/não] [protocolo] [origem] [destino]
[opções]
Regra #1 Não UDP Qualquer Interno Porta 2049
Regra #1 Não TCP Qualquer Interno Porta 6000
Regra #1 Não UDP/TCP Qualquer Interno Porta < 1024
A liberação de todas as portas altas é necessária porque os
clientes dos usuários da rede interna (browsers, mails, telnets
etc.) utilizam uma infinidade delas. Seria impossível (ou quase)
liberar apenas as necessárias... Aparentemente estas regras
resolveriam o problema, não fosse o seguinte fato: os servidores
"geralmente" são executados em portas baixas
(<1024), mas nada impede que um funcionário da rede execute
um servidor de Telnet (que geralmente fica na porta 23), por
exemplo, na porta 3456... Não pense você que isto é muito
difícil de acontecer. Muita gente se utiliza deste método para
escapar justamente das limitações impostas pelo firewall da sua
empresa. Para eles é ótimo, pois podem navegar pela rede da
empresa sem estar fisicamente lá, baixar arquivos, tirar
relatórios, modificar configurações, uma maravilha! Inclusive
para os hackers! Muitos gerentes de rede ficaram carecas por
causa disso!
Mas, como disse lá em cima, os roteadores verificam também um
tal de "flags do pacote". Que diabos é isto? Um flag
é uma sinalização entre os computadores intercomunicantes que
identificam alguns estados em que o pacote se encontra.
Analisaremos um estado bem interessante (não, o pacote não
está grávido!): o flag ACK! O ACK (de 'acknowledgment')
identifica que este pacote é uma resposta a um pedido, ou seja,
que pertence a uma conexão já existente. Os pedidos de conexão
originais não possuem o flag ACK. Aí está a chave para o
bloqueio da conexão nos servidores dos funcionários
irresponsáveis.
[nº da regra] [sim/não] [protocolo] [origem] [destino]
[opções]
Regra #1 Sim IP Interno Qualquer
Regra #2 Sim TCP Qualquer Interno Flag ACK
Desta forma, todos os pacotes com o flag ACK ativado poderiam
entrar na rede interna, mas os outros (que muito provavelmente
estariam fazendo uma tentativa de conexão) seriam bloqueados. É
importante lembrar que estas regras se aplicam a cada interface
do roteador, ou seja, a regra 1 seria aplicada na interface do
roteador com a rede interna e, a número 2, na interface do
roteador com a Internet. O sentido em que a informação passa
pelo roteador deve ser levado (e muito) em consideração.
Bom, então vamos dormir sossegados, que já está tudo
resolvido... não é? NÃO! Primeiro que com este truque do ACK
só podemos impedir a passagem do pacote TCP. O UDP não possui
este flag! O que fazer? Seja radical: proíba todos os pacotes
UDP. Se não puder fazer isso, libere-os e reze. Entende agora
porque o firewall é apenas um complemento para a segurança do
host?
O segundo motivo para a preocupação é o FTP. Se você precisa
de FTP na sua rede, vamos queimar um pouco as pestanas. Isto é
um inferno para os firewalls... Os clientes de FTP (assim como
todos os outros clientes) iniciam a comunicação com uma porta
"local" alta, vamos supor, 2030, direcionada à porta
21 do servidor de FTP do qual se deseja baixar o arquivo. Até
aí tudo bem, estamos dentro da última regra imposta pela
filtragem de pacotes. O problema é o seguinte: a conexão FTP
usa duas portas! Uma para controle e outra para a transmissão
dos arquivos. Você, ao se conectar no servidor de FTP (porta
local 2030, porta remota 21), os computadores negociam, através
das portas 2030/21, uma porta local para a transferência do
arquivo, vamos supor 2055, que receberá o arquivo do servidor
FTP originado na porta 20. Só que, quem faz o pedido de conexão
na porta 2055 é o servidor FTP, portanto, o pacote tentará
entrar na rede em uma porta alta sem o flag ACK acionado. Seria
barrado no ato!
O fator principal para esta bagunça é a aleatoriedade com que
os programas escolhem uma porta local para a transmissão do
arquivo. O único jeito de se conseguir baixar os arquivos por
FTP seria liberando novamente as portas altas, mas como vimos,
esta não é uma atitude aceitável.
Há uma outra maneira bastante interessante de se contornar este
problema, mas os recursos necessários para isto são um pouco
mais difíceis de se encontrar: podemos filtrar pacotes baseado
na porta de *origem* em que foram criados. A regra ficaria mais
ou menos assim:
[nº da regra] [s/n] [protc] [origem] [destino] [opções]
Regra #1 Sim IP Interno Qualquer
Regra #1 Sim TCP Qualquer Interno Flag ACK
Regra #1 Sim TCP Qualquer Porta 20 Interno Porta >1023
É lógico que isto somente reduziria um pouco os problemas, até
porque nada impede que o hacker utilize justamente a porta 20
para passar pelo firewall. O único inconveniente é que ele
precisaria ter privilégios de root no sistema originador do
ataque para poder usar estas portas de número baixo. Mas só se
estiver usando algum sabor de Unix, porque se estiver em DOS não
há maiores problemas (para o hacker!). O mais importante nestas
regras é o fato de que, com elas, o número de pessoas que vai
desistir da invasão sem ao menos tentar entender o motivo da
falha é de 90%. A grande maioria dos supostos hackers utiliza
"receitinhas de bolo" para invasões. Se acontecer
qualquer coisa diferente do planejado, ela ficará perdida. E o
firewall é uma excelente arma contra estas pessoas.
O autor do livro "Firewall - Repelling the wily
hacker", Steve Bellovin, propôs a utilização de um
recurso no FTP chamado "FTP Passivo" que resolveria
este problema da filtragem de pacotes. Com este método, os
clientes e servidores de FTP trocariam normalmente as
informações mas, no momento de transferir o arquivo, quem faria
o pedido de envio pela porta 20 seria o cliente. Com isto os
pacotes do arquivo chegariam com o flag ACK acionado (já que
agora se trata de uma conexão feita, e não mais de uma
tentativa de estabelece-la), e assim poderíamos impedir a
conexão com todas as portas altas da sua rede Interna. Mas
infelizmente (ahhhh...) nem todos os servidores e clientes de FTP
já implementaram esta característica (que, diga-se de passagem,
já existe no protocolo FTP). Uma pena...
Os Filtros Inteligentes
Pensando nas dificuldades de configuração e falta de recursos
dos roteadores para a implementação dos filtros de pacotes,
muitos fabricantes criaram ferramentas para fazer este tipo de
filtragem, desta vez baseada em um host (computador) específico
para esta tarefa, localizado nos pontos de conexão da rede
interna com a Internet.
Os chamados filtros inteligentes são aplicações executadas em,
por exemplo, computadores ligados ao roteador e à rede interna.
O tráfego de um lado para outro se dá (ou não) conforme as
regras estabelecidas nas aplicações. Apesar desta solução
requerer um equipamento extra, ela nos dá uma série de
vantagens sobre os filtros baseados em roteador, principalmente
no que diz respeito à monitoração de acesso.
Roteadores, quando possuem algum tipo de log, não guardam
informações muito precisas sobre as tentativas de conexão na
(ou da) rede interna, enquanto os filtros inteligentes possuem
vários níveis de logs, nos quais é possível (e bastante
recomendável) perceber os tipos de tentativa de acesso, e até
definir certas ações caso um evento em especial relacionado à
segurança aconteça.
Uma outra característica interessante dos filtros inteligentes
é a tentativa de implementar um controle de pacotes UDP,
guardando informações sobre eles e tentando
"improvisar" o flag ACK. Montando-se uma tabela de
pacotes UDP que passam, pode-se comparar os pacotes UDP que
retornam e verificar se eles são uma resposta ou se são uma
tentativa de novo contato.
Mais uma vez, volto a avisar: nem mesmo os filtros inteligentes
são substitutos para a segurança dos computadores internos.
Fica fácil visualizar a quantidade de problemas se seus
computadores da rede interna não apresentarem nenhum nível de
segurança e o firewall for comprometido. Lembre-se que um colete
à prova de balas dificilmente lhe protegerá se eu enfiar o dedo
no seu olho...
Os Servidores Proxy
Esqueça tudo o que você viu acima! Estes tipos de firewalls
são completamente diferentes... Neste sistema, temos um gateway
(computador que faz uma ligação) entre o nosso host e o host
que desejamos acessar. Esse gateway possui uma ligação com a
rede externa e outra com a rede interna. Tudo o que passa de uma
para outra deve, obrigatoriamente, passar pelo gateway. O fato de
terem duas ligações lhe confere o nome de "Gateway de Base
Dupla".