Esta mini guía explica una forma de configurar el demonio SSH para que envíe un correo cada vez que se produzca un acceso con éxito a nuestra máquina. Se contemplan todos los tipos de la sesión: Shell interactiva, comando-simple y de subsistema (sftp). Es extremadamente sencilla ya que solo requiere tres pasos.
El texto es una traducción del mensaje original que timeBandit publicó en los foros de Gentoo y se hace con consentimiento del autor, así es que todos los créditos le corresponden a él.
Introducción
Existen muchas herramientas y técnicas que podemos usar para estar al tanto de las conexiones que se producen en un servidor desatendido (TCP wrappers, swatch, etc.). En lugar de usar alguna de estas técnicas ideé este método tan simple porque no requiere instalar ningún paquete que no tenga ya instalado. En mis sistemas la utilizo para que, en el momento en el que cualquier persona entre, enviar un mensaje SMS a mi teléfono móvil. En caso de que esa persona no sea yo, tengo una oportunidad de echar al intruso o apagar la máquina ;-).
Requisitos previos
Se asume que los siguientes paquetes están ya instalados y funcionando:
- OpenSSH (net-misc/openssh).
- El cliente de correo mailX (mail-client/mailx), para enviar correos desde scripts de shell o desde línea de comandos.
- Un MTA ("mail transfer agent" o "agente de transferencia del correo") para mailX, como pueden ser Qmail, Postfix o Sendmail.
- Opcional: el sistema de ventanas X Window. No es obligatorio, pero debe de tenerse en cuenta a la hora de configurar SSH.
En caso de no cumplir alguno de los requisitos existen un montón de recursos para ayudarte, incluyendo los excelentes foros de Gentoo. Cómo configurar SSH o un servidor de correo está fuera del alcance de esta guía, que cubre solamente cómo conectar ambos.
Cómo funciona
En caso de que exista el script /etc/ssh/sshrc, SSH lo ejecuta después de cargar el entorno de un usuario pero antes de iniciar su intérprete de comandos. Este archivo nos proporciona las inicializaciones globales necesarias "antes de que el directorio /home del usuario llegue a ser accesible" (consultar # man 8 sshd). En mi caso, lo utilizo para enviar el correo con los detalles de la conexión.
Qué hacer
- Hacer login como root.
- Crear /etc/ssh/sshrc tal y como se muestra a continuación. En caso de que ya exista no sobreescribirlo, simplemente añadir en el punto adecuado los comandos que aparecen a partir de "Enviar una alerta con los detalles de la conexión".
# Establecer XAuthority usando el protocolo X desde stdin # (ejemplo sacado de: man 8 sshd) # Puedes omitir esta seccion si X (y por tanto xauth) no estan instalados. # if read proto cookie && [ -n "$DISPLAY" ]; then if [ `echo $DISPLAY | cut -c1-10` = 'localhost:' ]; then # X11UseLocalhost=yes echo add unix:`echo $DISPLAY | cut -c11-` $proto $cookie else # X11UseLocalhost=no echo add $DISPLAY $proto $cookie fi | xauth -q - fi # Enviar una alerta con los detalles de la conexión # cuando=`/usr/bin/date` donde=`echo $SSH_CONNECTION|cut -f1 -d' '|cut -f4 -d:` if [ -z "$SSH_TTY" ] ; then que="Conexion de $USER" else que="Login de $USER en $SSH_TTY" fi mailto="" cc_to="" bcc_to="" while read direccion mode do if [ -z "$direccion" -o "${direccion:0:1}" = "#" ] ; then continue; fi if [ "x$mode" = "xcc" -o "x$mode" = "xCC" ] ; then cc_to=${cc_to:+${cc_to},}$direccion elif [ "x$mode" = "xbcc" -o "x$mode" = "xBCC" ] ; then bcc_to=${bcc_to:+${bcc_to},}$direccion else mailto=${mailto:+${mailto},}$direccion fi done </etc/ssh/notify mailto=${mailto:-operator} cc_to=${cc_to:+"-c $cc_to"} bcc_to=${bcc_to:+"-b $bcc_to"} mail ${cc_to} ${bcc_to} -s "Alerta SSH" ${mailto} >&2 <<-EOM ${que} desde ${donde} el ${cuando} EOM
Este archivo debe tener permisos de lectura para todos los usuarios (# chmod 644 /etc/ssh/sshrc) puesto que se ejecuta con los privilegios del usuario que conecta. No es necesario, ni recomendado, establecer permiso de ejecución en el archivo. Las direcciones de los destinatarios de las alertas se encuentran en otro archivo para facilitar el mantenimiento.
Lo anterior sigue la sintaxis de Bash y asume que en tu sistema /bin/sh es equivalente a /bin/bash (SSH ejecuta este archivo usando /bin/sh). Si no es ése tu caso entonces me temo que no puedo ayudarte, pero se aceptan contribuciones de algún script de shell equivalente :-). Para los detalles de los trucos usados en el script puedes consultar la página del manual del Bash, especialmente la sección "Extensión de parámetros".
- Crear el archivo con la lista de destinatarios, /etc/ssh/notify.
# Lista de destinatarios para las alertas de acceso SSH # # Formato: # direccion[,direccion] [cc|bcc] # # Se pueden indicar varias direcciones en distintas lineas o separadas por comas # Las opciones "cc" y "bcc" marcan la direccion(es) de destino como "Cc:" or # "Bcc:", respectivamente. # # Las lineas en blanco o con # en la columna 1 son ignoradas. # # Es importante que la ultima linea del fichero sea una linea en blanco # 123456789@pagina-de-sms.foo root@localhost,yomismo@oficina.com bcc
También en este caso el archivo debe tener permisos de lectura para todos los usuarios (# chmod 644 /etc/ssh/notify). Sustituye las direcciones del ejemplo por las direcciones que quieras que reciban las alertas de conexión.
Cuando alguno de los destinatarios sean direcciones SMS, es posible que te interese evitar la opción CC en favor de BCC. De esta forma no se incluyen en el mensaje las direcciones del resto de destinatarios y el SMS se mantiene breve.
Eso es todo. No es necesario reiniciar el servicio SSH.
Comprobación
Conéctate a la máquina vía SSH usando tu método preferido (ssh, PuTTY, sftp, etc.). En poco tiempo, los destinatarios listados en /etc/ssh/notify deberían recibir un mensaje similar a este:
Asunto: Alerta SSH De: stolz@foo.bar Para: admin@midominio.foo Fecha: Hoy 21:42:05 Login de stolz en /dev/pts/2 desde 216.16X.XX.XX el Wed Dec 21 21:42:05 CET 2005
Hay que tener en cuenta que los mensajes SMS pueden tardar varios minutos en llegar, dependiendo de la red de tu proveedor y de la propia disposición del MTA. En caso de ser una intrusión real, sabrías a quién "perseguir" y de dónde vino.
Resolución de problemas
Cosas que comprobar si no recibes ninguna alerta:
- Asegúrate que los archivos tienen permisos de lectura para todos los usuarios
- Asegúrate que el correo funciona
Remplaza TuNombre@tu.dominio por una tus direcciones auténticas que sepas que funciona. Si no recibes el mensaje de prueba, busca fallos en el servidor de correo o en la configuración del cliente.
- Comprueba y vuelve a comprobar con minuciosidad las direcciones en /etc/ssh/notify. En concreto, observa que las direcciones se pueden poner una por línea, en listas separadas por comas, o de ambas formas, pero las listas separadas por espacios en blanco no funcionarán. Por ejemplo
BIEN: tu@localhost,yo@mimaquina O: tu@localhost yo@mimaquina MAL: tu@localhost yo@mimaquinaEn el ejemplo MAL, cualquier dirección después del primer espacio será ignorada de forma silenciosa. El script no hace ningún tipo de comprobación de direcciones, así es que pon atención para no introducir errores de mecanografía.
- Revisa los logs de tu MTA para ver la información relativa a correos no aceptados y otros fallos similares.
Gracias a Ron (a.k.a timeBandit) por su mensaje original.

Gracias.
En cuento saque tiempo, me pongo manos a la obra con este mini how-to :_). Muchas gracias, Stolz, por cierto, felices fiestas (aunque sólo te conozca por los foros de gentoo :P) :).
Muy interesante...
Muy intresante esta manera de controlar absolutamente el tráfico ssh... sobre el tema tengo unas preguntas:
1) Tengo alguna dificultad para utilizar el servicio sendmail... (más detalles) si alguienn tiene sugerencias las agradecería mucho.
2) Con el ssh me ocurre algo extraño: no logro ejecutar algunas aplicaciones como usuario remoto (más detalles)
3) Por último: leía más arriba, en el código que se presenta, la opción # X11UseLocalhost=yes comentada... quisera saber para que es esa opción y si es posible algún material de consulta (en español) que describa las diferentes alternativas del archivo de configuración del ssh....
Bueno, desde ya muchísimas gracias.-
logear fin de sesion?
Hola,
segui la guia y funciona a la perfeccion. GRACIAS!!
muy buena manera de enterarse quien esta en alguna maquina y si lo combinas con un filto+etiqueta de gmail el resultado es un buen registo de accesos por ssh a la maquina en cuestion ordenados por usuario.
solo me queda una consulta:
es posile hacer algo similar pero a la salida de la sesion? es decir cuando el usuario cierra la sesion remota, para poder asi tener una idea mas clara de cuanto tiempo estubo el usuario.
nuevemante gracias
saldos
last
Hola xSober.
No se como hacer algo similar para la salida de sesión. Tal vez con el comando 'last' puedas obtener lo que buscas.
Saludozzzzzzz