Configurando servidor proxy autenticado com Squid

Hoje explicarei como configurar o squid para servir como proxy autenticado no gateway da rede fazendo cache e restrição de acesso de alguns sites e dessa vez com autenticação de usuário/senha.

Instalação
Baixando o source do squid 3.1.16
$wget “http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.16.tar.gz”
Extraindo o source do download acima
$tar -xzvf squid-3.1.16.tar.gz
$cd squid-3.1.16
$./configure –prefix=/usr/local/squid \
–enable-err-Portuguese=lang \
–mandir=/usr/share/man \
–enable-auth=”basic,digest,ntlm” \
–enable-removal-policies=”lru,heap” \
–enable-digest-auth-helpers=”password” \
–enable-basic-auth-helpers=”getpwnam,YP,NCSA,MSNT” \
–enable-external-acl-helpers=”ip_user,unix_group,wbinfo_group” \
–enable-ntlm-auth-helpers=”fakeauth,no_check” \
–enable-removal-policies \
–enable-linux-netfilter \
–enable-ident-lookups \
–enable-useragent-log \
–enable-cache-digests \
–enable-delay-pools \
–enable-referer-log \
–enable-underscores \
–enable-async-io \
–enable-truncate \
–enable-arp-acl \
–with-pthreads \
–enable-icmp \
–enable-htcp \
–enable-carp \
–enable-poll \
–enable-snmp \
–enable-wccp \
–enable-ssl

$make
#make install

Configuração
Como foi definido o local da instalação em /usr/local/squid no ./configure
#mv /usr/local/squid/etc/squid.conf /usr/local/squid/etc/squid.conf.bkp
squid.conf

#autenticação dos usuários para acesso
auth_param basic program /usr/local/squid/libexec/ncsa_auth /usr/local/squid/etc/passwd
auth_param basic children 5
auth_param basic realm COMPUTAÇÃO INTEGRAL
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
http_port 3128
visible_hostname mundodacomputacao.com.br

cache_mem 64 MB
maximum_object_size 512 MB
minimum_object_size 0 KB
cache_swap_low 90
cache_swap_high 95
cache_dir ufs /var/spool/squid 2048 16 256
cache_access_log /usr/local/squid/var/logs/cache.log
refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280

acl manager proto cache_object
acl localhost src 127.0.0.1
acl autenticados proxy_auth REQUIRED
acl Safe_ports port 80 #http
acl Safe_ports port 21 #ftp
acl Safe_ports port 443 563 #https,snews
acl Safe_ports port 70 #gopher
acl Safe_ports port 210 #wais
acl Safe_ports port 280 #http-mgmt
acl Safe_ports port 488 #gss-http
acl Safe_ports port 591 #filemaker
acl Safe_ports port 777 #multiling http
acl Safe_ports port 901 #swat
acl Safe_ports port 1025-65535 #portas altas
acl purge method PURGE
acl CONNECT method CONNECT
acl SSL_ports port 443 563

##ACLS
#criando ACLs para os usuários com acesso livre e restrito
acl grupo_liberado proxy_auth “/usr/local/squid/usuarios_liberados”
acl grupo_limitado proxy_auth “/usr/local/squid/usuarios_limitados”

#criando ACLs para restrição de sites e palavras
acl sitesbloqueados url_regex -i “/usr/local/squid/dominiosbloqueados”
acl palavrasproibidas url_regex -i “/usr/local/squid/palavrasproibidas”
acl sitespermitidos url_regex -i “/usr/local/squid/dominiospermitidos”

#ACL para bloquear skype
acl acl_url_im_skype url_regex ^((0|1[0-9]{0,2}|2[0-9]{0,1}|2[0-4][0-9]|25[0-5]|[3-9][0-9]{0,1})\.){3}(0|1[0-9]{0,2}|2[0-9]{0,1}|2[0-4][0-9]|25[0-5][3-9][0-9]{0,1})(:|/|$\?)

#controle de acesso
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access deny sitesbloqueados !grupo_liberado
http_access deny palavrasproibidas !grupo_liberado
http_access deny CONNECT acl_url_im_skype !grupo_liberado
http_access allow sitespermitidos

http_access allow autenticados grupo_limitado
http_access allow autenticados grupo_liberado
http_access allow localhost
http_access allow autenticados
http_access deny all
error_directory /usr/local/squid/share/errors/pt-br

Criando os arquivos que serão utilizados
#touch /usr/local/squid/dominiosbloqueados
#touch /usr/local/squid/palavrasproibidas
#touch /usr/local/squid/dominiospermitidos
#cp /usr/local/squid/sbin/squid /usr/sbin
#mkdir /usr/local/squid/var/cache
#mkdir /usr/local/squid/var/logs
#chmod 0777 /usr/local/squid/var/cache
#chmod 0777 /usr/local/squid/var/logs
#touch /usr/local/squid/usuarios_liberados
#touch /usr/local/squid/usuarios_limitados

BadListSites /usr/local/squid/dominiosbloqueados

orkut.com
http://www.orkut.com
facebook.com
http://www.facebook.com
twitter.com
http://www.twitter.com
http://www.ebuddy.com
http://www.meebo.com
http://www.4shared.com
4shared.com
http://www.esnips.com
esnips.com
http://www.adrive.com
adrive.com
http://www.megaupload.com
megaupload.com
http://www.redtube.com
redtude.com
http://www.youtube.com
youtube.com
http://www.torproject.org
torproject.org
http://www.ninjacloak.com
ninjacloak.com
speedyhide.info/index.php
speedyhide.info
http://www.dropbox.com

