quinta-feira, 21 de março de 2019

Servidor proxy com Squid - Instalação e configuração

0 comentários

INSTALAÇÃO E CONFIGURAÇÃO BÁSICA

 
Squid, um servidor de Proxy, trabalha como saída principal da rede. Com isso, podemos centralizar nosso foco em segurança (políticas de acesso, autenticação, etc.) em uma única máquina. 

O Squid trabalha com os principais protocolos da Internet, alguns deles são: HTTP, HTTPS, FTP. 

O Squid é um Software Livre licenciado pela GPL, sua utilização pode nos trazer várias vantagens, como:
  • Autenticação;
  • Controle de acesso;
  • Cache;
  • Controle centralizado;
  • Registros de acesso, etc.

Ele também atua como Proxy transparente evitando que usuários "espertinhos" possam burlar o controle de acesso. 

Bem, chega de teoria e vamos começar o trabalho. Este tutorial é voltado à distribuições baseadas no Debian

O Squid é formado de um único pacote, o que torna sua instalação extremamente fácil: 

# apt-get install squid 

Depois que instalamos o Squid, vamos renomear o arquivo de configuração para criarmos um do zero: 

# mv /etc/squid/squid.conf /etc/squid/squid.conf.orig
# pico /etc/squid/squid.conf
 

Vamos criar uma configuração básica no arquivo, adicionando as seguintes linhas: 

http_port 3128
visible_hostname KORZOS 

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 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT 

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports 

acl redelocal src 192.168.0.0/24 

http_access allow localhost
http_access allow redelocal
http_access deny all


Depois, dê um: 

# /etc/init.d/squid restart 

...Que seu Squid já deve estar em pleno funcionamento. 

ENTENDENDO A CONFIGURAÇÃO

Agora, precisamos descobrir para que serve cada uma destas linhas:
  • http_port 3128: Define em qual porta o Squid vai atuar, a porta default é a 3128, mas podemos definir qualquer outra porta.
  • visible_hostname KORZOS: Define o nome do servidor, lembre-se de substituir o "KORZOS" pelo nome do seu servidor.
  • acl all src 0.0.0.0/0.0.0.0: Esta linha cria uma ACL, uma política de acesso com nome "all" contendo qualquer IP.
  • acl localhost src 127.0.0.1/255.255.255.255: Aqui criamos uma ACL de nome "localhost" contendo localhost.
  • acl SSL_ports port 443 563: Cria a ACL contendo as portas que são utilizadas no protocolo HTTPS.
  • acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535: Cria a ACL contendo as portas de diversos protocolos conhecidos na Internet.
  • acl manager proto cache_object: Cria a ACL manager do tipo proto.
  • acl purge method PURGE : Cria a ACL manager do tipo method.
  • acl CONNECT method CONNECT: Cria a ACL CONNECT também do tipo method.
  • http_access allow manager localhost: Libera a ACL manager e localhost.
  • http_access deny manager : Bloqueia a ACL manager.
  • http_access allow purge localhost: Libera a ACL purge e localhost
  • http_access deny purge: Bloqueia a ACL purge.
  • http_access deny !Safe_ports: Esta linha se torna bastante interessante pelo uso da "!", pois ela bloqueia qualquer conexão que não contenha o conteúdo da ACL Safe_Ports.
  • http_access deny CONNECT !SSL_ports: Bloqueia qualquer conexão que não esteja no conteúdo da ACL SSL_ports.
  • acl redelocal src 192.168.0.0/24: Cria a ACL redelocal contendo a faixa de endereço da rede.
  • http_access allow localhost: Libera a ACL localhost.
  • http_access allow redelocal: Libera a ACL redelocal.
  • http_access deny all: Bloqueia a ACL all

INCORPORANDO - ADICIONANDO O CACHE

 

INCORPORANDO UM POUCO

Bem, depois que entendemos como funciona e para que serve essas linhas de configurações, vamos incorporar um pouco o nosso Squid. 

Adicione as seguintes linhas em seu arquivo: 

# Esta opção manda o Squid buscar os dados diretamente na origem, ela é referente ao conteúdo dinâmico, se a URL conter algum padrão aqui especificado ela irá direto a origem buscar o conteúdo.
hierarchy_stoplist CGI-bin ? 

# Define o caminho das páginas de erro do squid.
error_directory /usr/share/squid/errors/Portuguese 

# Define o e-mail que vai aparecer na página de erro do Squid, assim o usuário terá mais informações para interagir com o responsável.
cache_mgr admin@seu_dominio.com.br 

