Squid + SSL

Utilizando o Squid para filtrar conteúdo HTTP e HTTPS com certificados self-signed, porém sem o famoso problema de SSL Mismatch.

[ Hits: 54.925 ]

Por: Fabio em 20/09/2012


Configurações



As configurações abaixo são referentes ao servidor GNU/Linux.

A partir deste ponto, serão necessários conhecimentos em algum editor de textos no ambiente GNU/Linux, eu recomendo o Vim (Improved VI), mas fique à vontade para escolher o editor de sua preferência.

Como já é de conhecimento dos leitores, o caractere "#" na linha de comando representa uma console de super usuário (root) enquanto "$" representa uma console de usuário comum. Além disso, o caractere "#" pode também representar comentários, caso esteja presente dentro dos arquivos que serão editados.

No meu ambiente foram utilizadas duas interfaces de rede, simulando um ambiente real, onde uma interface possui acesso irrestrito à Internet (eth0) e a outra interface, apenas à rede local (eth1):
  • eth0 → Internet Access (192.168.0.0/24)
  • eth1 → Local Network (10.1.1.0/24)

1. O primeiro passo após a instalação do GNU/Linux é configurar o SELinux para trabalhar em modo permissivo, desta forma ele não tomará qualquer atitude, irá apenas gerar logs de qualquer suposto acesso indevido.

Para isso é necessário editar o arquivo /etc/selinux/config e alterar o parâmetro SELINUX para permissive.

Ex.:

SELINUX=permissive

2. O segundo passo é habilitar o encaminhamento de pacotes na pilha TCP, para isso será necessário editar um parâmetro de kernel que tem por padrão o valor "0".

Editar o /etc/sysctl.conf e adicionar no final do arquivo o parâmetro:

net.ipv4.ip_forward = 1

Para que a alteração acima tenha efeito, executar o comando abaixo:

# sysctl -p

3. O terceiro passo chega a ser um pouco polêmico, pois trata-se da liberação completa do acesso da sua rede local para a Internet, mas você irá compreender esta necessidade no final deste tópico.

Para criar esta regra de firewall será utilizado o IPtables. Com esta regra, será feito o mascaramento das requisições da rede local (eth1) para a rede com acesso à Internet (eth0), desta forma, os programas do governo como ReceitaNet, Caixa FGTS, etc, irão funcionar sem maiores problemas.

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

4. Com o acesso irrestrito liberado pelo passo anterior, nada impede que o usuário remova as configurações de proxy do browser e consiga navegar tranquilamente sem qualquer filtro. Para evitar este tipo de acesso, deverá ser bloqueado a saída para a Internet através de HTTP e HTTPS direto.

# iptables -A FORWARD -p tcp -s 10.1.1.0/24 -i eth1 --sport 1024: -d 0/0 -o eth0 --dport 80 -j DROP
# iptables -A FORWARD -p tcp -s 10.1.1.0/24 -i eth1 --sport 1024: -d 0/0 -o eth0 --dport 443 -j DROP


Obs.: Caso queira bloquear o acesso irrestrito, apenas para alguns determinados IPs, basta alterar o parâmetro "-s" da configuração acima, especificando os IPs que deverão ser bloqueados.

# iptables -A FORWARD -p tcp -s 10.1.1.10/32 -i eth1 --sport 1024: -d 0/0 -o eth0 --dport 80 -j DROP
# iptables -A FORWARD -p tcp -s 10.1.1.10/32 -i eth1 --sport 1024: -d 0/0 -o eth0 --dport 443 -j DROP


5. Ajustar o hostname no arquivo /etc/hosts, no meu caso, o nome do servidor é "monkey", e o arquivo ficou conforme exemplo abaixo:

127.0.0.1        localhost
192.168.0.10  monkey
10.1.1.1         monkey

6. Instalação do Squid

Existem formas muito simples de instalar o Squid, utilizando pacotes prontos para cada distribuição (".rpm" ou ".deb"), porém, após algumas horas de tentativas sem sucesso, reparei que as versões distribuídas já empacotadas são carentes de um parâmetro na compilação que é necessário para a configuração que iremos utilizar. Sendo assim, será necessário instalar o Squid através do fonte que pode ser obtido no site do projeto.

A versão do OpenSSL utilizada na versão padrão do CentOS é mais atual e incompatível com o Squid. Após algumas tentativas sem sucesso na compilação, consegui identificar que seria necessário também instalar uma versão menos recente do OpenSSL através do fonte, que também pode ser obtido através do site do projeto.

Obs.: Obviamente, para que seja possível compilar os programas, serão necessários os compiladores de C e C++, que serão instalados através do YUM.

Segue abaixo o passo a passo que deve ser executado para efetuar a instalação do Squid:

# yum install gcc gcc-c++ openssl openssl-devel
# cd /root
# wget
http://www.openssl.org/source/openssl-1.0.0g.tar.gz
# tar -xvzf openssl-1.0.0g.tar.gz
# cd openssl-1.0.0g
# ./config
# make
# make install
# cd /root
# wget
http://www.squid-cache.org/Versions/v3/3.2/squid-3.2.1-20120915-r11661.tar.gz
# tar -xvzf squid-3.2.1-20120915-r11661.tar.gz
# cd squid-3.2.1-20120915-r11661
# ./configure --enable-ssl --enable-ssl-crtd --with-openssl="/root/openssl-1.0.0g"
# make all
# make install
# mkdir -p /usr/local/squid/var/lib/
# /usr/local/squid/libexec/ssl_crtd -c -s /usr/local/squid/var/lib/ssl_db
# chown -R nobody. /usr/local/squid/


7. O passo anterior pode ser um pouco demorado, dependendo da sua configuração de hardware disponível. Em seguida entra a configuração básica Squid, para isso será necessário customizar o arquivo de configurações: /usr/local/squid/etc/squid.conf

As configurações adicionadas estão delimitadas por linhas comentadas.

acl CONNECT method CONNECT

        #-------- Início config. adicionada --------#
# Configuracao customizada para o meu ambiente FGM (acl)
acl fgm_network src 10.1.1.0/24
acl badsites url_regex -i "/usr/local/squid/etc/restricted-sites"

# Configuracao customizada para o meu ambiente FGM (http_acess)
http_access deny badsites
http_access allow fgm_network
.....
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/squid/etc/monkey.pem
.....
        #-------- Fim config. adicionada --------#

#cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256

        #------- Início config. adicionada --------#
# SSL Configurations
always_direct allow all
ssl_bump allow all
        #-------- Fim config. adicionada --------#

8. No passo anterior, foram customizadas as configurações do proxy para o seu ambiente e foi criada uma ACL que é utilizada para restringir o acesso a sites que possuam palavras específicas, que serão definidas pelo administrador.

O conteúdo restrito deve estar dentro do arquivo de restrições /usr/local/squid/etc/restricted-sites, as palavras devem ser separadas por linha.

Exemplo:

facebook
twitter
tumblr
redtube
porn
xxx

9. Gerar a chave e o certificado que serão utilizados na configuração do Squid:

# openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout /usr/local/squid/etc/monkey.pem -out /usr/local/squid/etc/monkey.pem

10. Exportar o certificado para o formato do browser:

# openssl x509 -in /usr/local/squid/etc/monkey.pem -outform DER -out /usr/local/squid/etc/monkey.der

Obs.: O arquivo "monkey.der" não tem qualquer utilidade no servidor, ele servirá apenas para o browser dos clientes, no meu caso, o cliente foi o Windows XP com Firefox. A cópia do arquivo pode ser facilmente executada através do winscp.

11. Iniciar o Squid:

# /usr/local/squid/sbin/squid start

Obs.: Os logs podem ser acompanhados através do diretório: /usr/local/squid/logs

12. Importar o certificado (mokey.der) no browser (Chrome, Firefox, Safari e IE).

Segue abaixo o exemplo para o Firefox:
  1. Acesso à opção 'Options' do menu principal.
  2. Vá até a seção 'Advanced', e selecione a aba 'Encryption'.
  3. Clique no botão 'View Certificates' e vá até a aba 'Authorities'.
  4. Clique no botão 'Import', selecione o arquivo ".der", que foi criado anteriormente, e pressione 'OK'.

Obs.: A execução deste procedimento fará com o que o browser não apresente uma mensagem de alerta dizendo que o site não pode ser acessado, pois você não possui um certificado válido.

Referências


Obrigado.

Fabio G. Martins
LPIC ID - LPI000127547
CCNA ID - CSCO11016831

Página anterior    

Páginas do artigo
   1. Introdução
   2. Configurações
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Bloqueando o Messenger com iptables e Squid

Direcionando log Squid para banco MySQL

Squid3 no Debian 8 (Jessie) com suporte a filtro de páginas HTTPS

Instalação e configuração do Squid no Fedora

Instalando natACL no Debian Etch (proxy autenticado)

  
Comentários
[1] Comentário enviado por dalveson em 21/09/2012 - 16:57h

muito interessante o artigo Fabio G. Martins, irei fazer alguns teste por aqui.
mais antes algumas duvidas:
1 - o squid passará a fazer cache do https(443)?
2 - uma duvida que tenho sobre a compilação do squid, não é necessario outros parametros no ./configure:
tipo --enable-linux-nefilter para ativa o proxy transparente dentre outros parametros.
ou quando vc executa ./configure --enable-ssl --enable-ssl-crtd --with-openssl="/root/openssl-1.0.0g" ele ja traz varias opçoes habilitadas por padrao?
att.

[2] Comentário enviado por herloncamargo em 21/09/2012 - 18:52h

Fiquei com a dúvida se qualquer site https, a partir de então, deixará de apresentar mensagem de alerta de "perigo", incluindo os que deveriam apresentá-la. Dessa forma, qualquer site passará a ser "confiável" (sem mensagem de alerta)?

[3] Comentário enviado por magnored em 21/09/2012 - 22:09h

Existe a possibilidade de criar uma regra no squid para que ele bloqueie somente o HTTPS de sites como facebook, youtube,etc...e fique totalmente liberado para sites como Bradesco, Santander, etc...

No iptables eu sei que existe essa possibilidade, mas gostaria de saber se tem alguma coisa no Squid que nao utilize o "man in the middle" para uma lista de sites que eu especificar

[4] Comentário enviado por alexsandro06 em 28/09/2012 - 02:08h

Muito bom o artigo, fiz todo o procedimento, mas ainda não deu certo.

Quando tento acessar um site bloqueado, a coisa funciona e aparece a menssagem de acesso negado, mas no momento em que vou acessar uma pagina que está liberada aparece o seguinte:

Na tentativa de recuperar a URL: https://www.google.com.br/

O seguinte erro foi encontrado:

Falha na conexão

O sistema retornou:

(71) Protocol error

O host remoto (servidor) ou a rede pode estar indisponível. Por favor tente novamente.

Alguem sabe me dizer o que pode ser esse erro?

Alex.

[5] Comentário enviado por emiliocortessf em 07/11/2012 - 18:56h

Fabio, estava seguindo as suas indicações, muito bom seu tuto estou concluindo.
Linux Debian 6.06
ABS Emilio

[6] Comentário enviado por rodrigocontrib em 13/08/2014 - 20:20h

Erro na compilação do Squid :
collect2: ld returned 1 exit status
make[3]: *** [basic_ncsa_auth] Error 1
make[3]: Leaving directory `/opt/squid-3.2.13/helpers/basic_auth/NCSA'
make[2]: *** [install-recursive] Error 1
make[2]: Leaving directory `/opt/squid-3.2.13/helpers/basic_auth'
make[1]: *** [install-recursive] Error 1
make[1]: Leaving directory `/opt/squid-3.2.13/helpers'
make: *** [install-recursive] Error 1
root@FW-01:/opt/squid-3.2.13#

[7] Comentário enviado por rodrigocontrib em 14/08/2014 - 17:43h


[3] Comentário enviado por magnored em 21/09/2012 - 22:09h:

Existe a possibilidade de criar uma regra no squid para que ele bloqueie somente o HTTPS de sites como facebook, youtube,etc...e fique totalmente liberado para sites como Bradesco, Santander, etc...

No iptables eu sei que existe essa possibilidade, mas gostaria de saber se tem alguma coisa no Squid que nao utilize o "man in the middle" para uma lista de sites que eu especificar


O iptables, provavelmente deve bloquear o range de ip do facebook, mas isso não da muito certo porque o ip nem sempre atende a farm do facebook.
Um exemplo disso são os serviços distribuidos geograficamente, onde o facebook de hoje, atendido por um ip dos USA pode pode ser um facebook local atendido em um ip da sua area,

O bom mesmo é bloquear pelo nome, ai "não tem erro".


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts