CONTROLE DE ACESSOS PELO SQUID

Publicado por Djair Dutra C. Jr. 24/02/2006

[ Hits: 8.973 ]

Download squid_control




Enviei um artigo que na verdade deveria ser este script, mas tudo bem. Estou enviando agora o sript, porque algumas pessoas me reportaram erros na execução do código, que quando é publicado como arquivo são quebradas algumas linhas e realmente assim não funciona.

  



Esconder código-fonte

Requisitos para a aplicação do script 

Desenvolvi este script na pressa e em apenas um dia deixei-o pronto. A necessidade era criar "rapidamente" uma solução amigável que fizesse o trabalho de controlar os acessos do Squid. 

Já o coloquei para funcionar no cyber café do provedor onde trabalho e até agora não recebi nenhuma reclamação, mas admito que foi apenas o primeiro passo para um projeto maior. Este script ainda está cru. 

Na verdade este script apenas acrescenta usuários ao Squid e permite criar uma lista de restrições para acessos e downloads. Não há nele nenhuma referência ao firewall (iptables) ou controle de banda (cbq). Com o script é possível: 
Adicionar clientes ao Squid; 
Excluir clientes. 
Diferenciar clientes por tipo de acesso: 

ACESSO TOTAL: Tem acesso total às páginas e não "cai" em nenhuma restrição de páginas, download ou velocidade do download. 

ACESSO RESTRITO: Tem acesso, mas passa por todas as restrições criadas pelo administrador da rede. Não acessa sites pornográficos, sites hackers, nem faz downloads de arquivos especificados pelo administrador da rede. 

Adicionar/excluir lista de restrições (URLs); 
Adicionar/excluir lista de arquivos bloqueados para download; 
Adicionar/excluir lista de exceções aos bloqueios. 

Se, por exemplo, você bloqueou a palavra sexo, mas deseja abrir um site de nome sexoseguro, no qual não há conteúdo pornográfico, terá problemas. Neste caso você deverá adicionar a exceção sexoseguro. Dessa forma a palavra sexo continuará bloqueada, mas quando o site for sexoseguro, o acesso será liberado. Bacana, né?!?! :-) 

Como já disse anteriormente, desenvolvi este script na pressa, portanto não pensei numa solução que abrangesse todas as distribuições Linux. Na verdade todos os comandos do script estão baseados na organização dos arquivos de um Conectiva Linux 10, mas podem ser editados para adaptar o script a qualquer outra distro. 

 
Configuração do Squid 

O script é baseado numa distribuição Conectiva Linux 10, com o Squid atualizado (2.5.STABLE9) pelo apt-get. 

Veja a versão do seu Squid com o comando: 

$ squid -v 

Se você tiver tudo nas mãos, então vamos meter a mão na massa. 

1. Dentro da pasta /etc/squid/, crie os seguintes arquivos (sem extensão): 

acesso_total
acesso_restrito
bloqueado
liberado
download 

2. Coloque as linhas abaixo nas ACLs do squid.conf sem alterar sua ordem: 

 
############# DECLARANDO AS ACLs #############

# PCs com acesso total
acl acesso_total src "/etc/squid/acesso_total"

# PCs com acesso restrito
acl acesso_restrito src "/etc/squid/acesso_restrito"

# Lista de extensões bloqueadas para download (.avi .exe .wmv)
acl download url_regex -i "/etc/squid/download"

# Lista para bloqueio de sites
acl bloqueado url_regex -i "/etc/squid/bloqueado"

# Lista de exceções aos bloqueios
acl liberado url_regex -i "/etc/squid/liberado"

############# ATIVANDO AS ACLs #############

http_access allow acesso_total
http_access allow liberado
http_access deny download
http_access deny bloqueado
http_access allow acesso_restrito
http_access deny all  

3. Crie conteúdos de teste para os arquivos vazios, conforme o exemplo: 
acesso_total = IPs dos clientes com acesso total ao Squid; 
acesso_restrito = IPs dos clientes com acesso restrito; 
bloqueado = palavras de URLs que deseja bloquear; 
liberado = exceções à regra anterior; 
download = extensões de arquivos que não podem ser baixados. Exemplo: 

$.exe
$.zip
$.iso
$.cab 

4. Dê um restart ou um reload no Squid para testar. Se ocorrer algum erro, devem ser os arquivos vazios ou preenchidos incorretamente. Confira os IPs e as extensões. 

5. Se desejar dar uma melhorada no visual e nas mensagens de erro do Squid, crie arquivos HTML com mensagens referentes ao bloqueio de páginas e downloads e coloque-os dentro do diretório /usr/share/squid/errors/Portuguese/. 

Depois adicione a linha abaixo ao squid.conf, na seção error_directory, para que o Squid saiba onde estão os arquivos HTML de erro: 

 
error_directory /usr/share/squid/errors/Portuguese  

Adicione as linhas abaixo no squid.conf, na seção deny_info: 

 
deny_info download.htm download
deny_info bloqueado.htm bloqueado  

No exemplo acima criei os arquivos download.html e bloqueado.html com mensagens informando sobre as restrições o Squid. 


