User Tools

Site Tools


programacion:shellscripts:sftplogs

sftplogs :: Análisis de logs para ftp seguro

Objetivo

Analizar los logs dejados por un cliente que se conecta al servicio sftp y poder hacer un script que analice el uso del servicio y detalle las conexiones en curso

log de actividad ssh

/var/log/auth.log

Apr  4 08:17:24 sftp1 sshd[16863]: Accepted publickey for guadiana from 183.133.152.195 port 26116 ssh2
Apr  4 08:17:24 sftp1 sshd[16865]: (pam_unix) session opened for user test by (uid=0)
Apr  4 08:17:24 sftp1 sshd[16865]: subsystem request for sftp
Apr  4 08:17:24 sftp1 scponly[16866]: running: /usr/lib/sftp-server (username: test(1005), IP/port: 183.133.152.195 26116 22)
Apr  4 08:17:48 sftp1 sshd[16865]: (pam_unix) session closed for user test

log de actividad smb

/var/log/messages

Apr  3 06:27:01 sftp1 kernel: [43450589.460000] smb_add_request: request [ee4d6e80, mid=15] timed out!
Apr  3 14:29:13 sftp1 kernel: [43479521.100000] smb_open: p_00001-2000/Acta de la Reunión.doc access denied, access=0, wish=1
Jul 25 06:25:07 sftp1 kernel: [43023067.850000] SMB connection re-established (-5)

Script

#!/bin/sh
# sftpusers.sh    (C) 2007 Joaquin Herrero
#     1. lista los procesos que estan usando los directorios de alberca mediante "fuser"
#     2. cruza el pid de cada proceso con la entrada "running" del log /var/log/auth.log para saber datos de la conexion
#     3. cruza la direccion IP de la conexion con la lista de empresas autorizadas
#        (el formato del archivo de empresas autorizadas es el mismo que el del fichero de hosts)
#     4  localiza el proceso padre de sftp (sshd) para ver el fingerprint del certificado usado
#        (para esto hace falta poner el nivel de log VERBOSE en ssh_config)
#     5. busca el certificado usado basandose en su fingerprint
#     6. presenta como resultado:
#        a) pid del proceso sftp
#        b) fecha y hora de la conexion
#        c) nombre de login usado
#        d) certificado usado
#        e) direccion IP desde la que se ha hecho la conexion
#        f) opcionalmente: latencia de la conexion

_EMPRESAS=IP_AUTORIZADAS
_TEMPFILE=/tmp/_usuarios`date +%Y%m%d%H%M%S`
_CH=`ls /altroot/home`
_ALMACEN_CERTIFICADOS=/altroot/almacen_certificados
_RUNNING_DIRECTORY=/altroot

#echo "\nSFTPUSERS 1.0 "
cd $_RUNNING_DIRECTORY
for ch in $_CH
do
   pid=`fuser -v /altroot/home/$ch 2>&1 | cut -c 22- | awk '{print $2}'`
   for proceso in $pid
   do
       nonums=`echo $proceso | sed 's/[0-9]//g'`
       if [ -z "$nonums" ]; then
         ppid=`ps -p $proceso -o ppid=`
         user_fingerprint=`grep "\[$ppid\]: Found matching DSA key" /var/log/auth.log | uniq | awk '{print $9}'`
         if [ -z $user_fingerprint ]
         then
           user_fingerprint="none"
         fi

         # Nos metemos en el almacen de certificados para buscar uno con ese fingerprint
         cd $_ALMACEN_CERTIFICADOS
         certificado_usuario="desconocido"
         certificado_fingerprint="desconocido"
         for crt in *id_dsa.pub
         do
             cert_fingerprint=`ssh-keygen -l -f $crt | awk '{print $2}'`
             if [ "$user_fingerprint" = "$cert_fingerprint" ];
             then
                certificado_usuario=$crt
                certificado_fingerprint=$user_fingerprint
             fi
         done
         grep "running" /var/log/auth.log | \
            awk -v cert=$certificado_usuario -v fp=$certificado_fingerprint -v pid=$proceso  \
              '$0 ~ pid  {print $2 ":" $1 ":"  $3 ":" $9 ":" $11 ":" $7 ":" cert ":" pid ":" fp}' >> ${_TEMPFILE}
       fi
   done
done
cd $_RUNNING_DIRECTORY
FS=: 
echo "  PID       FECHA/HORA         USUARIO        DIRECCION IP        EMPRESA            CERTIFICADO"
echo "-------- --------------- ------------------ --------------- -------------------- ---------------------"

while read line
do
  DIA=$(echo $line|cut -d$FS -f1)
  MES=$(echo $line|cut -d$FS -f2)
  HOR=$(echo $line|cut -d$FS -f3)
  MIN=$(echo $line|cut -d$FS -f4)
  SEG=$(echo $line|cut -d$FS -f5)
  USR=$(echo $line|cut -d$FS -f6)
   IP=$(echo $line|cut -d$FS -f7)
  CRT=$(echo $line|cut -d$FS -f9)
  PID=$(echo $line|cut -d$FS -f10)
   FP=$(echo $line|cut -d$FS -f11)
  EMPRESA=`awk -v ip=$IP '$0 ~ ip {print $2}' $_EMPRESAS`
  if [ -z $EMPRESA ]
  then
    EMPRESA="desconocida"
  fi


  #TIEMPO=`ping -s 1000 -c1 $IP | grep "1008 bytes from" | awk '{print $7 $8}'`
  
  #echo "[$PID] $DIA $MES $HOR:$MIN:$SEG $USR $IP $EMPRESA $CRT"
  printf "%8s %2s %3s %2s:%2s:%2s %18s %15s %20s %21s %16s \n" $PID $DIA $MES $HOR $MIN $SEG $USR $IP $EMPRESA $CRT
done < ${_TEMPFILE}

#echo 
#echo "USUARIOS CONECTADOS AL PUERTO 22"
#fuser -4 -u  22/tcp

rm ${_TEMPFILE}

programacion/shellscripts/sftplogs.txt · Last modified: 2007/07/27 15:17 by jherrero