É 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