BOMBOLOM.COM

(http) Instalação do SQUID - Proxy Transparente

Controlo de Acessos WWW

Introdução

É 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.

Instalação do software

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.

Configuração

A configuração do sistema envolve várias etapas:

  1. Configuração do squid como proxy transparente, ie, o squid vai actuar como proxy independentemente dos utilizadores o terem configurado localmente ou não. Isto consegue-se redireccionando todos os pedidos da porta 80 para a porta onde o proxy está a escutar;
  2. Adicionalmente vai-se a este nível definir vários comportamentos importantes:
    1. a.Separação das redes corporativas das redes dos clientes (não queremos filtrar o acesso dos clientes, apenas os dos nossos utilizadores);
    2. b.Bloqueio automático de downloads de ficheiros multimédia e de streams multimédia;
    3. c.Configuração do sistema de cache de modo a reter mais agressivamente todos os updates de sistema e de anti-virus.
  3. 3.Configuração do filtro, com o auxilio das listas de bloqueio e das listas que se vão compor localmente, vai-se controlar o acesso à Internet;
  4. 4.Configuração da produção de estatísticas automaticamente de modo a pudermos acompanhar regularmente o padrão de utilização da Internet.

Configuração do proxy (squid)

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.

Configuração dos filtros (squidGuard)

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/squidGuard
Nesta altura devem-se também criar as listas de bloqueio locais, vazias:
# cd /arquivo/squidGuard/local
# touch domains urls
# cd ..
# chown –R squid:root *

Obtenção das listas de bloqueio

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.

Configuração das estatísticas

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.

Configuração das páginas de erro e de bloqueio

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.

Manutenção do sistema

Scripts definidos

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

Retirar domínios ou URLs das listas de bloqueio

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

Monitorização em tempo real

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
25.07.2006 | Ler mais | Comentários | Tags , , ,

Voltar à Página principal | Made with PyBlosxom