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):
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
[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?
[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.
[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!
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!
[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).