Activando guardar históricos al syslog del bash en CentOS

Ando probando una que otra cosa, pero esta me parece fundamental, hace días que vengo con la idea de que bash guarde todos los comandos que los usuarios emiten hacia syslog.

Esto con la finalidad incluso de llevar un mucho más largo history de los comandos que los usuarios escriban. Incluso poder enviarlos hacia otro servidor para almacenarlos.

Me guié por este documento, que sirven muchas cosas. Pero otras cambié por el bien de tener un ambiente aislado para pruebas y para que funcionara en CentOS-6

Comencemos:

Instalación de mock:

Instalé el paquete mock en un servidor virtual que uso para compilar paquetes de prueba en la ESPOCH.

Este servidor virtual es CentOS-6 de 64bits. Debe ser de 64bits para que pueda compilar paquetes de 64bits y de 32bits. De lo contrario no podrá compilarse paquetes de 64bits sino solamente de 32bits.

yum install mock

Creé un usuario para realizar las compilaciones:

useradd eperez

passwd eperez

Y entonces agregué el usuario eperez al grupo mock, este grupo, en el archivo /etc/group queda así:

mock:x:135:eperez

De no hacer al usuario parte del grupo mock, este usuario no podrá usar mock.

A partir de ahora todo trabajo con mock lo hago con mi usuario eperez. No se hace ningún trabajo como root, sólo mock.

su – eperez

Compilación de bash (todo esto lo haré dentro del usuario eperez):

Me bajé el último paquete de bash que existe al día de hoy (este podrá variar a futuro, hay que estar alerta de las versiones más modernas) y le instalé:

wget http://vault.centos.org/6.5/os/Source/SPackages/bash-4.1.2-15.el6_4.src.rpm

rpm -Uvh bash-4.1.2-15.el6_4.src.rpm

Ahora viene lo más duro, que es generar un diff con los cambios que se harán. Para ello abriré el tar.gz del bash, haré una copia de este directorio, cambiaré un par de archivos, y luego de esto generaré un diff entre el directorio de la copia y el directorio del original.

cd rpmbuild/SOURCES

tar zxf bash-4.1.tar.gz

cp -r bash-4.1 bash-4.1.orig

cd bash-4.1

Edito entonces el archivo config-top.h y sobre la línea 104 descomento la línea (está comentada con /* */ no quito el signo de # delante, es un .h de C, los # son parte del comando. Entonces termino dejando la línea solamente así:

#define SYSLOG_HISTORY

Y cambio las dos siguientes líneas que definen SYSLOG_FACILITY y SYSLOG_LEVEL para que tengan los valores LOG_LOCAL1 y LOG_DEBUG respectivamente, ambas líneas quedarían así (marco en negritas los dos cambios):

#  define SYSLOG_FACILITY LOG_LOCAL1
#  define SYSLOG_LEVEL LOG_DEBUG

Ahora edito bashhist.c y modifico las líneas 708 y 713 para que queden así (en negritas marco precisamente todo lo que cambié):

Línea 708

syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, “HISTORY: PPID=%d PID=%d SID=%d UID=%d User=%s %s”, getppid(), getpid(), getsid(getpid()), current_user.uid, current_user.user_name, line);

Línea 713:

syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, “HISTORY (TRUNCATED): PPID=%d PID=%d SID=%d UID=%d User=%s %s”, getppid(), getpid(), getsid(getpid()), current_user.uid, current_user.user_name, trunc);

Estamos listos para preparar el diff, salgamos al directorio SOURCES y creemos el diff:

cd ..

pwd

[eperez@mock bash-4.1]$ cd ..
[eperez@mock SOURCES]$ pwd
/home/eperez/rpmbuild/SOURCES

diff -Npur bash-4.1.orig bash-4.1 > bash_history_syslog.patch

 

Ahh, para esto es que habíamos hecho una copia del directorio bash, llamada bash-4.1.orig, es para que el diff pueda comparar y guardar los cambios. Al final estos cambios los guardé en bash_history_syslog.patch el puedes bajar de http://www.ecualinux.com/bash_history_syslog.patch para el que quiera ahorrarse todo el anterior proceso: este archivo debe ponerse en rpmbuild/SOURCES/ .

Ahora me cambio al directorio SPECS/ para editar el archivo bash.spec, cambiaré las siguientes líneas:

cd

cd rpmbuild/SPECS

vi bash.spec

# agrego _99 en la línea 8

