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 correo. 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
1. Hacer login como root.
2. 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
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
3.
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.
genial, muchas gracias por tu aportación!
ResponderEliminarUna belleza, gracias
ResponderEliminarEsta linea me deja dudas: mailto=${mailto:-operator} No debería ir ahi el correo de la persona que recibirá el mensaje?
ResponderEliminar