Iniciando o script 

Se todos os passos anteriores estiverem corretos, agora é só copiar o código-fonte abaixo pata um arquivo e correr pro abraço. 

Não esqueça de tornar o arquivo executável através do comando: 

chmod 0500 <nome_do_arquivo> 

Script do "programa": 
 
########### SCRIPT ###########

#!/bin/sh

atualiza () {
/etc/init.d/squid reload
cliente=""
ip=""
mac=""
tipoc=""
del_cli=""
busca_cli=""
exclusao=""
tipocliente=""
palavra=""
lista=""
}

excluir () {

if [ "$del_cli" == "" ]; then

dialog --stdout --msgbox "O campo está em branco. Esta operação será cancelada." 0 0

else

`cat /etc/squid/acesso* | grep -i $del_cli > /tmp/busca` &&
dialog --stdout --title "DADOS DOS CLIENTES QUE SERÃO EXCLUÍDOS" --textbox /tmp/busca 0 0

dialog --stdout --yesno "CONFIRMA A EXCLUSÃO DO CLIENTE?" 0 0

   if [ $? = 0 ]; then
      `cat /etc/squid/acesso_restrito | grep -v $del_cli > /etc/squid/acesso_restrito`
      `cat /etc/squid/acesso_total | grep -v $del_cli > /etc/squid/acesso_total`
      atualiza
      dialog --stdout --msgbox "O Cliente foi excluído com sucesso!" 0 0
   else
      /etc/squid/squid_reload
   fi

fi;

}

adicionar_total () {
echo "$ip" >> /etc/squid/acesso_total
atualiza
dialog --stdout --msgbox "O Cliente foi adicionado com sucesso!" 0 0
}

adicionar_restrito () {
echo "$ip" >> /etc/squid/acesso_restrito
atualiza
dialog --stdout --msgbox "O Cliente foi adicionado com sucesso!" 0 0
}   

#dialog --msgbox "Verificar se o erro que está acontecendo na hora de excluir dados no meio de um alista é por causa do comando /etc/squid/squid_control, que reabre o form. Criar uma variável com o nome início, onde as variáveis são zeradas e substituir dos os /etc/squid/squid_config" 0 0

abertura=$(dialog --stdout --backtitle "SQUID CONTROL VERSÃO 0.1" --title 'MENU PRINCIPAL' --menu "Controle do Squid Proxy - Radio Connect" 0 0 0  1 'ADICIONAR CLIENTE' 2 'REMOVER CLIENTE' 3 'VISUALIZAR CLIENTES' 4 'ADICIONAR PALAVRAS (BLOQUEIOS/EXCEÇÕES)' 5 'REMOVER PALAVRAS (BLOQUEIOS/EXCEÇÕES)' 6 'VISUALIZAR (BLOQUEIOS/EXCEÇÕES)' 7 'TESTE DE CONEXÃO' 8 'SOBRE' 9 'FECHAR')

#########################################################################

if [ "$abertura" == '1' ]; then

   cliente=$(dialog --stdout --inputbox "Digite o NOME do cliente: " 0 0)
   ip=$(dialog --stdout --inputbox   "Digite o IP do cliente:" 0 0)
   mac=$(dialog --stdout --inputbox "Digite o MAC do cliente:" 0 0)
   tipoc=$(dialog --stdout --menu "Escolha o tipo de acesso para o cliente: $cliente" 0 0 0  1 'Acesso total à internet' 2 'Acesso restrito à internet')

# CHECANDO CAMPOS EM BRANCO
   
   if [ "$cliente" == "" ]; then
      dialog --stdout --msgbox "O nome do cliente está em branco. Tente novamente." 0 0
      /etc/squid/squid_control

   elif [ "$ip" == "" ]; then
      dialog --stdout --msgbox "O IP do cliente está em branco. Tente novamente." 0 0
      /etc/squid/squid_control

   elif [ "$mac" == "" ]; then
      dialog --stdout --msgbox "O MAC do cliente está em branco. Tente novamente." 0 0
      /etc/squid/squid_control

   elif [ "$tipoc" == "" ]; then
      dialog --stdout --msgbox "O tipo de acesso  do cliente está em branco. Tente novamente." 0 0
      /etc/squid/squid_control

   else
      if [ "$tipoc" == '1' ]; then
         adicionar_total
      elif [ "$tipoc" == '2' ]; then
         adicionar_restrito
      fi;
   fi

/etc/squid/squid_control

#########################################################################

elif [ "$abertura" == '2' ]; then

   exclusao=$(dialog --stdout --menu "BUSCA DE CLIENTES PARA EXCLUSAO:" 0 0 0  1 'POR IP' 2 'POR MAC' 3 'PESQUISAR NOME')


   if [ "$exclusao" == '1' ]; then

      del_cli=$(dialog --stdout --inputbox "Digite o IP do cliente:" 0 0)
      excluir

   elif [ "$exclusao" == '2' ]; then

      del_cli=$(dialog --stdout --inputbox "Digite o MAC do cliente:" 0 0)
      excluir

   elif [ "$exclusao" == '3' ]; then

      busca_cli=$(dialog --stdout --inputbox "Digite o nome do cliente ou ou apenas parte dele." 0 0)
      `cat /etc/squid/acesso* | grep -i $busca_cli > /tmp/busca` &&
      dialog --stdout --textbox /tmp/busca 0 0
   fi


