Por: @vitorp Publicado em: 2020-04-02

Proxy Squid 4 + CentOS 8 + SSL

Este laboratório tem como objetivo orientar na instalação, configuração e servir como embasamento teórico para o módulo WebFilter do FWFLEX v3.

Sistema Operacional: CentOS 8.0.1905 Proxy: squid-4.4-8

Instalação

yum install squid

Gerar Certificado SSL

Criar pasta, gerar certificados e alterar permissões.

mkdir /opt/client/squid/certs
chown squid:squid /opt/client/squid/certs -R
cd /opt/client/squid/certs
openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -keyout squidCA.pem -out squidCA.pem
openssl x509 -in squidCA.pem -outform DER -out squid.der
chown squid:squid squidCA.pem
chmod 400 squidCA.pem

Cria uma pasta com cache dos certificados criados ao fazer a negociação com as páginas web. O squid deve ter permissão nessa pasta senão a navegação não funcionará.

mkdir -p /var/lib/squid
/usr/lib64/squid/ssl_crtd -c -s /var/lib/squid/ssl_db
/usr/lib64/squid/security_file_certgen -c -s /var/spool/squid_ssl_db -M 256MB
chown -R squid:squid /var/spool/squid_ssl_db
chown -R squid:squid /var/lib/squid

Configuração - Squid

Embasamento Teórico

A intenção deste tópico é apresentar alguns conceitos sobre as funcionalidades e lógicas do Squid, principalmente relacionado à utilização do SSL.

Modo de funcionamento das portas

http_port 3127

  • Necessário configurar o proxy no navegador, apontando para o IP do servidor na porta definida.
  • Funciona no modo padrão do Squid, sem nada relacionado ao SSL. Utilizando as ACL’s http_access. Desta forma, o HTTP é normal e HTTPS verifica somente os domínios.
  • Se houver algum bloqueio para HTTPS, exibe erro de conexão ao usuário. Não aparece a tela de bloqueio.
  • Não é necessário instalar certificado na máquina do cliente.

http_port 3128 ssl-bump tls-cert=/root/keys_squid/squidCA.pem

  • Necessário configurar o proxy no navegador, apontando para o IP do servidor na porta definida.
  • Funciona nos modos HTTP e HTTPS, verificando as URL’s de ambos.
  • Passa a respeitar/casar com as ACL’s ssl_bump
  • Se houver algum bloqueio para HTTPS, exibe a tela de bloqueio.
  • Precisa instalar certificado na máquina do cliente.

Obs: Se apontar a máquina para a porta 3128 e não instalar o certificado, pode ser criado uma ACL “ssl_bump splice” para utilizar o túnel SSL direto com os sites, não sendo necessário utilizar a porta 3127.

http_port 3129 intercept

  • Pode ser chamado de “transparente”.
  • Não é necessário configurar o proxy no navegador, mas é preciso criar regra de firewall redirecionando todos os destinos na porta 80 para a porta 3129 do FW.
  • Funciona no modo padrão do Squid, sem nada relacionado ao SSL. Se direcionar a porta 443 para a 3129, não irá bloquear nada.
  • Não precisa instalar certificado na máquina do cliente, pois só deve ser utilizada para a porta 80 (Sem SSL).

https_port 3130 intercept ssl-bump tls-cert=/root/keys_squid/squidCA.pem

  • Pode ser chamado de “transparente” e também atua no modo SSL.
  • Não é necessário configurar o proxy no navegador, mas é preciso criar regra de firewall redirecionando todos os destinos na porta 443 para a porta 3130 do FW.
  • Funciona no modo HTTPS, verificando as URL’s.
  • Passa a respeitar/casar com as ACL’s ssl_bump.
  • Se houver algum bloqueio para HTTPS, exibe a tela de bloqueio.
  • Precisa instalar certificado na máquina do cliente.

SSL_BUMP

SSL_BUMP é um tipo de ACL do Squid que trata as conexões SSL.

Essa ACL trata a conexão SSL e o formato em que ocorre, não é ela quem define se o site será bloqueado ou liberado.

Quando há um requisição CONNECT no squid, vindo de uma porta configurada com ssl-bump, essa ACL é acionada. A partir disso a conexão será tratada como HTTPS e seguirá de acordo com a primeira regra que “casar” nas ACL’s ssl_bump.

Em cada etapa da conexão (1, 2 e 3), ela pode casar com um modo diferente.

  • Ações de análise: peek, stare
  • Ações de tomada de ação: splice, bump
  • Ações de encerramento: terminate

Lista das opções suportadas pela ACL e breve descrição:

peek

Recebe o certificado (Cliente - Sslbump1 e Servidor - SslBump2) do cliente ou servidor e analisa, assim consegue verificar informações da conexão. Usar o peek na etapa 2 (SslBump2), normalmente significa usar “bump” na etapa 3.

Este modo pode ser usado nas etapas 1 e 2. A diferença do peek para o stare está no modo que a conexão será tratada nas próximas etapas.

stare

Recebe o certificado (Cliente - Sslbump1 e Servidor - SslBump2) do cliente ou servidor e analisa, assim consegue verificar informações da conexão. Usar o stare na etapa 2 (SslBump2), normalmente significa usar “splice” na etapa 3.

Este modo pode ser usado nas etapas 1 e 2. A diferença do peek para o stare está no modo que a conexão será tratada nas próximas etapas.

splice

É a ação padrão. Cria um túnel TCP direto do cliente com o site acessado. Modo utilizado para “exceções” e conexões diretamente com os sites de destino, sem interferência do proxy. Ex: bancos.

Em um ambiente com interceptação SSL e certificado instalado nas máquinas, quando ocorre o splice, é exibido o certificado do servidor final no navegador do cliente.

Este modo pode ser utilizado nas etapas 1, 2 e 3. É um modo que toma decisão referente ao formato que será feita a conexão.

bump

Esta opção “barra” a conexão do cliente com o servidor final, estabelecendo obrigatoriamente uma conexão proxy com o cliente e o servidor final.

Este modo pode ser utilizado nas etapas 1, 2 e 3. É um modo que toma decisão referente ao formato que será feita a conexão.

Caso seja utilizado na etapa 1, estabelece a conexão segura com o cliente e depois a conexão com o servidor final. (Caso o servidor final tenha problemas com SSL/HTTPS, não exibirá ao cliente).

Caso seja utilizado na etapa 2 ou 3, estabelece a conexão segura com o servidor final e posteriormente com o cliente.

Em um ambiente com interceptação SSL e certificado instalado nas máquinas, quando ocorre o bump, é exibido o certificado do Proxy no navegador do cliente.

terminate

Encerra todas as conexões.

Etapas de processamento

São etapas do “handshake” da conexão. Estas etapas são onde as ações do ssl_bump serão tomadas.

Em cada etapa, são aplicadas as regras do ssl_bump. Se não houverem regras específicas por etapa, aplicará a primeira regra que “casar”.

A imagem abaixo é uma representação simples do handshake TLS e exemplifica as etapas.

Etapa 1

  • Coleta as informações TCP do cliente.
  • Nesta etapa, não há informações como o domínio, somente IP e Porta.
  • Executa as regras “ssl_bump” conforme definidas.
  • Se for tomada alguma ação como “bump” ou “splice”, só será possível sobre IP e porta.

Etapa 2

  • Coleta o TLS ClientHello do cliente.
  • Nesta etapa é possível coletar o SNI (Server Name Indication) e trabalhar sobre domínios.
  • Executa as regras “ssl_bump” conforme definidas.
    • Usar “peek” nesta etapa, impossibilita a utilização de “etapa” na etapa 3.
    • usar “stare” nesta etapa, impossibilita a utilização de “splice” na etapa 3.

Etapa 3

  • Coleta o TLS ServerHello do servidor, incluindo o certificado do servidor.
  • Valida o certificado TLS do servidor.
  • Executa as regras “ssl_bump” conforme definidas.
  • Na maioria dos casos, é utilizada a ação “terminate” na etapa 3, já que “splice” ou “bump” são utilizados na etapa 2.

Sequência das etapas

Em cada etapa do handshake, existem “restrições” para a ação ssl_bump escolhida.

A tabela abaixo foi retirada do site do squid e exemplifica o funcionamento no squid v4+.

Etapa1 Etapa2 Etapa3
splice - -
bump - -
peek splice -
peek bump -
peek peek splice
peek stare bump
stare peek splice
stare stare bump

Exemplos de uso relacionado às etapas:

  • Utilizar bump ou splice na primeira etapa faz com que o modo de conexão seja definido imediatamente. Neste caso não é possível bloquear através do domínio nem vê-lo no log. Caso seja utilizado o bump e haja algum problema de SSL com o servidor acessado, não será exibido pro cliente.
  • Utilizar o peek ou stare na primeira etapa possibilita “exergar” o domínio do site, assim o modo “splice” ou “bump” é definido na etapa 2 e posteriormente nas ACL’s de bloqueio, pode acontecer o bloqueio através de URL.
  • Devido a limitações, utilizar peek na etapa 2 faz que seja utilizado splice na Etapa 3.
  • Devido a limitações, utilizar stare na etapa 2 faz que seja utilizado bump na Etapa 3.

Lógica de funcionamento das ACL’s e configurações

Sem ssl-bump

Se uma conexão utilizar uma porta “normal” (sem ssl-bump), irá casar diretamente com as ACL’s de liberação (http_access, etc.).

  • Conexão entra no proxy em porta sem ssl-bump
  • Casa com regras de liberação (http_access, etc.)

Com ssl-bump

Se uma conexão utilizar uma porta configurada com ssl-bump, primeiro irá passar pelas ACL’s ssl-bump tratando o modo da conexão SSL e posteriormente será tratada pelas regras de liberação.

  • Conexão entra no proxy em porta com ssl-bump
  • Passa pelas acl’s ssl_bump e trata como a conexão será estabelecida com o servidor
  • Casa com regras de liberação (http_access, etc.)

Implantação

Foi realizada a configuração geral do Squid e testes com máquina cliente para validar os modos de funcionamento.

Proposta de uso - squid.conf

O squid.conf abaixo foi desenvolvido, validado e testado pensando na utilização para o FWFLEX v3.

Algumas considerações sobre a lógica adotada:

  • Inicialmente todas as conexões fazem “peek” na etapa 1, assim será possível coletar as informações necessárias paraas ACL’s de bloqueios.
  • Posteriormente chama a ACL “noSSLBumpDomains” onde serão adicionados os domínios que devem fazer conexão direta com o site de destino sem utilizar o certificado do proxy, independente da rede/política que vier a conexão. Então faz “splice” destes domínios.
  • Posteriormente faz bump ou splice baseado em cada política. Se for uma política com SSL ativado, fará bump e utilizará o certificado. Caso contrario, faz splice e cria o túnel das conexões diretamente.
# Configurações gerais
# ====================

http_port 3128 ssl-bump tls-cert=/root/keys_squid/squidCA.pem   # Porta proxy setado manualmente (Não transparente). Pode ser utilizado com ou sem certificado SSL
http_port 3129 intercept                                        # Proxy Intercept para a porta 80 (HTTP)
https_port 3130 intercept ssl-bump tls-cert=/root/keys_squid/squidCA.pem    # Proxy intercept para a porta 443 (HTTPS)

sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/spool/squid_ssl_db -M 256MB

sslcrtd_children 80 startup=10 idle=2

icp_port 0
visible_hostname fw
logfile_rotate 0
error_directory /usr/share/squid/errors/pt-br
coredump_dir /var/spool/squid
#debug_options ALL,1
max_filedesc 8192

# Desabilitar ipv6
# ======================

dns_v4_first on
acl to_ipv6 dst ipv6
http_access deny to_ipv6 !all

# Configurações de cache
# ======================

#hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
acl DST_LAN dst "/etc/squid/acl/net_lan"
acl DOMAIN_NOCACHE dstdomain "/etc/squid/acl/domain_nocache"
ssl_bump stare DOMAIN_NOCACHE
no_cache deny QUERY
no_cache deny DST_LAN
no_cache deny DOMAIN_NOCACHE
cache_mgr email@host.com
cache_mem 256 MB
cache_dir ufs /var/spool/squid 10000 16 256
cache_access_log /var/log/squid/access.log
logformat access_formated %{%d/%m/%Y %X}tl - %>a - %un - %Ss - %ru - %ru
logformat squid1  %{%d/%m/%Y %X}tl %6tr %>a %Ss/%03>Hs %<st %rm %ru %ssl::>sni:%<rP %ssl::bump_mode  %[un %Sh/%<a %mt
access_log  /var/log/squid/access.log squid1
cache_access_log /var/log/squid_formated/access.log access_formated
cache_log /var/log/squid/cache.log
cache_store_log none
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

# Definição das ACL
# =================

# ACLs padrões

acl manager proto cache_object
cachemgr_passwd itflex09x all

acl CONNECT method CONNECT
http_access allow CONNECT

acl SRC_LAN src "/etc/squid/acl/net_lan"
acl DST_ALL dst all
acl HOST_RESTRICT src "/etc/squid/acl/host_restrict"
acl HOST_ALLOW src "/etc/squid/acl/host_allow"
acl URL_EXTENSION urlpath_regex -i "/etc/squid/acl/url_extension"
acl URL_ALLOW url_regex -i "/etc/squid/acl/url_allow"
acl URL_DENY url_regex -i "/etc/squid/acl/url_deny"
acl URL_TIME_ALLOW url_regex -i "/etc/squid/acl/url_time_allow"
acl DOMAIN_NODENY dstdomain "/etc/squid/acl/domain_nodeny"
acl DOMAIN_DENY dstdomain "/etc/squid/acl/domain_deny"
acl DOMAIN_NODENY2 ssl::server_name "/etc/squid/acl/domain_nodeny"
acl DOMAIN_NODELAY dstdomain "/etc/squid/acl/domain_nodelay"
acl DOMAIN_DOWNLOAD dstdomain "/etc/squid/acl/domain_download"
acl IP_NODENY dst "/etc/squid/acl/ip_nodeny"

# Tratamento SSL

# ACL para excludes de domínios
acl noSSLBumpDomains ssl::server_name "/etc/squid/acl/domain_nointercept"

# ACLs de políticas para saber se vai aplicar a inspeção de SSL (Criadas de acordo com as políticas do webfilter)
acl policy_A src 10.15.0.0/24 192.168.5.0/24
acl policy_B src 10.16.0.0/24
acl policy_C src 192.20.0.0/24 10.45.0.0/24

# Verificação de SNI (Server Name Indicator - domínio do servidor que o client está tentando conectar)
acl SSLStep1 at_step SslBump1 # Cria ACL chamada SSLStep1 indicando que ação deve ocorre na etapa "SslBump1"

ssl_bump peek SSLStep1 # Define que todas as conexões serão modo "peek" na etapa "SSlBump1", conforme acl SSLStep1. Assim pode ser capturado o SNI da requisição
ssl_bump splice noSSLBumpDomains # Faz splice para todos os domínios listados na ACL "noSSLBumpDomains"

ssl_bump bump policy_A # Política criada com inspeção de SSL
ssl_bump splice policy_B # Política criada sem inspeção de SSL
ssl_bump bump policy_C # Política criada com inspeção de SSL

ssl_bump splice all # Faz splice das conexões que não casarem com as políticas criadas

# Regras de bloqueio - ACL Externa

#external_acl

# Regras de bloqueio - Obsoleto (Regras antigas utilizadas pela iTFlex. Funciona para o HTTP. HTTPS é tratado em outros tipos de ACL e serão desenvolvidas as ACL's externas pra isso)
# ==================

http_access allow manager localhost
http_access deny manager

# Bloqueia se origem não for da LAN
http_access deny !SRC_LAN

# Libera com destino à LAN
http_access allow DST_LAN

http_access deny DOMAIN_DENY

# Libera host sem restrição
http_access allow HOST_ALLOW

# Libera URL sem restrição
http_access allow DOMAIN_NODENY

# Libera IP sem restrição
http_access allow IP_NODENY

# Libera URL fora do horário comercial
http_access allow URL_TIME_ALLOW !TIME_MON_FRI_MOR !TIME_MON_FRI_AFT

# Bloqueia host limitado
http_access deny HOST_RESTRICT DST_ALL

# Bloqueia URL se não estiver liberada
http_access deny URL_DENY !URL_ALLOW

http_access allow URL_ALLOW

# Bloqueio geral
http_access allow localhost
http_access deny all
http_reply_access allow all
icp_access allow all

Materiais de apoio

https://wiki.squid-cache.org/Features/SslPeekAndSplice http://www.squid-cache.org/Doc/config/ssl_bump/