Um dos problemas mais comuns para quem implementa o
Squid nas empresas para fazer a filtragem de sites é a questão de que as regras por horário podem não funcionar como gostaríamos, em certos casos.
É de conhecimento de muitos que, quando passa do horário de intervalo (de almoço, por exemplo), os usuários ainda conseguem manter o acesso aos sites que estavam proibidos antes deste horário, se mantiverem simplesmente seu navegador aberto e atualizando a página constantemente.
Com isso, o cidadão que trabalha aí na sua empresa pode começar a navegar no Facebook no horário de almoço e continuar com isto até o fim do expediente!
Isso ocorre porque após o horário de almoço, o servidor proxy ainda continua com conexões estabelecidas com os servidores do Facebook, fazendo com que a navegação a estes sites continue sem a análise dos horários descritos nas ACLs do Squid, mesmo após o horário de almoço.
Com isso, criei o script abaixo que faz com que depois do horário de intervalo, regras de Firewall sejam criadas para bloquear as conexões já existentes, fazendo com que estes acessos caiam.
Implementação
Horário de almoço: 12:00 ~ 13:30.
O script deve ser ativado no
crontab um minuto após o horário de almoço e pode ser desativado 5 minutos depois:
31 13 * * * root /usr/local/sbin/bloqueia_face ativabloqueio
36 13 * * * root /usr/local/sbin/bloqueia_face desativabloqueio
Funcionamento
Como dito antes, as conexões permanecem estabelecidas após o horário de almoço e por isso, o pessoal ainda consegue acessar o Face. Quando é ativado o bloqueio, são identificadas as conexões existentes com os hosts do Facebook e são criadas regras de Firewall, que fazem o bloqueio para estas conexões.
Segue o script:
#!/bin/bash -x
## bloqueia_face - Cria/deleta regras de bloqueio para conexões estabelecidas com o facebook
## Escrito por: Benedito Marques
## CentOS release 6.2 (Final)
# Exemplo de uso: ./bloqueia_face ativabloqueio
URL="www.facebook.com fbstatic-a.akamaihd.net facebook.com xx-fbcdn-shv-05-iad1.fbcdn fbcdn-profile-a.akamaihd.net"
for I in `/bin/echo $URL`
do
#GUARDA OS IPS DO FACEBOOK
FAC=`/usr/bin/dig +short $I | /bin/grep [0-9].[0-9].[0-9].[0-9]`
FACEBOOK="$FACEBOOK $FAC"
done
#GUARDA AS PORTAS DOS SOCKETS DE ORIGEM QUE ESTÃO CONECTADAS AO FACEBOOK
SPORTS=$(for i in `/bin/echo $FACEBOOK` ; do /bin/netstat -nt | /bin/grep "`/bin/echo $i`"| /bin/awk -F ' ' '{print $4}' | /bin/cut -d ':' -f5 ; done)
if [ "$1" = "ativabloqueio" ]; then
#VERIFICA SE A VARIÁVEL $SPORTS É VAZIA
if [ -z "$SPORTS" ]; then
/bin/echo "Sem conexões com o Facebook. A ativação do bloqueio não é necessária."
else
for i in `/bin/echo $SPORTS`
do
for j in `/bin/echo $FACEBOOK`
do
IP=`/bin/netstat -nt | /bin/grep $i | /bin/awk -F ' ' '{print $5}' | /bin/cut -d ':' -f4`
/sbin/iptables -I OUTPUT -d $IP -p tcp --sport $i -m multiport --dports 443,80 -j DROP
break
done
done
fi
elif [ "$1" = "desativabloqueio" ]; then
#COLETANDO REGRAS CRIADAS ANTES
/sbin/iptables-save | /bin/grep OUTPUT | /bin/grep DROP | /bin/grep tcp | /bin/grep 443 | /bin/grep 80 | /bin/sed 's/-A/\/sbin\/iptables -t filter -D/g' > /tmp/regras
#REMOVENDO REGRAS COLETADAS
. /tmp/regras
else
/bin/echo -e "Argumento incorreto! \nOpções possíveis: ativabloqueio, desativabloqueio."
fi
Observações
1. O script acima não irá bloquear quem possui NAT e está acessando o Facebook, pois foi usada a chain OUTPUT bloqueando única e exclusivamente o servidor proxy. Além disso, quando há NAT as conexões não ficam no proxy, e sim na máquina local.
2. O script também não irá bloquear quem, pelo proxy, tem permissão de acesso ao Facebook fora do horário, pois ele faz restrições pela porta do socket de origem já existente (--sport), permitindo novas conexões do proxy para os IPs do Facebook.
3. É importante deixar as regras de bloqueio ativas por no mínimo 5 minutos, pois durante este tempo, observei no monitoramento do tráfego que há alguns keep-alives de minuto em minuto do proxy para os servidores do Facebook e que precisam ser bloqueados para finalizar as conexões estabelecidas.
4. Se o usuário mantiver a página do Facebook aberta fora do horário do almoço e só vier a mexer depois que as regras forem retiradas, também haverá bloqueio, pois as conexões que estavam estabelecidas já tiveram seu tempo de estabelecimento esgotado.
5. O script acima foi implementado para bloquear somente o Facebook, porém, pode ser alterado posteriormente para bloquear outros tipos de sites que os usuários venham a abusar do uso fora do horário de almoço, bastando acrescentar o site à variável $URL separando-os por espaço.
Pronto, a partir de agora, o bloqueio por horário será feito.
Fiquem com Deus!