GeekZilla
(usa CentOS)
Enviado em 26/10/2016 - 15:30h
Vou abrir um tópico dedicado mas como existe a dúvida neste tópico também:
Pessoal quem utiliza Squid + C-ICAP ou qualquer outro servidor ICAP provavelmente já se deparou com o seguinte problema:
Em um cenário onde com proxy não-transparente e sem certificados nas maquinas o Squid/ICAP retorna um erro que não é "entendido" pelo navegador que exibe uma mensagem própria como se o site estivesse fora do ar, o problema afeta também Endian Firewall, Pfsense e outras distribuições de FW.
Mas a solução foi encontrada pelo pessoal da Diladele, um server ICAP que também trabalha com o Squid mas tem apenas versão trial de 30 dias e comercial, tornando-o inviavel para quem trabalha apenas com Open Source.
Antes de mais nada segue a analise deles do problema:
Se na sua rede os navegadores utilizam um proxy explicito (Configurado no navegador, não transparente) ao navegar para um site HTTPS bloqueado a sequência de eventos abaixo ocorre:
1-O navegador estabelece uma conexão HTTP normal ao proxy server e envia o pedido CONNECT facebook.com:443 para configurar o tunel seguro ao Facebook.
2- O Squid intercepta este pedido e o redireciona ao servidor ICAP
3- O servidor ICAP "vê" que o dominio facebook.com está bloqueado e retorna um mensagem HTTPS "403 Blocked" ao Squid.
4- O Squid encaminha o "403 Blocked" de volta para o navegador
5- O Navegador espera receber o Handshake SSL do Facebook e ao invés disto vê um fluxo inesperado de bytes (a resposta 403) e mostra uma mensagem padrão do próprio navegador "Não é possível conectar ao site utilizando HTTPS" ao invés da página de erro do Squid.
A solução no caso é primeiro deixar o tunel CONNET ser bem sucedido e depois bloquear o primeiro pedido neste tunel.
O problema está sendo implementar a solução da Diladele no Endian e no Squid +ICAP utilizado pela comunidade em geral.
Perguntei ao Rafael da Diladele se o "segredo" eram somentes as ACLS que ele criou combinadas com SSL Bump já disponível no Squid e ele me disse que sim então a base seria o código abaixo
# No caso forçamos o sslbump a habilitar o bloqueio "atrasado" de túneis CONNECT, funciona apenas em modo não transparente, adicionando um header "X-SSL-Bump: force" ao pedido CONNECT
acl qlproxy_ssl_force_bump req_header X-SSL-Bump -i force
ssl_bump server-first qlproxy_ssl_force_bump
# bump all others by default
ssl_bump server-first all
A diladele fornece uma vm já configura com o sistema (baixe a versão 4.7 que tem a licença trial válida ainda por 30 dias) para quem quiser analisar o funcionamento do sistema, testei aqui e realmente a mensagem de erro está sendo exibida, só lembre de marcar a opção no filtro do proxy.
Agora o negócio é implementar esta solução no Squid + qualquer servidor ICAP. Idéias pessoal?
Thanks!
(Meu Squid.conf atual "puro" sem as regras extras, já tentei algumas váriavies mas ainda sem sucesso, se no tempo do pessoal aqui analisar eu conseguir a solução, postarei aqui visto que é um problema que já tem anos e só agora veio uma solução prática que não envolva ter que instalar um certificado em cada máquina da rede, no meu caso com redes com 3/4 mil usuários é totalmente inviável especialmente porque nem todos estão no AD)
# +------------------------------------------------------------------------------+
# | Endian Firewall |
# +------------------------------------------------------------------------------+
# | Copyright (c) 2005-2006 Endian |
# | Endian GmbH/Srl |
# | Bergweg 41 Via Monte |
# | 39057 Eppan/Appiano |
# | ITALIEN/ITALIA |
# | info@endian.it |
# | |
# | This program is free software; you can redistribute it and/or |
# | modify it under the terms of the GNU General Public License |
# | as published by the Free Software Foundation; either version 2 |
# | of the License, or (at your option) any later version. |
# | |
# | This program is distributed in the hope that it will be useful, |
# | but WITHOUT ANY WARRANTY; without even the implied warranty of |
# | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# | GNU General Public License for more details. |
# | |
# | You should have received a copy of the GNU General Public License |
# | along with this program; if not, write to the Free Software |
# | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
# | http://www.fsf.org/ |
# +------------------------------------------------------------------------------+
shutdown_lifetime 1 seconds
icp_port 0
workers 1
# direct access - acls
acl to_proxy_port port 8080 18080 18081
# proxy interfaces - acls
acl to_orange_interface dst 192.168.2.240
acl to_green_interface dst 192.168.174.249
acl from_orange src "/etc/squid/acls/orange_subnets.acl"
acl to_orange dst "/etc/squid/acls/orange_subnets.acl"
acl from_green src "/etc/squid/acls/green_subnets.acl"
acl to_green dst "/etc/squid/acls/green_subnets.acl"
tcp_outgoing_mark 0x20000000
tcp_preserve_outgoing_mark_mask 0x3fff8
#=== ORANGE zone setting ===
#=== ORANGE IP 192.168.2.240 ===
http_port 192.168.2.240:8080
#=== GREEN zone setting ===
#=== GREEN IP 192.168.174.249 ===
http_port 192.168.174.249:8080
nontransparent_spoof_client_ip allow all
dns_v4_first on
cache_effective_user squid
pid_filename /var/run/squid.pid
cache_mem 40 MB
cache_dir rock /var/spool/squid 500 max-size=32768
error_directory /usr/share/squid/errors/en
icon_directory /usr/share/squid/icons
max_filedesc 54140
server_persistent_connections off
half_closed_clients off
buffered_logs on
# START LOG
cache_log /var/log/squid/cache.log
access_log syslog:local6.info
cache_store_log none
strip_query_terms off
log_mime_hdrs off
# END LOG
# FORWARD IP ADDRESS
forwarded_for delete
# START AUTHENTICATION
# windows logon name for auth
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --configfile=/etc/samba/winbind.conf
auth_param ntlm children 45
auth_param ntlm keep_alive off
# domain user or auth
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic --configfile=/etc/samba/winbind.conf
auth_param basic children 45
auth_param basic realm geekzilla.geek
#kerberos
auth_param negotiate program /usr/lib/squid/negotiate_wrapper_auth --ntlm /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --configfile=/etc/samba/winbind.conf --kerberos /usr/lib/squid/negotiate_kerberos_auth
auth_param negotiate children 45
auth_param negotiate keep_alive off
external_acl_type NT_global_group children-max=45 ttl=300 ipv4 %LOGIN /usr/lib/squid/wbinfo_group.pl
acl for_auth_rule0 external NT_global_group "/etc/squid/groups/rule0"
acl for_auth_rule1 external NT_global_group "/etc/squid/groups/rule1"
acl for_auth_rule2 external NT_global_group "/etc/squid/groups/rule2"
acl for_auth_users proxy_auth REQUIRED
# END AUTHENTICATION
# network - acls
acl from_all src all
acl to_all dst all
acl from_localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.1/32
acl CONNECT method CONNECT
acl to_http_port port 80
acl to_https_port port 10443
# allowed ports - acls
acl allowed_ports port "/etc/squid/acls/ports.acl"
acl allowed_sslports port "/etc/squid/acls/sslports.acl"
acl within_timeframe_rule0 time MTWHFAS 00:00-24:00
acl using_mimetype_rule0 rep_mime_type "/etc/squid/acls/mimetypes_rule0.acl"
acl with_browser_rule0 browser (AOL)|(avantbrowser)|(Chrome)|(Firefox)|(FrontPage)|(Gecko)|(GetRight)|(Go!Zilla)|(Google\sToolbar)|(Iceweasel)|(Java)|(Konqueror)|(Lynx)|(MSIE.*[)]$)|(^Mozilla\/4.[7|8])|(Netscape)|(Opera)|(Safari)|(wget)|(Industry\sUpdate\sControl)|(Windows\sUpdate)|(Service\sPack\sSetup)|(Progressive\sDownload)|(Windows-Update-Agent)|(Windows\sUpdate\sAgent)|(APT-HTTP/1\.3)|(urlgrabber)
acl within_timeframe_rule1 time MTWHFAS 00:00-24:00
acl within_timeframe_rule2 time MTWHFAS 00:00-24:00
# caching settings
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
cache deny from_localhost
cache deny CONNECT
cache allow from_all
# http access to cachemanager
acl cachemanageracl proto cache_object
http_access allow cachemanageracl from_localhost
http_access deny cachemanageracl
# snmp access settings
snmp_port 3401
acl snmppublic snmp_community public
snmp_access allow snmppublic from_localhost
snmp_access deny from_all
# http access to squid
http_access deny to_localhost
http_access allow from_localhost
http_access allow from_green to_green_interface to_http_port
http_access allow from_green to_green_interface to_https_port
http_access allow CONNECT from_green to_green_interface to_https_port
http_access deny to_orange_interface to_https_port
http_access deny to_orange_interface to_proxy_port
http_access deny to_green_interface to_https_port
http_access deny to_green_interface to_proxy_port
http_access deny !allowed_ports !allowed_sslports
http_access deny CONNECT !allowed_sslports
http_access deny within_timeframe_rule0 for_auth_rule0 with_browser_rule0 using_mimetype_rule0
http_access allow within_timeframe_rule1 for_auth_rule1
http_access allow within_timeframe_rule2 for_auth_rule2
http_access deny from_all
# http reply access rules
http_reply_access allow from_localhost
http_reply_access deny within_timeframe_rule0 for_auth_rule0 with_browser_rule0 using_mimetype_rule0
http_reply_access allow within_timeframe_rule1 for_auth_rule1
http_reply_access allow within_timeframe_rule2 for_auth_rule2
http_reply_access deny from_all
# max/min object size
maximum_object_size 1024 KB
minimum_object_size 0 KB
reply_body_max_size 300000 KB from_all
visible_hostname proxy01.geekzilla.rdc
icap_enable on
icap_service_revival_delay 30
icap_service_failure_limit -1
icap_preview_enable on
icap_preview_size 128
icap_send_client_ip on
icap_send_client_username on
include /etc/squid/squid.conf.d/*.conf
adaptation_access service_cf_req deny cachemanageracl
# icap contentfilter access control
# rule 0 -
adaptation_access service_cf_req deny within_timeframe_rule0 for_auth_rule0 with_browser_rule0 using_mimetype_rule0
# rule 1 - adminsrede
adaptation_access service_cf_req allow within_timeframe_rule1 for_auth_rule1
adaptation_meta X-Profile profileadminsrede within_timeframe_rule1 for_auth_rule1
# rule 2 - domain_users
adaptation_access service_cf_req allow within_timeframe_rule2 for_auth_rule2
adaptation_meta X-Profile profiledomain_users within_timeframe_rule2 for_auth_rule2
# default deny - only allow defined traffic
adaptation_access service_cf_req deny all