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/