/etc/squid/squid_control

#########################################################################

elif [ "$abertura" == "3" ]; then

   tipocliente=$(dialog --stdout --menu "Escolha o tipo de clientes" 0 0 0  1 'Clientes com acesso total à internet' 2 'Clientes com acesso restrito à internet')

      if [ "$tipocliente" == '1' ]; then
         dialog --textbox /etc/squid/acesso_total 0 0

      elif [ "$tipocliente" == '2' ]; then
         dialog --textbox /etc/squid/acesso_restrito 0 0
   
      fi;

/etc/squid/squid_control


########################################################################

elif [ "$abertura" == "4" ]; then

   tipopalavra=$(dialog --stdout --menu "Escolha a lista que deseja adicionar palavras:" 0 0 0 1 'BLOQUEIOS' 2 'EXCEÇÕES')

      if [ "$tipopalavra" == '1' ]; then
      palavra=$(dialog --stdout --inputbox "Digite a palavra que deseja adicionar à lista de bloqueios: " 0 0)
      echo "$palavra" >> /etc/squid/bloqueado
      atualiza


      elif [ "$tipopalavra" == '2' ]; then
      palavra=$(dialog --stdout --inputbox "Digite a palavra que deseja adicionar à lista de exceções: " 0 0)
      echo "$palavra" >> /etc/squid/liberado
      atualiza

      fi

      /etc/squid/squid_control

########################################################################

elif [ "$abertura" == "5" ]; then

   tipopalavra=$(dialog --stdout --menu "Escolha a lista que deseja remover palavras:" 0 0 0 1 'BLOQUEIOS' 2 'EXCEÇÕES')

      if [ "$tipopalavra" == '1' ]; then
      palavra=$(dialog --stdout --inputbox "Digite a palavra que deseja remover da  lista de bloqueios: " 0 0)
      `cat /etc/squid/bloqueado | grep -v $palavra > /etc/squid/bloqueado`
      atualiza

      elif [ "$tipopalavra" == '2' ]; then
      palavra=$(dialog --stdout --inputbox "Digite a palavra que deseja remover da  lista de exceções: " 0 0)
      `cat /etc/squid/liberado | grep -v $palavra > /etc/squid/liberado`
      atualiza

      fi

      /etc/squid/squid_control

#########################################################################

elif [ "$abertura" == "6" ]; then

   lista=$(dialog --stdout --menu "Escolha a lista que deseja visualizar" 0 0 0  1 'Lista de palavras bloqueadas' 2 'Lista de Excessões')

      if [ "$lista" == '1' ]; then
         dialog --textbox /etc/squid/bloqueado 0 0

      elif [ "$lista" == '2' ]; then
         dialog --textbox /etc/squid/liberado 0 0
      
      fi;

/etc/squid/squid_control

#########################################################################

elif [ "$abertura" == "7" ]; then


destino=$(dialog --stdout --inputbox  "Defina o endereço de destino:" 0 0 "200.253.131.10")
quant=$(dialog --stdout --inputbox "Defina a quantidade de pings enviados:" 0 0 "10")
tamanho=$(dialog --stdout --inputbox "Defina o tamanho dos pacotes:" 0 0 "64")
dialog --infobox "Aguarde enquanto o teste é realizado." 0 0

#if [ "$destino == "" ]; then
#dialog --msgbox "O valor do destino não foi definido." 0 0

#elif [ "$tamanho == "" ]; then
#dialog --msgbox "O valor do tamanho dos pacotes não foi definido." 0 0

#elif [ "$quant == "" ]; then
#dialog --msgbox "O valor da quantidade de pacotes não foi definido." 0 0

#else
   ping -c $quant -s $tamanho $destino > /tmp/testping
   dialog --title "RESULTADO DO TESTE" --textbox /tmp/testping 0 0

#fi

   
/etc/squid/squid_control

#########################################################################

elif [ "$abertura" == "8" ]; then
   dialog --msgbox "SQUID CONTROL VESAO 0.1

Versão para: Conectiva Linux / Squid Cache 2.5
Desenvolvido por: Djair Dutra Cordeiro Jr.
djairdutra@hotmail.com / djair@radioconnect.com.br
(88) 9221-4351 / (88) 3631-2244" 0 0

   /etc/squid/squid_control

#########################################################################

elif [ "$abertura" == "9" ]; then

clear

fi;

# Regras para o botão cancelar do menu principal
#clear

Scripts recomendados

Instalação do FreeRock GNOME unstable

Criar pacote Debian o firefox de br.mozdev.org

Script para montar dispositivo Android

Script de backup para MySQL - JonMyBackup

Nsupdate português


  

Comentários
[1] Comentário enviado por ederalves em 08/06/2006 - 12:43h

sera quer vociona mesmo


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts