martes, 31 de marzo de 2020

redireccionar todos los comandos de bash de los usuarios al log messages (syslog) ( centos7 y centos 6 y derivados)

Un problema bien común, es que aveces no encontramos los comandos que ejecuto algún usuario dentro del log messages o bien secure o audit de una forma rápida o sencilla y es complicado hacer el tracking con bash history

Para esto hay varias formas de resolverlo

En centos 7 tenermos el siguiente comando (variable) 
[root@localhost ~]# shopt -s syslog_history
 
 para deshabilitara podemos usar : use shopt -u syslog_history 

  • Para hacer el cambio persistente en todas las sesiones de bash es necesario agregar al final del archivo /etc/bashrc file: shopt -s syslog_history

Hay otro método para copiar todos los comandos ejecutados por los usuarios a  syslog.
La cual es utilizar "trap" como parte de la programación de bash, personalmente es mi metodo preferido

  • Hay que agregar las siguientes lineas ya sea en el bash profile; ~/.bash_profile y/o en /etc/profile para que sea de forma global, personalmente lo realice cree el archivo dentro en /etc/profile.d/user-activity.sh  a manera de script y se agregan las siguentes lineas:
PORT=`who am i | awk '{ print $5 }' | sed 's/(//g' | sed 's/)//g'`
logger -p local7.notice -t "bash $LOGNAME $$" User $LOGNAME logged from $PORT
function history_to_syslog
{
declare cmd
declare p_dir
declare LOG_NAME
cmd=$(history 1)
cmd=$(echo $cmd |awk '{print substr($0,length($1)+2)}')
p_dir=$(pwd)
LOG_NAME=$(echo $LOGNAME)
if [ "$cmd" != "$old_command" ]; then
logger -p local7.notice -- SESSION = $$, from_remote_host = $PORT,  USER = $LOG_NAME,  PWD = $p_dir, CMD = "${cmd}"
fi
old_command=$cmd
}
trap history_to_syslog DEBUG || EXIT
 
bien otra forma seria la siguiente donde cambia el orden de los eventos
 
function bash_syslog
{
   declare COMMAND
   declare HOSTNAME
   declare IP_ADDR
   COMMAND=\$(fc -ln -0)
   HOSTNAME=\$(hostname)
   IP_ADDR=\$(ip addr show | grep "inet " | grep -v 127.0.0. | head -1 | cut -d" " -f6 | cut -d/ -f1)

   logger -p local4.info -t bash_syslog -i -- "\$HOSTNAME:\$IP_ADDR:\${USER}:\${SUDO_USER}:\${COMMAND}"
}
trap bash_syslog DEBUG 
 
Nota: Esta solución  creara un nuevo proceso por cada comando que se ejecute por lo cual pudiera afectar ligeramente el perfomance del servidor, para salvar el log messages en un archivo de log particular , agregaremos la siguiente linea en  /etc/syslog.conf (para RHEL4/5) o /etc/rsyslog.conf (para RHEL6):

local7.notice                           /var/log/cmd.log
  • Esto tambien manda a log todos los comandos a /var/log/messages .
  • To para evitar que  los comandos se vayan a  /var/log/messages , agrega la siguiente linea a /etc/syslog.conf (para RHEL4/5) or /etc/rsyslog.conf (para RHEL6/7):
*.info;mail.none;authpriv.none;cron.none;local7.!notice                     /var/log/messages
  • esto evitara que los mensajes con prioridad notice o mas altar se vayan al log /var/log/messages .
# service syslog restart
  • Centos 6
# service rsyslog restart
 
articulo original y traducido de :
https://access.redhat.com/solutions/20707
license GPL  

No hay comentarios.:

Publicar un comentario