Squid + SSL

Post original em Viva o Linux

Autor: Fabio <fabiogoma at gmail.com> Data: 20/09/2012

Introdução

Um grande desafio para os administradores de rede em geral é gerenciar o conteúdo acessado pelos seus usuários, e muitas vezes, são tomadas atitudes mais radicais como, por exemplo, bloquear completamente o acesso à Internet.

Existem muitos documentos disponíveis na Internet relacionados à configuração de servidores de proxy utilizando Squid, mas tenho percebido que todos os documentos estão preparados apenas para tratar do conteúdo HTTP, não tratando dos acessos HTTPS, como por exemplo: sites de bancos, webmail, e-commerce etc.

Pensando nisso, resolvi escrever este tutorial, que apresenta, de uma forma simples e objetiva, como configurar o servidor com suporte à geração dinâmica de certificado SSL.

O grande infortúnio dos acessos HTTPS através de proxy são os erros de certificado SSL apresentados quando você possui um man in the midle, que possui um certificado auto assinado. Como apresentado na figura abaixo:

Proposta e pré-requisito

Para evitar as mensagens de alerta de certificado, utilizamos a característica DynamicSslCert do Squid, que foca na geração dinâmica de certificados que são compatíveis com o nome de domínio do site requisitado.

Entenda que a checagem do nome do site pelo browser não adiciona muita segurança no ambiente onde as máquinas clientes já confiam no seu proxy, esta validação apenas gera problemas na apresentação das páginas, conforme apresentado na figura acima.

Antes de começar, vou apresentar a configuração do ambiente virtual de laboratório que utilizei para elaborar e validar este tutorial:

  • VirtualBox 4.2
  • CentOS 6.3 (Equivalente à versão 6.3 do RHEL):
    • 2x vCPUs
    • 1GB RAM
    • 10GB HD
  • Windows XP Professional SP3:
    • 2x vCPUs
    • 2GB RAM
    • 10GB HD

Neste laboratório o GNU/Linux CentOS foi utilizado como servidor, e o Windows XP foi utilizado como cliente.
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

2 pensamentos sobre “Squid + SSL

  1. dvas0004 disse:

    Thank you for your reference, and your article!

    • jcfleal disse:

      Thanks buddy!! But this is just a copy of other person. I put here to have as reference in case of the original site, became off-line.

Deixe um comentário