Gentoo Logo

[ << ] [ < ] [ Início ] [ > ] [ >> ]


12. Firewalls

Conteúdo:

12.a. Uma firewall

As pessoas normalmente pensam que uma firewall fornece o mais alto nível de segurança, mas estão enganadas. Na maior parte dos casos uma firewall mal-configurada dá menos segurança que não ter nenhuma. Uma firewall também é feita de software e deve ser tratada do mesmo jeito que qualquer outro software, porque tem a mesma chance de conter defeitos.

Então pense antes de implementar uma firewall! Você realmente precisa de uma? Se você acha que você precisa de uma, escreva uma política sobre como deve funcionar, que tipo de firewall, e quem deve operá-la. Mas antes leia este guia.

Firewalls são usadas para dois propósitos:

  • Manter usuários (worms/indivíduos maliciosos) fora
  • Manter usuários (empregados/crianças) dentro

Basicamente há três tipos de firewalls:

  • Filtro de pacotes
  • Relay de circuitos
  • Roteador de aplicações

Uma firewall deve ficar em uma máquina dedicada que não roda serviços (ou unicamente sshd) e segura do jeito que este guia recomenda que seja.

12.b. Filtro de pacotes

Todo tráfego de rede é enviado na forma de pacotes. Grandes quantidades de tráfego são divididas em pacotes menores para facilitar seu manuseio e são remontados quando chegam em seu destino. No cabeçalho de pacote todos pacotes contêm informações de como e onde devem ser levados. E esta informação é exatamente o que uma firewall de filtro de pacotes usa. A filtragem é baseada em:

  • Permitir ou proibir pacotes com base em endereço de IP fonte/destino
  • Permitir ou proibir pacotes com base em porta de fonte/destino
  • Permitir ou proibir pacotes com base em protocolo
  • Permitir ou proibir pacotes com base em opções dentro de um protocolo específico

Em outras palavras, a filtragem é baseada em todos os dados do cabeçalho de um pacote e não seu conteúdo.

Fraquezas:

  • Informações de endereço em um pacote podem potencialmente conter um endereço IP falso (ou como dizemos spoofados) pelo enviador.
  • Dados ou pedidos dentro do pacote permitido podem conter dados não-desejáveis que o indivíduo malicioso pode usar para explorar bugs conhecidos nos serviços na firewall ou atrás dela
  • Normalmente único ponto de falha

Vantagens:

  • Simples e fácil de implementar
  • Pode dar avisos de um possível ataque antes de acontecer (isto é, detectando escaneadores de portas)
  • Bom para deter ataques de SYN

Exemplos de filtros de pacotes gratuitos para Linux:

Nota: É recomendável que você use iptables. Ipchains está obsoleto.

12.c. Relay de circuitos

Um roteador em nível de circuito é uma firewall que valida as conexões antes de permitir que os dados sejam trocados. Isto significa que ele não simplesmente permite ou nega pacotes com base no cabeçalho do pacote, mas também determina se a conexão entre os dois lados é válida de acordo com regras configuráveis antes de abrir uma sessão e permitir que dados sejam trocados. A filtragem é baseada em:

  • Endereço IP de fonte/destino
  • Porta de fonte/destino
  • Um período de tempo
  • Protocolo
  • Usuário
  • Senha

Todo tráfego é validado e monitorado, e tráfego não desejável pode ser ignorado.

Fraquezas:

  • Opera no layer de transporte e pode necessitar de modificação substanciais nos programas que normalmente fornecem funções de transporte.

12.d. Roteador de aplicações

Um roteador de nível de aplicações é um proxy para aplicações, trocando dados com sistemas remotos em nome dos clientes. É mantido longe do público seguramente atrás de uma DMZ (De-Militarized Zone: a porção de uma rede privada que é visível através da firewall) ou uma firewall que não permite conexões do lado de fora. A filtragem é baseada em:

  • Permitir ou impedir com base em endereço IP de fonte/destino
  • Baseado no conteúdo do pacote
  • Limita acesso de arquivos com base no tipo de arquivo ou extensão

Vantagens:

  • Pode fazer cachê de arquivos, aumentando performance de rede
  • Registros detalhados de todas conexões
  • Boa escalabilidade (alguns servidores de proxy podem "compartilhar" dados em cachê)
  • Não tem acesso direto do exterior
  • Pode alterar até o conteúdo do pacote na hora

Desvantagens:

  • Configuração é complexa

Roteadores de aplicações são considerados a solução mais segura já que eles não tem que rodar como administrador (root) e os hosts atrás deles não são alcançáveis através da Internet.

Exemplo de um roteador de aplicações gratuito:

12.e. Iptables

Para usar o iptables, ele deve estar ativado no kernel. Eu adicionei o iptables como módulos (o comando iptables carrega-os conforme eles são necessários) e recompilei meu kernel (mas você pode compilar o iptables dentro do kernel, se você tem a intenção de desligar suporte de módulos carregáveis, como discutimos anteriormente). Para mais informações em como configurar seu kernel para o iptables vá para o Tutorial de Iptables Capítulo 5: Preparativos. Depois que você compilou ser kernel (ou durante a compilação do kernel, você deve adicionar o comando iptables. Simplesmente faça emerge iptables e ele deve funcionar.

Agora teste se ele funciona rodando iptables -L. Se falhar, algo está errado e você tem quer verificar sua configuração mais uma vez.

O Iptables é o novo e muito melhorado filtro de pacotes do kernel do Linux 2.4.x. Ele é o sucessor do antigo filtro de pacotes ipchains do kernel do Linux 2.2.x. Uma das grandes melhorias é que o iptables agora pode fazer filtro de pacotes "stateful". Com o filtro de pacotes stateful é possível controlar cada conexão TCP estabelecida.

Uma conexão TCP consiste de uma série de pacotes contendo informações sobre endereço IP de fonte, endereço IP de destino, porta de fonte, porta de destino, e um número de seqüência para que os pacotes possam ser remontados sem perder dados. TCP é um protocolo orientado à conexão, diferente do UDP, que funciona sem conexão.

Examinando o cabeçalho do pacote TCP, um filtro de pacotes stateful pode determinar se um pacote TCP recebido é parte de uma conexão já estabelecida ou não e decidir aceitar ou ignorar o pacote.

Com um filtro de pacotes não-stateful, é possível enganar o filtro de pacotes a aceitar pacotes que deveriam ser ignorados manipulando os cabeçalhos dos pacotes TCP. Isto pode ser feito manipulando as opções de SYN ou outras opções no cabeçalho de TCP para fazer um pacote malicioso parecer ser parte de uma conexão estabelecida (já que o filtro de pacotes em si não suporte rastreamento de conexões). Com o filtro de pacotes stateful é possível ignorar esses pacotes, já que eles não são parte de uma conexão pré-estabelecida. Isto também irá parar a possibilidade de "stealth scans", um tipo de escaneamento de portas em que o escaneador manda pacotes com opções que são muito menos possíveis de serem registradas por uma firewall que pacotes SYN normais.

O Iptables fornece várias outras funções como NAT (Network Address Translation) e limite de taxas. O limite de taxas é extremamente útil na prevenção de certos ataques de DoS (Denial of Service) como SYN floods.

Uma conexão de TCP é estabelecida pelo chamado cumprimento de três jeitos. Na hora de estabelecer uma conexão TCP o lado do cliente envia um pacote para o servidor com a opção SYN ligada. Quando o servidor recebe o pacote SYN, ele responde mandando um pacote SYN+ACK de volta para o cliente. Quando o pacote SYN+ACK é recebido, o lado do cliente responde com um terceiro pacote ACK reconhecendo a conexão em efeito.

Um ataque de SYN flood é feito mandando o pacote SYN, mas não enviando a resposta ao pacote SYN+ACK. O lado do cliente pode forjar um pacote com um endereço IP falso porque não precisa de uma resposta. O sistema do servidor irá adicionar uma entrada na fila de conexões parcialmente abertas quando recebe o pacote SYN e esperar o pacote ACK final antes de apagar a entrada da fila. A fila tem um número limitado de vagas e se todas vagas estiverem preenchidas antes de um tempo de espera especificado, a entrada será automaticamente apagada da fila. Os ajustes de espera variam, mas são tipicamente de 30-60 segundos ou até mais. O lado do cliente inicia o ataque forjando vários pacotes SYN com endereços IP de fontes diferentes e enviando-os para o endereço IP alvo o mais rápido possível, preenchendo a fila de conexões parcialmente abertas, impedindo que outros clientes estabeleçam conexões legítimas com o servidor.

Aqui é onde o limite de taxas torna-se útil. É possível limitar a taxa de pacotes SYN aceitos usando -m limit --limit 1/s. Isto irá limitar o número de pacotes SYN aceitos para um por segundo e portanto restringir o SYN flood em nossos recursos.

Nota: Outra opção para impedir SYN floods são os SYN cookies, que permitem que seu computador responda a pacotes de SYN sem preencher espaço na fila de conexões. SYN cookies podem ser ativados na configuração do kernel do Linux, mas eles são considerados experimentais no momento.

Algumas coisas práticas agora!

Quando o iptables é carregado no kernel ele tem 5 ganchos onde você pode colocar suas regras. São chamados INPUT, OUTPUT, FORWARD, PREROUTING e POSTROUTING. Cada um deles é chamado de uma cadeia e consiste de uma lista de regras. Cada regra diz se o cabeçalho do pacote parecer-se com isso, aqui está o que fazer com o pacote. Se a regra não bater com o pacote, a próxima regra da cadeia é consultada.

Você pode colocar as regras diretamente nas 5 cadeias principais ou criar novas cadeias e adicioná-las como uma regra para uma cadeia existente. O Iptables suporta as seguintes opções.

Opção: Descrição:
-A Anexar
-D Apagar
-I Inserir
-R Trocar
-L Listar
-F Apagar todas regras na cadeia ou todas cadeias
-Z Zerar contadores na cadeia ou todas cadeias
-C Testar este pacote na cadeia
-N Criar uma nova cadeia definida por usuário
-X Apagar uma cadeia definida por usuário
-P Mudar política na cadeia alvo
-E Mudar nome da cadeia
-p Protocolo
-s Endereço de fonte/máscara
-d Endereço de destino/máscara
-i Nome da entrada (nome de ethernet)
-o Nome de saída (nome de ethernet)
-j Pular (alvo para regra)
-m Relação estendida (pode usar extensão)
-n Saída numérica de endereços e portas
-t Tabela para manipular
-v Modo verbal
-x Expandir números (mostrar valores exatos)
-f Fazer relação só do segundo fragmento e posteriores
-V Versão do pacote
--line-numbers Mostrar número das linhas quando listando

Primeiro iremos experimentar bloquear todos pacotes ICMP em nossa máquina, só para ficarmos familiares com o iptables.

Listagem de código 5.1: Bloquear todos pacotes ICMP

# iptables -A INPUT -p icmp -j DROP

Primeiro especificamos a cadeia a que nossa regra deve ser anexada, depois o protocolo dos pacotes para relacionar, e finalmente o alvo. O alvo pode ser o nome de uma cadeia especificado pelo usuário ou um dos alvos especiais ACCEPT, DROP, REJECT, LOG, QUEUE, ou MASQUERADE. Neste caso nós usamos DROP, que irá ignorar o pacote sem responder para o cliente.

Nota: O alvo LOG também é o que conhecido como "não-terminante". Se o pacote relacionar-se com uma regra do alvo LOG, ao invés de parar a avaliação, o pacote continuará a ser relacionado com outros filtros. Isto permite registrar pacotes e ainda processá-los normalmente.

Agora experimente ping localhost. Você não irá receber nenhuma resposta, já que o iptables irá ignorar todas mensagens de ICMP que chegarem. Você também não poderá fazer ping de outras máquinas, já que o pacote de respostas ICMP será ignorado também. Agora limpe a cadeia para iniciar o fluxo de ICMP novamente.

Listagem de código 5.2: Limpando todas regras

# iptables -F

Agora vamos olhar o filtro de pacotes stateful no iptables. Se nós quiséssemos ativar a inspeção stateful de pacotes chegando na eth0, nós faríamos o seguinte comando:

Listagem de código 5.3: Aceitar pacotes oriundos de uma conexão já estabelecida

# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Isto irá aceitar qualquer pacote de uma conexão já estabelecida ou relacionada na cadeia INPUT. E você pode ignorar qualquer pacote que já não estiver na tabela de estados rodando iptables -A INPUT -i eth0 -m state --state INVALID -j DROP antes do comando anterior. Isto ativa o filtro de pacotes stateful no iptables carregando a extensão "state". Se você quisesse permitir que outros conectem-se a sua máquina, você pode usar a opção --state NEW. O Iptables contém alguns módulos para propósitos diferentes. Alguns deles são:

Módulo/Relação Descrição Opções extendidas
mac Extensão de relação para o endereço de mac dos pacotes que chegam. --mac-source
state Ativa inspeção stateful --state (estados são ESTABLISHED,RELATED, INVALID, NEW)
limit Limite de taxas de relação --limit, --limit-burst
owner Tentar relacionar várias características do dono do pacote --uid-owner userid --gid-owner groupid --pid-owner processid --sid-owner sessionid
unclean Várias verificações de sanidade dos pacotes

Vamos tentar criar uma cadeia definida por usuário e aplicá-la a uma das cadeias existentes:

Listagem de código 5.4: Criando uma cadeia definida por usuário

(Crie uma nova cadeia com uma regra)
# iptables -X minhacadeia
# iptables -N minhacadeia
# iptables -A minhacadeia -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
(A política padrão é que todo tráfego para fora é permitido. Todo tráfego de entrada é ignorado.)
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
(E adicione à cadeia INPUT)
# iptables -A INPUT -j minhacadeia

Aplicando a regra à cadeia input nós obtemos a política: Todos pacotes saindo são permitidos e todos entrando são ignorados.

Pode-se encontrar documentação em Netfilter/iptables documentation.

Vamos ver um exemplo completo. Neste caso minha política de firewall/roteador diz:

  • Conexões para a firewall só são permitidas através de SSH (porta 22)
  • A rede local deve ter acesso a HTTP, HTTPS e SSH (DNS também deve ser permitido)
  • tráfego de ICMP pode conter payload e não deve ser permitido. Claro que temos de permitir um certo tráfego de ICMP.
  • Escaneamentos de portas devem ser detectados e registrados
  • Ataques de SYN devem ser evitados
  • Todo outro tráfego deve ser ignorado e registrado

Listagem de código 5.5: /etc/init.d/firewall

#!/sbin/runscript
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=212.242.40.3
DNS2=212.242.40.51
#inside
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#outside
OIP=217.157.156.144
OINTERFACE=eth1

opts="${opts} showstatus panic save restore showoptions rules"

depend() {
  need net
}

rules() {
  stop
  ebegin "Configurando regras internas"

  einfo "Configurando o padrão para negar"
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP

  #regra padrão
  einfo "Criando cadeias de estados"
  $IPTABLES -N allowed-connection
  $IPTABLES -F allowed-connection
  $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \ 
      "Pacote ruim de ${IINTERFACE}:"
  $IPTABLES -A allowed-connection -j DROP

  #tráfego de ICMP
  einfo "Criando cadeia de icmp"
  $IPTABLES -N icmp_allowed
  $IPTABLES -F icmp_allowed
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \ 
      time-exceeded -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \ 
      destination-unreachable -j ACCEPT
  $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "tráfego ruim de ICMP:"
  $IPTABLES -A icmp_allowed -p icmp -j DROP

  #tráfego de entrada
  einfo "Criando uma cadeia para tráfego ssh de entrada"
  $IPTABLES -N allow-ssh-traffic-in
  $IPTABLES -F allow-ssh-traffic-in
  #proteção de flood
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ 
      ALL RST --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ 
      ALL FIN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ 
      ALL SYN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT

  #tráfego de saída
  einfo "Criando uma cadeia para tráfego ssh de saída"
  $IPTABLES -N allow-ssh-traffic-out
  $IPTABLES -F allow-ssh-traffic-out
  $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT

  einfo "Criando cadeia de saída de dns"
  $IPTABLES -N allow-dns-traffic-out
  $IPTABLES -F allow-dns-traffic-out
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \ 
      -j ACCEPT
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \ 
     -j ACCEPT

  einfo "Criando cadeia de tráfego de saída http/https"
  $IPTABLES -N allow-www-traffic-out
  $IPTABLES -F allow-www-traffic-out
  $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
  $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT

  #Pegar escaneadores de porta
  einfo "Criando cadeia de detecção de escaneamento de portas"
  $IPTABLES -N check-flags
  $IPTABLES -F check-flags
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \ 
      --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:" 
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \ 
      5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \ 
      -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \ 
      --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \ 
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \ 
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

  # Aplicar a adicionar estados inválidos às redes
  einfo "Aplicando as cadeias a INPUT"
  $IPTABLES -A INPUT -m state --state INVALID -j DROP
  $IPTABLES -A INPUT -j icmp_allowed 
  $IPTABLES -A INPUT -j check-flags
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A INPUT -j allow-ssh-traffic-in
  $IPTABLES -A INPUT -j allowed-connection

  einfo "Aplicando as cadeias a FORWARD"
  $IPTABLES -A FORWARD -m state --state INVALID -j DROP
  $IPTABLES -A FORWARD -j icmp_allowed 
  $IPTABLES -A FORWARD -j check-flags
  $IPTABLES -A FORWARD -o lo -j ACCEPT
  $IPTABLES -A FORWARD -j allow-ssh-traffic-in
  $IPTABLES -A FORWARD -j allow-www-traffic-out
  $IPTABLES -A FORWARD -j allowed-connection

  einfo "Aplicando as cadeias a OUTPUT"
  $IPTABLES -A OUTPUT -m state --state INVALID -j DROP
  $IPTABLES -A OUTPUT -j icmp_allowed
  $IPTABLES -A OUTPUT -j check-flags
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  $IPTABLES -A OUTPUT -j allow-ssh-traffic-out
  $IPTABLES -A OUTPUT -j allow-dns-traffic-out
  $IPTABLES -A OUTPUT -j allow-www-traffic-out
  $IPTABLES -A OUTPUT -j allowed-connection

  #Permitir que o cliente roteie através de NAT (Network Address Translation)
  $IPTABLES -t nat -A POSTROUTING -o $IINTERFACE -j MASQUERADE 
  eend $?
}

start() {
  ebegin "Iniciando firewall"
  if [ -e "${FIREWALL}" ]; then
    restore
  else
    einfo "${FIREWALL} não existe. Usando regras padrão."
    rules
  fi
  eend $?
}

stop() {
  ebegin "Parando firewall"
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -X
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P INPUT   ACCEPT
  $IPTABLES -P OUTPUT  ACCEPT
  eend $?
}

showstatus() {
  ebegin "Status"
  $IPTABLES -L -n -v --line-numbers
  einfo "status de NAT"
  $IPTABLES -L -n -v --line-numbers -t nat
  eend $?
}

panic() {
  ebegin "Configurando regras de pânico"
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -t nat -F
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  eend $?
}

save() {
  ebegin "Salvando regras de firewall"
  $IPTABLESSAVE > $FIREWALL
  eend $?
}

restore() {
  ebegin "Restaurando regras de firewall"
  $IPTABLESRESTORE < $FIREWALL
  eend $?
}

restart() {
  svc_stop; svc_start
}

showoptions() {
  echo "Uso: $0 {start|save|restore|panic|stop|restart|showstatus}"
  echo "start)      irá restaurar ajuste se existir, caso contrário criar regras"
  echo "stop)       apagar todas regras e aceitar tudo"
  echo "rules)      forçar a configuração de novas regras"
  echo "save)       gravar configuraçõe em ${FIREWALL}"
  echo "restore)    restaurar configurações de ${FIREWALL}"
  echo "showstatus) Mostrar o status" 
}

Conselhos antes de criar uma firewall:

  1. Crie uma política de firewall antes de implementá-la
  2. Mantenha simples
  3. Conheça como cada protocolo funciona (leia o RFC(Request For Comments) relevante)
  4. Tenha em mente que uma firewall é só outro software rodando como administrador (root).
  5. Teste sua firewall

Se você acha que o iptables é difícil de entender ou leva muito tempo para configurar uma boa firewall, você pode usar o Shorewall. Ele basicamente usa o iptables para gerar regras de firewall, mas é concentrado em regras e não protocolos específicos.

12.f. Squid

O Squid é um servidor de proxy muito poderoso. Ele pode filtrar tráfego com base em hora, expressões regulares (regex) sobre caminho/URI, endereço IP de fonte e destino, domínio, navegador, usuário autenticado, tipo de MIME, e número de porta (protocolo). Eu provavelmente esqueci de algumas funcionalidades, mas é difícil cobrir a lista inteira aqui.

No seguinte exemplo eu adicionei um filtro de banner ao invés de um filtro baseado em sites pornôs. A razão para tanto é que Gentoo.org não deve ser listado como um site pornô. E eu não quero perder meu tempo tentando descobrir alguns sites bons para você.

Neste caso, minha política diz:

  • Navegar (HTTP/HTTPS) é permitido durante horas de trabalho (segunda-sexta 8-17 e sábado 8-13), mas se os empregados chegarem aqui atrasados devem trabalhar, não navegar
  • Baixar arquivos não é permitido (.exe, .com, .arj, .zip, .asf, .avi, .mpg, .mpeg, etc)
  • Não gostamos de banners, então eles são filtrados e substituídos com um gif transparente (aqui é onde você deve ser criativo!).
  • Todas outras conexões para e da Internet devem ser negadas.

Isto é implementado em 4 passos fáceis.

Listagem de código 6.1: /etc/squid/squid.conf

# Prender em um ip e porta
http_port 10.0.2.1:3128

# Configuração padrão
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

# Listas de controle de acesso básicas
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255

# Adicionar quem pode acessar este servidor de proxy
acl localnet src 10.0.0.0/255.255.0.0

# E portas
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl purge method PURGE

# Adicionar lista de controle de acesso com base em expressões
# regulares (regex) dentro de urls
acl archives urlpath_regex "/etc/squid/files.acl"
acl url_ads url_regex "/etc/squid/banner-ads.acl"

# Adicionar lista de acesso de controle com base em hora e dia
acl restricted_weekdays time MTWHF 8:00-17:00
acl restricted_weekends time A 8:00-13:00

acl CONNECT method CONNECT

#permitir acesso do manager do localhost
http_access allow manager localhost
http_access deny manager

# Só permitir pedidos de purge do localhost
http_access allow purge localhost
http_access deny purge

# Negar pedidos em portas desconhecidas
http_access deny !Safe_ports

# Negar CONNECT fora portas de SSL
http_access deny CONNECT !SSL_ports

# Minhas próprias regras

# Adicionar uma página a ser mostrada quando
# um banner for removido
deny_info NOTE_ADS_FILTERED url_ads

# Então negá-los
http_access deny url_ads

# Negar todos arquivos
http_access deny archives

# Restringir acesso a horas de trabalho
http_access allow localnet restricted_weekdays
http_access allow localnet restricted_weekends

# Negar o resto
http_access deny all

A seguir preencha os arquivos que você não quer que seus usuários baixem. Eu adicionei arquivos zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg, au, ra, arj, tar, gz e z.

Listagem de código 6.2: /etc/squid/files.acl

\.[Zz][Ii][pP]$
\.[Vv][Ii][Vv].*
\.[Ee][Xx][Ee]$
\.[Mm][Pp]3$
\.[Rr][Aa][Rr]$
\.[Aa][Cc][Ee]$
\.[Aa][Ss][Ff]$
\.[Aa][Vv][Ii]$
\.[Mm][Oo][Vv]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Aa][Uu]$
\.[Rr][Aa]$
\.[Aa][Rr][Jj]$
\.[Tt][Aa][Rr]$
\.[Gg][Zz]$
\.[Zz]$

