É normal as empresas serem forçadas a criar politicas de utilização de recursos que tornam necessário filtrar e monitorar os padrões de acesso à Internet e os próprios conteúdos.
Uma das formas de conseguir atingir esse objectivo consiste na instalação de proxies de HTTP. Naturalmente que a instalação do proxy transparente não resolve nada se não forem tomadas medidas de edução dos utilizadores, implementação de uma firewall segura e fechada, etc...
Ainda se ganha no processo uma redução de largura de banda utilizada.
Notar, no entanto, que este sistema apenas controla o acesso através de http e mesmo este tipo de acesso pode ser ultrapassado se o utilizador configurar um proxy externo no seu browser. Para obviar este workaround as firewalls externas devem estar configuradas de forma a não permitir ligações para o exterior através de outras portas que não as standards e mesmo essas devem ser alvo de monitorização constante. O assunto da configuração das firewalls não é tratado neste artigo.
Neste manual vou apenas descrever o procedimento de instalação e manutenção para sistemas SuSE, como tirando a instalação do software, todo o resto da configuração se faz editando os ficheiros de configuração, deverá ser muito fácil implantar este sistema utilizando qualquer outra distribuição de Linux.
O software a instalar encontrar-se quase na sua totalidade presente nos CDs da distribuição. Utilizando o Yast devem-se instalar os seguintes pacotes:
Tanto um pacote como o outro têm dependências adicionais que vão ser automaticamente escolhidas. Deve-se, obviamente, aceitar a instalação dessas dependências.
Para além deste software deve-se fazer o download do script de actualização das listas de bloqueio “getlists.sh” em:
http://www.maynidea.com/squidguard/getlists.sh
Este script deve ser gravado para a directoria /arquivo/scripts.
Adicionalmente deve-se tornar executável este script, utilizando o comando:
# chmod +x /arquivo/scripts/getlists.sh
NOTA: neste documento guardamos os scripts auxiliares em /arquivo/scripts, naturalmente que estes podem ser guardados em qualquer directoria apropriada.
A configuração do sistema envolve várias etapas:
A configuração do squid é feita no ficheiro:
/etc/squid/squid.conf
Vamos exemplificar uma configuração em que o proxy serve duas sub-redes diferentes. Deverá ser bastante fácil configurar o proxy para servir mais ou menos redes.
Devem-se deixar intactas as configurações por omissão, de uma forma geral, e fazer as seguintes alterações:
http_port 3128 cache_dir ufs /arquivo/squid 8192 16 256
A directiva cache_dir indica a directoria onde se vai armazenar o conteúdo da cache, é importante que esteja num file system com espaço suficiente. Um bom valor para uma rede pequena (até 50 utilizadores) é 8GB (8192MB).
Depois do comentário onde se lê # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS deve-se incluir os ACLs1 da nossa rede, por exemplo para uma rede composta de duas sub redes poderiamos utilizar:
# Rede de Hotel acl rede_corporativa src 192.168.123.0/24 acl rede_clientes src 192.168.133.0/24 http_access allow rede_clientes delay_pools 1 delay_class 1 1 delay_access 1 allow rede_clientes delay_access 1 allow rede_corporativa delay_access 1 deny all delay_parameters 1 16000/16000 acl BLOCK url_regex "/etc/squid/block.acl" http_access deny BLOCK http_access allow rede_corporativa
Definimos dois ACLs, rede_corporativa e rede_clientes. À rede dos clientes dá-se acesso não restrito incondicionalmente http_access allow rede_clientes quanto à rede corporativa, fazem-se várias restrições:
\.(afx|asf|asx|au|avi|divx|m3u|mov|mp2|mp3|mpeg|mpg|qt|ra|ram|rm|viv|vivo|vob|vqf|wav|wma|wmv|vbs|shs|pif)($|\?)
Notar que o conteúdo anterior deve ser inserido numa única linha. Esta expressão é verdadeira para todos os ficheiros com as extensões indicadas.
A seguir definem-se os parâmetros necessários para o proxy funcionar como proxy transparente:
httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on
As condições especiais de caching para os updates de sistema e de anti-virus, fazem-se do seguinte modo:
refresh_pattern windowsupdate.com/.*\.(cab|exe) 4320 100% 43200 reload-into-ims refresh_pattern download.microsoft.com/.*\.(cab|exe) 4320 100% 43200 reload-into-ims refresh_pattern au.download.windowsupdate.com/.*\.(cab|exe) 4320 100% 43200 reload-into-ims refresh_pattern liveupdate.symantecliveupdate.com/.*\.(zip|x86|bin) 4320 100% 43200 reload-into-ims refresh_pattern officeimages.microsoft.com/.*\.gif 4320 100% 43200 reload-into-ims refresh_pattern grisoft.com/.*\.bin 4320 100% 43200 reload-into-ims
Estas configurações devem ser inseridas a seguir aos valores por omissão sugeridos no ficheiro de configuração.
Finalmente deve-se configurar a ligação ao filtro squidGuard:
redirect_program /usr/sbin/squidGuard -c /etc/squidguard.conf
A configuração da cache está completa.
Falta agora (i) criar a directoria de cache; (ii) iniciar o serviço, (iii) garantir que este é iniciado caso seja necessário fazer um reboot e (iv) redireccionar os pedidos de forward para a porta 80 para a porta onde o squid está a escutar (3128):
# mkdir /arquivo/squid # chown squid:root squid # chkconfig squid on # rcsquid start # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Devemos garantir que o redireccionamento é feito em cada reboot, para isso deve-se configurar a firewall do SuSE para carregar a regra de redireccionamento de cada vez que é (re)iniciada. Deve-se editar o ficheiro /etc/sysconfig/SuSEfirewall2 e tirar a marca de comentário na linha:
FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"
E a seguir acrescentar no ficheiro "/etc/sysconfig/scripts/SuSEfirewall2-custom", na função “fw_custom_before_masq”, imediatamente antes da keyword true as linhas seguintes:
# Proxy Transparente iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128 iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
Onde neste caso eth0 e eth1 correspondem às redes internas onde queremos que funcione o proxy transparente.
Deve-se verificar se não foi cometido algum erro consultando os logs do squid em /var/log/squid.
A configuração do squidGuard, faz-se editando o respectivo ficheiro de configuração: /etc/squidguard.conf. O ficheiro deve ser construído da seguinte forma:
logdir /var/log/squidGuard
dbhome /arquivo/squidGuard
##
# REDES
##
src corporativo {
ip 192.168.123.0/24
}
src clientes {
ip 192.168.133.0/24
}
##
# DESTINATIONS
##
destination bl_adult {
domainlist blacklists/adult/domains
urllist blacklists/adult/urls
expressionlist blacklists/adult/expressions
log stopped.log
}
destination bl_aggressive {
domainlist blacklists/aggressive/domains
urllist blacklists/aggressive/urls
log stopped.log
}
destination bl_audio_video {
domainlist blacklists/audio-video/domains
urllist blacklists/audio-video/urls
log stopped.log
}
destination bl_drugs {
domainlist blacklists/drugs/domains
urllist blacklists/drugs/urls
log stopped.log
}
destination bl_gambling {
domainlist blacklists/gambling/domains
urllist blacklists/gambling/urls
log stopped.log
}
destination bl_hacking {
domainlist blacklists/hacking/domains
urllist blacklists/hacking/urls
log stopped.log
}
destination bl_mail {
domainlist blacklists/mail/domains
log stopped.log
}
destination bl_porn {
domainlist blacklists/porn/domains
urllist blacklists/porn/urls
expressionlist blacklists/porn/expressions
log stopped.log
}
destination bl_proxy {
domainlist blacklists/proxy/domains
urllist blacklists/proxy/urls
log stopped.log
}
destination bl_violence {
domainlist blacklists/violence/domains
urllist blacklists/violence/urls
expressionlist blacklists/violence/expressions
log stopped.log
}
destination bl_warez {
domainlist blacklists/warez/domains
urllist blacklists/warez/urls
log stopped.log
}
destination bl_local {
domainlist local/domains
urllist local/urls
log stopped.log
}
destination bl_malware {
urllist malware/urls
log stopped.log
}
##
# ACLs
##
acl {
corporativo {
pass !bl_malware !bl_adult !bl_aggressive !bl_audio_video !bl_drugs !bl_gambling !bl_hacking !bl_mail !bl_porn !bl_proxy !bl_violence !bl_warez !bl_local
}
clientes {
pass !bl_malware
}
default {
pass none
redirect http://192.168.0.1/cgi-bin/blocked.py?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u
}
}
Deve-se garantir que existem as directorias /var/log/squidGuard, /arquivo/squidGuard/local e /arquivo/squidGuard/malware e que são acessíveis pelo utilizador squid:
# mkdir –p /var/log/squidGuard /arquivo/squidGuard/local /arquivo/squidGuard/malware # chown squid:root /var/log/squidGuard /arquivo/squidGuard # chown –R squid:root /var/lib/squidGuard /arquivo/squidGuardNesta altura devem-se também criar as listas de bloqueio locais, vazias:
# cd /arquivo/squidGuard/local # touch domains urls # cd .. # chown –R squid:root *
Na configuração do squidGuard foram definidas listas provenientes de diversas fontes.
Utilizamos uma lista dinâmica de sites fonte de malware, para obter a lista utilizamos o script “/arquivo/scripts/getmalwarelist”:
#!/bin/sh wget -O - http://malware.hiperlinks.com.br/cgi/submit?action=list_sguard \ > /arquivo/squidGuard/malware/urls squidGuard -C malware/urls squidGuard -u cd /var/lib/squidGuard/db chown -R squid:root * squid -k reconfigure
Naturalmente que este script deve ser tornado executável.
Este script deve ser corrido periodicamente a cada 5 horas através da tabela cron do root:
10 */5 * * * /arquivo/scripts/getmalwarelist > /dev/null 2> /dev/null
Inicialmente devemos obter a lista a primeira vez com:
wget -O - http://malware.hiperlinks.com.br/cgi/submit?action=list_sguard > /arquivo/squidGuard/malware/urls
Devemos configurar o script /arquivo/scripts/getlists.sh para obter as listas de pornografia e semelhantes, devem ser mudadas as seguintes linhas:
SQUID=/usr/sbin/squid
SQUIDGUARD=/usr/sbin/squidGuard
BLACKDIR=/var/lib/squidGuard/db
chown -R squid ${BLACKDIR}
Após termos editado este ficheiro devemos corre-lo:
# cd /arquivo/scripts # ./getlists.sh
O script vai fazer o download de vários ficheiros comprimidos que contêm colectâneas de domínios associados a sites pornográficos, de droga, de violência, de racismo, etc... Periodicamente deve-se correr este script para actualizar as listas.
As estatísitcas de utilização fazem-se utilizando o programa “webalizer”. A configuração do webalizer faz-se no ficheiro: “/arquivo/scripts/proxylog.conf”, por exemplo:
ReportTitle Estatisticas Rede XPTO HostName proxy.example.com HistoryName /var/log/squid/webalizer.hist OutputDir <path para um web server>/stats Incremental yes IncrementalName /var/log/squid/webalizer.current LogType squid AllReferrers yes AllSites yes TopURLs 30 TopKURLs 30 TopSites 30 TopKSites 30 CountryGraph no IgnoreSite http://proxy.example.com IgnoreURL http://proxy.example.com/* GroupDomains 2 AllSites yes AllURLs yes PageType htm* PageType cgi PageType php PageType shtml HideURL *.gif HideURL *.GIF HideURL *.jpg HideURL *.JPG HideURL *.png HideURL *.PNG HideURL *.ra
Deve-se criar a directoria “logs” na home directory do utilizador root. Esta directoria é utilizada para guardar informação temporária. As directorias de output devem ser escolhidas de acordo com a configuração do servidor de http local.
De modo a correr o webalizer constrói-se o seguinte script (/arquivo/scripts/gerar_logs_squid):
#!/bin/sh /usr/bin/webalizer -c /arquivo/scripts/proxylog.conf /var/log/squid/access.log chown -R sysadm:www <path para um web server>/stats chmod -R a+rX <path para um web server>/stats
Como o webalizer não utiliza grandes recursos para gerar os logs programamos o crontab do utilizador root para correr todas as horas:
10 * * * * /arquivo/scripts/gerar_logs_squid 2> /dev/null > /dev/null
Assim temos disponível na rede interna os logs de utilização de Internet actualizados de hora a hora. Para os consultar só temos de nos dirigir ao site interno, directoria stats.
As páginas de erro em português são distribuídas directamente com o squid. O procedimento para as utilizar é o seguinte:
# cd /etc/squid # rm errors # ln –s /usr/share/squid/errors/Portuguese errors
Quanto à página de erro apresentada sempre que um site é bloqueado pelo filtro squidGuard, o processo é mais complexo, dado que implica a construção de um CGI script que compõe a página. Naturalmente que a construção de CGI scripts ultrapassa em muito o âmbito deste manual, pelo que me limito a apresentar um exemplo de script simples.
O script que utilizamos é feito em Python. A linguagem Python é instalada por omissão nos sistemas SuSE, assim apenas temos de criar o script na directoria de scripts do nosso webserver local.
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Script para apresentar a pagina bloqueada pelo SquidGuard
import cgi
import sys
print "Content-type: text/html\n"
print """<html>
<head>
<title>Acesso Negado</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8">
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="author" content="Helder Guerreiro">
<meta name="language" content="pt">
<meta http-equiv="cache-control" content="no-cache">
</head>
<body>
<h1>Acesso Negado</h1>
"""
form = cgi.FieldStorage()
if not ((form.has_key("clientaddr")) or \
(form.has_key("clientname")) or \
(form.has_key("clientgroup")) or \
(form.has_key("targetgroup")) or \
(form.has_key("url")) ):
print "<h2>Erro</h2>"
print "<p>Este script não está feito para ser directamente acedido!"
sys.exit(0)
print "<h1>O seu pedido foi bloqueado!</h1>"
print """<p>Este sistema tem um filtro de conteúdos activo.
Todos os conteudos que não
sejam permitidos pela administraçãoo estão bloqueados.
<p>Ainda assim, se julga que o seu pedido é legitimo,
entre em contacto com o seu administrador de sistemas e envie-lhe
a seguinte informação:
<ul>"""
try:
clientaddr = form["clientaddr"].value
except:
clientaddr = ""
try:
clientname = form["clientname"].value
except:
clientname = ""
try:
clientgroup = form["clientgroup"].value
except:
clientgroup = ""
try:
targetgroup = form["targetgroup"].value
except:
targetgroup = ""
try:
url = form["url"].value
except:
url = ""
print "<li>Endereço:", clientaddr
print "<li>Nome:", clientname
print "<li>Client Group:", clientgroup
print "<li>Target Group:", targetgroup
print "<li>URL:", url
print """</ul>
<p>Esta informação foi guardada para futura análise.
<br><br>
<p>Tenha um bom dia!
</body>
</html>
"""
O script deve ser executável.
Notar que para termos uma apresentação conveniente poderiamos utilizar o layout do site interno da empresa.
Para acrescentar domínios à lista de bloqueio utiliza-se o seguinte script (add_domain):
#!/bin/sh echo $1 >> /arquivo/squidGuard/local/domains squidGuard -C local/domains squidGuard -u cd /var/lib/squidGuard/db chown -R squid:nogroup * squid -k reconfigure
Este script deve ser criado em /arquivo/scripts.
Para adicional URLs (add_url):
#!/bin/sh echo $1 >> /arquivo/squidGuard/local/urls squidGuard -C local/urls squidGuard -u cd /var/lib/squidGuard/db chown -R squid:nogroup * squid -k reconfigure
A utilização dos scripts é muito simples:
# cd /arquivo/scripts # ./add_domain example.com
ou
# ./add_url www.example.com/teste
Para retirar domínios da lista de bloqueio basta editar os ficheiros de texto com as listas de domínios ou url bloqueados e apagar o domínio ou url pretendido. Os ficheiros são:
/arquivo/squidGuard/local/domains /arquivo/squidGuard/local/urls
Após se ter apagado os domínios ou urls dos ficheiros deve-se fazer:
# squidGuard -C local/domains # squidGuard -C local/urls # squidGuard -u # cd /var/lib/squidGuard/db # chown -R squid:nogroup * # squid -k reconfigure
A monitorização em tempo real dos sites acedidos pelos utilizadores faz-se examinando o ficheiro de logs do squid:
# tail –f /var/log/squid/access.log
Da mesma forma podem-se verificar os sites que vão sendo bloqueados, examinando o ficheiro de log do squidGuard:
# tail –f /var/log/squidGuard/stopped.log