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

Publicado por Delton em 20/11/2013

[ Hits: 25.072 ]

 


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

Backtrack 5 - Problemas de inicialização do modo gráfico

Instalando e Configurando o Google Earth

Xorg não sobe com usuário normal no Gentoo [Resolvido]

Boot mais rápido após Gnome SlackBuild

Resolvendo de vez os erros envolvendo arquivos .save em /etc/apt/sources.list.d

  

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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts