Atenção: esse artigo tem um vídeo complementar. Clique e assista!

Do que se trata o artigo:

Este artigo visa demonstrar os procedimentos de instalação e configuração do proxy Squid no sistema operacional FreeBSD. Após tais procedimentos, o Squid será responsável por controlar e gerenciar todos os acessos à internet, oferecendo inúmeras vantagens na administração de uma rede de computadores.


Em que situação o tema é útil:

O Squid é muito útil em ambientes onde existe a necessidade de controle sobre o acesso à internet, sobretudo de seu conteúdo, proporcionando economia de banda, uma vez que possui um cache dos conteúdos acessados. Dentre seus benefícios, destaca-se a melhoria na segurança da rede, em função do controle de acesso e uma sensível diminuição do esforço administrativo.

Resumo DevMan:

Este artigo abordará de forma simples e prática como instalar e configurar o proxy Squid, para que atue como cache dos conteúdos acessados na internet. Sendo assim, será possível entender os arquivos de configuração do Squid e a forma como este serviço se comportará na infraestrutura de rede, o que possibilitará ao leitor fazer customizações e adequar esta leitura às necessidades de seu ambiente.

Foi publicado na primeira edição da Infra Magazine um artigo sobre como instalar o sistema operacional FreeBSD para atuar como um gateway. O gateway é o host que atua como um concentrador de tráfego, situado na fronteira entre a rede interna e a externa, sendo por meio dele que as máquinas da rede interna acessam a internet.

Para complementar o artigo da primeira edição, será mostrado como adicionar um servidor proxy ao gateway com o intuito de controlar o acesso e manter a correta utilização da internet, em função do uso a que esta se destina.

Outra utilidade propiciada por seu uso é o controle de acesso, que se baseia em diferentes métodos de autenticação, como: fornecimento de usuário e senha, pelo domínio da rede, pela estação de trabalho, em função do horário do acesso, por agrupamento de regras, entre outros.

Além dos benefícios citados, o Squid aumenta a economia da largura de banda, o que melhora a velocidade de entrega do conteúdo solicitado pelo cliente, permite a criação de regras de controle de acesso à internet e autenticação do usuário, e armazena o conteúdo solicitado para que futuras solicitações não necessitem buscar as mesmas informações na internet, fazendo a leitura diretamente de seu cache. Neste caso, quando é requisitado um conteúdo que sofreu atualização após seu armazenamento em cache, o Squid atualiza tais dados e entrega-os ao cliente, garantindo economia de banda.

Todas as funcionalidades do Squid geram logs que possibilitam ao proxy a disponibilização de relatórios completos, tornando mais fácil a identificação de possíveis problemas, bem como o acompanhamento do desempenho da rede.

O proxy Squid

O Squid é um servidor proxy, open source (código aberto), empregado em atividades relacionadas ao tráfego de pacotes na rede. Dentre as funcionalidades disponíveis, destacam-se: o filtro de conteúdo, que registra em arquivo todo o conteúdo acessado pelas estações da rede; o bloqueador de conteúdo, cuja funcionalidade é restringir o acesso a informações consideradas indesejadas pelo administrador; o autenticador de acesso, que concede acesso à internet somente a usuários conhecidos; e, uma de suas principais características, o cache de conteúdo, que armazena conteúdos recentemente visitados, proporcionando menor tempo de resposta às solicitações do usuário e diminuindo o tráfego entre a rede local e a internet. Cada uma das features destacadas pode ser utilizada individualmente ou em conjunto. Dessa forma, é mantido o controle e registro das atividades dos usuários que fazem uso da internet, permitindo investigações futuras e o próprio monitoramento de acesso em tempo real.

Tantos serviços oferecidos e a disponibilidade de suas versões para os sistemas operacionais das famílias Unix e Windows, além do suporte aos navegadores mais utilizados no mundo, como: Firefox, Internet Explorer e Google Chrome, e a facilidade que o usuário tem em configurar seu browser para o uso deste proxy, fazem do Squid uma excelente escolha para gerenciar a internet como recurso de rede.

O cenário

Como ferramenta para a elaboração deste artigo, foi utilizada uma rede de microcomputadores contendo um host com a funcionalidade de gateway e os demais hosts para atuarem como clientes deste gateway.

O servidor proxy foi instalado no gateway com o objetivo de disponibilizar o acesso à internet mantendo certo nível de controle quanto aos conteúdos acessados.

As solicitações de acesso à internet feitas pelos clientes acontecem de forma controlada, e possíveis tentativas de acesso indevido aos recursos da rede são negadas e registradas em arquivos de log, objetivando a identificação do usuário.

Neste contexto, cabe aos administradores a definição das regras que serão aplicadas ao Squid, sejam eles profissionais ou educacionais, a fim de restringir determinados acessos, a exemplo de conteúdo pornográfico.

Para tanto, será utilizado um microcomputador com o sistema operacional FreeBSD, conforme a Figura 1, compilado com parâmetros do kernel, para atuar como gateway (na primeira edição da Infra Magazine foi mostrado como realizar esta compilação). Após este procedimento, o proxy Squid será instalado e configurado com algumas de suas funcionalidades básicas.

Para atuar como gateway e possivelmente como um proxy, um microcomputador bem modesto atenderá aos requisitos de hardware. Porém, é indicado o uso de um que o disco rígido esteja em bom estado, já que ele será altamente exigido pelo cache do proxy.

Figura 1. O cenário da rede.

O microcomputador usado no cenário foi um Intel(R) Atom(TM) CPU 330 @ 1.60GHz, 1GB de RAM, HD Maxtor 80GB, com duas placas de rede, sendo uma onboard e outra offboard: sis 900 e RT8139(A/B/C/810x/813x/C+) Fast Ethernet Adapter. A conexão com a internet é via cable modem, onde o provedor fornece o endereço IP automaticamente via DHCP (Dynamic Host Configuration Protocol).

Vale ressaltar que o tráfego das estações será direcionado ao gateway que, por sua vez, redirecionará, por meio do firewall IPFW (Firewall padrão do FreeBSD), todo o tráfego destinado à web pela porta padrão do Squid (3128), que aplicará suas regras – chamadas de ACL (Lista de Controle de Acesso).

A instalação

A versão do sistema operacional utilizada foi a FreeBSD 7.2-RELEASE i386 (veja a seção Links), e a versão do Squid foi a 2.6.STABLE23 (veja seção Links).

Neste exemplo, a instalação do proxy será a partir do código fonte do Squid, para que seja possível realizar os passos aqui descritos também em outras distribuições Linux, tais como Red Hat, Slackware, dentre outras, já que o processo de instalação e configuração é idêntico. Há administradores que optam por realizar a instalação através dos ports (/usr/ports), no entanto, ambas as formas levam a resultados idênticos.

Instalando o Squid

Após fazer o download do Squid em www.squid-cache.org/Versions/v2/2.6/, deve-se acessar o diretório onde foi salvo o arquivo referente a seu código fonte, por exemplo /home/dmedia/squid-2.6.STABLE23.tar.gz e descompactá-lo com o utilitário tar (tar -jxvf squid-2.6.STABLE23.tar.gz). Feito isso, será criado um diretório chamado squid-2.6.STABLE23.

Deve-se logar com o super usuário do sistema (su - ) e, em seguida, executa-se o script de configuração do Squid. Em função da grande quantidade de parâmetros e funcionalidades, este artigo mostrará os mais utilizados para um servidor proxy simples, porém funcional.

O script de pré-configuração do Squid chama-se configure. Através dele serão realizadas as configurações básicas de pré-instalação, como a localização do diretório raiz para instalação, tipo de sistema de arquivos que será reconhecido pelo Squid, dentre outras. Porém, algumas funções não estão disponíveis através do arquivo de configuração (squid.conf), a exemplo dos tipos de sistema de arquivos reconhecidos, que deverá ser informado neste ponto, através do script de configuração, da seguinte maneira:


  ./configure --prefix=/usr --exec-prefix=/usr --sbindir=/usr/sbin --sysconfdir=/etc --mandir=/usr/share/man --bindir=/usr/sbin --libexecdir=/usr/lib/squid --enable-snmp –enable-storeio=aufs,ufs,null --enable-auth=basic --enable-basic-auth-helpers=NCSA --enable-ident-lookups --with-large-files --enable-arp-acl 

Quando executado, uma longa lista de arquivos e procedimentos de pré-compilação será exibida, estando inclusos nela a verificação de todos os requisitos necessários para o Squid funcionar com os parâmetros indicados. Então, para que sejam evitados problemas com dependência de arquivos, a instalação do FreeBSD foi feita no modo standard.

Conforme mostrado no comando “./configure...”, foi passada como parâmetro uma lista de informações de configuração, cuja sintaxe a ser seguida é a seguinte: variável=parâmetro, onde variável é uma palavra reservada do script de configuração do Squid, e parâmetro pode ser um caminho completo para um diretório ou o nome de um protocolo, assim como mostrado na Tabela 1, onde se tem uma breve explicação sobre cada parâmetro utilizado.

Parâmetro

Descrição

--prefix=/usr

Indica o prefixo, isto é, o diretório raiz para instalação dos componentes do Squid.

--exec-prefix=/usr

Indica o prefixo, isto é, o diretório raiz para instalação dos componentes executáveis do Squid.

--sbindir=/usr/sbin

Indica onde devem ser colocados os componentes binários, para manipular o Squid.

--sysconfdir=/etc

Indica a localização dos principais arquivos de configuração do Squid (cachemgr.conf, squid.conf e outros – cuja explicação será apresentada mais adiante).

--libexecdir=/usr/lib

Indica em que local manter as bibliotecas usadas pelo Squid.

--bindir=/usr/sbin

Indica onde estará o principal binário do Squid.

--enable-snmp

Habilita o protocolo SNMP (Simple Network Management Protocol), interessante para manter monitoramento.

--enable-storeio=aufs,ufs,null

Indica quais são os tipos de sistemas de arquivos que o Squid usará na manipulação do cache em disco (existem outras opções como: coss e diskd).

--enable-auth=basic

Habilita o modo de autenticação básico.

--enable-basic-auth-helpers=NCSA:

Indica ao Squid qual protocolo será utilizado para autenticação, no caso NCSA (NCSA-style é um arquivo cujo formato é um nome de usuário e sua senha, sendo um por linha).

--enable-ident-lookups

