Squid3 com bloqueio HTTPS [que realmente funciona] - Versão 3.5.22

Este é um tutorial atualizado e funcional, no que se refere à instalação e configuração do Squid3 para bloqueio real de páginas HTTPS. O ambiente usado foi o Debian 7 e o Squid3.

[ Hits: 24.243 ]

Por: marlon em 16/01/2017


Instalação, compilação e configuração



Olá, este é meu primeiro artigo no VOL e resolvi fazê-lo devido à falta de um tutorial atualizado e que realmente funcione, no que se refere à instalação e configuração do Squid3 para bloqueio real de páginas HTTPS.

O ambiente usado foi o Debian 7.11.0 instalado a partir da mídia debian-7.11.0-i386-netinst (também funciona na x64), e o Squid3 foi compilado a partir do arquivo squid-3.5.22.tar.gz disponível no site:

Instalando/compilando e configurando o Squid3

Obs.: todos comando foram executados com o usuário root.

Com o SO Debian recém instalado e apenas com SSH rodando, para facilitar a inserção de comandos usando a putty, a primeira coisa é baixar os pacotes necessários para compilar o Squid3 (famosos "Build-Depends") com o seguinte comando:

# apt-get build-dep squid3

Além dos pacotes que serão instalado acima, mais dois devem ser instalados segundo a documentação do Squid:

# apt-get install build-essential libssl-dev

Feito isso, você deve baixar o arquivo fonte do Squid3:

# wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.22.tar.gz

Descompacte o arquivo:

# tar xvzf squid-3.5.22.tar.gz

Entre no diretório:

# cd squid-3.5.22

Execute o seguinte comando para fazer a configuração o make e o make install do Squid:

# ./configure --prefix=/usr --localstatedir=/var --libexecdir=${prefix}/lib/squid --datadir=${prefix}/share/squid --sysconfdir=/etc/squid --with-default-user=proxy --with-logdir=/var/log/squid --with-pidfile=/var/run/squid.pid --enable-ssl --enable-ssl-crtd --with-openssl && make && make install

Obs.: o comando acima foi retirado da documentação "Compilando o Squid" acrescido dos parâmetros "--enable-ssl --enable-ssl-crtd --with-openssl" solicitados Features/DynamicSslCert - Squid Web Proxy Wiki, que são essenciais ao correto funcionamento do Squid3 para bloqueio de HTTPS.

Dependendo da sua configuração de hardware, esse procedimento pode demorar muito, aqui demorou uns 30 minutos.

Abra esse link no navegador e copie o conteúdo:
Depois disso, crie o arquivo /etc/init.d/squid:

# nano /etc/init.d/squid

Cole o conteúdo copiado acima e salve (se estiver usando o putty e só clicar com o botão direito que ele já cola automaticamente).

De permissão de execução para esse arquivo:

# chmod 755 /etc/init.d/squid

Entre no diretório de configuração:

# cd /etc/squid

Crie a pasta "ssl_cert", onde será criado o certificado:

# mkdir ssl_cert

Altere o dono da pasta:

# chown proxy:proxy ssl_cert

Mude as permissões da pasta:

# chmod 700 ssl_cert

Entre na pasta:

# cd ssl_cert

Crie o arquivo de certificado:

# openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem

Cria o arquivo de certificado para ser importado no navegador navegador:

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

Esse arquivo deve ser levado para o Windows, pois você vai importa-lo no navegador.

Prepare o diretório para fazer o cache de certificados:

# /lib/squid/ssl_crtd -c -s /etc/squid/ssl_db

Depois de inicializar o diretório, altere o dono para 'nobody':

# chown -R nobody /etc/squid/ssl_db

Altere seu arquivo /etc/squid.conf e deixe como segue:

http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/myCA.pem
sslcrtd_program /lib/squid/ssl_crtd -s /etc/squid/ssl_db -M 4MB
sslcrtd_children 5
cache_dir ufs /var/spool/squid 100 16 256
error_directory /share/squid/errors/pt-br

strip_query_terms off

acl bloqueado ssl::server_name .youtube.com

ssl_bump bump all
ssl_bump peek all
ssl_bump splice all

http_access deny bloqueado

http_access allow all

Cheque as configurações com o comando:

# squid -k parse

Pode ocorrer problemas com permissões negadas em alguma pasta, casso ocorra é só alterar o dono da pasta com:

# chown -R proxy:proxy caminho/da/pasta

Crie a pasta onde será salvo o cache e mude o dono:

# mkdir /var/spool/squid
# chown -R proxy:proxy /var/spool/squid

Inicie o cache com o comando:

# squid -z

Reinicie o squid:

# /etc/init.d/squid restart


Até aqui tudo deve funcionar corretamente, menos sites HTTPS, que devem dar a mensagem de erro de certificado.

Para resolver isso, é só importar o certificado para o navegador e após, todos sites HTTPS devem navegar normalmente, menos o youtube.com que nós bloqueamos no arquivo de configuração.

   

Páginas do artigo
   1. Instalação, compilação e configuração
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

SQUID autenticado - Bloqueando o acesso dos usuários por grupos

Squid Plus com AD, redirector, controle de banda e relatórios

SQUID e as autenticações em NTLM e RADIUS

Squid + Bridge + TProxy no CentOS 5.4

Integrando autenticação do Squid ao Active Directory

  
Comentários
[1] Comentário enviado por willianholtz em 19/01/2017 - 23:59h

Vou contribuir aqui com uma dica, porém é por Iptables, que eu acho muito melhor do que fazer recompilações de pacotes, porém uso arch linux, acredito que os comando abaixo sirvam para outras distros também!

O script a seguir BLOQUEIA tudo que for HTTPS:

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j DROP
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j ACCEPT
done

Caso deseje LIBERAR todo acesso HTTPs e apenas bloquear o que interessa faça o inverso:

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j DROP
done


Espero que sirva de ajuda caso o pessoal achei difícil o que o artigo ensina!

[2] Comentário enviado por SK5_RJ em 21/01/2017 - 18:59h


[1] Comentário enviado por willianholtz em 19/01/2017 - 23:59h

Vou contribuir aqui com uma dica, porém é por Iptables, que eu acho muito melhor do que fazer recompilações de pacotes, porém uso arch linux, acredito que os comando abaixo sirvam para outras distros também!

O script a seguir BLOQUEIA tudo que for HTTPS:

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j DROP
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j ACCEPT
done

Caso deseje LIBERAR todo acesso HTTPs e apenas bloquear o que interessa faça o inverso:

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j DROP
done


Espero que sirva de ajuda caso o pessoal achei difícil o que o artigo ensina!


Obrigado pela dica, não tinha pensado em algo simples e funcional como apresentou, voce indica algum livro de Iptables?

Obrigado pelo artigo! Vou criar um ambiente e testar!!


[3] Comentário enviado por wagnerfs em 23/01/2017 - 23:36h


[1] Comentário enviado por willianholtz em 19/01/2017 - 23:59h

Vou contribuir aqui com uma dica, porém é por Iptables, que eu acho muito melhor do que fazer recompilações de pacotes, porém uso arch linux, acredito que os comando abaixo sirvam para outras distros também!

O script a seguir BLOQUEIA tudo que for HTTPS:

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j DROP
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j ACCEPT
done

Caso deseje LIBERAR todo acesso HTTPs e apenas bloquear o que interessa faça o inverso:

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j DROP
done


Espero que sirva de ajuda caso o pessoal achei difícil o que o artigo ensina!


De fato essa solução é bem mais rápida em questão de processamento e efeito. De toda forma, parabéns pelo artigo e por ter contribuído o conhecimento.

[4] Comentário enviado por rafael_r em 25/01/2017 - 16:58h

Certa vez precisei efetuar estes bloqueios (https), via Squid não tive sucesso pois utilizava proxy transparente. A melhor solução que encontrei foi via iptables com o módulo de string. Não vou entrar em detalhes, mas tem vários artigos sobre isso aqui no VOL.

Por exemplo, bloquear o Facebook:
iptables -A FORWARD -m string --algo bm --string "facebook.com" -j DROP

No meu caso funcionou 100%

[5] Comentário enviado por SK5_RJ em 29/01/2017 - 18:07h


[4] Comentário enviado por rafael_r em 25/01/2017 - 16:58h

Certa vez precisei efetuar estes bloqueios (https), via Squid não tive sucesso pois utilizava proxy transparente. A melhor solução que encontrei foi via iptables com o módulo de string. Não vou entrar em detalhes, mas tem vários artigos sobre isso aqui no VOL.

Por exemplo, bloquear o Facebook:
iptables -A FORWARD -m string --algo bm --string "facebook.com" -j DROP

No meu caso funcionou 100%

Sim, Rafael, mas sempre existe alguem na empresa que quer acessar, sabe, algum diretor, gerente etc...
Então, tem existir uma forma; ao script acima so resta criar uma lista de exceção.

[6] Comentário enviado por rafael_r em 31/01/2017 - 14:06h


[5] Comentário enviado por SK5_RJ em 29/01/2017 - 18:07h


[4] Comentário enviado por rafael_r em 25/01/2017 - 16:58h

Certa vez precisei efetuar estes bloqueios (https), via Squid não tive sucesso pois utilizava proxy transparente. A melhor solução que encontrei foi via iptables com o módulo de string. Não vou entrar em detalhes, mas tem vários artigos sobre isso aqui no VOL.

Por exemplo, bloquear o Facebook:
iptables -A FORWARD -m string --algo bm --string "facebook.com" -j DROP

No meu caso funcionou 100%

Sim, Rafael, mas sempre existe alguem na empresa que quer acessar, sabe, algum diretor, gerente etc...
Então, tem existir uma forma; ao script acima so resta criar uma lista de exceção.



Exato!

[7] Comentário enviado por christianssouza em 01/03/2017 - 08:28h


[1] Comentário enviado por willianholtz em 19/01/2017 - 23:59h

Vou contribuir aqui com uma dica, porém é por Iptables, que eu acho muito melhor do que fazer recompilações de pacotes, porém uso arch linux, acredito que os comando abaixo sirvam para outras distros também!

O script a seguir BLOQUEIA tudo que for HTTPS:

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j DROP
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j ACCEPT
done

Caso deseje LIBERAR todo acesso HTTPs e apenas bloquear o que interessa faça o inverso:

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j DROP
done


Espero que sirva de ajuda caso o pessoal achei difícil o que o artigo ensina!


Olá estou tentando aplicar este comando porem está retornado o seguinte erro
Bad argument "^#"
Alguma dica ?
Obrigado

[8] Comentário enviado por jocelidownloads em 09/03/2017 - 17:25h

Excelente tutorial.

[9] Comentário enviado por oliverio em 10/05/2017 - 10:56h

Alguém seguiu esse tutorial e deu certo?

[10] Comentário enviado por leonardo.dss em 04/10/2017 - 13:32h

Boa tarde,

O link https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi?p=pkg-squid/pkg-squid3.git;a=blob_plain;...
não está disponivel. Existe outro?

[11] Comentário enviado por dinorma em 25/11/2017 - 10:10h

Excelente tutorial. Estou migrando agora do PFSense para o Debian. No PFSense a lentidão da captura de SSL estava deixando muito a desejar. Como tá rodando aí a de vocês? Resposta rápida ou também apresenta alguma lentidão ? Abs.

[12] Comentário enviado por jhonatanpalmer em 26/11/2017 - 18:32h

Obrigado por compartilhar teu conhecimento.
fiz os passos descritos porém na hora de iniciar o cache, squid -z, ele fica travado.
2017/11/26 18:25:30 kid1| Making directories in /var/spool/squid/0F
nao sai desse lugar, você também encontrou este erro?