# Esta ACL é responsável por não armazenar conteúdo CGI em cache.
acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY


ADICIONANDO O CACHE

As próximas linhas são referentes às configurações do cache. 

# Define a quantidade de memória RAM reservada para o uso do Squid.
cache_mem 64 MB 

# Esta linha é responsável por limitar o tamanho dos arquivos que serão armazenados no cache da memória RAM.
maximum_object_size_in_memory 64 KB 

# Aqui definimos o tamanho máximo e mínimo respectivamente dos arquivos que serão armazenados no cache do HD.
maximum_object_size 512 MB
minimum_object_size 0 KB 

# Com essas duas linhas podemos definir a porcentagem de atualização do cache, estamos dizendo que quando o cache chegar em 95% o Squid irá apagar os arquivos mais antigos até chegar a 90%.
cache_swap_low 90
cache_swap_high 95 


# Nessa linha conseguimos definir o tamanho e alguns parâmetros do cache feito em HD, a linha é composta por quatro valores, o 1º define o caminho do cache (/var/spool/squid), o 2º o tamanho que será alocado em MB para o cache (2Gb), o 3º a quantidade de diretórios criados para o cache (16) e o 4º é o numero de subdiretórios que serão criados. Se você possuir bastante espaço em disco e quiser armazenar os arquivos por mais tempo, aumente a opção do tamanha do cache.
cache_dir ufs /var/spool/squid 2048 16 256 


# Define onde serão armazenados os registros de log do Squid.
cache_access_log /var/log/squid/access.log 


refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280


Essas três últimas linhas definem o intervalo de atualização do cache, ou seja, de quanto em quanto tempo o Squid irá aguardar antes de verificar se algum arquivo em cache foi alterado em seu local original (um download ou uma pagina Web, por exemplo). 

Mas é importante lembrar que estas três linhas sempre terão que ser usadas em conjunto, se você omitir uma delas, a configuração não entrará em vigor. 

O Squid faz uso destes valores para verificar se os objetos armazenados são os mais recentes, ou há a necessidade de atualizá-los. Não há necessidade de mudança nestes valores. 

Depois, reinicie o Squid para ativar as configurações: 

# /etc/init.d/squid restart 

CRIANDO E ENTENDENDO AS ACLS

 
Depois que demos um upgrade em nosso Squid, é hora de criar as políticas de acesso (os bloqueios). 

Antes de começar, é importante lembrar que o Squid trabalha de forma hierárquica, ou seja, ele lê as regras em uma sequência lógica. Se você diz que ele deve bloquear a URL que contenha a palavra "sexo" e depois mandar liberar, a URL continuará bloqueada, pois quando ele se encaixa em uma determinada regra, ele não "lê" as demais. Bem, mãos à massa. 

Obs.: Nos exemplos a seguir, utilizarei como exemplo somente as ACLs do tipo: src e time. 

Por questão de organização, é bom criar arquivos com o conteúdo a ser trabalho para não poluir o ".conf": 

Neste arquivo, iremos adicionar palavras que serão bloqueadas, como: sexo, porno... 

# pico /etc/squid/palavras_bloqueadas.txt 

Neste arquivo, serão adicionados os sites que não terão acesso, como: 4shared.com, rapidshare.com, megavideo.com, filesonic.com, etc: 

# pico /etc/squid/sites_bloqueados.txt 

Aqui, iremos colocar as redes sociais, como: facebook.com, orkut.com, twiter.com, etc: 

# pico /etc/squid/redes_sociais.txt 

Neste arquivo, iremos colocar os IPs das máquinas dos gerentes (e "daquela" estagiária que entrou semana passada...:)): 

# pico /etc/squid/ips_liberados.txt 

Lista de sites adultos: redtub, xvideos 

# pico /etc/squid/sites_porno.txt 

Este arquivo limita os tipos de arquivos que serão baixados, tudo que contiver neste arquivo será bloqueado. Exemplos: .avi$, .mp3$, .wmv$: 

# pico /etc/squid/formato_arquivo.txt 

Pronto, depois dos arquivos criados e preenchidos, é hora de criar as ACLs: 

acl rede_local src 192.168.0.0/24
acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt "
acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt "
acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt"
acl liberados src "/etc/squid/ips_liberados.txt "
acl porno url_regex -i "/etc/squid/sites_porno.txt "\e acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt"
acl horario_almoco time 12:00-13:00 

