Buscar artículos en cambiatealinux.com



Cómo detectar accesos a tus servidores Linux en tiempo real

Por Alex, el 20/07/2026 · 10 min lectura   -  Comentarios: 0   -  Comentar el artículo
Detectar cuando alguien se conecta por ssh a tu servidor Linux, cuando esto pase lo que vamos a hacer es enviarnos una mensaje por Telegramy así estaremos advertidos en tiempo real de posibles accesos no autorizados.
Guardar el artículo.

Si te ha gustado y ayudado puedes compartir en redes para que el artículo sea mas visible y pueda ayudar a mas gente:




Las pruebas y configuraciones las he hecho con un servidor Ubuntu 24.04 y usaremos Telegram para comunicarnos.

Usaremos lo siguiente:

  • Un bot de Telegram gratuito que creemos con @BotFather y nos devolverá un token que es la contraseña del bot.
  • Un script en bash
  • PAM, que ejecutará el script

La idea es que cuando alguien se conecte via ssh un script nos envíe un mensaje a nuestra cuenta de telegram (o la cuenta que hayamos definido)

El formato del mensaje puede ser de la siguiente forma:

SSH login detected
Server: srv-linux-01
User: ubuntu
Source IP: 85.87.7.106
Date: 2026-07-17 08:35:20 CEST



1) Crear un bot en Telegram y obtener el token

Desde la aplicación móvil o desde Telegram Web busca en el buscador

BotFather

Seleccion del botfather en telegram

El bueno es el que tiene el distintivo azul.

Inicia conversación con /start o dandole al botón iniciar y despues en la caja de mensajes escribir

/newbot

para crear un bot nuevo, y nos pedirá el nombre del bot

Alright, a new bot. How are we going to call it? Please choose a name for your bot.

En mi caso lo voy a llamar Alertas Linux servidor 5

Seguido nos pregunta el username del bot que tiene que ser único.

Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

Yo lo he llamado alertas_servidor_linux_5_bot

Proceso de inicialización del bot

Y al final de ese mensaje os dara un código similar a este:

2742342uei3:2AAA9-Bjweqwps34032ssdsdsff2-Wpoec

(no tengo que deciros que este me lo he inventado)


2) Obtener el chat_id y probar manualmente el envío

Ahora que hemos creado el bot y tenemos el token id vamos a crear el chat donde vamos a recibir los mensajes y el chat_id

Lo primero buscamos el bot en Telegram

Buscar el nuevo chat recién creado

Lo abrimos y escribimos /start o pulsamos el botón

Botón start del chat para inicializarlo

Y enviamos un “Hola” por ejemplo, un texto es necesario para que Ttelegram registre la conversación.

Ahora para obtener el chat_id en el navegador abrimos esta url

https://api.telegram.org/botTU_TOKEN/getUpdates

TU_TOKER = el token que nos ha dado antes del bot (ojo el texto bot se queda antes del token)

Si te devuelve algo como esto:

{ "ok": true, "result": [] }

Este el Hola anterior no a funcionado y no se ha enterado el bot, vuelvele a hablar que está un poco sordo.

Yo le tuve que escribir un par de veces antes que devolviera el JSON correcto.

{
  "ok": true,
  "result": [
    {
      "update_id": 00000000000,
      "message": {
        "message_id": 4,
        "from": {
          "id": 11111222223333,
          "is_bot": false,
          "first_name": "Alex",
          "last_name": "..",
          "language_code": "es"
        },
        "chat": {
          "id": 11111222223333,
          "first_name": "Alex",
          "last_name": "..",
          "type": "private"
        },
        "date": 523423423423,
        "text": "/iniciar",
        "entities": [
          {
            "offset": 0,
            "length": 8,
            "type": "bot_command"
          }
        ]
      }
    },
    {
      "update_id": 121124214234,
      "message": {
        "message_id": 5,
        "from": {
          "id": 11111222223333,
          "is_bot": false,
          "first_name": "Alex",
          "last_name": "..",
          "language_code": "es"
        },
        "chat": {
          "id": 11111222223333,
          "first_name": "Alex",
          "last_name": "..",
          "type": "private"
        },
        "date": 23534535345,
        "text": "hola de nuevo"
      }
    }
  ]
}



El chat_id que se necesita es:

"chat": { "id": 11111222223333,

Y para probar el funcionamiento del bot desde un terminal del servidor hacemos la siguiente prueba y enviamos un post con curl

curl -X POST "https://api.telegram.org/botTU_TOKEN/sendMessage" \
-d chat_id=11111222223333 \
-d text="Hola desde mi servidor Linux"

esta es mi ultima prueba y salida en el chat

Test de envio desde el servidor

Es inmediato y en el móvil si activais las notificaciones para este chat quedaría así

Mensaje de alerta al movil

Ahora ya tenemos el bot creado y configurado y funciona desde el servidor.


3) Guardar las credenciales y proteger las credenciales

Y antes de seguir con la automatización vamos a guardar las credenciales del bot y a protegerlas.

Creamos un fichero en etc

sudo vim /etc/telegram-alerts.conf

Al que le guste más nano también sirve.

Y dentro ponemos el token y el chat id

BOT_TOKEN="1234567890:AAHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
CHAT_ID="987654321"


Y le damos los siguientes permisos de root

sudo chown root:root /etc/telegram-alerts.conf
sudo chmod 600 /etc/telegram-alerts.conf

Y comprobamos que esta todo correcto

sudo ls -l /etc/telegram-alerts.conf

y el resultado tiene que ser

-rw------- 1 root root ... /etc/telegram-alerts.conf



4) Crear el script de notificación

El script de notificación lo crearemos en /usr/local/sbin/tgm-ssh-login.sh

Y dentro ponemos el siguiente código:

#!/usr/bin/env bash

# Always allow the PAM login process to continue.
# A notification failure must never prevent SSH access.
trap 'exit 0' ERR

CONFIG_FILE="/etc/telegram-alerts.conf"

if [[ ! -r "${CONFIG_FILE}" ]]; then
    exit 0
fi

# shellcheck source=/dev/null
source "${CONFIG_FILE}"

# PAM calls the script for both opening and closing sessions.
# Notify only when a session is opened.
if [[ "${PAM_TYPE:-}" != "open_session" ]]; then
    exit 0
fi

USER_NAME="${PAM_USER:-unknown}"
SOURCE_IP="${PAM_RHOST:-unknown}"
SERVER_NAME="$(hostname -f 2>/dev/null || hostname)"
LOGIN_DATE="$(date '+%Y-%m-%d %H:%M:%S %Z')"

# PAM_RHOST can occasionally be empty. Use SSH_CONNECTION as fallback.
if [[ -z "${SOURCE_IP}" || "${SOURCE_IP}" == "unknown" ]]; then
    SOURCE_IP="$(awk '{print $1}' <<< "${SSH_CONNECTION:-}")"
    SOURCE_IP="${SOURCE_IP:-unknown}"
fi

MESSAGE="???? SSH login detected

Server: ${SERVER_NAME}
User: ${USER_NAME}
Source IP: ${SOURCE_IP}
Date: ${LOGIN_DATE}"

# Send asynchronously so a Telegram outage does not delay the SSH login.
curl --silent \
    --show-error \
    --max-time 5 \
    --request POST \
    "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
    --data-urlencode "chat_id=${CHAT_ID}" \
    --data-urlencode "text=${MESSAGE}" \
    >/dev/null 2>&1 &

exit 0



Ahora probamos desde el terminal el script

sudo env \
   PAM_TYPE=open_session \
  PAM_USER=ubuntu \
  PAM_RHOST=10.87.7.25 \
  /usr/local/sbin/tgm-ssh-login.sh

y al móvil tiene que llegar un mensaje como este:

Mensaje de alerta al movil con formato


5) Hacer una copia de PAM y configurar PAM

Vamos a realizar una copia de seguridad de PAM antes de configurarlo y ver si nuestro ssh utiliza PAM

Copia de seguridad con:

sudo cp --preserve=all \
 /etc/pam.d/sshd \
 "/etc/pam.d/sshd.backup-$(date +%Y%m%d-%H%M%S)"

Y comprobamos que se utiliza PAM

sudo sshd -T | grep usepam

El resultado tiene que ser usepam yes

El siguiente paso es configurar PAM para ejecutar nuestro script

Editamos el fichero /etc/pam.d/sshd

sudo vim /etc/pam.d/sshd

y al final añadimos lo siguiente

session optional pam_exec.so seteuid /usr/local/sbin/tgm-ssh-login.sh

La palabra optional es importante: si Telegram o el script fallan, el acceso SSH no debería quedar bloqueado.


6) Probar acceso SSH real y ver posibles errores

Para probarlo soy hay que hacer una conexión ssh al servidor y ver si llega el mensaje al chat telegram

Para ver los errores tenemos que ir a los logs revisando los logs de SSH y PAM

sudo journalctl -u ssh --since "10 minutes ago"

Si no se ve nada probar con sshd en lugar de ssh

sudo journalctl --since "10 minutes ago" | grep -iE 'pam_exec|telegram|sshd'



7) Conclusión

Como hemos podido comprobar esta es una solución bastante sencilla de tener controlado un servidor Linux y detectar accesos no autorizados porque ataques al ssh los hay cada día. Este bot nos sirve para monitorizar otros servicios como

  • InIntentos fallidos de SSH.
  • Uso de sudo.
  • Cambios en authorized_keys.
  • Creación de usuarios.
  • Poco espacio en disco.
  • Servicios caídos.
  • Reinicios del servidor.
  • Fallos en copias de seguridad.

Y cualquier cosa que nosotras creamos importante. O tener diferentes servidores monitorizados.

Y esto es todo !!!
Gracias por seguirme y leerme, espero que les haya ayudado
Saludos
Alex
:-)
/



Si te ha gustado y ayudado puedes compartir en redes para que el artículo sea mas visible y pueda ayudar a mas gente:




Publicidad



Artículos relacionados:

Como reemplazar texto desde el terminal en linux
2026/03/24 · 2 min lectura

Como reemplazar texto desde el terminal en linux

Cómo activar o desactivar servicios en Linux
2026/02/24 · 3 min lectura

Cómo activar o desactivar servicios en Linux

Como ajustar la hora en Ubuntu Server con timedatectl
2025/11/13 · 1 min lectura

Como ajustar la hora en Ubuntu Server con timedatectl

Calcular el tiempo que tarda en ejecutarse un script
2025/06/12 · 2 min lectura

Calcular el tiempo que tarda en ejecutarse un script

Como desinstalar Virtualbox para instalar otra versión
2025/04/06 · 2 min lectura

Como desinstalar Virtualbox para instalar otra versión


Añadir un comentarios:


  • Comenta el artículo si te ha sido de utilidad y te ha funcionado para que pueda ayudar a mas personas.
  • Si no ha funcionado comentalo tambien asi yo puedo repasarlo e intentar ver porque no funciona.

En ambos casos tú opinión es valiosa y de mucha utilidad para mejorar el blog y ayudar a otros usuarios.



(no se publica el email)


Los comentarios no se publican al momento sino que son revisados para prevenir el spam.

Todavía no hay comentarios.
Archivo:


2026 6 2025 13 2024 22 2023 34 2022 87 2021 87 2020 83 2019 38 2018 37 2017 85 2016 138 2015 49 2014 5 2013 9 2012 7 2010 1