Após perceber que o Squid não guarda o log de conexões HTTPS, a não ser que ele esteja configurado no navegador e que o Squid no modo
"Squid-in-the-middle", pode ser um tormento.
Tive uma ideia que pode ser útil a todos: criar uma regra no IPtables que gera um log das conexões HTTPS (porta 43).
Se a máquina for um Firewall, use a seguinte regra:
iptables -t nat -A PREROUTING -i -p tcp -m tcp --dport 443 -j LOG --log-level 4 --log-prefix "log_https "
Se não for:
- Substitua -t nat por nada.
- E PREROUTING por OUTPUT.
A regra de IPtables vai gerar no
/var/log/messages uma linha por conexão a porta 443, algo como:
Dec 16 17:00:14 server kernel: log_https IN=eth0 OUT=
MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=XXXX.XXX.XXXX.XXX DST=XXX.XXX.XXXX.XXXX
LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=397 DF PROTO=TCP SPT=52045 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0
Só para não lotar o messages, separarei ele editando o
/etc/rsyslog.conf e colocando uma linha assim:
kern.* /var/log/iptables.log
salve o rsyslog e reinicie o serviço com o comando:
/etc/init.d/rsyslog restart
A próxima conexão já deve ir para este log separado.
Agora, para gerar um log para o
Sarg, será preciso criar um script que vai ler os dados do
/var/log/iptables.log e converter ele para o formato do
/var/log/squid/access.log.
Chamei este script de
sshlog.sh, com o seguinte conteúdo
#!/bin/bash
exec < /var/log/iptables.log
year=`date +"%Y"`
dia=`date +"%d"`
c=0
d=0
while read data
do
let c=$c+1
let d=$d+1
#c=`expr $c + 1`
#d=`expr $d + 1`
lmounth=`echo $data | awk '{ print $1 }'`
day=`echo $data | awk '{ print $2 }'`
hour=`echo $data | awk '{ print $3 }'`
if [ "$dia" == "$day" ]; then
case $lmounth in
Jan)
out="01"
;;
Fev)
out="02"
;;
Mar)
out="03"
;;
Abr)
out="04"
;;
Apr)
out="04"
;;
Mai)
out="05"
;;
May)
out="05"
;;
Jun)
out="06"
;;
Jul)
out="07"
;;
Ago)
out="08"
;;
Aug)
out="08"
;;
Set)
out="09"
;;
Out)
out="10"
;;
Oct)
out="10"
;;
Nov)
out="11"
;;
Dec)
out="12"
;;
Dez)
out="12"
;;
esac
fdate=`echo $year"/"$out"/"$day" "$hour`
tdate=`date -d "$fdate" "+%s"`
iporg=`echo $data | awk '{ print $10 }' | awk -F"=" '{ print $2 }'`
ipdet=`echo $data | awk '{ print $11 }' | awk -F"=" '{ print $2 }'`
if [ "$c" -gt "9" ]; then
c=1
fi
echo $tdate.00$c" "$d" "$iporg" TCP_MISS/200 0 GET http://"$ipdet" - DIRECT/"$ipdet" text/html" >> /var/log/squid/sshlog.log
fi
done
#fim do script
Obs. 1: o comando
let, às vezes, não é interpretado corretamente por alguns sistemas
Linux, por isto
logo abaixo temos
expr comentados. Se for o caso, comente o
let e descomente os
expr.
Obs. 2: não é possível pegar a quantidade de bytes trafegados e no relatório do sarg, vai sair o tempo zerado.
Após gerar, basta concatenar o
sshlog.log com o
acess.log,
pode ser necessário dar um
sort para concatenar, conforme a linha do tempo e após isto rodar o Sarg.
Já coloquei em produção.
Abraços a todos,
Paulo.