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
/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
/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)
#!/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}