Mejoras al History del Bash

Una de las características que le falta al history del bash (por lo menos de mi punto de vista) es poder saber quien y a que hora se ejecutaron los comandos. Para poder solucionar esto existen muchas soluciones, desde agregar keylogers al sistema hasta parchear el mismo fuente del Bash.

Pero los otros dias navegando por un blog encontré una solución que me pareció muy buena y limpia a través del mismo syslog. La idea es agregar en alguno de los scripts de inicio de la sesión de los usuarios una pequeña función que guarda el ultimo comando ejecutado en el syslog a través del comando logger.

En nuestro caso elegimos el archivo /etc/profile y en el le agregamos al final las siguientes lineas:
function history_to_syslog {
declare cmd
cmd=$(fc -ln -0)
logger -p local7.notice -- SESSION = $$, WHO = $(whoami), CMD=$cmd
}

trap history_to_syslog DEBUG

Luego para poder revisar mejor los registros, configuramos el demonio de syslogd para que separe los registros y los guarde en un archivo separado. Para ello agregamos en el /etc/syslog.conf la siguiente linea:
# BASH
local7.* -/var/log/cmdhist.log
Por ahí también es bueno agregar en el logrotate algunas lineas para rotar los logs y evitar que se haga muy grande este archivo. Para ello podemos crear el archivo /etc/logrotate.d/cmdhist y le agregamos las siguientes lineas:
/var/log/cmdhist.log {
daily
rotate 31
compress
missingok
}
y con esto tendremos registrado el día a día de todos los comandos ejecutados en el sistema identificando el usuario, la sesión y la hora en que se ejecuto cada comando.

Lo bueno de esta solución es que le agrega un poco más de seguridad al histórico de los comandos. El bash_history es facil de saltear, si el usuario en algún momento de la sesión ejecutamos el comando:
unset HISTFILE
Con esto, el Bash pierde la configuración de donde tiene que guardar los comandos ejecutados, por lo que al cerrar la sesión no se guardan los comandos ejecutados. La solución de ir guardando los comandos en el syslog, le agrega un poco de seguridad en este aspecto, ya que los comandos se van guardando a medida que se van ejecutando, por lo que hasta los mismos comandos para "borrar las huellas" quedan registrados en el mismo syslog, e inclusive, se puede configurar el demonio del syslog para que guarde los registros en forma remota y de esta forma agregarle un poco mas de seguridad al respecto.

Otra vieja historia Zen

Recordando viejas historias algunas ves leídas y meditadas, hoy recordé en particular una sobre lo malo que puede ser la ansiedad de querer conseguir resultados.

La historia es la de un gran maestro zen especialista en el manejo de la espada. Un día se le acerca un joven, que conocía la destreza del maestro y le ruega para ser aceptado como su alumno. El maestro acepta y lo toma como su discípulo.

Pero el joven no quería ser el discípulo del gran maestro para ser iniciado en el Zen, lo que deseaba era convertirse en un gran espadachín para poder así vengar la muerte de su familia.

Después de unos años de ser discípulo el alumno, viendo que no avanzaba muy rápido su aprendizaje en el manejo de la espada, el alumno le pregunta al maestro: "en cuanto tiempo voy a ser un gran espadachín ?" y el maestro.. que ya conocía el apuro de su alumno, le dice "en unos 15 años mas"

La frustración del alumno fue muy grande al ver postergado en tanto tiempo su venganza y le volvió a preguntar a su maestro: "y si entreno duro todo los días ?" a lo que el maestro respondió "en ese caso... puede que en 20 años"

Mas asombrado el alumno, le reclama a su maestro "como puede ser ? si todos los días entreno para ello, como puede ser que tarde mas tiempo?"

A lo que el maestro respondió "es que en ese caso vas a estar mas pendiente en llegar al final del camino, que en lo que tienes que hacer realmente para recorrerlo y llegar a destino"

Un poco de informacion sobre SPF

Es normal escuchar hablar sobre implementar SPF para reducir el SPAM, y aunque ayuda mucho, no es el objetivo principal del mismo. Entonces, que es SPF ? Si nos remitimos a la misma Wikipedia nos dice que SPF "es una protección contra la falsificación de direcciones en el envío de correo electrónico. "

Que sucede, cuando se ideo el protocolo SMTP se pensó en un esquema muy similar a lo que se conocía, que es el correo postal, tratando de imitarlo lo mejor posible. Pero al hacer esto nos encontramos en Internet con un problema que existe en la vida real, y es que al recibir una carta, por mas que esta sea "certificada" y solicite que confirmemos su recepción, al momento de recibirla nadie nos garantiza la identidad del emisor de la misma. Para contrarrestar este problema es que surgio SPF.

SPF es una técnica por la cual, al momento de recibir un correo podemos, a través de una consulta DNS, verificar si el IP desde el cual estamos recibiendo el correo esta autorizado para entregar correos del dominio del emisor., y con esto decidir si aceptamos o no el correo.

Para que esta verificación se pueda llevar a cabo tienen que haber sucedido dos procesos totalmente independientes. Por un lado el emisor tiene que haber agregado un registro del tipo TXT especialmente armado en su zona DNS, con el listado de los servidores autorizados a enviar sus correos. Y por otro lado, el administrado del servidor de correo del dominio receptor debe configurar su servidor para realizar la verificación de cada correo entrante.

El agregar los registros para la verificacion del SPF a nuetro dominios es una tarea relativamente simple y generar el registro aun mas gracias a que existen un par de sitios que nos ayudan a generar ese registro especial que luego deberemos agregar a nuestro servidor DNS. Entre los sitios que nos ayudan a generar este registro podemos destacar el sitio de openSFP.

Un registro SPF mas o menos simple, para nuestro dominio example.com, puede llegar a ser algo mas o menos asi:

example.com. IN TXT "v=spf1 a ptr a:192.168.1.1 a:mail.example.com -all"
Con esta linea agregada al archivo de nuetra zona DNS estamos indicando que los servidores que pueden entregar correos para el dominio example.com son:

  • a -> el ip con el cual resuelva el dominio (que se obtiene con un simple dig example.com a)
  • prt -> cualquier IP que al resolver el inverso se encuentre dentro de la zona example.com ( dig -x ip_del_servidor_emisor )
  • a:192.168.1.1 -> el IP 192.168.1.1
  • a:mail.example.com -> el IP que tenga el registro mail.example.com (dig mail.example.com a)

La ultima parte de la linea, el "-all" es la política que debe emplear el receptor en caso de no coincidir el IP del servidor emisor con alguno del listado. En nuestros caso, el "-all" indica que solo los IP indicados en el registro son los autorizados para enviar correos, y por ende si se recibe un correo de otro IP que no este listado, deben ser ser tratados como falsos y descartados.

La política opuesta es la de "?all", con la cual estamos indicando que pueden llegar correos de IP que no estén listados, y que estos correos deben ser tratados como "neutrales" y ser aceptados.

Existe una tercer política, y es la que en realidad se sugiere utilizar en la mayoría de los casos, que es "~all". Esta política es considerada como un "softfail" o "falla leve". Esto nos permite indicarle al receptor que puede que el IP del cual esta recibiendo el correo no este listado entre los IP validos pero que puede no ser una falsificación de identidad, y en ese caso que también utilice otros medios para terminar la verificación.

Entre esas otras técnicas que se realizan en caso de un "softfail", es buscar entre la cabecera del correo entrante alguno de los IP validos, para saber si el origen del correo es alguno de los servidores permitidos. Esta ultima política es la que debemos utilizar, por ejemplo, si nuestro servidor de correo utiliza a otro servidor para reenviar los correos (servidor relay o smarthost ) y no siempre conocemos el IP de salida de ese servidor relay.

Con este simple registro TXT agregado a nuestra zona DNS es que estaremos evitando que terceros envíen correos en nombres nuestro, y con ello evitando, por ejemplo, los rebotes de los mail de SPAM enviados por otros usando nuestro dominio.