Firewalls ùma introdução à segurança
A popularização da Internet transformou a rede em um ambiente inseguro, mas já diversas soluções para amenizar o problema
Marcelo Barbosa Lima
marcelo.lima@dcc.unicamp.br
A popularização da Internet transformou a rede em um ambiente inseguro, mas
já há diversas soluções para amenizar o problema
Uma revista especializada em Linux não poderia deixar
de tratar da segurança. Isso porque o Linux é hoje uma das plataformas
mais bem servidas de recursos para a implementação de firewalls, além
de ser uma das preferidas por crackers ou atacantes. Basicamente por
ser um sistema operacional bastante configurável, com várias ferramentas
de programação, além de ser open source, oferecendo muitas facilidades
para o desenvolvimento de ataques mais sofisticados. Neste artigo
apresentaremos fragilidades de serviços e protocolos TCP/IP, ataques
explorando estas vulnerabilidades e falhas nos softwares que implementam
estes serviços e protocolos, além de mostrar que a criação de firewalls
pode ser uma boa solução em redes locais.
Um breve histórico
Na década de 60, no auge da guerra fria, o Departamento
de defesa americano tinha interesse de construir uma rede de telecomunicações
capaz de sobreviver a uma guerra nuclear. As redes telefônicas tradicionais
eram consideradas muito vulneráveis. Deste esforço, surgiu uma rede de
pacotes conhecida como ARPANET, na qual os pacotes trafegavam independentes
uns dos outros usando as várias rotas existentes entre cada par de pontos
da rede. Essa redundância garantia o uso de rotas alternativas em caso de
problemas com pontos intermediários na rede. Nos anos 70 esse projeto
proporcionou o surgimento da arquitetura de protocolos TCP/IP. Ela foi
desenvolvida para facilitar a interconexão de diferentes tecnologias
físicas de rede, o que propiciou o crescimento da ARPANET. Nessa época,
a rede era relativamente pequena, com alguns poucos pontos (militares)
espalhados pelos Estados Unidos e por alguns países aliados, além das
universidades ligadas ao projeto.
Assim, o TCP/IP nasceu com poucos mecanismos de
segurança nativos. Com o tempo, graças às facilidades de interconexão
trazidas pelo TCP/IP e ao fim da guerra fria, várias outras redes
menores (inclusive redes não militares) começaram a fazer parte da
ARPANET, até chegarmos ao que hoje é a Internet.
A popularização da Internet trouxe a exploração
comercial da rede. Entretanto, ela também transformou a rede em um
ambiente inseguro. Por isso, os protocolos TCP/IP apresentam sérios
problemas para esta nova funcionalidade da rede. Além disso, qualquer
computador conectado à rede pode ser alvo de ataques de pessoas nos
mais remotos lugares e, com isso, problemas de segurança em sistemas
operacionais e softwares podem ser uma porta de entrada para
estes atacantes. O resultado foi o surgimento de soluções para amenizar
esses problemas: firewalls e criptografia, entre outras. Mesmo assim,
ainda não existe uma ferramenta ou solução que garanta o estado-da-arte
em termos de segurança.
Ataques
Vários ataques foram criados explorando as deficiências
existentes na arquitetura TCP/IP. O grande problema é que nesta arquitetura
a maioria dos serviços e protocolos usa endereços IP como base para
autenticação. Entre estes serviços e protocolos podemos citar rapidamente
o NFS (Network File System) e o DNS (Domain Name System), por exemplo.
Pacotes IP podem ser forjados, ou seja, o cabeçalho IP pode ser alterado
da forma que o atacante quiser (como as modificações do endereço IP da
origem do pacote, por exemplo). Desta forma é possível para um atacante
personificar qualquer máquina na rede. Esta técnica é chamada de IP
spoofing e serve como base para diversos outros tipos de ataques uma
vez que, entre outras coisas, ela permite esconder a origem do ataque.
Somam-se a estes ataques outros que usam bugs de segurança nas
implementações dos serviços e protocolos TCP/IP e falhas nos softwares
em geral. Vejamos alguns dos ataques mais conhecidos e famosos:
Ataques de seqüência de números. Protocolos
que mantêm estados de suas conexões ou `queries' (como TCP e DNS,
respectivamente) por intermédio de números seqüenciais são, em geral,
menos vulneráveis a IP spoofing, já que estes números são geralmente
aleatórios (difíceis de prever). Isso acontece porque, se um pacote
fizer IP spoofing, ele terá que adivinhar os números de seqüências
exatos para usar nos pacotes IP forjados. Se um pacote chega
com números inválidos, a máquina receptora simplesmente descarta o
pacote e notifica a falha para a máquina que enviou o pacote. Portanto,
nenhum mal pode ser feito. Todavia, após o natal de 1994, Kevin Mitnick
usou uma técnica de predição de números de seqüência do TCP para penetrar
nos computadores de Mitomu Shimomura, mostrando que, dependendo da
aleatoriedade da geração desses números seqüenciais, esses protocolos
poderiam facilmente sofrer IP spoofing.
Ataques de Negação de Serviços. Este
tipo de ataque é um dos mais fáceis de implementar e mais difíceis de
se evitar. Geralmente usam IP spoofing para esconder a origem do
ataque. O objetivo é, como o próprio nome fala, negar serviços,
seja evitando de alguma maneira que um servidor aceite novos pedidos,
seja derrubando todas as conexões de um usuário. Existem várias
formas de realizar ataques de negação de serviços por exemplo:
Flooding. O atacante envia muitos pacotes
em curto período de tempo, de forma que a máquina vítima fica
sobrecarregada e começa a descartar pacotes (negar serviços). Pacotes
UDP, ICMP e TCP podem ser usados na implementação desses ataques.
Buffer Overflow. Uma máquina pode negar
serviços se algum software ou sistema operacional tiver alguma falha
com o processo de alocação de memória e com o limitado tamanho dos
buffers usados. Já existem ferramentas (por exemplo, Stackguard para
o gcc) para forçar o compilador a fazer checagens em tempo de
compilação de certas condições que podem gerar estes problemas.
Existem ataques que exploram estes problemas de implementação para,
inclusive, executar código fonte na máquina vítima com privilégios
de root. Quem acompanha listas de discussão em segurança, como a
Bugtraq, já deve ter escutado falar muito neste tipo de ataque.
Fragmentação de pacotes. Algumas implementações
do algoritmo de desfragmentação IP não tratam corretamente fragmentos
sobrepostos. Assim existem vários ataques que usam este fato para negar
serviços. Um exemplo famoso é o ping of death.
Mas por que fazer um ataque de negação de serviços?
Porque pode representar prejuízos para uma rede local corporativa, por
exemplo. Além disso, esses ataques são geralmente usados auxiliando
outros ataques mais sofisticados.
Sniffers
Sniffers ou farejadores são programas que exploram o
fato de o tráfego de pacotes das aplicações TCP/IP não usar nenhum tipo
de cifragem nos dados. Exemplo clássico é o Telnet. Nesta aplicação um
sniffer pode obter nomes de usuários e suas respectivas senhas. Neste
caso do Telnet, uma maneira de evitar este tipo de ataque é usar o ssh
(Secure Shell), pois este, ao contrário do Telnet, usa criptografia nos
dados dos pacotes.
A dificuldade do uso de um sniffer é que o atacante
precisa instalar o sniffer em algum ponto estratégico, como entre duas
máquinas (com o tráfego entre elas passando pela máquina com o programa
farejador) ou em uma rede local ethernet com a interface de rede no modo
promíscuo (em máquinas usando sistema operacional Linux, usar a interface
no modo promíscuo só é permitido com privilégios de root).
Scanning
Internet scanners têm como objetivo procurar por
serviços e falhas que possam comprometer uma máquina. Esta é talvez
a primeira etapa de um ataque. Com estas ferramentas um atacante pode
coletar todas as informações possíveis sobre o seu alvo e, conseqüentemente,
descobrir falhas na segurança. Scanners podem ser usados também pelo
administrador da rede de forma a tornar a rede local menos vulnerável
a certos ataques.
Vale ressaltar que essa lista de ataques não é
exaustiva e alguns detalhes foram omitidos para facilitar a discussão,
visto que exigem certos conhecimentos mais avançados de TCP/IP. Outras
informações sobre falhas em softwares, ferramentas e ataques podem ser
obtidas em diversos sites da Internet.
É importante afirmar ainda que existem ataques de
engenharia social. Estes são difíceis de evitar, pois envolvem os usuários
da rede, que podem ser induzidos a agir de acordo com o que o atacante
deseja. Para exemplificar, o atacante pode conseguir senhas dos usuários,
levá-lo a instalar um sniffer ou um cavalo de tróia dentro da rede interna
(programas conhecidos que são alterados para esconder código fonte de
um atacante).
Firewalls
Uma boa solução para evitar muitos dos ataques citados
acima é implementar firewalls usando-se: filtros de pacotes, servidores
proxy e NAT. Um firewall é um conjunto de componentes (de hardware e
software) que restringe o acesso entre os hosts (computadores ligados
a uma rede) em uma rede local e a Internet (Internet firewalls), ou entre
redes internas (firewalls internos).
Filtro de Pacotes. Filtragem de pacotes é
o processo de permitir ou evitar o tráfego de pacotes entre duas redes,
baseando-se nas informações obtidas nos cabeçalhos dos pacotes e em
um conjunto de regras de filtragem. Esse processo usa geralmente
informações dos cabeçalhos IP (endereços IP da origem e do destino,
como exemplo) e informações dos cabeçalhos TCP ou UDP (números de portas
usados na origem e no destino, por exemplo). Isso justifica o fato dos
filtros de pacotes serem considerados inseguros, pois eles não fazem
nenhuma filtragem na parte de dados dos pacotes. Assim, filtros não
podem evitar que um vírus seja transferido em um arquivo por FTP.
Além disso, filtros não isolam a rede interna, já que pacotes vindos de
hosts na Internet podem chegar, caso sejam permitidos pelas regras de
filtragem no filtro de pacotes, aos hosts dentro da rede interna. É
necessário então o uso de um outro componente complementar que examine os
dados dos pacotes. Por outro lado, filtros de pacotes protegem o sistema
operacional por serem implementados no kernel evitando que certos pacotes
nocivos cheguem ao sistema operacional. O Linux possui ferramentas para a
filtragem de pacotes implementados no kernel: ipfwadm (kernel 2.0.x),
ipchains (kernel 2.2.x) e iptables (que estará presente no kernel 2.4.x).
Vale ressaltar ainda que a filtragem de pacotes é implementada no processo
de roteamento.
Servidor Proxy
Complementar à filtragem de pacotes, um servidor proxy
é executado como um `daemon' do sistema operacional (espaço de processos)
e tem por objetivo evitar que os clientes ou servidores de um determinado
serviço, em máquinas dentro da rede interna, comuniquem-se diretamente com
hosts remotos. Um cliente na rede interna se comunica com o proxy do serviço
e este se encarrega de fazer a comunicação com o servidor remoto. Isso
significa que em hipótese alguma pacotes vindos da Internet podem atingir
a rede interna diretamente. Toda comunicação deve ser feita via proxy.
Isso pode ser garantido usando-se filtragem de pacotes, ou colocando os
servidores proxy para os diversos serviços em uma máquina dual-homed
(computador com duas interfaces de rede: uma para a rede interna
e a outra para a rede externa) e configurando os hosts na rede interna com a
máquina dual-homed como default gateway. Desta forma, o proxy pode oferecer
algumas vantagens como manter cache de dados, autenticar usuários e criar
logs das comunicações e dos dados trocados. Um servidor proxy pode ser
dedicado a um serviço. Neste caso, ele é considerado bastante seguro, porque
pode fazer uma verificação na parte de dados dos pacotes. Veja por exemplo
um proxy para FTP, ele pode procurar vírus no fluxo de dados ou evitar que
alguém faça um comando GET. Há também o proxy genérico (que pode ser usado
para qualquer serviço), mas neste caso ele não conhece nenhuma aplicação em
particular e, conseqüentemente, não faz nenhuma análise no fluxo de dados.
Um problema com servidores proxy é que eles não protegem o sistema
operacional da máquina. Ataques explorando possíveis fragilidades de
segurança do sistema operacional podem colocar todo firewall a perder.
Então, uma filtragem de pacotes adicional para fornecer esta proteção deve
ser utilizada. Existem também servidores proxy para serem usados em máquinas
Linux: TIS-FWTK e Squid, são exemplos.
Network Address Translation
Consiste em reescrever informações de endereços IP e
portas nos cabeçalhos dos pacotes. Desta forma, NAT pode permitir que as
máquinas na rede interna usem endereços IPs reservados (IPs que não podem
ser usados na Internet) e, com isso, evita que as máquinas dentro da rede
possam ser acessadas diretamente por computadores na Internet. Uma desvantagem
de NAT é que, assim como filtros de pacotes, não há nenhuma análise na parte
de dados. Um caso especial de NAT, que existe em Linux, é o masquerading.
Ele permite que as máquinas da rede local compartilhem o endereço IP de um
gateway. Mas existem implementações de NAT completo para Linux.
Portanto, podemos afirmar que firewalls, a grosso modo,
são elementos estruturais roduzidos na arquitetura TCP/IP com intuito
específico para agregar segurança à Internet e o Linux pode ser uma excelente
opção para a implementação de um firewall, pelo baixo custo e por possuir todo
ferramental necessário.