Habilita o Squid a utilizar o protocolo ident (RFC 1413). Este protocolo identifica o nome de usuário do sistema operacional de modo transparente, ou seja, não é preciso que sejam feitas novas solicitações.

--with-large-files

Habilita suporte a arquivos grandes de cache, maiores que 2GB.

--enable-arp-acl

Habilita suporte a filtragem por MAC (Media Access Control).

Tabela 1. Parâmetros de configuração do Squid.

Com estas configurações, será possível que o Squid faça o cache, filtre os pacotes por endereço MAC, reconheça arquivos grandes, permita autenticação básica com nome de usuário e senha, realize a identificação pelo nome do usuário logado no sistema operacional, habilite o uso do protocolo de gerenciamento SNMP, e habilite o reconhecimento dos sistemas de arquivos mais comuns e utilizados.

Após executar o script configure, será necessário compilar o Squid com o comando make e posteriormente fazer sua instalação com o comando make install.

Para agilizar este processo, os comandos serão utilizados de forma sequencial, make && make install. O símbolo && diz que só se deve executar o comando mais a direita se o da esquerda for bem sucedido, ou seja, se seu retorno for 0. Se tudo ocorrer bem com o comando acima, haverá um retorno em tela semelhante à Figura 2.

Figura 2. Compilando e instalando o Squid.

A configuração do Squid

Toda configuração do Squid é feita através de arquivos em formato texto, e o principal arquivo é o squid.conf . Nesta instalação, ele deve estar situado no local informado como parâmetro na variável sysconfdir, logo, estará em /etc/squid/squid.conf.

Configurando o Squid

Como boa prática, deve-se fazer uma cópia do arquivo original antes de iniciar as modificações, pois caso aconteça qualquer tipo de problema com o arquivo manipulado o arquivo original continua à disposição para restauração. Para proceder com as configurações, é imprescindível criar um usuário e grupo para que o processo do Squid o utilize, pois não é seguro deixá-lo com usuários root ou nobody. Usuários com privilégios além do necessário podem ser explorados em falhas/bugs por pessoas maliciosas para causar danos ao sistema.

Ao especificar um usuário, deve-se delimitar seu acesso somente aos recursos necessários para o funcionamento do sistema. Pensando nisso, será criado um grupo com o comando pw groupadd squid e, em seguida, um usuário, já o inserindo no grupo e com o shell (programa que interpreta comandos e os repassa ao kernel do sistema operacional) inválido (Squid não utiliza o shell), através do comando pw adduser squid -g squid -s /dev/null. Feito isso, deve-se modificar o dono dos arquivos de configuração com o comando chown, a fim de que o usuário squid possa acessá-los.

Conforme observado na Figura 3, o usuário não necessita de um shell válido (-s /dev/null), o que melhora a segurança, uma vez que foi restringido que este não terá como executar qualquer comando referente ao sistema operacional, caso ele venha a ser utilizado para fins maliciosos.

Figura 3. Criando o grupo, usuário e editando as permissões.

Criando a estrutura de diretórios para o cache

É possível criar os diretórios necessários ao funcionamento do Squid em discos separados, o que aumenta a performance em função de os discos trabalharem em paralelo, e a segurança. Contudo, para este artigo, o disco será apenas particionado, técnica conhecida como slice, que divide um disco físico logicamente fazendo com que o sistema operacional trabalhe como se houvesse tantos discos quanto as partições que foram criadas.

O Squid faz uso do disco proporcionalmente à quantidade de usuários e acessos. Logo, quanto maior o número de usuários e seus acessos, maior será o número de registros escritos em disco, o que demanda especial atenção à área em disco destinada ao cache.

O Squid necessita que o administrador crie uma estrutura de diretórios para que ele possa utilizar durante suas operações. Esta estrutura servirá para armazenamento de dados de cache, registros de log, entre outros, conforme mostrado abaixo:

• Para o cache deve haver o diretório /var/spool. Para tanto os comandos: cd /var/spool e, em seguida, mkdir squid devem ser utilizados;

• Para arquivos de registros/log, onde serão mantidos os históricos de acesso, deve-se criar o diretório /var/log/squid, através dos comandos cd /var/log e mkdir squid. Após sua criação, deve-se alterar o dono dos diretórios recém-criados para que o Squid possa escrever nos mesmos, conforme os comandos mostrados na Figura 4.

Figura 4. Criando diretórios.

Editando o squid.conf

Em princípio, será mostrada a configuração básica do Squid, o que permitirá o uso de seu cache, bem como o acesso total pelos usuários, ou seja, sem qualquer restrição, mantendo todo registro de quem, onde e quando foi realizado cada acesso, porém forçando a configuração do proxy no navegador do usuário.

Para tal configuração é necessário editar o arquivo squid.conf, inserindo as linhas descritas na Listagem 1. Nos próximos tópicos serão atribuídas mais configurações ao Squid.

Listagem 1. Squid.conf básico.


  http_port 3128
  cache_mem 256 MB
  hierarchy_stoplist cgi-bin ?
  maximum_object_size_in_memory 8 KB
  minimum_object_size 0 KB
  maximum_object_size 250 MB
  dns_nameservers endereço1 endereço2
  error_directory /usr/share/errors/Portuguese
  visible_hostname filtro.de.conteudo.FreeBSD.DevMedia
  shutdown_lifetime 1 second
   
  cache_dir aufs /var/spool/squid 5000 32 512 
  coredump_dir /var/spool/squid
   
  cache_effective_user squid
  cache_effective_group squid
   
  cache_access_log /var/log/squid/access.log
  cache_log /var/log/squid/cache.log
  cache_store_log /var/log/squid/store.log
  pid_filename /var/run/squid.pid 
   
  acl all src 0.0.0.0/0.0.0.0
  acl redeInterna src 10.0.0.0/255.255.0.0
  acl localhost src 127.0.0.1/255.255.255.255
   
  acl QUERY urlpath_regex cgi-bin \?
  no_cache deny QUERY
   
  acl manager proto cache_object
  acl SSL_ports port 443 563            # https,snews
  acl Safe_ports port 80                # http
  acl Safe_ports port 21      # ftp
  acl Safe_ports port 443 563      # https                     
  acl Safe_ports port 70      # gopher
  acl Safe_ports port 210          # wais
  acl Safe_ports port 1025-65535        # unregistered ports
  acl Safe_ports port 280          # http-mgmt
  acl Safe_ports port 488          # gss-http
  acl Safe_ports port 591          # filemaker
  acl Safe_ports port 777          # multiling http
  acl purge method PURGE
  acl CONNECT method CONNECT
  no_cache deny SSL_ports
   
  http_access allow manager localhost
  http_access deny manager all
  http_access allow purge localhost
  http_access deny purge
  http_access deny !Safe_ports
  http_access deny CONNECT !SSL_ports
   
  http_access allow localhost
  http_access allow redeInterna
  http_access deny all 

Para melhor entendimento, segue uma breve descrição sobre os parâmetros do arquivo Squid.conf:

http_port 3128: Define a porta que será utilizada pelo Squid, sendo 3128 a porta padrão. Pode-se mudá-la desde que as portas sejam acima de 1024 e, no máximo, 65535, pois abaixo dessa faixa é reservada para outros serviços. Para verificar portas e serviços, consulte o arquivo /etc/services. Nele existe o número, protocolo e descrição de cada serviço;

cache_mem 256 MB: É a quantidade de memória utilizada para manter os objetos mais recentes, chamados de objetos quentes, e objetos em transição (por exemplo, dados de páginas web). Desta forma o Squid consulta a memória ao invés do disco, o que melhora seu desempenho, já que o acesso a memória é muito mais rápido que o acesso em disco.

• Para especificar o tamanho ideal, deve-se considerar que para sistemas de 32 bits o Squid usa aproximadamente 10MB de memória por GB no total dos diretórios de cache físico cache_dir. Logo, recomenda-se ter o dobro de memória RAM física com relação à especificada, e como os dados são armazenados em blocos de 4 KB, deve-se sempre especificar o tamanho como múltiplo de 4.

• O cache_mem nunca deve ser maior que o tamanho físico do cache_dir. Para um cache_mem de 128MB, tem-se um cache_dir de 512MB, dada a fórmula 128 x 4 = 512.

• Caso o cálculo seja feito em função do tamanho destinado ao cache_dir, por exemplo, 5GB, tem-se acréscimo à fórmula de 10MB por GB, ou seja, 50MB, e o cálculo é dado pelos seguintes valores: ((128 MB + 50 MB) * 4 KB = 712 MB), logo o valor ideal, neste caso, será de 712MB.

• Como a memória deve ser utilizada também pelo sistema operacional, tem-se como boa prática configurar o dobro. Portanto, este servidor deve ter 1,5GB de memória para não gerar transtornos ou lentidão. Nota-se que ter um cache em disco grande com pouca memória não é vantajoso, uma vez que o Squid fará muito swap comprometendo o desempenho;

hierarchy_stoplist cgi-bin ?: Define quais palavras que, quando encontradas em uma URL, não devem ser armazenadas em cache, pois possuem poucas chances de serem novamente requisitadas, o que fará com que esta configuração poupe o cache, aumentando o desempenho do Squid;

maximum_object_size_in_memory 8 KB: Tamanho máximo de um objeto em memória. Objetos maiores não ficarão no cache de memória. Logo, o parâmetro deve ter um valor razoável e múltiplo de quatro, conforme mostrado anteriormente. O valor de 8 KB é o padrão, sendo ideal para servidores com bastantes requisições e com a quantidade de memória especificada acima;

minimum_object_size 0 KB: Define que os objetos menores que o tamanho configurado não serão salvos em disco. O valor 0 (zero) indica que não há limite. Neste caso todos os objetos serão salvos;

maximum_object_size 250 MB: Define que os objetos maiores que o tamanho determinado não serão salvos em disco. Manter esse valor alto exigirá muito da largura de banda. Portanto, deve-se ajustar de acordo com o ambiente, sendo interessante que seja um valor médio referente à largura de banda;

dns_nameservers endereco1 endereco2: Determina os servidores DNS utilizados pelo Squid. Os endereços devem ser separados por espaço. O DNS configurado no sistema operacional (/etc/resolv.conf) será ignorado se essa opção for encontrada no Squid. Logo, deve-se inserir tanto o DNS configurado no resolv.conf quanto os adicionais no Squid.conf ou remover essa linha para que seja usado apenas o DNS configurado no resolv.conf;

error_directory /usr/share/errors/Portuguese: Decide onde o Squid deve procurar as páginas de erro a serem exibidas quando uma regra for aplicada. Existem páginas próprias para cada tipo de erro que foram traduzidas em várias línguas, sendo possível customizá-las ou desenvolver novas páginas que devem ser visualizadas quando regras específicas forem aplicadas, o que melhora o entendimento do usuário sobre o correto uso da rede;

visible_hostname filtro.de.conteudo.FreeBSD.DevMedia: Define o nome do host/servidor que o Squid exibirá, quando solicitado;

shutdown_lifetime 1: Define quanto tempo o Squid deve aguardar até que as requisições sejam finalizadas para encerrar seu próprio processo. Deve-se definir um valor baixo para que a ação seja rápida e não cause transtornos por demora na restauração;

cache_dir ufs /var/spool/squid 5000 32 512: Um dos parâmetros fundamentais ao funcionamento do Squid (o parâmetro de instalação --enable-storeio afeta diretamente esta opção). É ele quem define como será o cache, e sua sintaxe é explicada na Tabela 2.

Sendo assim, foi definido que o tipo de armazenamento é o aufs (Assíncrono Unix File System), a localização do diretório raiz do cache será /var/spool/squid, e o tamanho máximo do disco, que pode ser usado para os diretórios /cache, será de 5GB.

O parâmetro seguinte se refere ao número de subdiretórios a partir do diretório raiz. Por último, o número de diretórios de nível 2, criados a partir dos subdiretórios de nível 1, ou seja, definiu-se 32 diretórios, sendo que cada um conterá 512 subdiretórios. Tal diretiva pode ser definida múltiplas vezes, para múltiplos caches.

cache_dir

Diretiva de configuração para o diretório de cache.

aufs

Tipo de sistema de arquivo que o Squid utilizará.

/var/spool/squid

Caminho do diretório raiz do cache.

5000

Tamanho máximo de disco que o Squid usará para cache.

32

Número de diretórios de primeiro nível

512

Número de diretórios de segundo nível, a partir do diretório de primeiro nível.

Tabela 2. Parâmetros cache_dir.

coredump_dir /var/spool/squid: Quando o Squid é iniciado são criados alguns arquivos chamados de core-dump, que em princípio são armazenados no próprio diretório do Squid. Com este parâmetro é possível alterar a localização padrão dos arquivos core-dump, indicando apenas o novo caminho;

cache_effective_user squid: Conta de usuário utilizado pelo processo do Squid;

cache_effective_group squid: Identifica o grupo de usuários que será utilizado pelo processo do Squid;

cache_access_log /var/log/squid/access.log: Define onde será armazenado o arquivo que mantém todos os registros de acesso. É uma boa prática manter este arquivo em uma partição diferente da que está o sistema operacional e o Squid para que se possa melhorar o desempenho de acesso ao disco.

• Há a possibilidade de desativar os registros usando a diretiva cache_access_log none. O Squid também disponibiliza um comando específico para rotacionar o arquivo de log, e este pode ser usado juntamente com o agendador de tarefas, como o cron por exemplo, para rotacionar os arquivos a cada período de tempo, através do comando squid -k rotate;

cache_log /var/log/squid/cache.log: Determina em que local será armazenado o arquivo que mantém todos os registros referentes ao cache e informações como número de objetos carregados, expirados, requisições inválidas, dentre outros. Também pode ser desabilitado;

cache_store_log /var/log/squid/store.log: Decide onde será armazenado o arquivo que mantém todos os registros referentes ao processo de manipulação de disco e que contém informações completas referentes a quais objetos foram salvos, por quanto tempo e quais foram expirados. Aqui podem ser encontradas as informações em caso de falha de leitura e escrita no disco. Esse registro também pode ser desativado (cache_store_log none);

pid_filename: Define onde será criado o arquivo que contém o PID do Squid, que será configurado mais adiante no script de manipulação do serviço do Squid.

Após a configuração do cache deve-se ajustar as ACLs (Access Control List), que são as regras utilizadas para liberar ou bloquear os acessos.

As ACLs permitem manipular os pacotes de dados, isto é, os acessos, por meio de endereços de origem e/ou destino, usuários, domínios, portas e expressões regulares. Ainda, admite a definição dos horários de acesso e métodos de autenticação.

O Squid é bastante flexível quanto às suas configurações de controle de acesso. Por isso, vale uma consulta ao material oficial (veja a seção Links). A ACL, quando definida, é utilizada pela diretiva http_access, permitindo ou negando o tráfego de pacotes entre origem e destino caso coincidam com alguma de suas regras.

O formato da ACL é: acl <nome_acl> <tipo_acl> <"argumento ou arquivo">, e o formato da diretiva é: http_access <nome_da_acl_a_que_se_aplica> <permissão ou negação>.

Embora existam vários tipos de ACL, a forma de uso é a mesma para todos. O próprio arquivo squid.conf contém exemplos e explicações para cada tipo. Vejamos alguns deles:

acl all src 0.0.0.0/0.0.0.0: Define a ACL de nome all, do tipo src (IP de clientes/origem), cujo IP e faixa abrangem todas as faixas de rede A, B, C, D e E. Esta regra será utilizada com a diretiva http_access para negar todo o acesso e bloquear toda a rede;

acl redeInterna src 10.0.0.0/255.255.0.0: Determina uma ACL de nome redeInterna, do tipo src, pertencente à faixa de IPs utilizada na rede interna. Esta regra com a diretiva http_access servirá para bloquear todo o tráfego da rede, com exceção dos IPs da rede definida aqui;

acl localhost src 127.0.0.1/255.255.255.255: Define uma ACL de nome localhost, do tipo src, cuja faixa de IP/rede é a interface loopback, servindo para permitir os pacotes gerados pelo próprio servidor;

acl QUERY urlpath_regex cgi-bin \?: Determina uma ACL de nome QUERY, do tipo urlpath_regex, que será utilizada juntamente com o recurso de expressão regular para procurar ocorrências das palavras cgi-bin ou ? em uma URL;

no_cache deny QUERY: Define uma regra de negação (deny), do tipo no_cache, para a ACL de nome QUERY. Ela determina que não deve ser feito cache para conteúdos cgi, pois como normalmente são conteúdos dinâmicos, é importante evitar que informações inválidas ou antigas sejam mantidas e possivelmente acessadas no futuro;

acl manager proto cache_object: Cria uma ACL de nome manager, do tipo proto, que define uma regra para o gerenciador de objetos em cache, como por exemplo o squidclient, usando um protocolo especial (cache_object);

acl SSL_ports port 443 563# https,snews: Define uma ACL de nome SSL_ports, do tipo port, e seus elementos confiáveis que são as portas seguras;

acl Safe_ports port 80#http: Define ACLs chamadas Safe_ports, do tipo port, que são as portas permitidas pelo proxy Squid. Por exemplo: acl Safe_ports port 21# ftp;

acl purge method PURGE: Define uma ACL de nome purge, do tipo method. purge é um método específico do Squid que permite que o administrador force a remoção dos objetos do cache. Esta regra será utilizada para permitir apenas solicitações de origem do próprio servidor;

acl CONNECT method CONNECT: Determina uma ACL de nome CONNECT, do tipo method, utilizada para permitir conexões diretas através do proxy;

no_cache deny SSL_ports: Define uma ACL de negação, do tipo no_cache, às portas seguras, ou seja, não permite que seja feito cache dos objetos, evitando que informações inválidas ou antigas sejam consultadas no futuro, como por exemplo, dados dinâmicos em portas https;

http_access allow manager localhost: Cria uma nova diretiva (http_access) que permite (allow) à ACL chamada manager aceitar todas as solicitações referentes ao gerenciamento dos objetos em cache, desde que elas sejam originadas da rede configurada através da ACL localhost (127.0.0.1/255.255.255.255, o próprio servidor);

http_access deny manager all: Cria uma diretiva que nega (deny) o conteúdo da ACL manager, ou seja, proíbe ao restante da rede o gerenciamento dos objetos em cache configurados na ACL all;

http_access allow purge localhost: Cria uma diretiva que aceita a ACL purge, ou seja, permite que os IPs configurados na ACL localhost possam gerenciar os objetos em cache do Squid através do método purge;

http_access deny purge all: Cria uma diretiva que nega a ACL purge para o restante da rede através de seus próprios hosts;

http_access deny !Safe_ports: Cria uma diretiva que nega as portas que não estão definidas na ACL Safe_ports. O símbolo de exclamação (“!”) inverte a lógica, ou seja, tudo que for diferente do definido na ACL Safe_ports, como por exemplo, negando as portas de número 81 e 82. Logo, é preciso observar se existem aplicativos na rede que utilizem portas especificas, sendo necessário liberá-las para que eles funcionem corretamente;

http_access deny CONNECT !SSL_ports: Cria uma diretiva negando conexões diretas às portas que não estão definidas na ACL SSL_ports;

http_access allow localhost: Cria uma diretiva que permite a ACL localhost, ou seja, libera todo o tráfego ou requisição cuja origem seja o próprio host, uma vez que a ACL localhost aponta para o IP de loopback;

http_access allow redeInterna: Cria uma diretiva que permite o que foi definido na ACL redeInterna, ou seja, libera todo o tráfego ou requisição proveniente da rede definida na mesma ACL (desde que atenda às regras definidas anteriormente);

http_access deny all: Cria uma diretiva que nega todo o tráfego de qualquer origem para qualquer destino, com exceção da rede definida na ACL redeInterna, pois, como o Squid lê as regras de forma sequencial e a ACL redeInterna está posicionada antes desta, logo, já foi liberada. Então, lê-se a regra assim: a rede interna foi liberada e houve bloqueio de todas as outras faixas de endereços possíveis.

Após a realização das configurações deve-se executar o binário do Squid para que este leia as configurações e então possa construir o cache/swap e, por fim, inicializar o Squid.

Para construir ou reconstruir o cache é necessário parar o Squid e utilizar o comando /usr/sbin/squid –z. Sua inicialização é feita através do comando /usr/sbin/squid, conforme a Figura 5.

Para quaisquer alterações no arquivo de configuração (squid.conf) é preciso fazer com que o Squid releia o referido arquivo e aplique as novas alterações. Para realizar essa tarefa, deve-se utilizar o comando /usr/sbin/squid -k reconfigure. Assim as conexões ativas não serão interrompidas.

Figura 5. Criando cache e inicializando o Squid.

