Filtro de conteúdo com o SquidGuard

Filtro de conteúdo com o SquidGuard
Em um ambiente de trabalho, a idéia é que os funcionários usem a internet para comunicação, pesquisa e outras funções relacionadas ao que estão fazendo. Muitas empresas permitem que acessem os e-mails pessoais e coisas do gênero, mas sempre até um certo limite. Seu chefe não vai gostar se começarem a passar a maior parte do tempo no Orkut, por exemplo.

O Squid permite bloquear sites indesejados de forma bastante simples usando o parâmetro “dstdomain”. Ele permite que você crie acls contendo endereços de sites que devem ser bloqueados (ou permitidos).

Isso é feito em duas etapas. Primeiro você cria a acl, especificando os endereços e em seguida usa o parâmetro “http_access” para bloquear ou liberar o acesso a eles. Veja um exemplo:

acl bloqueados dstdomain orkut.com playboy.abril.com.br
http_access deny bloqueados

Aqui eu criei uma acl chamada “bloqueados“, que contém os endereços “orkut.com” e “playboy.abril.com.br” e em seguida usei o parâmetro “http_access deny” para bloquear o acesso a eles. Você pode incluir diversas acls diferentes dentro da configuração do Squid, desde que use um nome diferente para cada uma. De certa forma, elas são similares às variáveis, que usamos ao programar em qualquer linguagem.

Ao aplicar a regra, o Squid faz a resolução do domínio e passa a bloquear todas sub-páginas que estiverem hospedadas dentro dele. Existe uma ressalva: muitos sites podem ser acessados tanto com o “www” quanto sem. Se os dois estiverem hospedados em servidores diferentes, o Squid considerará que tratam-se de dois sites diferentes, de forma que ao bloquear apenas o “www.orkut.com” os usuários ainda conseguirão acessar o site através do “orkut.com” e vice-versa. Nesses casos, para bloquear ambos, é preciso incluir as duas possibilidades dentro da regra, como em:

acl bloqueados dstdomain orkut.com www.orkut.com playboy.abril.com.br
http_access deny bloqueados

Você pode incluir quantos domínios quiser dentro da acl, basta separá-los por espaço e deixar tudo na mesma linha. Se a regra começar a ficar muito grande, você tem a opção de transferir as entradas para um arquivo. Nesse caso, crie um arquivo de texto simples, com todos os domínios desejados (um por linha), como em:

orkut.com
www.orkut.com
playboy.abril.com.br
www.myspace.com

… e use a regra abaixo na configuração do Squid para que ele seja processado e os domínios sejam incluídos na acl. No exemplo, estou usando o arquivo “/etc/squid/bloqueados”:

acl bloqueados url_regex -i “/etc/squid/bloqueados”
http_access deny bloqueados

Temos aqui um exemplo de arquivo “/etc/squid/squid.conf” completo, incluindo as regras de restrição de acesso:

http_port 3128
visible_hostname gdh
error_directory /usr/share/squid/errors/Portuguese/

cache_mem 64 MB
maximum_object_size_in_memory 64 KB
maximum_object_size 512 MB
minimum_object_size 0 KB
cache_swap_low 90
cache_swap_high 95
cache_dir ufs /var/spool/squid 2048 16 256
cache_access_log /var/log/squid/access.log
refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280

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
acl SSL_ports port 443 563
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

acl bloqueados url_regex -i “/etc/squid/bloqueados”
http_access deny bloqueados

acl redelocal src 192.168.1.0/24
http_access allow localhost
http_access allow redelocal
http_access deny all

Bloquear domínios e endereços IP individuais funciona bem para bloquear páginas específicas, mas não funciona para bloquear páginas pornográficas, por exemplo, simplesmente porque existem muitas delas e você iria morrer louco se tentasse bloquear todas manualmente.

Existem grupos destinados a manter listas com URLs de páginas pornográficas, páginas de cassinos e jogos e páginas ilícitas em geral, que são atualizadas freqüentemente. Por serem construídas através da combinação dos esforços de muitas pessoas, auxiliadas por ferramentas semi-automáticas de indexação e classificação de conteúdo, estas listas permitem bloquear a maior parte das páginas ilícitas sem muito esforço. Apenas a lista mantida pelo Shalla Security possui mais de 1.5 milhões de URLs cadastradas, que formam um arquivo compactado de 9 MB.

A lista mais usada é provavelmente a MESD blacklists, que é a indicada pela equipe do SquidGuard, por ser completamente livre e utilizável para qualquer fim. Ela tem pouco mais de 1 milhão de links e pode ser baixada no: http://squidguard.mesd.k12.or.us/blacklists.tgz.

Outra lista muito usada é a Shalla’s Blacklists, disponível no: http://www.shallalist.de/. A lista é livre para uso pessoal ou não comercial e é mais completa que a lista do MESD, com mais de 1.5 milhões de URLs. Uso comercial é permitido desde que você preencha um contrato de uso, sem custo.

Outra opção é a lista do URLBlacklist.com. Ela é uma lista comercial, que conta com mais de 2 milhões de links e é atualizada regularmente, contando inclusive com um script de atualização automática. A assinatura custa de US$ 6 a US$ 55 mensais, de acordo com o tipo de uso.

Estas listas nada mais são do que longas listas de links, com um por linha. Elas até podem ser usadas diretamente no Squid, através da opção url_regex (a mesma que usamos para criar uma lista de sites bloqueados), mas, por serem arquivos muito grandes, o desempenho seria ruim, já que o Squid processa cada linha dos arquivos a cada acesso, o que consome muito processamento.

Entra em cena então o SquidGuard, que permite usar longas listas de URLs, com milhões de links sem uma grande perda de desempenho. Ele permite integrar as listas que vimos a pouco sem comprometer o desempenho do seu servidor proxy. As listas se encarregarão de bloquear a maior parte das páginas impróprias e você poderá fazer ajustes manuais conforme necessário. A página do projeto é a: http://www.squidguard.org/.

Nas distribuições derivadas do Debian, você pode instalá-lo rapidamente via apt-get:

# apt-get install squidguard

A configuração é feita em três fases. O primeiro passo é baixar os arquivos das listas desejadas e descompactá-los no diretório “/var/lib/squidguard/db”. Em seguida, é necessário configurar o arquivo “/etc/squid/squidGuard.conf”, especificando os arquivos de listas que serão usados e o comportamento do SquidGuard ao bloquear os acessos e, finalmente, editar o “/etc/squid/squid.conf”, adicionando a linha que ativa o uso do SquidGuard.

Vamos começar baixando as listas. Vou usar como exemplo as listas do Shalla e do MESD, mas você pode usar os mesmos passos para usar outras listas que desejar.

Comece baixando as listas em um diretório qualquer, como em:

Copie os dois arquivos para o diretório “/var/lib/squidguard/db” e descompacte-os, como em:

# cp blacklists.tgz shallalist.tar.gz /var/lib/squidguard/db/
# cd /var/lib/squidguard/db/
# tar -zxvf blacklists.tgz
# tar -zxvf shallalist.tar.gz

Aproveite para remover os dois arquivos, já que não precisaremos mais deles:

# rm -f blacklists.tgz shallalist.tar.gz

Com isso, você terá as pastas “BL” (as listas do Shalla) e “blacklists” (listas do MESD) dentro do diretório, cada uma contendo um conjunto de subpastas, como neste screenshot:

3ac358a4

Como pode ver, as listas são divididas por assunto. A lista do MESD é concentrada em temas ilegais, enquanto a lista do Shalla inclui listas relacionadas a temas diversos, que você pode bloquear ou não de acordo com a situação. Dentro de cada pasta, você encontra dois arquivos, “domains” e “urls”, o primeiro contendo domínios que são bloqueados completamente e o segundo contendo URLs isoladas.

Alguns dos temas cobertos pelas listas são:

