Instalando Squid no Ubuntu 20.04 + AD

Integrando Squid com grupos do Active Directory (Windows Server 2019) e criar hierarquias de acesso através deles.

Ubuntu Server (srvProxy)Windows Server 2019 (srvAD)
IP: 192.168.0.64IP: 192.168.0.193
Porta proxy: 3128 e 3129 (Usuários AD)Domínio: HOMEOFFICE

Instalando pacotes necessários:

sudo apt install squid squidclient squidview -y

Backup do arquivo original

sudo cp /etc/squid/squid.conf{,.original}

Criando as pastas e os arquivos necessários para o funcionamento

sudo mkdir -p /etc/squid/bloqueados
sudo mkdir -p /etc/squid/liberados
sudo touch /etc/squid/bloqueados/palavras 
sudo touch /etc/squid/liberados/dominios 
sudo touch /etc/squid/bloqueados/dominios 
sudo touch /etc/squid/liberados/totalmente_liberados 
sudo touch /etc/squid/bloqueados/expressoes
sudo touch /etc/squid/liberados/dominios_sem_senha 
sudo touch /etc/squid/liberados/ips 
sudo touch /etc/squid/bloqueados/ips 
sudo touch /etc/squid/bloqueados/expressoes_gerais 
sudo touch /etc/squid/bloqueados/expressoes_gerais 
sudo touch /etc/squid/liberados/videos_youtube 
sudo touch /etc/squid/liberados/redes
sudo  vim /etc/squid/liberados/redes

192.168.0.0/24

sudo  vim /etc/squid/squid.conf
#
#   WELCOME TO SQUID 4.10
#

# Usar com o IP para garantir apenas conexões via rede interna

http_port 192.168.0.64:3128
http_port 127.0.0.1:3128

http_port 192.168.0.64:3129
http_port 127.0.0.1:3129
visible_hostname srvproxy
dns_nameservers 192.168.0.193

pid_filename /var/run/squid.pid


#max_filedesc 4096

# Mensagens em português
error_directory /usr/share/squid/errors/Portuguese
error_directory /usr/share/squid-langpack/pt-br

# Configuração de Cache
cache_mem 512 MB
maximum_object_size_in_memory 64 KB
maximum_object_size 100 MB
minimum_object_size 2 KB
cache_swap_low 90
cache_swap_high 95
cache_dir aufs /var/spool/squid 1024 16 256

# Numero de arquivos de log rotacionados a guardar.
logfile_rotate 4

# Monitoramento
high_response_time_warning 1500
acl Snmppublic snmp_community public
# IP ZABBIX
acl SnmpHost src 192.168.0.243 127.0.0.1
snmp_access allow SnmpHost Snmppublic
http_access allow SnmpHost

# Não incluir cabeçalho de redirecionamento
via off
forwarded_for delete

# Aumentar tentativas de redirecionamentos para evitar erros 503 em sites https
forward_max_tries 30

cache_mgr contato@joserodriguesfilho.com
mail_from contato@joserodriguesfilho.com

# Debugging for your ACLs
# debug_options 28,9

# Localização do log de acesso
cache_access_log /var/log/squid/access.log

refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280

#ACLs

#Squid RealTime stat
#acl manager proto cache_object
acl webserver src 192.168.0.64/255.255.255.0
http_access allow manager webserver
http_access deny manager

# Mysar

# log_fqdn off
# emulate_httpd_log off
log_mime_hdrs off

# java
acl libjava url_regex javadl-esd.sun.com/*
http_access allow libjava

# Redes
acl redesall src all
acl rede_cabo src "/etc/squid/liberados/redes"
acl localhost src 127.0.0.1/32

# Palavras
acl palavras_bloqueadas dstdom_regex "/etc/squid/bloqueados/palavras"

# Domínios
acl dominios_livres dstdomain "/etc/squid/liberados/dominios"
acl dominios_bloqueados dstdomain "/etc/squid/bloqueados/dominios"
acl dominios_bloqueados_gerais dstdomain rapidhare.com www.rapidhare.com www.1.fm 1.fm uwall.tv mail.ru
acl dominios_liberados_gerais dstdomain "/etc/squid/liberados/totalmente_liberados"

# Expressões Regulares
acl expressoes_bloqueadas url_regex -i "/etc/squid/bloqueados/expressoes"

# Streaming video/mp4
acl streaming rep_mime_type video/quicktime video/x-flv video/x-ms-asf video/m2ts video/mp2t video/MP2T video/mpeg video/msvideo video/quicktime video/x-flv video/x-ms-asf #video/webm

# Portas SSL
acl SSL_ports port 443 563

# Portas Seguras
acl Safe_ports port 21
acl Safe_ports port 80
acl Safe_ports port 89
acl Safe_ports port 8080
acl Safe_ports port 443 563
acl Safe_ports port 70
acl Safe_ports port 210
acl Safe_ports port 3389
acl Safe_ports port 1025-1862
acl Safe_ports port 1864-65535
acl Safe_ports port 280
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 777
acl Safe_ports port 901

# Domínios sem senha
acl dominios_sem_senha dstdomain "/etc/squid/liberados/dominios_sem_senha"
http_access allow dominios_sem_senha

# Binários
acl binarios url_regex -i \.avi($|\?|\&) \.mp3($|\?|\&) \.mp4($|\?|\&) \.torrent($|\?|\&) \.webm($|\?|\&) \.inf($|\?|\&) \.exe($|\?|\&)

# Bloquear método PURGE, que trata de objetos em cache
acl purge method PURGE

# Tunelamento de conexões
acl CONNECT method CONNECT

# Autenticação para quem esta logado no domínio.
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --domain=HOMEOFFICE
auth_param ntlm children 200

# Grupos do AD
external_acl_type Active_Directory %LOGIN /usr/lib/squid/ext_wbinfo_group_acl

# Autenticação normal
# auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
# auth_param basic children 150
# auth_param basic realm Squid proxy-caching web server
# auth_param basic realm ATENCAO: ao digitar seu login e senha o usuario declara estar ciente do conteudo da portaria xxx/xx, que regulamenta o uso da Internet
# auth_param basic credentialsttl 2 hours

# Liberar/negar Por IPs e macs da rede interna
acl ips_livres src "/etc/squid/liberados/ips"
acl ips_bloqueados src "/etc/squid/bloqueados/ips"  

# Impedimento de login simultâneo
authenticate_ip_ttl 60 seconds
#acl loginsvariasmaquinas proxy_auth jose.rodrigues sergio.araujo
acl loginsvariasmaquinas external Active_Directory LA005
acl umlogin max_user_ip -s 1
http_access deny umlogin !loginsvariasmaquinas

# Acls da autenticação

# Logins com cota
acl loginscota proxy_auth "/etc/squid/liberados/loginscota"

# Logins sem restrições via AD
acl AD_LA001 external Active_Directory LA001

# Logins sem acesso via AD
acl AD_LB001 external Active_Directory LB001

# Demais casos
acl logins proxy_auth REQUIRED

# Sites com cota
acl urlscota dstdomain facebook.com youtube.com facebook.com.br youtube.com.br fast.com

# Limitação de uso de banda para streaming

delay_pools 2
delay_class 1 3
delay_parameters 1 -1/-1 800000/800000 100000/100000
delay_access 1 allow rede_cabo #logins_livres 

# Teste delay geral
delay_class 2 3
delay_parameters 2 -1/-1 -1/-1 2000000/2000000
delay_access 2 allow rede_cabo

# Não faz cache dos servidores locais
acl LocalServers dst 192.168.0.0/24
no_cache deny LocalServers
acl DomainMachines dstdomain .homeoffice.local
no_cache deny DomainMachines

# Facebook com VÍDEO
acl facebookUsersVideo proxy_auth jose.rodrigues vivian.lima
acl facebookDomainVideo url_regex -i "/etc/squid/bloqueados/expressoes_gerais"
http_access allow facebookDomainVideo facebookUsersVideo

# Teste bloqueio geral de vídeos no Facebook - transferir para arquivo BLOQUEADOS_GERAIS
# acl videos_facebook url_regex -i .*video.*fbcdn\.net.* .*video\.globo\.com.* *.lance\.com\.br.* .*dafiti\.com\.br.* .*mp\.microsoft\.com.*
acl videos_facebook url_regex -i "/etc/squid/bloqueados/expressoes_gerais"
http_access deny videos_facebook

# -----------------------------------------------
# Listas para redes sociais, WhatsApp e YouTube
# -----------------------------------------------
# Vídeos YouTube liberados
acl videos_youtube url_regex -i "/etc/squid/liberados/videos_youtube"
http_access allow videos_youtube

# WhatsApp web
acl whatsappwebUsers external Active_Directory LA002
acl whatsappwebDomain url_regex -i web.whatsapp.com
http_access allow whatsappwebDomain whatsappwebUsers

# YouTube
acl youtubeUsers external Active_Directory LA004
acl youtubeDomain url_regex -i youtube.com googlevideo.com
http_access allow youtubeDomain youtubeUsers

# Facebook
acl facebookUsers external Active_Directory LA003
acl facebookDomain url_regex -i facebook.com
http_access allow facebookDomain facebookUsers

# Bloqueios, liberacoes
# Importante prestar atencao a ordem das regras

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge

http_access allow dominios_liberados_gerais
http_access deny dominios_bloqueados_gerais
http_access allow ips_livres

http_access deny binarios

#http_access allow logins_livres
http_access allow      AD_LA001
http_access deny AD_LB001

http_access deny streaming
http_reply_access deny streaming
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow dominios_livres
http_access deny ips_bloqueados
http_access deny AD_LB001
http_access deny palavras_bloqueadas
http_access deny expressoes_bloqueadas
http_access deny dominios_bloqueados

http_access allow loginscota
http_access allow logins

http_access allow rede_cabo
http_access deny redesall
http_access deny all

Definir permanentemente ulimit -n

sudo vim /etc/sysctl.conf
fs.file-max = 65535
sudo sysctl -p
sudo vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

Permissão no arquivo NTLM

sudo chmod 6755 /usr/bin/ntlm_auth ; systemctl restart squid

Ajustes no crontab

sudo vim /etc/crontab
# Atualiza o squid de 15 em 15 minutos.
*/15 * * * * root systemctl reload squid >/dev/null 2>&1
# Permissão
58 23 * * * root chmod 6755 /usr/bin/ntlm_auth >/dev/null 2>&
# sudo /etc/init.d/cron restart

DICAS

Veja a seguir algumas dicas que vão lhe ajudar

Status do Squid

# systemctl status squid.service

Verificando as ACLS

# squid -k check

Verifica se usuário esta conseguindo autenticar

# /usr/bin/ntlm_auth --username=joserf --password=senha --domain=HOMEOFFICE

O usuário joserf esta no grupo teste ?

echo "joserf teste" | /usr/lib/squid/ext_wbinfo_group_acl

Exibe os sites que os IPS estão acessando

# tail -f /var/log/squid/access.log |awk '{print "IP: "$3" Site: "$7}' 

Exibe os logins, IPs e sites

# tail -f /var/log/squid/access.log |awk '{print "Login: "$8" IP: "$3" Site: "$7}'

Usúarios utilizando a proxy em tempo real (IP/Login)

# squidclient mgr:active_requests |awk -F ':| ' '/remote|username/{print $3,"\n"$2 | "xargs -n2 |sort -u"}' |grep -v -
squidclient mgr:active_requests |awk -F ':| ' '/remote|username/{print $3,$2 | "xargs -n2 |sort -u"}' |awk '{print $2",",$1}' |grep -v - 

CSV

JSON

Exibe os acessos por IP

tail -f /var/log/squid/access.log | grep 192.168.0.X

Exibe os acessos por login

tail -f /var/log/squid/access.log | grep joserf

Usuários utilizando a proxy

# squidclient mgr:active_requests |grep username |grep -v - | sort | uniq |awk '{print$2}' | wc -l

Quantidade de usuários conectados

# squidclient mgr:active_requests |grep username |grep -v - | sort | uniq |awk '{print$2}' | wc -l

Quanto tempo o Squid esta em execução ?

# systemctl status squid.service |grep Active |awk '{print$9}' |head -n 1

Hosts conectados (*net-tools)

# netstat -n enp0s3 | grep '\:3129' | awk '/ESTABLISHED/ {print $5}' | cut -d: -f1 | sort | uniq -c | wc -l

O Squid está execudando (active), parado (inactive) ou com erro (failed) ?

systemctl status squid.service |grep Active |awk '{print$2}' |head -n 1

Consumo de memória do Squid

# systemctl status squid.service |grep Memory |awk '{print$2}'

Há quanto tempo o Squid está rodando ?

# systemctl status squid.service |grep Active |awk '{print$9,$10}' |head -n 1

Data / Hora

# systemctl status squid.service |grep Active |awk '{print$6,$7}' |awk -F '-| ' '{print $3"/"$2"/"$1,$4}' |head -n 1
# systemctl status squid.service |grep Active |awk '{print$6,$7,$9,$10}' |awk -F '-| ' '{print $3"/"$2"/"$1,$4,$5,$6}' |head -n 1
# systemctl status squid.service |grep Active |awk '{print$6,$7}' |head -n 1
# systemctl status squid.service |grep Active |awk '{print$6}' |head -n 1 |awk -F- '{printf "%s/%s/%s\n",$3,$2,$1}'
# systemctl status squid.service |grep Active |awk '{print$6}' |head -n 1 | awk -v FS=- -v OFS=/ '{print $3,$2,$1}'

Espaço em disco usado pelo log

# du -hs /var/log/squid/ | awk '{print $1}'

Uptime

# squidclient mgr:info 2>&1|grep 'UP Time:' |cut -d':' -f2 |awk '{print$1}'

CPU

# squidclient mgr:info|grep 'CPU Usage:'|cut -d':' -f2|tr -d '%'|tr -d ' \t'