Neste ponto o Squid deve estar funcionando, como indicado na Figura 5. Caso contrário, deve-se verificar os caminhos e as permissões dos diretórios: tanto os configurados no squid.conf, quanto os próprios diretórios e arquivos de configuração, incluindo as contas e os grupos de usuários.

Contudo, apesar do Squid estar configurado e funcionando, não implica dizer que o tráfego esteja sendo filtrado, pois é necessário que todas as requisições que passem pelas portas HTTP (80), HTTPS (443) e 8080 (as mais utilizadas) sejam redirecionadas para a porta em que o Squid foi configurado, o que é possível através do parâmetro http_port (3128) existente no mesmo arquivo de configuração. O redirecionamento será feito pelo IPFW (Firewall padrão do FreeBSD).

Para fazer o monitoramento dos logs do Squid (vide arquivo /var/log/squid/access.log) será utilizado o comando tail –f /var/log/squid/access.log. Este comando monitora o arquivo passado como parâmetro e, a partir deste momento, quaisquer alterações sofridas pelo arquivo serão exibidas em tempo real.

Para finalizar o processo de monitoramento do arquivo /var/log/squid/access.log deve-se pressionar ctrl + c. É importante lembrar que o arquivo de log do Squid permanecerá vazio até que o redirecionamento do tráfego das portas citadas seja feito.

Redirecionando o tráfego

Para redirecionar o tráfego serão utilizadas regras de firewall do IPFW, o firewall padrão do FreeBSD.

É importante ressaltar que a política adotada pelo firewall é a totalmente aberta, onde todo o tráfego é permitido através do gateway em qualquer porta e em qualquer direção (entrada e saída).

O próximo passo consiste na criação de um script de firewall cujo objetivo é ajustar as regras para que todo o tráfego das portas 80, 443 e 8080 sejam redirecionados à porta 3128 do Squid. Este script deve estar localizado em /usr/local/etc/rc.d/rc.firewall, conforme mostrado na Figura 6.

Figura 6. Script com regras para o IPFW.

Como podemos observar, as regras são simples e servem para redirecionar o tráfego. As regras são: de número 500, que nega requisições de qualquer origem para qualquer destino que forem realizadas diretamente na porta 3128, através da interface de rede rl0; a regra de número 501, que faz com que todo o tráfego destinado às portas 80, 443 e 8080, desde que a origem não seja o próprio servidor (not me), sejam redirecionadas à porta 3128 do próprio servidor – 3128 é a porta onde o Squid está “escutando/aguardando” o tráfego; e a última regra, de número 502, que realiza o NAT (Network Address Translation ) através da interface rl0 – o NAT irá mascarar os endereços dos microcomputadores da rede local de maneira que seja possível a comunicação entre a rede interna LAN (Local Area Network) com a rede externa WAN (Wide Area Network, ou rede).

É importante enfatizar a regra de número 501, pois ela é responsável por forçar o uso da configuração do proxy no navegador. Se o proxy não for informado, configurado, não será permitido a navegação, uma vez que requisições diretamente nas portas especificadas (80, 443 e 8081) não serão aceitas.

Esta configuração de firewall aumenta a segurança, já que se algum browser/navegador for desconfigurado pelo usuário, este não conseguirá navegar. Em contrapartida, quando o parque de máquinas é amplo ou existe um fluxo muito grande de dispositivos móveis e não há mecanismos como servidor DHCP (Dynamic Host Configuration Protocol) configurados para atribuir o proxy de modo automático para os dispositivos, poderá exigir maior esforço por parte dos administradores e aos usuários leigos.

Adicionadas as regras de firewall, será necessário ativá-las com o script ou reiniciando o micro. Após o servidor ter sido configurado, será necessária a configuração do proxy nos navegadores dos clientes. A partir deste momento pode-se verificar novamente o arquivo de log do Squid com o comando tail -f /var/log/squid/access.log (veja Figura 7), pois os logs serão registrados durante os acessos.

É importante mostrar aos usuários leigos que tenham necessidade de conectar seus dispositivos em outras redes como remover as configurações de proxy.

Como complemento, vale a pena estudar sobre proxy automático, através dos scripts PAC (Proxy Auto-Configuration) e/ou WPAD (Windows Proxy Auto Discovery) juntamente com o DHCP.

Figura 7. Realizando um acesso e verificando o arquivo de log.

Com o proxy já configurado no navegador, conforme se observa na Figura 7, foi possível fazer a simulação do retorno do browser informando ao usuário que o proxy não está configurado, o que pode ser visto na Figura 8.

É possível perceber que a página de erro exibida (Figura 8) está no idioma português, pois o caminho para as páginas foi configurado através do arquivo squid.conf, por meio do parâmetro error_directory, e o nome do host configurado através do parâmetro visible_hostname, o que demonstra facilidade em personalizar as páginas de erros. Para tanto, é necessário apenas um modesto conhecimento de HTML (HyperText Markup Language) para que se possa editar as páginas existentes ou mesmo criar novas páginas de erro.

Figura 8. Tentativa de acesso sem proxy configurado.

Neste ponto tem-se então um gateway com proxy funcional, surgindo agora a necessidade de se adicionar novas regras a fim de controlar o acesso por endereço IP, por endereço MAC, bloquear palavras contidas em URL e domínios. Mas antes é preciso fazer com que o Squid seja inicializado junto ao sistema operacional.

Iniciar o Squid automaticamente junto ao FreeBSD

Embora o Squid tenha sido configurado corretamente, é necessário fazer com que ele fique disponível automaticamente a cada nova inicialização do sistema operacional. Reiniciar o sistema operacional não é uma atividade rotineira, mas causa transtornos à empresa, por isso, quanto mais rápido e automatizado este processo acontecer, menor será seu impacto.

Sendo assim, será utilizado o sistema de inicialização rc.d do FreeBSD para fazer do Squid um serviço que possa ser iniciado automaticamente através de script e do arquivo rc.conf, assim como feito com outros serviços, a exemplo do firewall. Para tal, será criado um arquivo dentro do diretório /usr/etc/rc.d com o nome squid. Seu conteúdo pode ser visto na Listagem 2.

Listagem 2. Script para inicialização do Squid no boot.


  #!/bin/sh
  #
  # PROVIDE: squid
  # REQUIRE: ipfw
  # KEYWORD: shutdown
   
  . /etc/rc.subr
  name="squid"
  rcvar=`set_rcvar`
  command="/usr/sbin/squid"
  load_rc_config $name
  squid_enable=${squid_enable-"NO"}
  squid_pidfile=${squid_pidfile-"/var/run/squid.pid"}
  pidfile="${squid_pidfile}"
  run_rc_command "$1" 

Após a criação do arquivo squid, deve-se ajustar suas permissões de modo a torná-lo executável, alterar seu dono para o usuário root e seu grupo para Wheel através dos seguintes comandos:


  # chown -R root:wheel /etc/rc.d/squid 
  # chmod 755 /etc/rc.d/.squid. 

Feito este procedimento, deve-se adicionar a variável squid_enable=”YES” no arquivo rc.conf localizado em /etc/rc.conf.

Logo após, deve-se executar o comando /etc/rc.d/squid rcvar com o intuito de verificar se a configuração está correta, pois a partir deste ponto pode-se manipular o Squid com os comandos /etc/rc.d/squid start|stop|status. Como o foco deste artigo não é o sistema de inicialização do FreeBSD, mais detalhes sobre este assunto podem ser obtidos através da seção Links.

Vale ressaltar que a variável squid_pidfile possui o seguinte conteúdo: “/var/run/squid.pid”, e que este deve ser o mesmo caminho e arquivo de PID que é ajustado no arquivo de configuração do Squid, através da diretiva pid_filename. É através dele que será possível finalizar o processo do Squid com a opção stop.

Outra diretiva que sofre influência direta da opção stop é a diretiva shutdown_lifetime, que configura o tempo de finalização do processo. Quanto maior o valor para shutdown_lifetime, maior será o tempo para finalização do Squid.

Para um teste efetivo, deve-se reiniciar o FreeBSD e verificar se o Squid foi iniciado automaticamente.

Este teste pode ser feito realizando-se um simples acesso a algum site pelo navegador, através do comando ps aux | grep squid no console do servidor ou verificando o arquivo de log do Squid /var/log/messages.

O arquivo messages contém as mensagens referentes a todo o processo de inicialização. Logo, é mais indicado verificá-lo, pois se houver qualquer tipo de erro, é através dele que será possível identificar o maior número de detalhes para se atuar na correção.

Caso tudo esteja correto, o arquivo messages deverá conter o registro da inicialização do Squid, semelhante à Figura 9.

Figura 9. Registro de inicialização correta do Squid no /var/lo/messages e a verificação do processo.

Neste ponto o Squid está instalado e configurado de modo a registrar todos os acessos da rede, porém ele está aberto, o que quer dizer que todo e qualquer conteúdo poderá ser acessado sem qualquer restrição. Por isso, em edições posteriores da Infra Magazine serão publicados novos artigos que detalharão como podem ser adicionados mais controles e regras no Squid.

Conclusão

Redes empresariais, escolares e de acesso público, requerem o controle do conteúdo acessado através da rede de dados (Internet).

Neste contexto a utilização de um servidor proxy é conveniente e vantajosa quando é preciso manter os registros de identificação do usuário, datas e horários em que foram realizados os acessos, além do registro do que foi acessado ou da tentativa de acesso.

Tais informações possibilitam ao administrador a identificação do perfil de seus usuários, e a restrição do acesso ao tipo de uso a que a rede se destina. Além disso, auxilia no dimensionamento da rede, quanto à largura de banda, uma vez que se pode mensurar o número de acessos, e ajuda a restringir o tempo de conexão dos usuários, quando apropriado.

Sendo assim, o Squid se mostra eficiente na realização das tarefas cotidianas, bastante aderente ao sistema operacional, com baixo custo de implantação, além de ser confiável e robusto, como o FreeBSD.

Links

Infra Magazine 01 – Gateway com FreeBSD
www.devmedia.com.br/websys.4/webreader.asp?cat=62&revista=inframagazine_1#a-3509

Endereço para download do ISO FreeBSD
ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/7.2/7.2-RELEASE-i386-disc1.iso

Endereço para download do Squid
http://www.squid-cache.org/Versions/v2/2.6/squid-2.6.STABLE23.tar.gz

Como configurar a Squid ACL
http://www.squid-cache.org/Doc/config/acl/