adv – Sites que hospedam banners e anúncios em geral, exibidos em outras páginas (bloqueando estes domínios, você bloqueia boa parte dos banners de anúncios). Na lista do MESD a categoria se chama “ads”.
audio-video – Páginas (não necessariamente ilegais) que hospedam vídeos e músicas, como o youtube.
chat – Páginas com salas de bate-papo ou contendo clientes web para acesso ao MSN ou outras redes.
drugs – sites que vendem remédios e páginas com conteúdo relacionado ao uso de drogas ou apologia às drogas.
finance – Páginas com informações financeiras, incluindo bancos, empresas de seguros e financeiras. Esta pasta inclui várias subpastas, com as páginas divididas em categorias.
gamble – Cassinos e outras páginas relacionadas a jogos de aposta.
porn – Este dispensa comentários. É a categoria com o maior número de entradas e a primeira que você precisará bloquear.
sex – Similar à “porn”, contém páginas de conteúdo adulto.
proxy – Esta é outra lista que você sempre deve incluir no bloqueio. Ela reúne URLs e endereços IP de proxys externos, que podem ser usados pelos usuários para furar o bloqueio.
socialnet – Inclui redes sociais, como o Orkut e o Myspace.
tracker – Endereços de trackers com torrents. É interessante bloqueá-los para dificultar o download de arquivos .torrent através da rede, o que tem potencial para consumir muita banda.
warez – Páginas que hospedam programas piratas.
webradio, webtv – Rádios e TVs online. É interessante bloqueá-las junto com a categoria “audio-video”, caso você queira reduzir o uso de banda da rede.

Com isso, você tem as duas listas à disposição e pode escolher qual das duas utilizar, ou mesmo combinar seções de ambas para incrementar o filtro. O próximo passo é configurar o arquivo “/etc/squid/squidGuard.conf“, especificando as listas a utilizar. Um exemplo básico de arquivo de configuração, usando apenas duas das seções da lista do MESD, seria:

# /etc/squid/squidGuard.conf

dbhome /var/lib/squidguard/db/blacklists
logdir /var/log/squid

dest porn {
domainlist porn/domains
urllist porn/urls
}

dest proxy {
domainlist proxy/domains
urllist proxy/urls
}

acl {
default {
pass !porn !proxy all
redirect http://gdhn.com.br
}
}

As duas primeiras linhas indicam o diretório contendo as blacklists e o diretório onde serão armazenados os logs. No exemplo estou usando as listas do MESD, daí o “/var/lib/squidguard/db/blacklists” e estou orientando o SquidGuard a salvar o log no mesmo diretório utilizado pelo Squid, gerando o arquivo “/var/log/squid/squidGuard.log”.

Em seguida, temos duas ACLs, batizadas de “porn” e proxy”, cada uma incluindo os dois arquivos da categoria correspondente dentro das listas. Para que fossem adicionadas mais seções, bastaria adicionar uma nova ACL para cada uma.

No final, a opção “pass” indica como as duas ACLs serão usadas. No exemplo, usei a linha “pass !porn !proxy all”, que indica que os acessos a páginas citadas nas listas deve ser bloqueados, mas o acesso a outras páginas é aceito.

Concluindo, usei a linha “redirect http://gdhn.com.br“, que faz com que todos os acessos bloqueados sejam redirecionados de forma transparente à URL especificada. Dessa forma, o usuário tentando acessar páginas impróprias é sutilmente direcionado a uma página com conteúdo mais saudável :). Você pode substituí-la pelo site da empresa, ou mesmo pela localização de uma página de aviso.

Temos aqui um segundo exemplo de configuração, bem mais incrementado, que usa um número bem maior de ACLs, combinando listas do MESD e do Shalla:

# /etc/squid/squidGuard.conf
dbhome /var/lib/squidguard/db
logdir /var/log/squid