Nota: Por favor note o [] com letras maiúsculas e minúsculas para cada caractere. Isto é feito para ninguém enganar nosso filtro acessando um arquivo chamado AvI ao invés de avi

A seguir nós adicionamos as expressões regulares (regex) para identificar banners. Você será provavelmente mais criativo que eu:

Listagem de código 6.3: /etc/squid/banner-ads.acl

/adv/.*\.gif$
/[Aa]ds/.*\.gif$
/[Aa]d[Pp]ix/
/[Aa]d[Ss]erver
/[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$
/[Bb]annerads/
/adbanner.*\.[GgJj][IiPp][FfGg]$
/images/ad/
/reklame/
/RealMedia/ads/.*
^http://www\.submit-it.*
^http://www\.eads.*
^http://ads\.
^http://ad\.
^http://ads02\.
^http://adaver.*\.
^http://adforce\.
adbot\.com
/ads/.*\.gif.*
_ad\..*cgi
/Banners/
/SmartBanner/
/Ads/Media/Images/
^http://static\.wired\.com/advertising/
^http://*\.dejanews\.com/ads/
^http://adfu\.blockstackers\.com/
^http://ads2\.zdnet\.com/adverts
^http://www2\.burstnet\.com/gifs/
^http://www.\.valueclick\.com/cgi-bin/cycle
^http://www\.altavista\.com/av/gifs/ie_horiz\.gif

E como a parte final nós queremos que este arquivo seja mostrado quando um banner for removido. É basicamente meio arquivo html com uma imagem gif 4x4 transparente.

Listagem de código 6.4: /etc/squid/errors/NOTE_ADS_FILTERED

<HTML>
<HEAD>
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://localhost/images/4x4.gif">
<TITLE>ERRO: A URL pedida não pode ser obtida</TITLE>
</HEAD>
<BODY>
<H1>Anúncio filtrado!</H1>

Nota: Não feche as tags <HTML> <BODY>. O squid fará isso.

Como você pode ver, o Squid tem muitas possibilidades e é muito eficiente tanto como filtro, como proxy. Ele pode até mesmo usar proxies de Squid alternativos para escalabilidade em redes muito grandes. A configuração que eu listei aqui serve para uma pequena rede com 1-20 usuários.

Mas combinar o filtro de pacotes (iptables) e a aplicação roteadora (Squid) é provavelmente a melhor solução, mesmo se o Squid está localizado em um lugar seguro e ninguém puder acessá-lo de fora. Nós ainda precisamos nos preocupar com ataques do interior.

Agora você tem que configurar os navegadores de seus clientes para usar o servidor de proxy. O roteador impedirá que usuários façam contato com o exterior se não usarem o proxy.

Nota: No Mozilla isto é feito em Editar->Preferências->Avançado->Proxies.

Isto também pode ser feito transparentemente usando o iptables para encaminha todo tráfego de saída para o proxy do Squid. Isto pode ser feito adicionando uma regra de encaminhamento/pré-roteamento no roteador:

Listagem de código 6.5: Permitir encaminhamento de portas para nosso servidor de proxy

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to proxyhost:3128
# iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to proxyhost:3128

Nota: Se o proxy estiver rodando no host que filtra pacotes--embora não seja recomendado, pode ser necessário se você não tiver máquinas sobrando--use um alvo REDIRECT ao invés de DNAT (REDIRECT dirige os pacotes para o localhost).

12.g. Lições aprendidas

Nós aprendemos que:

  1. Uma firewall pode ser um risco em si mesma. Uma firewall mal configurada é pior que não ter nenhuma.
  2. Como configurar um roteador básico e proxy transparente.
  3. A chave para uma boa firewall é conhecer os protocolos que você quer permitir.
  4. Que tráfego de IP nem sempre contém dados legítimos, como pacotes ICMP, que podem conter um payload malicioso.
  5. Como prevenir um ataque SYN.
  6. Filtrar tráfego HTTP removendo gravuras ofensivas e downloads de vírus.
  7. Combinar filtros de pacotes e roteadores de aplicações dá melhor controle.

Agora, se você realmente precisar, crie uma firewall que atenda às suas necessidades.


[ << ] [ < ] [ Início ] [ > ] [ >> ]


Imprimir

View all

Atualizado 16 de outubro de 2005

A versão original deste documento foi atualizada em 2 de abril de 2010

Resumo: Filtre seus pacotes.

Kim Nielsen
Autor

John P. Davis
Editor

Eric R. Stockbridge
Editor

Carl Anderson
Editor

Jorge Paulo
Editor

Sven Vermeulen
Editor

Benny Chuang
Editor

Sune Jeppesen
Editor

Tiemo Kieft
Editor

Zack Gilburd
Editor

Dan Margolis
Editor

Marcelo Góes
Tradutor

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.