Que vamos ver en este artículo
- 1) Crear un bot en Telegram y obtener el token
- 2) Obtener el chat_id y probar manualmente el envío
- 3) Guardar las credenciales y proteger las credenciales
- 4) Crear el script de notificación
- 5) Hacer una copia de PAM y configurar PAM
- 6) Probar acceso SSH real y ver posibles errores si no llega el mensaje
- 7) Conclusiones
- 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 buscadorBotFather
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 botAlright, 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 5Seguido 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
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_idLo primero buscamos el bot en Telegram
Lo abrimos y escribimos /start o pulsamos el botón
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"
Es inmediato y en el móvil si activais las notificaciones para este chat quedaría así
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
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.shY 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
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 PAMCopia de seguridad con:
sudo cp --preserve=all \
/etc/pam.d/sshd \
"/etc/pam.d/sshd.backup-$(date +%Y%m%d-%H%M%S)"
sudo sshd -T | grep usepam
El resultado tiene que ser usepam yesEl 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 siguientesession 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 telegramPara 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 sshsudo 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
:-)
/








