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 <interface de rede> -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: O comando let as vezes não é interpretado corretamente por alguns linux
por isto logo abaixo tem os expr comentados, se for o caso comente o let e
descomente os expr.
Obs2: 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