Muito Obrigado!

[13] Comentário enviado por jhonatanpalmer em 26/11/2017 - 19:28h

Segue o Link, o que estava descrito não abriu, joguei o link no google, e encontrei ele:


https://gist.github.com/masonkmeyer/b91d27a0069fc2801e8787679372764d


[14] Comentário enviado por jhonatanpalmer em 27/11/2017 - 21:14h


[10] Comentário enviado por leonardo.dss em 04/10/2017 - 13:32h

Boa tarde,

O link https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi?p=pkg-squid/pkg-squid3.git;a=blob_plain;....
não está disponivel. Existe outro?



tente esse
https://gist.github.com/masonkmeyer/b91d27a0069fc2801e8787679372764d

[15] Comentário enviado por valcirborges em 07/06/2018 - 09:18h

Pessoal, implantei o Squid 3.5.20 (CentOS 7.4) com certificado aqui na empresa, conforme explica esse excelente tutorial. Os navegadores Internet Explorer e Firefox funcionam perfeitamente depois que instala o certificado na estação, o Opera alerta sobre site inseguro mas acessa, porém o tal google chrome não tem jeito, insiste em dizer que a conexão não é particular. Achei essa dica (https://support.google.com/chrome/a/answer/7391219?hl=pt) a respeito, porém só funciona até a versão 65. Gerei um novo certificado digital incluindo essa extensão subject alternative name com o nome do meu dominio ficando assim na aba Extensões do cerenciador de certificados: Nome DNS=dominio.com.br, no entanto não tem jeito dele acessar.

Alguém já conseguiu resolver isso? Alguma dica?

Obrigado a todos,

Valcir.

[16] Comentário enviado por supportware em 29/06/2018 - 00:56h

desculpe, acabei duplicando o comentário!

[17] Comentário enviado por supportware em 29/06/2018 - 00:57h

Estou usando uma VM VirtualBox com Debian 9 x64 com squid 3.5.23 e não entendi essa linha no tutorial: "# /lib/squid/ssl_crtd -c -s /etc/squid/ssl_db". Será que alguém pode me explicar do que se trata exatamente e se devo criar também esse diretório?

Se for para criar quais permissões devo dar a ele? pois já pesquisei e no meu squid esses diretórios não existem. Desde já muito obrigado!

[18] Comentário enviado por felipeparantes em 11/03/2019 - 10:02h

Olá Pessoal, bom dia. Usei o trecho de código abaixo e o bloqueio esta ocorrendo corretamente.

#!/bin/sh
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
for URL in `grep -v "^#" /home/temp/acl/listabranca`; do
iptables -I FORWARD -d $URL -p tcp --dport 443 -j DROP
done

Porém, sempre existe aquele exceção danada que temos que fazer. Para isso, coloquei o seguinte comando:

iptables -I FORWARD 1 -s 192.168.20.20 -p tcp --dport 443 -j ACCEPT

Porém, a regra criada por ele, fica abaixo das regras que bloqueiam e por isso não esta funcionando essa liberação para a exceção. Como posso fazer uma liberação de exceção com base no IP local.

Desde já, agradeço a atenção. Obrigado.

[19] Comentário enviado por marciotaglietta em 10/04/2019 - 16:36h

Fiz as configurações e estou com problema de TLS, alguém sabe o que fazer? Apenas atualizei o openssl.
O erro é o seguinte:
The following error was encountered while trying to retrieve the URL: https://www.techtudo.com.br/*
Failed to establish a secure connection to 186.192.81.152
The system returned:
(71) Protocol error (TLS code: SQUID_ERR_SSL_HANDSHAKE)
Handshake with SSL server failed: error:140920F8:SSL routines:ssl3_get_server_hello:unknown cipher returned

This proxy and the remote host failed to negotiate a mutually acceptable security settings for handling your request. It is possible that the remote host does not support secure connections, or the proxy is not satisfied with the host security credentials.


Contribuir com comentário