Integración de avisos por Telegram en servidores linux)!

YOUberser

Hola!
He estado aburrido últimamente y he desarrollado un código muy sencillo escrito en Python, que usando la API de Telegram me permite recibir avisos al instante, permitiéndome saber quien entra a mi servidor, si alguien falla al logearse... También me permite reiniciar el servidor, saber la carga actual y demás, aunque por ahora solamente orientare el post al aviso de logins por SSH.

Si no tenéis la API de telegram instalada podéis ver como instalarla AQUI.

Una vez instalada es muy sencilla de usar, de hecho trae ejemplos detallados de como se usa.

En mi caso, me interesa que solamente se ejecute mi script cada vez que alguien se loguea en el servidor mediante SSH, por lo que edito el archivo "/etc/ssh/sshrc"

logger -t ssh-wrapper $USER login from $ip
python /home/miusuario/pyTelegramBotAPI/login.py $USER $ip > /dev/null 2>&1

Con este código conseguimos que se ejecute nuestro script en python, pasando las variables de usuario y dirección IP como argumentos.
Esto " > /dev/null 2>&1 " lo único que consigue es que no nos muestre ningún aviso al abrir la sesión ssh, si no pusiésemos ese código nos mostraría la salida de ese comando y a mi personalmente no me hace falta.

Y el contenido del ejecutable login.py seria:

import telebot
import sys
miid = "AQUI VA TU ID DE TELEGRAM, DONDE RECIBIRAS LOS MENSAJES"
bot = telebot.TeleBot('APIDELBOT')
bot.send_message(miid, "Usuario: " + sys.argv[1])
bot.send_message(miid, "IP: " + sys.argv[2])

Con este script lo que conseguimos es enviar los mensajes usando la API de telegram en python, pasando los argumentos segun el formato que quieras que tenga el mensaje que vas a recibir.

Aquí dejo un vídeo de lo que llevamos hasta ahora funcionando:

Ahora pasamos al ejecutable de python que se encarga de avisar si alguien falla al hacer login por ssh:

import telebot
import sys
import subprocess
import os
miid = "USUARIOQUERECIVEELMS"
bot = telebot.TeleBot('APIDELBOT')
ruta = "/home/miusuario/pyTelegramBotAPI/.historial"
child = subprocess.Popen('grep sshd.\*Failed /var/log/auth.log',stdout=subprocess.PIPE,shell=True)
output = child.communicate()[0]
if output == open(ruta).read():
        print "Sin cambios"
        sys.exit()
else:
        with open(ruta, "w") as text_file:
                text_file.write(output)
        print "Con cambios, archivo copiado"
        bot.send_message(miidG, "Alguien ha intentado entrar por ssh")
        child = subprocess.Popen('grep sshd.\*Failed /var/log/auth.log | tail -1',stdout=subprocess.PIPE,shell=True)
        output = child.communicate()[0]
        bot.send_message(miid, output)

Este script puede simplificarse, pero ahora mismo no tengo tiempo y con conocimientos mínimos de programación se puede optimizar, en un futuro lo actualizare. Ambos scripts, si el bot esta correctamente instalado y se sustituyen las rutas, Token y usuario funcionaran, los uso en mi servidor y van de lujo.
Se puede llegar a obtener control total del servidor y hacer miles de cosas desde este bot, pero hay que invertir tiempo. Por ahora quería hacer este post a ver si hay gente interesada en desarrollar todo esto ya que por lo menos a mi me entretiene y me ha parecido interesante cuando lo he descubierto.

Un saludo!!!

2
MaSoBa

Buen trabajo. Yo quería montarme algo parecido para que me alertara cuando el HDD que tengo conectado a la Raspberry muere y tengo que reiniciarla.

1 respuesta
YOUberser

#2 No deberías tener problema, aunque un script corriendo en segundo plano, comprobando algun archivo de ese HDD también valdría, cuando no pueda localizar ese archivo, el script podria reiniciarla directamente... O bien solo avisarte
Si necesitas ayuda en mis ratos libres puedo echar manos :qq:

MartiONE

Buen trabajo, pero una pregunta, cuando imprimes 'grep sshd.*Failed /var/log/auth.log' no deberias filtrar a solo la última entrada?

1 respuesta
YOUberser

#4 Exactamente, de ahí lo de que actualizaré el post jajaj
Sigo haciendo pruebas con otras cosas y ese código no lo terminé, aunque es funcional

1 respuesta
MartiONE

#5 'grep sshd.*Failed /var/log/auth.log | tail -1' :)

1
s4suk3

pues yo prefiero js a Python /abro-paraguas

spoiler

/cierro-paraguas

Usuarios habituales

  • s4suk3
  • MartiONE
  • YOUberser
  • MaSoBa