domingo, 31 de março de 2019

PiVPN + google Authenticator

0 comentários
Acredito que imaginei como configurar o google authenticator junto com o pivpn (após uma noite de tentativa e falha ...). 
Apenas deixando minhas anotações aqui para compartilhar com todos e espero confirmar que não cometeu nenhum erro e que potencialmente abrisse uma enorme falha de segurança aqui;)
  1. Instale o libpam-google-authenticator e configure o openvpn para usá-lo
  • Instale o google authenticator no pi: sudo apt-get install libpam-google-authenticator
  • sudo nano /etc/openvpn/server.confe adicionar plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn(para usar o google authenticator) e reneg-sec 0(para não reconectar a cada x minutos, a senha muda a cada poucos segundos)
  • Crie um perfil pam.d openvpn sudo cp /etc/pam.d/common-account /etc/pam.d/openvpn
  • Edite-o sudo nano /etc/pam.d/openvpnpara adicionar essas duas linhas no final auth requisite pam_google_authenticator.so forward_passeauth required pam_unix.so use_first_pass
  • Agora corra sudo service openvpn restartpara recarregar a mudança conf
  1. Configurar perfis de usuário 
    Para que isso funcione, você usará as contas do sistema (contas que você usa para fazer login no seu framboesa, como 'pi'). Você pode criar tantas contas quanto você com o addusercomando. Para cada usuário pivpn
  • faça o login como o usuário no framboesa su - pi(substitua pi pelo nome de usuário real)
  • execute o google-authenticatorcomando e siga as instruções (salve o URL do código de barras na próxima etapa)
  • A execução do autenticador do google adiciona um arquivo .google_authenticator no diretório pessoal do usuário. Este arquivo não deve ter direitos, exceto ler para o usuário sudo chmod 400 /home/pi/.google_authenticator(alterar pi com o nome de usuário correto)
  • crie uma conta pivpn com o mesmo nome exato do usuário e a opção nopass: pivpn -a nopassNota: o nome de usuário deve ser o mesmo que a conta do sistema (pi, por exemplo)
  • edite o arquivo user.ovpn recém-criado e adicione auth-user-pass(para dizer ao cliente para solicitar nome de usuário e senha na conexão) e reneg-sec 0(para não reconectar a cada x minutos, a senha muda a cada poucos segundos)
  1. Configure seu telefone, seu cliente e conecte-se a partir de uma rede externa
  • Instale o aplicativo google authenticator em seu telefone e verifique o código de barras gerado durante o comando google-authenticator (2) no pi
  • Configure seu cliente (testado no Windows e no iOS) com o novo arquivo do cliente ovpn (pi.ovpn por exemplo, criado na última etapa de (2)
  • Conecte-se usando sua senha da conta pi seguida pelos 6 números gerados pelo aplicativo google authenticator no seu telefone no mesmo momento 
    Por exemplo, a pisenha da sua conta é "framboesa" (você deve alterá-la) e sua senha será algo comoraspberry123456
Voila! Deixe-me saber se eu perdi alguma coisa (ou fiz algo errado), mas é assim que eu consegui trabalhar no meu pi 2 com Jessie Raspbian. 
Eu ainda estou querendo saber se a opção nopass no comando de criação de conta pivpn é razoável, se eu definir uma senha aqui (sem opção nopass), então eu tenho que preencher minha senha de certificado primeiro e depois minha senha pi + os números do google authenticator ... Tudo somado é realmente adicionar segurança sabendo que eu uso a opção nopass para criar o meu certificado de usuário? 
Créditos para https://vorkbaard.nl/setup-openvpn-with-google-authenticator-on-ubuntu-12-04-lts-server/onde encontrei a maior parte da solução ...

Continue reading →
sexta-feira, 29 de março de 2019

Atualizando o endereço IP no OpenDNS com Raspberry Pi

0 comentários
Como muitas pessoas, eu uso o OpenDNS em vez do DNS do meu provedor de internet. Além dos ganhos de velocidade que recebo (porque é mais rápido que o DNS do meu provedor), eu gosto de ver os relatórios que o OpenDNS fornece. Para que os relatórios funcionem, o OpenDNS precisa do meu endereço IP. Mas meu endereço IP é dinâmico, então toda vez que ele muda minha quebra de relatórios. O que eu fiz sobre? Eu configurei o meu Raspberry Pi para atualizar automaticamente o meu endereço IP no OpenDNS. Aqui está como eu fiz isso.
  1. Na linha de comando, digite o seguinte e tecle enter: 
    sudo apt-get install ddclient
    Quando solicitado, continue apenas para dizer sim. Pode levar um minuto para o pacote ser instalado, portanto seja paciente.
  2. Quando a instalação for concluída, a interface de configuração será carregada. Mantenha a tabulação para OK e pressione enter até que a interface seja fechada.
  3. Uma vez de volta na linha de comando digite o seguinte e aperte enter:
    sudo nano /etc/ddclient.conf
  4. Digite o seguinte no ddclient.conf:
    #opendns
    daemon=3600
    syslog=yes
    mail=root
    mail-failure=root
    pid=/var/run/ddclient.pid
    use=web, web=myip.dnsomatic.com
    ssl=yes
    server=updates.opendns.com
    protocol=dyndns2
    login=OPENDNS ACCOUNT EMAIL ADDRESS
    password='PASSWORD'
    NAME OF NETWORK
    OPENDNS ACCOUNT EMAIL ADDRESSdeve ser a conta de e-mail que você usa para sua conta OpenDNS. 
    PASSWORDdeve ser sua senha entre aspas simples (''). 
    NAME OF NETWORKdeve ser o nome que você deu à sua rede nas configurações do OpenDNS.
  5. Pressione CTRL-X para sair do nano. Quando solicitado a salvar, diga sim e pressione enter para confirmar o nome do arquivo.
  6. Na linha de comando, digite o seguinte e pressione enter:
    sudo nano /etc/default/ddclient
  7. Encontre run_ipupe altere a configuração para false.
  8. Encontre run_daemone altere a configuração para true.
  9. Encontre daemon_intervale altere a configuração para 3600.
  10. Pressione CTRL-X para sair do nano. Quando solicitado a salvar, diga sim e pressione enter para confirmar o nome do arquivo.
  11. Reinicie o ddclient digitando o seguinte na linha de comando e pressionando enter: 
    sudo /etc/init.d/ddclient restart
    Se tudo correu bem, você verá a seguinte linha e voltará à linha de comando:
    [ ok ] Restarting ddclient (via systemctl): ddclient.service.
Isso agora atualizará seu endereço IP no OpenDNS a cada 60 minutos. Se você quiser alterar o intervalo, altere a daemonconfiguração /etc/ddclient.confe a daemon_intervalconfiguração /etc/default/ddclientpara o tempo desejado (em segundos).
Para ver se tudo isso funciona, digite o seguinte na linha de comando e pressione Enter:
sudo ddclient -daemon=0 -debug -verbose -noquiet

Fonte http://nothing.golddave.com/2016/03/04/updating-ip-address-in-opendns-with-raspberry-pi/
Continue reading →
quarta-feira, 27 de março de 2019

Habilitar seleção da versão do Windows na instalação

0 comentários
STEP 1:
First of all we'll need to extract the content of Windows 10 setup ISO file. You can extract it using 7-Zip. It'll take some time in extracting the whole ISO file.
STEP 2:
Now open Notepad and copy/paste following piece of code in Notepad:
[EditionID]
Professional
[Channel]
Retail
Create_EI_CFG_File_Windows_10.png
You can also totally skip the [EditionID] part in the "ei.cfg" file so that Windows 10 setup asks you to choose desired edition at the time of clean installation:
[Channel]
Retail
Now save the file with the name "ei.cfg" (use the double-quotes "" while saving the file otherwise Notepad will create a text file with the name ei.cfg.txt).
STEP 3:
Now copy the "ei.cfg" file and paste it into Sources folder of Windows 10 setup folder which you got after extracting ISO file using 7-Zip.
Copy_EI_CFG_File_Windows_10_ISO.png
STEP 4:
Now you can create bootable USB drive or burn the files to a DVD and install Windows 10 Pro edition without any problem.

Continue reading →
quinta-feira, 21 de março de 2019

Servidor proxy com Squid - Instalação e configuração

0 comentários

INSTALAÇÃO E CONFIGURAÇÃO BÁSICA

 
Squid, um servidor de Proxy, trabalha como saída principal da rede. Com isso, podemos centralizar nosso foco em segurança (políticas de acesso, autenticação, etc.) em uma única máquina. 

O Squid trabalha com os principais protocolos da Internet, alguns deles são: HTTP, HTTPS, FTP. 

O Squid é um Software Livre licenciado pela GPL, sua utilização pode nos trazer várias vantagens, como:
  • Autenticação;
  • Controle de acesso;
  • Cache;
  • Controle centralizado;
  • Registros de acesso, etc.

Ele também atua como Proxy transparente evitando que usuários "espertinhos" possam burlar o controle de acesso. 

Bem, chega de teoria e vamos começar o trabalho. Este tutorial é voltado à distribuições baseadas no Debian

O Squid é formado de um único pacote, o que torna sua instalação extremamente fácil: 

# apt-get install squid 

Depois que instalamos o Squid, vamos renomear o arquivo de configuração para criarmos um do zero: 

# mv /etc/squid/squid.conf /etc/squid/squid.conf.orig
# pico /etc/squid/squid.conf
 

Vamos criar uma configuração básica no arquivo, adicionando as seguintes linhas: 

http_port 3128
visible_hostname KORZOS 

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT 

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 

acl redelocal src 192.168.0.0/24 

http_access allow localhost
http_access allow redelocal
http_access deny all


Depois, dê um: 

# /etc/init.d/squid restart 

...Que seu Squid já deve estar em pleno funcionamento. 

ENTENDENDO A CONFIGURAÇÃO

Agora, precisamos descobrir para que serve cada uma destas linhas:
  • http_port 3128: Define em qual porta o Squid vai atuar, a porta default é a 3128, mas podemos definir qualquer outra porta.
  • visible_hostname KORZOS: Define o nome do servidor, lembre-se de substituir o "KORZOS" pelo nome do seu servidor.
  • acl all src 0.0.0.0/0.0.0.0: Esta linha cria uma ACL, uma política de acesso com nome "all" contendo qualquer IP.
  • acl localhost src 127.0.0.1/255.255.255.255: Aqui criamos uma ACL de nome "localhost" contendo localhost.
  • acl SSL_ports port 443 563: Cria a ACL contendo as portas que são utilizadas no protocolo HTTPS.
  • acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535: Cria a ACL contendo as portas de diversos protocolos conhecidos na Internet.
  • acl manager proto cache_object: Cria a ACL manager do tipo proto.
  • acl purge method PURGE : Cria a ACL manager do tipo method.
  • acl CONNECT method CONNECT: Cria a ACL CONNECT também do tipo method.
  • http_access allow manager localhost: Libera a ACL manager e localhost.
  • http_access deny manager : Bloqueia a ACL manager.
  • http_access allow purge localhost: Libera a ACL purge e localhost
  • http_access deny purge: Bloqueia a ACL purge.
  • http_access deny !Safe_ports: Esta linha se torna bastante interessante pelo uso da "!", pois ela bloqueia qualquer conexão que não contenha o conteúdo da ACL Safe_Ports.
  • http_access deny CONNECT !SSL_ports: Bloqueia qualquer conexão que não esteja no conteúdo da ACL SSL_ports.
  • acl redelocal src 192.168.0.0/24: Cria a ACL redelocal contendo a faixa de endereço da rede.
  • http_access allow localhost: Libera a ACL localhost.
  • http_access allow redelocal: Libera a ACL redelocal.
  • http_access deny all: Bloqueia a ACL all

INCORPORANDO - ADICIONANDO O CACHE

 

INCORPORANDO UM POUCO

Bem, depois que entendemos como funciona e para que serve essas linhas de configurações, vamos incorporar um pouco o nosso Squid. 

Adicione as seguintes linhas em seu arquivo: 

# Esta opção manda o Squid buscar os dados diretamente na origem, ela é referente ao conteúdo dinâmico, se a URL conter algum padrão aqui especificado ela irá direto a origem buscar o conteúdo.
hierarchy_stoplist CGI-bin ? 

# Define o caminho das páginas de erro do squid.
error_directory /usr/share/squid/errors/Portuguese 

# Define o e-mail que vai aparecer na página de erro do Squid, assim o usuário terá mais informações para interagir com o responsável.
cache_mgr admin@seu_dominio.com.br 

# Esta ACL é responsável por não armazenar conteúdo CGI em cache.
acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY


ADICIONANDO O CACHE

As próximas linhas são referentes às configurações do cache. 

# Define a quantidade de memória RAM reservada para o uso do Squid.
cache_mem 64 MB 

# Esta linha é responsável por limitar o tamanho dos arquivos que serão armazenados no cache da memória RAM.
maximum_object_size_in_memory 64 KB 

# Aqui definimos o tamanho máximo e mínimo respectivamente dos arquivos que serão armazenados no cache do HD.
maximum_object_size 512 MB
minimum_object_size 0 KB 

# Com essas duas linhas podemos definir a porcentagem de atualização do cache, estamos dizendo que quando o cache chegar em 95% o Squid irá apagar os arquivos mais antigos até chegar a 90%.
cache_swap_low 90
cache_swap_high 95 


# Nessa linha conseguimos definir o tamanho e alguns parâmetros do cache feito em HD, a linha é composta por quatro valores, o 1º define o caminho do cache (/var/spool/squid), o 2º o tamanho que será alocado em MB para o cache (2Gb), o 3º a quantidade de diretórios criados para o cache (16) e o 4º é o numero de subdiretórios que serão criados. Se você possuir bastante espaço em disco e quiser armazenar os arquivos por mais tempo, aumente a opção do tamanha do cache.
cache_dir ufs /var/spool/squid 2048 16 256 


# Define onde serão armazenados os registros de log do Squid.
cache_access_log /var/log/squid/access.log 


refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280


Essas três últimas linhas definem o intervalo de atualização do cache, ou seja, de quanto em quanto tempo o Squid irá aguardar antes de verificar se algum arquivo em cache foi alterado em seu local original (um download ou uma pagina Web, por exemplo). 

Mas é importante lembrar que estas três linhas sempre terão que ser usadas em conjunto, se você omitir uma delas, a configuração não entrará em vigor. 

O Squid faz uso destes valores para verificar se os objetos armazenados são os mais recentes, ou há a necessidade de atualizá-los. Não há necessidade de mudança nestes valores. 

Depois, reinicie o Squid para ativar as configurações: 

# /etc/init.d/squid restart 

CRIANDO E ENTENDENDO AS ACLS

 
Depois que demos um upgrade em nosso Squid, é hora de criar as políticas de acesso (os bloqueios). 

Antes de começar, é importante lembrar que o Squid trabalha de forma hierárquica, ou seja, ele lê as regras em uma sequência lógica. Se você diz que ele deve bloquear a URL que contenha a palavra "sexo" e depois mandar liberar, a URL continuará bloqueada, pois quando ele se encaixa em uma determinada regra, ele não "lê" as demais. Bem, mãos à massa. 

Obs.: Nos exemplos a seguir, utilizarei como exemplo somente as ACLs do tipo: src e time. 

Por questão de organização, é bom criar arquivos com o conteúdo a ser trabalho para não poluir o ".conf": 

Neste arquivo, iremos adicionar palavras que serão bloqueadas, como: sexo, porno... 

# pico /etc/squid/palavras_bloqueadas.txt 

Neste arquivo, serão adicionados os sites que não terão acesso, como: 4shared.com, rapidshare.com, megavideo.com, filesonic.com, etc: 

# pico /etc/squid/sites_bloqueados.txt 

Aqui, iremos colocar as redes sociais, como: facebook.com, orkut.com, twiter.com, etc: 

# pico /etc/squid/redes_sociais.txt 

Neste arquivo, iremos colocar os IPs das máquinas dos gerentes (e "daquela" estagiária que entrou semana passada...:)): 

