06 marzo 2009

Parche para registrar comandos en bash 4.0

La más conocida de las shell, Bourne Shell, ha visto su versión 4.0 recientemente. Y como buenos BOFHs en sistemas compartidos que administramos, hay que tomar todas las medidas posibles para controlar los comandos que ejecutan nuestros queridos usuarios.

Existen distintos métodos para esta tarea, desde demonios que funcionan como keyloggers hasta truquitos en bash, pero yo personalmente prefiero parchear la shell.

Aunque realmente un usuario cabroncete, podría subirse su propia shell y ejecutar todo de forma que no quedase huella. La idea realmente no es espiar ni utilizar esta información como evidencia de nada. Es más bien una bitácora donde nosotros mismos podremos consultar que ejecutamos un día determinado y cosas similares.

Queda claro entonces que la intención y medida tiene importantes problemas de seguridad que serían saltados de maneras posibles.

Para instalar este parche, es tan sencillo como llevar a cabo los siguientes pasos:

1.- Descargar código fuente de bash:
[aramosf@malygos tmp]$ wget ftp://ftp.cwru.edu/pub/bash/bash-4.0.tar.gz --2009-03-06 21:02:02-- ftp://ftp.cwru.edu/pub/bash/bash-4.0.tar.gz => `bash-4.0.tar.gz.1' Resolving ftp.cwru.edu... 129.22.8.159, 129.22.9.240 Connecting to ftp.cwru.edu|129.22.8.159|:21... connected. [...]
2.- Descomprimir el código
[aramosf@malygos tmp]$ gzip -dc bash-4.0.tar.gz | tar -x
3.- Descargar y aplicar el siguiente parche de Javier Olascoaga que he actualizado para que se pueda usar en la versión 4.0.
[aramosf@malygos tmp]$ wget -q http://www2.unsec.net/bash-4.0-syslog.patch -O - | patch -p0 patching file bash-4.0/bashhist.c patching file bash-4.0/lib/readline/histexpand.c patching file bash-4.0/lib/readline/histfile.c patching file bash-4.0/lib/readline/history.c patching file bash-4.0/lib/readline/history.h
4.- Compilar.
[aramosf@malygos tmp]$ cd bash-4.0 [aramosf@malygos bash-4.0]$./configure checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking for emacs... no checking for xemacs... no [...] [aramosf@malygos bash-4.0]$ make rm -f mksyntax gcc -DPROGRAM='"bash"' -DCONF_HOSTTYPE='"i686"' -DCONF_OSTYPE='"linux-gnu"' -DCONF_MACHTYPE='"i686-pc-linux-gnu"' -DCONF_VENDOR='"pc"' -DLOCALEDIR='"/usr/local/share/locale"' -DPACKAGE='"bash"' -DSHELL -DHAVE_CONFIG_H -I. -I. -I./include -I./lib -g -o mksyntax ./mksyntax.c rm -f syntax.c ./mksyntax -o syntax.c [..]
4.- Instalar.
[aramosf@malygos bash-4.0]$ sudo make install ( cd ./po/ ; make DESTDIR= installdirs ) make[1]: Entering directory `/tmp/bash-4.0/po' [...]
Tal y como está desarrollado el parche, los eventos llegarán a syslog como local5.info
syslog(LOG_LOCAL5| LOG_INFO, "history: [pid:%d uid:%d] %s(++TRUNC)",

Para lo que deberemos configurar nuestro syslog, especificando donde queremos envíar estos eventos. Por ejemplo añadiendo la siguiente línea al archivo /etc/syslog.conf

local5.* /var/log/User.log

Finalizando, si queremos que cada usuario tenga su propio fichero, simulando un bash_history, pero con fecha. Se puede parsear procesar el fichero:

[aramosf@malygos bash-4.0]$ sudo mkdir /var/log/users

Y ejecutando el siguiente script:

Dejo pendiente escribir sobre las distintas variables del la shell para asuntos similares, y como se pueden añadir capas de seguridad adicionales...

5 comments :

Pepe dijo...

"Bourne Shell" y BASH son dos cosas distintas. Un poquito de por favor...

Alejandro Ramos dijo...

Gracias Pepe por el apunte, como bien matizas me he dejado el "Again", seguramente también me haya dejado algún GNU delante de Linux. Date prisa, seguro que si lees el blog entero lo encuentras y puedes comentarlo.

Un saludo!

Mariano Fons dijo...

Muy interesante el artículo.
Me he puesto a probarlo, he parcheado, incluído la línea en mi syslog.conf y reiniciado el servicio.
Pero no me loguea nada, algo se me escapa?

Gran blog, un saludo.

Alejandro Ramos dijo...

Buenas Mariano,

Primero, comprueba que ejecutando:

logger -p local5.info prueba

Aparece en el log donde hayas configurado el syslog una nueva linea, eso significaría que tienes correctamente el syslog configurado.

La segunda prueba, es comprobar que usas la 4.0 mediante:

bash --version

Debería mostrar la versión 4.0 que has compilado.

Un saludo y suerte.

Anónimo dijo...

Un monton de meses tarde...
Hay que hacer logout de la bash actual.
El logging solo estara disponible a partir de la siguiente ejecucion de bash.