Revista Do Linux  
EDIÇÃO DO MÊS
  Atualidades
  Beowulf
  CAPA
  Corporativo
  Divirta-se
  Entrevista
  Estudo de Caso
  Interfaces Gráficas
  Mercado
  Programação
  Segurança
  Servidores
  WEB

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.

para saber mais:
www.cert.org
www.securify.com/packetstorm
www.rootshell.com
 

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade