anúncios

terça-feira, 27 de dezembro de 2011

Configurando servidor proxy autenticado com Squid

No post http://mundodacomputacaointegral.blogspot.com/2011/11/configurando-servidor-proxy-com-squid.html mostrei como configurar o squid para proxy transparent, e 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
acl autenticados proxy_auth REQUIRED
http_port 3128
visible_hostname mundodacomputacao

cache_mem 128 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 localhost
http_access allow autenticados grupo_liberado
http_access allow autenticados grupo_limitado !sitesbloqueados !palavrasproibidas !acl_url_im_skype

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
www.orkut.com
facebook.com
www.facebook.com
twitter.com
www.twitter.com
www.issoebizarro.com
www.ebuddy.com
www.meebo.com
www.4shared.com
4shared.com
www.esnips.com
esnips.com
www.adrive.com
adrive.com
www.megaupload.com
megaupload.com
www.thepiratebay.org
thepiratebay.org
www.rapidshare.com
rapidshare.com
www.hotfile.com
hotfile.com
www.filecrop.com
filecrop.com
www.fileserv.com
fileserv.com
www.freeproxy.ca
freeproxy.ca
www.redtube.com
redtude.com
www.youtube.com
youtube.com
www.torproject.org
torproject.org
www.ninjacloak.com
ninjacloak.com
speedyhide.info/index.php
speedyhide.info
www.dropbox.com
www.baixandolegal.org
baixandolegal.org
www.baixebr.org
baixebr.org
www.superdownloads.com
superdownloads.com
www.superdownloads.com.br
superdownloads.com.br
www.baixaki.com.br
baixaki.com.br
www.tecmundo.com.br
www.techtudo.com.br
gizmodo.uol.com.br

BadListWords /usr/local/squid/palavrasproibidas

orkut
facebook
twitter
youtube
sexo
bondage
issoebizarro
tor
torproject
vidalia
ultrasurf
proxy
anonymous
gatewall.dll
ms
messenger
webmessengers
webmessenger
ebuddy
meebo
iloveim
skype
porno
sexy
safadinha
speedhide
ninjacloak
dropbox
piratebay
filecrop
baixaki
superdownload
techmundo
techtudo
gizmodo


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!