CONTROLE DE ACESSOS PELO SQUID
Publicado por Djair Dutra C. Jr. 24/02/2006
[ Hits: 9.197 ]
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.
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
Rwgimp28 :: para ter o gimp versão 2.8
Sincronizando seu hosts.deny com blacklist online
Backup de MySQL com 1 arquivo para cada Banco
Instalar Unreal Tourment no Linux
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Programa fora de escala na tela do pc (33)
Eu queria adicionar a incon do wifi e deixa transparente no fluxbox no... (0)