http_access allow liberados
http_access allow redes_sociais horario_almoco
http_access deny redes_sociais
http_access deny sites_bloqueados
http_access deny palavras_bloqueadas
http_access deny porno
http_access deny formato_arquivo
http_access allow rede_local


Depois de adicionar estas linhas no "squid.conf", é só reiniciar para que elas entrem em vigor: 

# /etc/init.d/squid restart 

Agora, vamos entender o funcionamento destas ACLs. No exemplo acima, criamos um modelo meio que padrão, no primeiro "parágrafo" criamos as ACLs e no segundo, liberamos ou bloqueamos as mesmas de acordo com nossa política. 

Vamos dissecar linha por linha:
  • acl rede_local src 192.168.0.0/24 -> Cria a ACL rede_local contendo a faixa de endereço da rede local.
  • acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt " -> Cria a ACL palavras_bloqueadas contendo as palavras proibidas que estão no arquivo descrito.
  • acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt " -> Cria a ACL sites_bloqueados contendo os sites proibidos que estão no arquivo descrito.
  • acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt" -> Cria a ACL redes_sociais contendo os sites de redes sociais que estão no arquivo descrito.
  • acl liberados src "/etc/squid/ips_liberados.txt " -> Cria a ACL liberados contendo endereços de IP que estão no arquivo descrito.
  • acl porno url_regex -i "/etc/squid/sites_porno.txt " -> Cria a ACL porno contendo os sites pornôs que estão no arquivo descrito.
  • acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt" -> Cria a ACL formato_arquivo contendo os tipos de arquivos que serão bloqueados que estão no arquivo descrito.
  • acl horario_almoco time 12:00-13:00 -> Cria a ACL horario_almoco do horário de meio dia há uma da tarde.

Aqui que a mágica acontece, a ordem sobre como você organiza as ACLs, é que faz toda a diferença, vamos lá: 

http_access allow liberados


Aqui, nós liberamos acesso total para os IP’s que estiverem no arquivo que criamos anteriormente. 

http_access allow redes_sociais horario_almoco
http_access deny redes_sociais


Nestas linhas, permitimos que qualquer usuário acesse os sites de redes sociais que estiverem no arquivo que criamos dentro do horário de 12:00 as 13:00, após esse horário, o acesso é bloqueado. 

http_access deny sites_bloqueados


Bloqueia o acesso aos sites que estiverem no arquivo criado dentro da ACL 'sites_bloqueados'. 

http_access deny palavras_bloqueadas


Bloqueia o acesso à palavras que estiverem no arquivo criado dentro da ACL 'palavras_bloqueadas'. 

http_access deny porno


Bloqueia o acesso aos sites pornos que estiverem no arquivo criado dentro da ACL 'porno'. 

http_access deny formato_arquivo


Bloqueia o acesso a downloads que forem do tipo de arquivo contido no arquivo criado na ACL 'formato_arquivo'. 

http_access allow rede_local


Se o acesso não se encaixou em nenhuma das regras acima e for proveniente da rede interna, ele é liberado. 

CONFIGURAÇÃO FINAL

 
Bem pessoal, depois de tudo isso, vamos ver como ficou nosso arquivo "squid.conf": 

http_port 3128
visible_hostname KORZOS 

error_directory /usr/share/squid/errors/Portuguese 

hierarchy_stoplist CGI-bin ? 

cache_mgr admin@seu_dominio.com.br 

acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY 

cache_mem 64 MB
maximum_object_size_in_memory 64 KB
maximum_object_size 512 MB
minimum_object_size 0 KB
cache_swap_low 90
cache_swap_high 95
cache_dir ufs /var/spool/squid 2048 16 256
cache_access_log /var/log/squid/access.log 

refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280 

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 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT 

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports 

acl rede_local src 192.168.0.0/24
acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt "
acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt "
acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt"
acl liberados src "/etc/squid/ips_liberados.txt "
acl porno url_regex -i "/etc/squid/sites_porno.txt "
acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt"
acl horario_almoco time 12:00-13:00 

http_access allow liberados
http_access allow redes_sociais  horario_almoco
http_access deny redes_sociais
http_access deny sites_bloqueados
http_access deny palavras_bloqueadas
http_access deny porno
http_access deny formato_arquivo
http_access allow rede_local
http_access allow localhost 

http_access deny all


Bem, é isso aí! 

Espero que tenha ficado claro e que todos entendam. Qualquer coisa, é só deixar um comentário. 

Leave a Reply