dest ads {
domainlist blacklists/ads/domains
urllist blacklists/ads/urls
}
dest aggressive {
domainlist blacklists/aggressive/domains
urllist blacklists/aggressive/urls
}
dest audio-video {
domainlist blacklists/audio-video/domains
urllist blacklists/audio-video/urls
}
dest drugs {
domainlist blacklists/drugs/domains
urllist blacklists/drugs/urls
}
dest gambling {
domainlist blacklists/gambling/domains
urllist blacklists/gambling/urls
}
dest porn {
domainlist blacklists/porn/domains
urllist blacklists/porn/urls
}
dest proxy {
domainlist blacklists/proxy/domains
urllist blacklists/proxy/urls
}
dest redirector {
domainlist blacklists/redirector/domains
urllist blacklists/redirector/urls
}
dest spyware {
domainlist blacklists/spyware/domains
urllist blacklists/spyware/urls
}
dest violence {
domainlist blacklists/violence/domains
urllist blacklists/violence/urls
}
dest warez{
domainlist blacklists/warez/domains
urllist blacklists/warez/urls
}
dest porn2{
domainlist BL/porn/domains
urllist BL/porn/urls
}
dest socialnet{
domainlist BL/socialnet/domains
urllist BL/socialnet/urls
}
dest tracker{
domainlist BL/tracker/domains
urllist BL/tracker/urls
}

acl {
default {
pass !ads !aggressive !audio-video !drugs !gambling !porn !proxy
!redirector !spyware !violence !warez !porn2 !socialnet !tracker all
redirect http://gdhn.com.br
}
}

Veja que nesse segundo exemplo, usei a linha “dbhome /var/lib/squidguard/db”. Isso permite que combine seções das duas listas, indicando o caminho até cada uma, a partir do diretório principal. Esta mesma idéia pode ser usada para combinar outras listas a que você tenha acesso. Basta colocar todas as listas dentro do diretório “/var/lib/squidguard/db” e incluir as ACLs correspondentes dentro da configuração.

Antes que possam ser efetivamente utilizadas, as listas precisam ser convertidas para o formato Berkeley DB, que permite um acesso muito mais rápido do que seria possível ao manipular diretamente os arquivos em texto. Para isso, use (depois de configurar o arquivo “/etc/squid/squidGuard.conf”, o comando:

# squidGuard -C all

Embora não seja necessário em muitas configurações, é recomendável usar também o comando abaixo para ajustar as permissões de acesso aos arquivos, garantindo que o Squid tenha acesso a eles. O “proxy:proxy” indica o usuário e o grupo utilizados pelo Squid, que podem eventualmente ser diferentes, de acordo com a distribuição usada:

# chown -R proxy:proxy /var/lib/squidguard/db/*

Os dois comandos a seguir complementam a configuração, fazendo com que todos os arquivos dentro da pasta sejam configurados com permissões 644 e as pastas com 755, que é a configuração correta. Isso previne o aparecimento de erros diversos relacionados a permissões incorretas para os arquivos:

# find /var/lib/squidguard/db -type f | xargs chmod 644
# find /var/lib/squidguard/db -type d | xargs chmod 755

Depois de gerar a configuração do SquidGuard, o próximo passo é alterar a configuração do Squid, para que ele seja utilizado. Para isso, edite o arquivo “/etc/squid/squid.conf“, adicionando a linha:

redirect_program /usr/bin/squidGuard

Ela deve ser colocada depois das ACLs restritivas (destinadas a bloquear acessos, como no caso das ACLs para bloquear o acesso a uma lista de sites personalizados, ou em determinados horários), mas entretanto antes das regras finais, que permitem o acesso. Um exemplo de arquivo squid.conf completo seria:

# /etc/squid/squid.conf
http_port 3128 transparent
visible_hostname gdh

cache_mem 128 MB
maximum_object_size_in_memory 128 KB
maximum_object_size 512 MB
cache_dir ufs /var/spool/squid 4096 16 256
cache_access_log /var/log/squid/access.log

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
acl SSL_ports port 443 563
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

redirect_program /usr/bin/squidGuard

acl redelocal src 192.168.1.0/24
http_access allow localhost
http_access allow redelocal
http_access deny all

A posição da regra que ativa o SquidGuard é importante, pois se ela for colocada depois da regra “http_access allow redelocal” (ou similar), as requisições serão liberadas antes de passar pelo SquidGuard, fazendo com que ele nunca seja usado.

Opcionalmente, você pode incluir também as duas linhas abaixo, logo após a linha que ativa o SquidGuard:

redirect_children 8
redirector_bypass on

A opção “redirect_children” ajusta o número de processos do SquidGuard que o servidor Squid manterá abertos. Aumentar o número ajuda a melhorar o desempenho do proxy em grandes redes, onde o proxy recebe um volume muito grande de requisições.

A opção “redirector_bypass on” faz com que o Squid continue funcionando mesmo que o SquidGuard trave ou deixe de funcionar por qualquer motivo. Usá-la tem seus prós e contras, já que pode ser preferível que o acesso pare completamente, até que você consiga solucionar o problema, do que permitir que o Squid funcione com os bloqueios desativados. Pense no caso de uma escola primária, por exemplo.

Depois de tudo terminado, reinicie o Squid para que a configuração entre em vigor:

# /etc/init.d/squid restart

Se você estiver configurando um servidor de produção, com usuários acessando o proxy enquanto está configurando, use o comando abaixo para ativar a configuração sem derrubar os usuários conectados:

# squid -k reconfigure

Com tudo pronto, verifique use o comando abaixo:

# tail /var/log/squid/squidGuard.log

Ele mostrará as mensagens de inicialização do SquidGuard. Se tudo estiver correto, as duas últimas linhas serão:

2008-06-14 09:16:02 [4521] squidGuard 1.2.0 started (1208175362.060)
2008-06-14 09:16:02 [4521] squidGuard ready for requests (1208175362.105)

Se algum erro impedir a inicialização do serviço, ele exibirá a mensagem de erro, permitindo que você localize o problema, como em:

2008-06-14 10:45:04 [4408] init domainlist /var/lib/squidguard/db/BL/socialnet/domains
2008-06-14 10:45:04 [4408] /var/lib/squidguard/db/BL/socialnet/domains: Permission denied

Nesse caso temos um problema com as permissões de acesso de uma das listas especificadas na configuração, o que poderia ser resolvido usando os comandos para acertar as permissões que vimos no início do tópico.

Com o SquidGuard ativo, os acessos a páginas impróprias será drasticamente reduzido e você conserva a possibilidade de refinar o bloqueio, adicionando novos endereços manualmente. Não se esqueça de atualizar os arquivos das blacklists periodicamente, já que elas são atualizadas de forma freqüente.

Com o tempo, é provável que você precise desbloquear algumas páginas manualmente, a pedido dos usuários. Para isso você pode criar uma lista branca, autorizando o acesso aos sites manualmente inseridos nela.

Para isso, adicione uma nova ACL no arquivo squidGuard.conf, adicionando as seguintes linhas próximo ao início do arquivo:

dest white {
domainlist white/domains
urllist white/urls
}

No final do arquivo, ao especificar o uso das ACLs, inclua o parâmetro “white” (sem a exclamação) antes dos demais, como em:

acl {
default {
pass white !porn !proxy all
redirect http://gdhn.com.br
}
}

Com isso, o conteúdo da ACL “white” será processado primeiro e o acesso às páginas especificadas no arquivo será liberado. Falta agora criar a pasta e os dois arquivos citados na configuração:

# mkdir /var/lib/squidguard/db/white
# touch /var/lib/squidguard/db/white/domains
# touch /var/lib/squidguard/db/white/urls

Use o arquivo “domains” para incluir domínios que devem ser permitidos por completo, como em “gdhn.com.br” e o arquivo “urls” para incluir páginas ou seções isoladas, como em “gdhn.com.br/tutoriais/”, sempre um por linha.

Depois de editar os arquivos, é necessário fazer com que o SquidGuard atualize a conversão das listas e reiniciar o Squid para que as alterações entrem em vigor, como em:

# squidGuard -C all
# squid -k reconfigure

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X