# pico /etc/squid/ips_liberados.txt 

Lista de sites adultos: redtub, xvideos 

# pico /etc/squid/sites_porno.txt 

Este arquivo limita os tipos de arquivos que serão baixados, tudo que contiver neste arquivo será bloqueado. Exemplos: .avi$, .mp3$, .wmv$: 

# pico /etc/squid/formato_arquivo.txt 

Pronto, depois dos arquivos criados e preenchidos, é hora de criar as ACLs: 

acl rede_local src 192.168.0.0/24
acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt "
acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt "
acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt"
acl liberados src "/etc/squid/ips_liberados.txt "
acl porno url_regex -i "/etc/squid/sites_porno.txt "\e acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt"
acl horario_almoco time 12:00-13:00 

http_access allow liberados
http_access allow redes_sociais horario_almoco
http_access deny redes_sociais
http_access deny sites_bloqueados
http_access deny palavras_bloqueadas
http_access deny porno
http_access deny formato_arquivo
http_access allow rede_local


Depois de adicionar estas linhas no "squid.conf", é só reiniciar para que elas entrem em vigor: 

# /etc/init.d/squid restart 

Agora, vamos entender o funcionamento destas ACLs. No exemplo acima, criamos um modelo meio que padrão, no primeiro "parágrafo" criamos as ACLs e no segundo, liberamos ou bloqueamos as mesmas de acordo com nossa política. 

Vamos dissecar linha por linha:
  • acl rede_local src 192.168.0.0/24 -> Cria a ACL rede_local contendo a faixa de endereço da rede local.
  • acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt " -> Cria a ACL palavras_bloqueadas contendo as palavras proibidas que estão no arquivo descrito.
  • acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt " -> Cria a ACL sites_bloqueados contendo os sites proibidos que estão no arquivo descrito.
  • acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt" -> Cria a ACL redes_sociais contendo os sites de redes sociais que estão no arquivo descrito.
  • acl liberados src "/etc/squid/ips_liberados.txt " -> Cria a ACL liberados contendo endereços de IP que estão no arquivo descrito.
  • acl porno url_regex -i "/etc/squid/sites_porno.txt " -> Cria a ACL porno contendo os sites pornôs que estão no arquivo descrito.
  • acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt" -> Cria a ACL formato_arquivo contendo os tipos de arquivos que serão bloqueados que estão no arquivo descrito.
  • acl horario_almoco time 12:00-13:00 -> Cria a ACL horario_almoco do horário de meio dia há uma da tarde.

Aqui que a mágica acontece, a ordem sobre como você organiza as ACLs, é que faz toda a diferença, vamos lá: 

http_access allow liberados


Aqui, nós liberamos acesso total para os IP’s que estiverem no arquivo que criamos anteriormente. 

http_access allow redes_sociais horario_almoco
http_access deny redes_sociais


Nestas linhas, permitimos que qualquer usuário acesse os sites de redes sociais que estiverem no arquivo que criamos dentro do horário de 12:00 as 13:00, após esse horário, o acesso é bloqueado. 

http_access deny sites_bloqueados


Bloqueia o acesso aos sites que estiverem no arquivo criado dentro da ACL 'sites_bloqueados'. 

http_access deny palavras_bloqueadas


Bloqueia o acesso à palavras que estiverem no arquivo criado dentro da ACL 'palavras_bloqueadas'. 

http_access deny porno


Bloqueia o acesso aos sites pornos que estiverem no arquivo criado dentro da ACL 'porno'. 

http_access deny formato_arquivo


Bloqueia o acesso a downloads que forem do tipo de arquivo contido no arquivo criado na ACL 'formato_arquivo'. 

http_access allow rede_local


Se o acesso não se encaixou em nenhuma das regras acima e for proveniente da rede interna, ele é liberado. 

CONFIGURAÇÃO FINAL

 
Bem pessoal, depois de tudo isso, vamos ver como ficou nosso arquivo "squid.conf": 

http_port 3128
visible_hostname KORZOS 

error_directory /usr/share/squid/errors/Portuguese 

hierarchy_stoplist CGI-bin ? 

cache_mgr admin@seu_dominio.com.br 

acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY 

cache_mem 64 MB
maximum_object_size_in_memory 64 KB
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 /var/log/squid/access.log 

refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280 

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT 

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 

acl rede_local src 192.168.0.0/24
acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt "
acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt "
acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt"
acl liberados src "/etc/squid/ips_liberados.txt "
acl porno url_regex -i "/etc/squid/sites_porno.txt "
acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt"
acl horario_almoco time 12:00-13:00 

http_access allow liberados
http_access allow redes_sociais  horario_almoco
http_access deny redes_sociais
http_access deny sites_bloqueados
http_access deny palavras_bloqueadas
http_access deny porno
http_access deny formato_arquivo
http_access allow rede_local
http_access allow localhost 

http_access deny all


Bem, é isso aí! 

Espero que tenha ficado claro e que todos entendam. Qualquer coisa, é só deixar um comentário. 
Continue reading →

Shell Scripting para Análise de Log do Squid

0 comentários
Encontrei um script shell muiiiito bacana aqui. Eu o escrevi no ano de 2008, quando fazia minha especialização em Administração de Redes GNU/Linux, pela Universidade Federal de Lavras (UFLA).
O professor havia passado um arquivo de log do squid muito grande. Não me lembro certamente, mas sei que tinham mais de 4GB somente de texto. E ele pediu para que fizéssemos um script shell para analisar aquele 'pequeno' arquivo: Fazer um ranking dos 10 IPs que mais consumiram dados em um data específica.
Por exemplo, eu chamaria o script da seguinte forma na linha de comandos e ele me retornaria a lista dos 10 IPs locais que consumiram mais banda (em ordem decrescente): ./meuscript.sh 20180606 /var/log/squid3/access.log
Cada linha do arquivo de log corresponde a um registro de acesso através do Squid. Está aqui um exemplo com 5 linhas:
1528362727.333 47 192.168.1.2 TCP_MISS/200 1757 GET http://cdn.content.prod.cms.msn.com/singletile/summary/alias/experiencebyname/today? - ORIGINAL_DST/2.21.178.106 text/xml
1528362727.333 46 192.168.1.2 TCP_MISS/200 1666 GET http://cdn.content.prod.cms.msn.com/singletile/summary/alias/experiencebyname/today? - ORIGINAL_DST/2.21.178.106 text/xml
1528362871.930 68 192.168.1.2 TCP_MISS/200 245 GET http://ncc.avast.com/ncc.txt - ORIGINAL_DST/200.143.247.16 text/html
1528363182.538 896988 192.168.1.2 TCP_MISS/200 311 GET http://su.ff.avast.com/R/A3kKIDQ0NzhlNGNhNjE4MzQyNmNiMDQ2YWI1ZTRkZThlMjhkEgQABwYYGLwHIgECKgcIBBCmpOVgKgcIAxCo14ZdMgoIABDFq-VgGIACOKKSkJABQiCTz0gZi7kd90OW8GIZphTR4939b-VE5k2JfgQW7Y5QAUiAgpgI - ORIGINAL_DST/77.234.42.239 application/octet-stream
1528363472.061 74 192.168.1.2 TCP_MISS/200 245 GET http://ncc.avast.com/ncc.txt - ORIGINAL_DST/200.143.247.16 text/html
Perceba que cada campo corresponde a uma informação, você pode ver os detalhes aqui sobre elas. Mas, as principais para o script eram: o Timestamp para pegar a data (1º campo), o IP do host local (3º campo), e a quantidade de Bytes consumida por aquela requisição (2º campo).
Na época fiz um primeiro script que utilizava 'loop dentro de loop' (complexidade quadrática), ou seja, eu varria o arquivo diversas vezes para fazer a soma dos Bytes para cada IP encontrado. Gerou um tempo de execução que ultrapassou os 10 minutos!
Foi quando utilizei o 'awk' (que é uma linguagem interpretada, muito utilizada para processamento de dados em arquivos de texto) e, além disso, utilizei Array Associativo. Enfim... eu tinha que varrer o arquivo apenas 1 vez, e concatenar os valores dos Bytes ao meu array que tinha como índice o IP do host.
Após essas modificações, o script passou a executar com menos de 2 segundos. Uma grande diferença, de 10 minutos para 2 segundos, não é mesmo?!
Vamos ao script... a parte inicial dele é toda de validação de formatos. O interessante está no final, quando é utilizado o AWK:
#!/bin/bash
#por Salim Aouar

#Validação de quantidade de parâmetros
if [ $# != 2 ]; then
 echo "erro 001 - Número incorreto de parâmetros (./script aaaammdd arquivoLog)"
 exit 1
fi

#Validação de existência de arquivo com log
if [ ! -f $2 ]; then
 echo "erro 002 - $2 não é um arquivo válido"
 exit 2
fi

#Validação de permissão de leitura no arquivo de log
if [ ! -r $2 ]; then
 echo "erro 003 - Não se tem permissão de leitura em $2"
 exit 3
fi

#Validação da data digitada pelo usuário, utilizando expressão regular
data=$(echo $1 | egrep '^([0-9]{8})')
if [ -z $data ]; then
 echo "erro 004 - Formato da data inválido (./script aaaammdd arquivoLog)"
 exit 4
fi

#Separando a data em ano, mês e dia
a=$(echo $data | cut -c1-4)
m=$(echo $data | cut -c5-6)
d=$(echo $data | cut -c7-8)

#Definindo os timestamps para o início e fim, pois serão comparados
dataInicial=$(date -d "$a-$m-$d" "+%s")
dataFinal=$(date -d "$a-$m-$d 23:59:59" "+%s")

#awk imprimindo o cabeçalho, somando os Bytes utilizando array associativo e, imprimindo o ranking
awk -F" " '
BEGIN { 
print "IP\t\tCONSUMO" 
}
{ 
if($1 >= '$dataInicial' && $1 <= '$dataFinal')
 consumos[$3] += $2
}
END { 
for (x in consumos)
 print x"\t"consumos[x] | "sort -k2 -nr | head"
}
' $2
Vou destacar aqui apenas 2 trechos deste script para fins de explicação. O primeiro deles é referente a soma dos Bytes consumidos e ligando ao IP no Array:
if($1 >= '$dataInicial' && $1 <= '$dataFinal')
 consumos[$3] += $2
}
Repare acima que estamos verificando se o Timestamp do arquivo de log (1º campo - $1) está dentro da data desejada e, caso esteja, acumulamos a soma dos Números de Bytes (2º campo - $2) no nosso vetor, cujo índice/posição é o número do IP do Host (3º campo - $3). Dessa forma, quando terminamos de percorrer todo o arquivo, temos um vetor com vários IPs de índices e seus respectivos consumos em Bytes salvos.
Aí podemos mandar exibir na tela os 10 IPs que mais consumiram dados. Fazendo um loop para percorrer nosso array 'consumos':
for (x in consumos)
 print x"\t"consumos[x] | "sort -k2 -nr | head"
}
Aí vem mais um detalhe... no trecho 'sort -k2 -nr | head' estamos pedindo para ordenar pelo segundo campo que é numérico (comando sort), e depois chamamos o 'head' para exibir somente os 10 primeiros da lista!
Enfim... neste script aí tem muita informação bacana, que você pode estudar e testar! Veja as partes de validações de data, parâmetros, etc... isto é muito importante também!
Gostaria de enfatizar que como bons profissionais, devemos sempre estudar e procurar aperfeiçoamento. Já escutei muitos falarem que vão trabalhar com redes ou servidores, pois não gostam de programação, e vice-versa. Entretanto, saibamos reconhecer que as áreas não são isoladas, e devemos sempre pensar de forma integrada!

Abraços,
Salim Aouar.

Fonte: https://www.salimaouar.com.br/artigo/shell-scripting-para-analise-de-log-do-squid
Continue reading →