Release: 15_99%{?dist}

# luego de la línea 41 agrego toda esta línea:

Patch999: bash_history_syslog.patch

# y luego de la línea 124 agrego toda esta línea:

%patch999 -p1 -b .history_syslog

Lo que hice fue cambiar la numeración del bash, ahora se llamaría -15_99.el6 (aparecerá un _99) esto es para evitar que luego un yum update me vuelva a instalar el viejo bash sin syslog.

Pero eso sí! hay que tener en mente que si mañana llega otro bash, el Release -16 por ejemplo, tendré que rehacer un nuevo rpm -16_99 por ejemplo.

Agregué además un nuevo parche, el 999 (puse un número alto para evitar que tropiece con futuros números de parches). Este parche se aplicará cada vez que compile el src.rpm, incorporando el envío de los comandos a syslog como deseo.

Ahora crearé el src.rpm del nuevo bash, lo guardaré hacia un directorio seguro (porque del directorio result/ le borra tan pronto compilo otra cosa), y le compilo al nuevo src.rpm para obtener el nuevo rpm:

cd

mock -r epel-6-x86_64 –sources=rpmbuild/SOURCES/ –spec=rpmbuild/SPECS/bash.spec –buildsrpm

mv /var/lib/mock/epel-6-x86_64/result/bash-4.1.2-15_99.el6.src.rpm .

mock -r epel-6-x86_64 bash-4.1.2-15_99.el6.src.rpm

mv /var/lib/mock/epel-6-x86_64/result/bash* .

como resultado tendré mi nuevo rpm!

[eperez@mock ~]$ ls
bash-4.1.2-15_99.el6.src.rpm
bash-4.1.2-15_99.el6.x86_64.rpm

ok, habrán más archivos, pero son los que ahora me interesan.

Si quisiera compilar el bash para 32bits, de una ejecuto:

mock -r epel-6-i386 bash-4.1.2-15_99.el6.src.rpm

mv /var/lib/mock/epel-6-i386/result/bash* .

Pues el mismo src.rpm me sirve para crear el de 32bits.

Instalando el nuevo bash (como root):

Me llevo este nuevo rpm hacia otro servidor, y le instalo:

rpm -Uvh bash-4.1.2-15_99.el6.x86_64.rpm

Entonces salgo y entro de nuevo, ya el nuevo bash estará activo.

Configurando rsyslog para recibir eventos de logs (como root):

Ahora edito /etc/rsyslog.conf y luego de una línea que comienza “local7.*”, agrego lo siguiente:

#bash
local1.debug                        /var/log/bash.log

Y reinicio rsyslog:

service rsyslog restart

Ahora disfruta, mira bash.log y verás que todo comando ahi aparecerá:

Dec 19 07:40:40 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez vi bash.spec
Dec 19 07:44:54 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez history |less
Dec 19 07:46:47 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez cd
Dec 19 07:46:48 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez mv /var/lib/mock/epel-6-x86_64/result/bash* .
Dec 19 07:46:49 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez ls
Dec 19 07:48:13 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez mock -r epel-6-i386 bash-4.1.2-15_99.el6.src.rpm
Dec 19 07:51:12 mock -bash: HISTORY: PPID=4187 PID=4511 SID=4511 UID=0 User=root cat /etc/rsyslog.conf
Dec 19 07:52:22 mock -bash: HISTORY: PPID=4187 PID=4511 SID=4511 UID=0 User=root tai /var/log/messages
Dec 19 07:52:25 mock -bash: HISTORY: PPID=4187 PID=4511 SID=4511 UID=0 User=root tail -f /var/log/messages
Dec 19 07:52:28 mock -bash: HISTORY: PPID=4187 PID=4511 SID=4511 UID=0 User=root tail -f /var/log/bash.log
Dec 19 08:01:13 mock -bash: HISTORY: PPID=27954 PID=27955 SID=27937 UID=500 User=eperez mv /var/lib/mock/epel-6-i386/result/bash-* .

Disfruten!

La forma fácil:

Si no tenemos tiempo para crear el rpm comento que estos rpm para CentOS-6 les he puesto  en el repo anku de EcuaLinux que es publico y que da bastante trabajo echar a andar un nuevo repo sólo por escasos paquetes, le instalo al repo:

wget -O /etc/yum.repos.d/anku.repo http://centos6.ecualinux.com/centosec.repo

Y ya luego:

yum update bash

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.