Filtrando conexões SSL com Squid

Vamos abordar uma configuração no Squid que auxiliará na filtragem de conteúdo protegido por SSL.

Primeiro vamos verificar como está nossa instalação e alterar algumas configurações.

vamos descobrir se temos o que é necessário

squid -v |grep ssl

a resposta esperada é um conteúdo de vários parâmetros, incluindo ‘–with-openssl’ ‘–enable-ssl-crtd’ nesta lista, caso isso não acontecer, vamos partir para uma alteração na instalação.

1 – Gerar um backup do nosso arquivo configurado anteriormente.

sudo cp /etc/squid/squid.conf ~/squid.conf_bkp

Este comando vai fazer uma cópia do arquivo squid.conf no diretório do usuário que estiver utilizando.

2 – Remover o squid que está instalado

sudo apt remove squid –purge

Este comando vai remover totalmente o squid e suas configurações do sistema operacional.

3 – Instalar o pacote que vai nos auxiliar na configuração, já habilitando o openssl e ssl-crtd que precisamos para o monitoramento de conexões SSL.

sudo apt install squid-openssl

Este comando vai trazer o pacote pré-compilado do squid que contem tudo que precisamos para iniciar os trabalhos, evitando que tenhamos que fazer a compilação manual e correr o risco de faltar com algum parâmetro.

4 – Criar o certificado autoassinado que usaremos para o filtro

Você será solicitado a preencher os campos do certificado SSL autoassinado.

cd /etc/squid

sudo openssl req -new -newkey rsa:2048 -days <período de validade do certificado em dias> -nodes -x509 -keyout bump.key -out bump.crt

O arquivo de certificado bump.crt e o arquivo de chave privada bump.key serão criados no formato PEM.

O arquivo de chave privada deve ser armazenado em um local seguro para impedir o acesso não autorizado ao tráfego.

5 – Converta o arquivo de certificado em um certificado confiável no formato DER para que possa ser importado para um navegador. Para fazer isso, execute o comando:

sudo openssl x509 -in bump.crt -outform DER -out bump.der

6 – Importe o arquivo bump.der para a lista de autoridades de certificação raiz confiáveis nos computadores dos usuários.

Ao usar determinados navegadores (como o Mozilla Firefox), também é preciso adicionar o certificado ao armazenamento do navegador.

O certificado SSL autoassinado será criado.

Podemos fazer a cópia do arquivo bump.der utilizando um programa cliente FTP como, Filezilla e WinSCP, assim que tiver este certificado na maquina, mova para um pendrive para poder levar à todas as maquinas que passam pelo proxy para navegar.

7 – Gere o arquivo de configurações para o algoritmo Diffie-Hellman. Para fazer isso, execute o comando:

sudo openssl dhparam -outform PEM -out /etc/squid/bump_dhparam.pem 2048

Configure as permissões para usar um arquivo de certificado SSL. Para fazer isso, execute os seguintes comandos, dependendo do sistema operacional utilizado:

  • Ubuntu ou Debian:

sudo chown proxy:proxy /etc/squid/bump*

sudo chmod 400 /etc/squid/bump*

8 – Determine a versão do serviço Squid que está sendo usada no servidor. Para fazer isso, execute o comando:

squid -v

As informações sobre a versão utilizada são exibidas no formato Squid Cache: Version <versão>.

9 – Interrompa o serviço Squid se ele estiver em execução. Para fazer isso, execute o comando:

sudo systemctl stopsquid

Para Squid versão 4x ou superior:

Crie um diretório para o banco de dados do certificado e inicialize o banco de dados. Para fazer isso, execute os seguintes comandos, dependendo do sistema operacional utilizado:

  • Ubuntu ou Debian:

sudo mkdir -p /var/lib/squid

sudo rm -rf /var/lib/squid/ssl_db

sudo /usr/lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 20MB

sudo chown -R proxy:proxy /var/lib/squid

No arquivo de configuração /etc/squid/squid.conf, faça as seguintes alterações:

Ubuntu ou Debian:

Crie as entradas antes de http_port

##Parametros para habilitar o monitoramento SSL
acl step1 at_step SslBump1
acl intermediate_fetching transaction_initiator certificate-fetching
http_access allow intermediate_fetching
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 20MB
sslcrtd_children 5
sslproxy_cert_error allow all
#sslproxy_cert_error deny all
ssl_bump stare all
ssl_bump bump all

Substitua a diretiva http_port pelo seguinte:

http_port 3128 tcpkeepalive=60,30,3 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB tls-cert=/etc/squid/bump.crt tls-key=/etc/squid/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3 tls-dhparams=prime256v1:/etc/squid/bump_dhparam.pem

10 – Inicie o serviço do Squid

sudo systemctl start squid

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start ‘squid.service’.
Authenticating as: Paulo Sa (paulo)
Password:
==== AUTHENTICATION COMPLETE ===

Será solicitada a senha do usuário para ativar o serviço de autenticação no Squid

Um exemplo de arquivo de configuração do squid.conf

# /etc/squid/squid.conf
# By Paulo Sa
#
# Porta padrão do Squid
#http_port 3128

##Parametros para habilitar o monitoramento SSL
acl step1 at_step SslBump1
acl intermediate_fetching transaction_initiator certificate-fetching
http_access allow intermediate_fetching
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 20MB
sslcrtd_children 5
sslproxy_cert_error allow all
#sslproxy_cert_error deny all
ssl_bump stare all
ssl_bump bump all

# HTTPS interception direct proxy
http_port 3128 tcpkeepalive=60,30,3 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB tls-cert=/etc/squid/bump.crt tls-key=/etc/squid/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3 tls-dhparams=prime256v1:/etc/squid/bump_dhparam.pem

# Está porta é usada para troca de informações entre servidores proxy.
# Não use o ICP se você tem um único proxy-pai que você sempre usa.
# Para desabilitar, basta colocar um 0. Padrão: 3130
icp_port 0

# Especifica o número da porta através do qual o Squid irá receber e enviar requisições HTCP de e para caches vizinhos.
# Para desabilitar, colocar 0. O padrão é 4827.
htcp_port 0

# Esta ACL diz ao squid para não armazenar em cache o conteúdo dos CGI’s, por tratar-se de conteúdo dinâmico
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

# Quantidade de memória usada pelo squid
cache_mem 256 MB

# Quando o cache chega no limite, automaticamente ele esvazia o cache
cache_swap_low 80
cache_swap_high 85

# Tamanho máximo para gravação no cache squid
maximum_object_size 64 MB

# Tamanho mínimo para gravação no cache squid
minimum_object_size 0 KB

# Tamanho maximo dos objetos mantidos em memória.
maximum_object_size_in_memory 128 KB
ipcache_size 3072
ipcache_low 90
ipcache_high 93

# política de substituição dos objetos quando se esgota o espaço destinado ao cache em disco.
# lru: mantém os objetos referenciados recentemente.
# heap GDSF: otimiza o “hit rate” por manter objetos pequenos e populares no cache, guardando assim um numero maior de objetos.
# heap LFUDA: otimiza o “byte hit rate” por manter objetos populares no cache sem levar em conta o tamanho.
# Se for utilizado este, o maximum_object_size devera ser aumentado para otimizar o LFUDA.
cache_replacement_policy heap LFUDA

# define a política de substituição dos objetos em memória da mesma forma como o cache_replacement_policy
memory_replacement_policy heap GDSF

# Esta TAG determina onde e como serão feitos 4 caches de 500 MiB, totalizando 2GiB.
cache_dir ufs /var/spool/squid/cache1 500 16 256
cache_dir ufs /var/spool/squid/cache2 500 16 256
cache_dir ufs /var/spool/squid/cache3 500 16 256
cache_dir ufs /var/spool/squid/cache4 500 16 256

# Log de requisitares.
cache_access_log /var/log/squid/access.log
# Log do cache.
cache_log /var/log/squid/cache.log
# Log de objetos guardados. Pode ser desativado.
cache_store_log none

# Pode ser usada para especificar uma lista de servidores DNS no lugar no /etc/resolv.conf dns_nameservers Endereço_IP
# Não esquecer de trocar a faixa de dns pela da sua faixa.
dns_nameservers 8.8.8.8
dns_nameservers 2.2.2.1

# Estas opções são o padrão do Squid e configuram como serão tratados os tempos de vida dos objetos no cache
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320

# O cache pode ser configurado para continuar com o download de requisições abortadas
quick_abort_min 0 KB
quick_abort_max 0 KB
quick_abort_pct 100

# Tempo de vida para requisições falhas. Certos tipos de erros (como
# conexão recusada ou página não encontrada) são marcados como
# “sem-cache” por um determinado tempo. Padrão de 5 minutos
negative_ttl 3 minutes

# Tempo de vida para resultados bem sucedidos de resolução DNS. Se você
# realmente precisar alterar esse valor, não deixe inferior a 1 minuto.
# Padrão de 6 horas.
positive_dns_ttl 5 minutes

# Nem sempre o Squid não consegue diferenciar conexões TCP totalmente fechadas e parcialmente fechadas.
# Mudando essa opção para off fará com que o Squid imediatamente feche a conexão quando a leitura do socket
# retornar “sem mais dados para leitura”
half_closed_clients off

# Estas ACL’s fazem parte da configuração padrão do Squid e é o mínimo recomendável para seu uso não sendo necessária nenhuma alteração.
#acl manager proto cache_object
acl SSL_ports port 443 563
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 CONNECT method CONNECT

# —- Cache para aceleração do Windows Update —-
refresh_pattern au.download.windowsupdate.com/.*\.(cab|exe|msi) 10080 100% 43200 store-stale
refresh_pattern download.microsoft.com/.*\.(cab|exe|msi) 10080 100% 43200 store-stale
refresh_pattern msgruser.dlservice.microsoft.com/.*\.(cab|exe|msi) 10080 100% 43200 store-stale
refresh_pattern windowsupdate.com/.*\.(cab|exe|msi) 10080 100% 43200 store-stale
refresh_pattern www.microsoft.com/.*\.(cab|exe|msi) 10080 100% 43200 store-stale

# Tags de Autenticação de usuários para monitoramento mais eficiente de conteúdos acessados
#auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
#auth_param basic children 5
#auth_param basic realm Squid Basic Authentication
#auth_param basic credentialsttl 2 hours
#acl auth_users proxy_auth REQUIRED
#http_access allow auth_users

#acl bad_urls dstdomain “/etc/squid/blacklisted_sites.acl”
#http_access deny bad_urls

#acl blockkeywordlist url_regex “/etc/squid/blockkeywords.lst”
#http_access deny blockkeywordlist

##Define o grupo de IPs que pode ter acesso a internet utilizando o Squid
# Se utilizarmos o squidGuard para garantir a segurança do conteúdo acessado, as configurações já estarão prontas.
url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
# Em caso de bloqueio pelo próprio Squid, podemos usar arquivos de referência como este de bloqueio chamado block.txt atribuindo uma ACL de identificação de domínios.
acl rede src 192.168.15.0/24
#acl bloqueio dstdomain “/etc/squid/block.txt”
#acl autenticado proxy_auth REQUIRED
http_access allow localhost
#http_access deny bloqueio
http_access allow rede

# Definição de regras de acesso referentes as ACL’s da parte da configuração
# padrão do Squid, também não é necessária nenhuma alteração, portanto apenas
# acrescente as suas próprias regras a estas;
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

# esta regra diz ao Squid que se nenhuma das regras anteriores for aplicada o acesso será então negado
http_access deny all

# Permite o acesso a porta icp de acordo com a configuração feita na ACL all
# que no nosso caso representa qualquer origem. Está porta é usada para troca
# de informações entre servidores proxy.
# Não use o ICP se você tem um único proxy-pai que você sempre usa.
# icp_access allow rede

# Usuario sob o qual ira rodar o Squid.
cache_effective_user proxy
# Grupo sob o qual ira rodar o Squid.
cache_effective_group proxy

#Mostra o nome do servidor configurado nas mensagens de erro
visible_hostname proxy

# Desligando essa variável, faz com que o squid descarregue a memória não
# utilizada, chamando uma função interna free() do squid, ao invés de ficar
# com ela para futuras operações.
memory_pools off

#Por padrão o Squid irá incluir o IP ou nome da sua máquina nas solicitações HTTP.
#Ele irá saber o IP da sua máquina interna como também saber qual classe ip você usa internamente.
#Para o site visitado não interessa para ele qual seu ip interno, o importante é que você visitou o site.
forwarded_for off
forward_max_tries 25

# Apresenta as mensagens de erro em Português Brasil
error_directory /usr/share/squid/errors/pt-br

# Por padrão o Squid já possui essa configuração como ativa. Ela serve para não colocar no log os
# parâmetros que são passados junto ao endereço acessado pelo usuário. Assim garante a privacidade.
# As vezes quando se usa filtro por palavras e um site apresenta acesso negado é interessante setar
# essa opção como off para verificar no log o endereço completo.
strip_query_terms off

# Local para gravar os arquivos core em caso de falhas do squid (/var/spool/squid)
# ou Evitar que sejam feitos coredumps (none).
coredump_dir none

# Resolve um problema com conexões persistentes que ocorre com certos servidores,
# e que provoca delays em nosso cache.
detect_broken_pconn on

################ Fim da edição, pode salvar o arquivo################