1 Aula 10 Proxy cache Squid 10.1 Proxy Um proxy é um servidor HTTP com características especiais de filtragem de pacotes que tipicamente são executados em uma máquina (com ou sem firewall). O proxy aguarda por uma requisição de dentro do firewall, a repassa para um servidor remoto do outro lado do firewall (caso tenha), recebe a resposta e a envia de volta ao cliente que requisitou o serviço ou página. A principal vantagem dos proxies é o armazenamento temporário de documentos, ou seja, em uma estação que utiliza proxy para acessar páginas da internet, uma cópia e cada página visitada é guardada no cache do proxy, que é uma área do disco rígido com tamanho especificado pelo administrador e que contém as requisições do sistema, portanto, caso algum outro usuário acessar a mesma página, não há a necessidade de se buscar essa ágina na internet novamente, já que a mesma está guarda localmente e assim carregada do servidor, não necessitando acesso externos, havendo portanto ganho de desempenho tanto ao carregar o arquivo, como também para o servidor atender ais demandas de acesso. 10.2 Squid O Squid foi feito a partir do projeto Harvest da ARPA, e tem como mentor do seu projeto Duane Wesseis, do National Laboratory for Apllied Network Reaserch, e uma lista enorme de colaboradores. O nome Squid (lula, animal marinho) foi colocado simplesmente para diferenciar um software do outro, ou seja, o Squid, do proxy. O Squid é um dos proxies para Linux mais utilizados na atualidade, pois trata se de um programa robusto, simples e extremamente confiável. A sua instalação e utilização tornou se quase que obrigatório em um sistema Linux, tanto é que vem em todos os CDs de instalação de quase todas as distribuições Linux. O Squid, além de ser um excelente cache (armazenador) de navegação, funciona também como uma extraordinária ferramenta de filtragem por conteúdo, como auxílio ao funcionamento de firewall, permitindo inclusive criação de regras (ACLs) que controlam a entrada de dados na rede. O Squid é um software livre, o que implica dizer que ele está licenciado nos termos da GPL (General Public License), com isso temos uma garantia a mais (ao nosso ver, sem sombras de dúvidas é muito mais seguro que ter o software nas mão de uma única corporação que pode fechar as portas de uma hora para outra, como já vimos por várias vezes) de que nenhuma corporação vai descontinuar o projeto e deixar os seus usuários sem rumo, já que é a própria comunidade de usuários que contribui com o desenvolvimento e avanços deste software. 10.3 Objetivos de um proxy A função básica de um proxy na rede é servir como um ponto intermediário, uma ponte na rede entre uma interface de rede local e a internet, e além disso também, ele possui a função de manter um cache de conteúdo acessado na internet, armazenando em disco no servidor proxy. Assim, quando partir uma
2 solicitação de outra máquina na rede buscando o mesmo conteúdo, será apenas verificado se não houve alterações na página original, se a modificação de fato não for confirmada, o proxy envia o conteúdo direto de seu cache interno para a máquina cliente da rede, pois a única máquina que sai diretamente para a internet é o serviço proxy, e os clientes da rede se comunicam diretamente com ele. Porém se o conteúdo não tiver sido cacheado antes, e por conseqüência não estiver presente no cache, então o servidor irá baixar esse conteúdo para o seu cache. Dessa forma, lá estará uma cópia para uma consulta futura proveniente dos clientes, reduzindo assim o tempo de acessos e o consumo de banda para uso de internet. 10.4 Normas Com relação a termos de segurança em redes, a utilização de um proxy cache em uma rede e sua configuração possuem vínculo de procedimento com a orientação da Norma BS7799 em sua versão NBR ISO/IEC 10799:2001 e NBR ISO/IEC 1079:2005, no item 9.4, onde se diz:... em uma rede devem existir mecanismos de controle de acesso à serviços de rede, tanto internos quantos externos (sendo que o segundo caso é o mais específico de controle de proxy), fazendo controle de acesso dos usuários aos serviços de informação... 10.5 Requisitos mínimos de hardware Os requisitos mínimos aconselháveis de hardware para um bom desempenho do seu servidor proxy são: K6 II 350 Mhz 128 RAM Disco IDE 10 GB para sistema e log. 2 placas de rede (para isolar as redes) 10.6 Instalação Caso queira se fazer a instalação do proxy cache Squid de forma isenta de distribuição, deve se buscar os pacotes binários do mesmo no endereço: http://www.squid cache.org Após o download do arquivo binário, deve se proceder com o desempacotamento e decompactação do mesmo: # tar xvfz squid 2.6.STABLE10.tar.gz # cd squid 2.6.STABLE10 #./configure prefix=/etc/squid # make # make install Os arquivos do Squid serão devidamente instalados no diretório /etc/squid neste caso, poruqe assim o definimos, mas geralmente quando instalamos via pacote coilado ele se instala em /usr/local/squid. Caso queira se utilizar os instaladores da distribuição, os passos são simples: Red Hat/Fedora: # yum install squid
3 ou, Debian: # apt get install squid Isso irá gerar os arquivos de configuração do squid dentro do diretório /etc. 10.7 Configuração básica do Squid O arquivo a ser utilizado aqui é o squid.conf que se localiza em /etc/squid/squid.conf. # vim /etc/squid/squid.con Passo 1: hablitar a porta do squid http_port 10.0.0.1:3128 Obs de segurança: o Squid deve habilitar o socket de conexão exclusivamente para a respectiva rede a fim de se obter uma proteção maior contra a possibilidade de o servidor ser atribuído com a função proxy anônimo, pois essa característica é utilizada muitas vezes por invasores para mascarar Ips de origem de invasão, ou até por usuários mal intencionados que desejam burlar políticas de controle de acesso préestabelecidas. Passo 2: habilitar o cache para do padrão para o valor de espaço em disco desejado e quantidade de diretórios desejados: padrão: cache_dir /var/cache/squid 100 16 256 alteração: cache_dir /var/cache/squid valor_em_mb 64 64 Passo 3: criar/ativar os diretórios de cache: # /etc/init.d/squid start ou # squid k reconfigure Somente estas alterações são suficientes para a ativação do Squid como um proxy cache básico, logo agora nos resta tomarmos alguns cuidados básicos de checagem, executando os seguintes comandos: netstat serve para verificar as portas ativas na pilha de rede do servidor: # netstat ntl less # netstat nul less fuser serve para verificar os processos ativos nas respectivas portas alocadas pelo Squid: # fuser v 3128/tcp # fuser v 3128/udp
4 10.8 Acessos e logs Os logs dos clientes podem ser monitorado através dos logs relacionados ao Squid, que se localizam em /usr/local/squid/var/logs/cache.log, por meio do comando tail: acessos : # tail f /var/log/squid/access.log cache: # tail f /var/log/squid/cache.log 10.9 ACLs (Access Lists Lista de Acessos) As ACL permitem especificar endereços de origem ou destino, domínios, horários, usuários, portas ou métodos de conexão ao Proxy, que servirão de base para permitir ou negar o acesso baseando se em conjuntos dessas ACL's. Isto permite uma grande flexibilidade na configuração do Squid: podemos, por exemplo, especificar quais endereços podem ser acessados, quais não podem ser acessados, que certo endereço somente pode ser acessado em determinado horário, que um usuário somente pode acessar a partir de uma maquina especifica, que um protocolo pode ou não ser utilizado, ou qualquer combinação dessas permissões/restrições. acl minharede src 192.168.0.0/255.255.255.0 Máscara da ACL _ Domínio, rede ou IP da ACL Tipo de ACL Nome da ACL Comando de criação de ACL Isto cria uma ACL de nome minharede do tipo src (IP de origem) sendo seu domínio 192.168.0.0/255.255.255.0 uma rede classe C. Agora temos que dar permissão a esta ACL a diretiva que faz isso e o http_access, então temos que inserir no squid.conf: http_access allow minharede Mas isso não pode ser feito em qualquer lugar, o squid e meio chato com a ordem dos parâmetros. Vamos ver como esta o arquivo padrão e quais alterações devem ser feitas para entendermos melhor. acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl SSL_ports port 443 563 acl Safe_ports port 80 21 443 563 70 210 1025 65535
5 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 # multilink http acl CONNECT method CONNECT http_access allow manager localhost http_access deny manager http_access deny!safe_ports http_access deny CONNECT!SSL_ports http_access deny all Como podemos ver existem vários tipos de ACL, vamos nos ater a primeira, foi criada uma ACL do tipo src, isto significa maquina de origem, com nome "all" que corresponde a qualquer maquina existente. A ultima diretiva diz que a conexões correspondentes a diretiva all estão proibidas de continuar. A diretiva ACL tem de ser criada antes de ser conferido algum direito. Então agora a ordem das linhas deverá ser a seguinte: acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl SSL_ports port 443 563 acl Safe_ports port 80 21 443 563 70 210 1025 65535 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 # multilink http acl CONNECT method CONNECT # ACL's do usuário acl minharede src 192.168.0.0/255.255.255.0 #ACL correspondente a rede interna # permissões para as ACLs http_access allow minharede http_access deny all #permite conexões da rede interna Podemos ver que temos varias linhas para a ACL Safe_ports, isso merece duas considerações, primeiro e possível especificar vários parâmetros para uma ACL, seja dando um espaço entre os
6 parâmetros ou colocando duas entradas para a mesma ACL assim se tivéssemos que permitir também a rede 192.168.1.0/255.255.255.0 poderíamos criar a ACL de duas formas: # com espaço: acl minharede 192.168.0.1/255.255.255.0 192.168.1.0/255.255.255.0 #ou com duas linhas acl minharede 192.168.0.0/255.255.255.0 acl minharede 192.168.1.0/255.255.255.0 A segunda consideração e que por padrão as diretivas ACL são do tipo "OU", ou seja uma conexão pertencera a uma ACL se qualquer um dos parâmetros coincidir. No nosso exemplo, a rede 192.168.0.0 OU rede 192.168.1.1 coincidiram com a ACL. A ordem entre as diretivas ACL não e importante. Para as diretivas http_access a coisa funciona diferente, como podemos ver a diretiva de permissão da rede interna foi inserida antes do deny all. O squid lê as diretivas de CIMA para BAIXO, parando a comparação na primeira que coincidir. Além disso as diretivas http_access são do tipo "E", para que a diretiva entre em ação, a conexão tem de estar coincidindo com TODAS as ACL's especificadas. EX: acl minharede src 192.168.0.0/255.255.255.0 acl horacom time SMTWHFA 09:00 10:00 http_access allow minharede horacom http_access deny all No exemplo acima, só as maquinas da rede 192.168.0.0/255.255.225 de 09:00 as 10:00 poderão acessar a Internet, as demais maquinas ou qualquer maquina fora deste horário não poderão acessar. 10.10 Configuração do squid.conf A seguir trecho do arquivo squid.conf, com parte de acl de rede e de regras pronto para usar: # ACLs acl permitir_rede src 10.1.1.0 acl horario time SMTWHFA 09:00 10:00 acl proibir_sites dstdomain "/usr/local/squid/etc/sitios" acl proibir_palavras url_regex i "/usr/local/squid/etc/palavras" # permissões http_access allow permitir_rede http_access allow permitir_rede horario http_access deny proibir_sitios http_access deny proibir_palavras
7 http_access deny permitir_rede horario http_access deny proibir_ip Onde os arquivos proibir_sitios e proibir_palavras devem ser atualizados constantemente, para que possamos ter sempre um filtro de conteúdos bem atualizados e funcional. Exemplo do arquivo proibir_sitios: www.sexy.com.br www.playboy.com www.playboy.com.br Exemplo de arquivo proibir_palavras: playboy sexy ninfeta msn orkut 10.11 Outras ACLs 10.11.1 ACL de arquivos de download Exemplo de ACL que servem para bloquear arquivos de downloads pela internet. Exemplo: acl mp3 url_regex i.*\.mp3$ acl mpeg url_regex i.*\.mpeg$ acl zip url_regex i.*\.zip$ acl avi url_regex i.*\.avi$ acl exe url_regex i.*\.exe$ acl rar url_regex i.rar acl scr url_regex i.scr acl msi url_regex i.msi acl wmv url_regex i.wmv acl pif url_regex i.pif 10.11.2 ACL com MAC address Para que o Squid possa controlar o acesso por MAC ADDRESS da placa de rede: As regras adicionadas do arquivo squid.conf ficariam da seguinte maneira: # ACLs MAC address acl iface1 arp 11:11:11:11:11:11 acl iface2 arp 12:12:12:12:12:12
8 acl iface3 arp 13:13:13:13:13:13 # permissões MAC address http_access allow iface1 http_access allow iface2 http_access allow iface3 10.12 Squid com autenticação Para ativas autenticação de usuários no squid, devemos localizar a linha: #auth_param basic program /usr/libexec/ncsa_auth /usr/etc/passwd E descomentá la, deixando assim: auth_param basic program /usr/bin/ncsa_auth /etc/squid/passwd Descomentar as seguintes linhas também: auth_param basic children 5 auth_param basic realm Digite sua senha auth_param basic credentialsttl 2 hours auth_param basic casesensitive off Feito isso é só salvar e fechar o arquivo. Agora devemos localizar o arquivo ncsa_auth: # find / name ncsa_auth Depois de localizá lo, copie o para o diretório /usr/bin: # cp /usr/sbin/ncsa_auth /usr/bin/ncsa_auth Criando usuários do Squid Agora devemos criar o arquivo onde ficarão os usuários e senhas. No arquivo de configuração especificamos que o arquivo onde ficarão os usuários e senha é /etc/squid/passwd. Então vamos criá lo: # cd /etc/squid # htpasswd c passwd aluno Onde: htpasswd : comando para criar o arquivo de senhas; c : parâmetro para criar o arquivo; passwd : nome do arquivo; aluno : usuário. Isto se faz só na primeira vez para criar o arquivo, depois é só digitar (sem o " c"):
9 # htpasswd passwd outro_usuário Cada vez que você criar um usuário ele vai pedir para que você digite a senha dele. Agora vamos reiniciar o Squid: # /etc/init.d/squid restart ou # squid k reconfigure O Squid já estará autenticando os usuários, agora deve se configurar o navegador das estações para usar proxy. 10.13 Ativando proxy transparente no Squid 2.6.x Para ativar o suporte a proxy transparente no Squid série 2.6 basta: 1) acessar o arquivo /etc/squid/squid.conf e alterar as seguinte linha: http_port 3128 para: http_port 192.168.0.1:3128 transparent Salvar e reiniciar o Squid normalmente. 2) adicionar a seguinte linha no firewall: # iptables t nat A PREROUTING d 192.168.0.0/24 p tcp dport 80 j REDIRECT to port 3128 O Squid já está com suporte a proxy transparente. 10.14 Ativando proxy transparente no Squid 2.4.x Se quisermos usar o squid.conf da série 2.4, devemos retirar as seguintes linhas: httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on