BadListWords /usr/local/squid/palavrasproibidas

orkut
facebook
twitter
youtube
sexo
bondage
tor
torproject
vidalia
gatewall.dll
ms
messenger
webmessengers
webmessenger
ebuddy
meebo
iloveim
skype
porno
sexy
safadinha
speedhide
ninjacloak
dropbox

Cadastrando usuários no proxy squid
#htpasswd -c /usr/local/squid/etc/passwd usuario1
Nota: O argumento -c é necessário apenas na primeira vez para criar o arquivo /usr/local/squid/etc/passwd.
#htpasswd /usr/local/squid/etc/passwd usuario2

Adicione os usuários com acesso livre no arquivo /usr/local/squid/usuarios_liberados
/usr/local/squid/usuarios_liberados
sysadmin
suportesystem

Adicione os usuários com acesso restrito no arquivo /usr/local/squid/usuarios_limitados
/usr/local/squid/usuarios_limitados
#Exemplo
usuario1
usuario3
usuario6

Configurando o proxy no navegador da estação
No IE
No menu Ferramentas>Conexões da Internet na aba Conexões
clique no botão Configurações da LAN em Servidor proxy e nos campos Endereço e Porta coloque o IP de seu servidor proxy e porta utilizado do squid.
Nesse caso: Endereço: 192.168.1.103 Porta: 3128
No Firefox
Na opção Preferências do Firefox em Avançado na aba Rede no botão Configurar conexão marque o radiobutton Configuração manual de proxy digite nos campos Endereço e Porta o IP de servidor proxy e porta do squid.
Nesse caso: Endereço: 192.168.1.103 Porta: 3128 e marque também o checkbox Usar este proxy para todos os protocolos

Check-list do Squid
#squid -z

Iniciando o serviço
Copie este script retirado do Servidor Linux(Slackware) para iniciar/parar o squid, mas também funciona na distro Debian, basta mover o script para /etc/init.d/.
rc.squid.conf

#!/bin/sh
# Start/stop/restart/reload the Squid Internet Object Cache (squid)
# To make Squid start automatically at boot, make this
# file executable: chmod 755 /etc/rc.d/rc.squid
# Written for Slackware Linux by Erik Jan Tromp
# Modified by David Somero
SQUIDCFG=/usr/local/squid/etc/squid.conf
SQUIDCMD=/usr/sbin/squid
if [ ! -r $SQUIDCFG ]; then
echo "Please set the correct path to $SQUIDCFG"
exit 1
fi
if [ ! -x $SQUIDCMD ]; then
echo "$SQUIDCMD not found"
exit 1
fi
squid_start() {
# Create cache directory hierarchy if needed
ALL_DIRS=$(awk '/^cache_dir/ {print $3}' $SQUIDCFG)
[ -z "$ALL_DIRS" ] && ALL_DIRS=/var/cache/squid
for CACHE_DIR in $ALL_DIRS ; do
if [ ! -d $CACHE_DIR/00 ] ; then
echo "Creating swap directories: $SQUIDCMD -z"
$SQUIDCMD -z 2> /dev/null
break
fi
done
echo "Starting Squid: $SQUIDCMD -F"
$SQUIDCMD -F
}
squid_stop() {
COUNTDOWN=$(awk '/^shutdown_lifetime/ {print $2}' $SQUIDCFG)
[ -z "$COUNTDOWN" ] && COUNTDOWN=30
echo -n "Shutting down Squid in $COUNTDOWN seconds: "
$SQUIDCMD -k shutdown 2> /dev/null
while $SQUIDCMD -k check 2> /dev/null ; do
sleep 1
echo -n .
COUNTDOWN=$[ $COUNTDOWN - 1 ]
if [ $COUNTDOWN -le 0 ] ; then
$SQUIDCMD -k interrupt 2> /dev/null
sleep 1
break
fi
done
echo
}
squid_restart() {
squid_stop
sleep 1
squid_start
}
squid_reload() {
$SQUIDCMD -k reconfigure 2> /dev/null
}
case "$1" in
'start')
squid_start
;;
'stop')
squid_stop
;;
'restart')
squid_restart
;;
'reload')
squid_reload
;;
*)
echo "usage: $0 start|stop|restart|reload"
esac

No Slackware:
#chmod +x /etc/rc.d/rc.squid
#/etc/rc.d/rc.squid start
No Debian:
#chmod +x /etc/init.d/rc.squid
#/etc/init.d/rc.squid start

Pronto, toda vez que o usuário abrir o navegador irá pedir autenticação user/passwd para acessar a internet.

Agora vem uma dica, caso algum usuário do proxy retirar o ip:porta do navegador na tentativa de acessar a internet livremente, basta adicionar essa regra no seu script de firewall

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Pronto, se o usuário retirar o ip:porta no navegador simplesmente não navega, se colocar navega com as regras do proxy squid.
A interface eth1 indica a placa da rede local, onde o proxy recebe as requisições dos outros micros da rede e o 3128 indica a porta usada pelo Squid.
PS:Nesse caso: eth0=rede externa(internet) e eth1=rede interna(intranet)
Verifique o log do Squid de acessos

# tail -f /usr/local/squid/var/logs/cache.log

Feito!

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: