CONTROLE DE ACESSOS PELO SQUID
Publicado por Djair Dutra C. Jr. 24/02/2006
[ Hits: 8.975 ]
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
Calculadora para eletrodomésticos
CkDeps - Análise de Dependências e Busca por Pacotes Instalados
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (3)
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta