Squid-in-the-middle - Bloqueando sites HTTPS no Squid

Publicado por Delton em 20/11/2013

[ Hits: 24.980 ]

 


Squid-in-the-middle - Bloqueando sites HTTPS no Squid



Sites como o Facebook, a muito tempo tem usado o protocolo HTTPS. Com HTTPS, informações como protocolo e caminho estão criptografadas e o Squid não tem acesso a elas.

A partir da versão 3.1 o Squid, pode ser configurado para funcionar como man-in-the-middle (homem do meio), ou seja, decodificar o tráfego para analisá-lo com os recursos do Squid. Assim, podemos, enfim, bloquear Facebook e similares, mesmo quando acessados por HTTPS.

Nesta dica, utilizei a versão 3.3.10 do Squid. Ela pode ser obtida em:
Foi necessário compilar o Squid com as seguintes diretivas:
  • --enable-ssl
  • --enable-ssl-crtd

Não vou entrar em detalhes sobre a compilação, pois este não é o foco da dica.

É necessário criar um certificado raiz auto-assinado. Este certificado será usado pelo Squid para gerar certificados dinâmicos. Este certificado torna-se um certificado raiz e você se torna uma CA raiz.

Se o certificado for comprometido, qualquer usuário confiando (conscientemente ou não) no seu certificado raiz, não pode ser capaz de detectar ataques man-in-the-middle orquestrados por terceiros.

Criar o diretório para armazenar o certificado (a localização exata não é importante):

# cd /etc/squid3
# mkdir ssl_cert
# cd ssl_cert


Criar certificado auto-assinado (você será solicitado a fornecer informações que serão incorporados em seu certificado):

# openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout empresa.pem -out empresa.pem

Criar uma versão para ser importada no Browser do usuário:

# openssl x509 -in empresa.pem -outform DER -out empresa.der

O arquivo empresa.der deve ser importado nos navegadores dos usuários. Caso contrário, será exibida a mensagem de certificado inválido ao acessar um site HTTPS.

Editar squid.conf:

http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid3/ssl_cert/empresa.pem
always_direct allow all
ssl_bump server-first all

sslcrtd_program /usr/src/squid-3.3.10/src/ssl/ssl_crtd -s /etc/squid3/ssl_cert/ssl_db -M 4MB
sslcrtd_children 5

Ajustar o diretório para cache de certificados:

# /usr/src/squid-3.3.10/src/ssl/ssl_crtd -c -s /etc/squid3/ssl_cert/ssl_db

O comando acima inicializa o banco de dados para armazenar certificados SSL em cache.

Depois de inicializado o DB SSL, é necessário ajustar as permissões do arquivo:

# chown -R proxy /etc/squid3/ssl_cert/ssl_db

Pronto, o Squid está configurado para inspecionar o tráfego HTTPS. Agora podemos criar uma ACL para bloquear os sites que desejarmos:

acl block dstdomain "/etc/squid3/sites"
http_access deny block

O arquivo /etc/squid3/sites deve conter os domínios que serão bloqueados, por exemplo:

.facebook.com
.youtube.com

Ao acessar http://www.facebook.com ou https://www.facebook.com, o acesso será negado.

Outras dicas deste autor

Monitorar o Messenger com o MSN-Proxy

Bloqueando o Ultrasurf

Leitura recomendada

Login automático no Ubuntu

Boot Ubuntu 9.10 e Windows 7

Instalando programas no Linux sem ter poderes de root

Nem todas as janelas maximizadas no UNR

Exibindo comandos em apresentações através do Screenkey

  

Comentários
[1] Comentário enviado por hiancintra em 20/11/2013 - 17:27h

Cara show de bola esse tutorial, há tempos procurava algo assim!!
Só me ficou uma dúvida, nesse caso, utilizando Squid como proxy transparente a regra se aplica também? Caso positivo devo redirecionar no meu firewall o tráfego da porta 443 pra 3128 também?

Abraços e parabéns!

[2] Comentário enviado por tiekookeit em 21/11/2013 - 16:54h

Parabéns Delton e obrigado pela dica, a tempo espero esta notícia e somente soube por ti. Valeu mesmo!

Hiancintra, pelo o que pesquisei (http://tektab.com/2012/09/28/squid-transparent-proxy-for-https-ssl-traffic/) tem que redirecionar a porta 443 também, um detalhe é que a porta transparente http normal é uma geralmente 3128 e a transparente pelo que entendi será outra, no caso sugere-se 3130.

Abraço!

[3] Comentário enviado por tiekookeit em 21/11/2013 - 17:09h

Acho que me enganei, estou testando os dois e são soluções diferentes, a descrita aqui é mais legal que a proposta no blog que linkei. Double Gz for you!

[4] Comentário enviado por j_bonetti em 21/04/2014 - 11:41h

No Centos eu nao consigo implementar está solução por que nao encontro os arquivos ssl_cert e ssl_db, alguém pode me ajudar


Obrigado

[5] Comentário enviado por sanderethx em 22/05/2014 - 17:06h

Algumas correções para quem está com o SLACKWARE 14.1, eu resolvi dessa forma:
baixei a versão 3.3.12 do Squid no próprio site

compilei com os seguintes parâmetros:
--prefix=/usr \
--sysconfdir=/etc/squid \
--localstatedir=/var/squid \
--libdir=/usr/lib64 \
--mandir=/usr/man \
--docdir=/usr/doc/squid \
--build=x86_64-slackware-linux \
--enable-dependency-tracking \
--enable-shard \
--disable-static \
--enable-icmp \
--enable-delay-pools \
--enable-kill-parent-hack \
--enable-ssl \
--enable-ssl-crtd \
--enable-cache-digests \
--enable-default-err-language=pt-br \
--enable-linux-netfilter \
--with-gnu-ld \
--with-default-user=squid \
--with-pthreads \
--with-large-files

depois, make e make install

NO FIREWALL
reencaminhei a porta 80 para a porta 3128
iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

reencaminhei a porta 443 para a porta 3129
iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp --dport 443 -j REDIRECT --to-port 3129

NOS ARQUIVOS
Criei a pasta certificado dentro da pasta squid
mkdir /etc/squid/certificado

dentro desta pasta, criei o certificado para o servidor:
cd /etc/squid/certificado
openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout empresa.pem -out empresa.pem

E o certificado para ser instalado no navegador dos clientes do servidor
openssl x509 -in empresa.pem -outform DER -out empresa.der

criei o DB:
/usr/libexec/ssl_crtd -c -s /etc/squid/certificado/ssl_db

Dei a permissão ao DB para o usuário squid (usuário squid no meu caso conforme parâmetros de instalação)
chown -R squid /etc/squid/certificado/ssl_db

NO SQUID.CONF
Adicionei no squid.conf as seguintes linhas:
http_port 3128 transparent #porta http de modo transparent
https_port 3129 transparent ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/certificado/empresa.pem
ssl_bump server-first all
always_direct allow all
sslcrtd_program /usr/libexec/ssl_crtd -s /etc/squid/cerificado/ssl_db

Criei uma acl (inseri dentro do arquivo dessa o facebook, imo.im e o twitter)
acl sites_bloqueados dstdomain "/etc/squid/listas/sites-bloqueados"

nego o acesso ao conteúdo da acl
http_access deny sites_bloqueados

NOS COMPUTADORES CLIENTES
instalei o certificado (empresa.der) nos clientes do servidor e aí sim funcionou!


Abraços!

[6] Comentário enviado por marceliinbrasil em 07/06/2017 - 12:06h

Prezados, quando uso essa configuração no Firewall:

O FIREWALL
reencaminhei a porta 80 para a porta 3128
iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

reencaminhei a porta 443 para a porta 3129
iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp --dport 443 -j REDIRECT --to-port 3129

e reencaminho tudo para a porta 3129 como no exemplo, eu deixo de verificar o certificado SSL válido?
Eu consigo redirecionar para a página de bloqueio, como acontece na porta 3128?


[7] Comentário enviado por joaovol em 12/09/2018 - 16:44h

Opa, sei que o tópico é antigo, porém ainda funcional. Segui o procedimento passado. Bloqueia tranquilamente, mas quando eu atualizo a página ela passa tranquilamente. Usei a versão do Squid3.3.8 recompilado (caso necessitem posto meu squid.conf).



Contribuir com comentário