Monitorizando el acceso root al sistema.

Llevo un par de años administrando mi Servidor VPS y siempre tienes la desconfianza, de que en, algún momento, algún pillaban pueda llegar a acceder con el usuario root al sistema. Entonces, para mi propia tranquilidad, he creado un script en Python para monitorizar el log de autentificación y si en algún momento llega a tener acceso, el script me enviará un correo electrónico.

En este correo electrónico, se enviarán las últimas cinco líneas del log \var\log\auth.log donde podremos ver desde donde se hizo la conexión. Y claro está, si no hemos sido nosotros… tendremos que ir corriendo a conectarnos al servidor para cambiar la contraseña de root y cerrar todas las conexiones SSH o Webmin 😛

El lanzamiento del Scipt, se hace desde el Cron del sistema. Este, es lanzado al inicio y nunca finalizará, debido a que el Scipt tiene un bucle infinito. Entonces, siempre estaremos avisados, de la posible  amenaza de que alguien de lo ajeno, se conecte al Servidor.

Scipt Python:

#!/usr/bin/python

# ####################################### #
# 17/02/2018 BeniValero                   #
# Monitorizando el acceso root al sistema #
# ####################################### #

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
import subprocess
import time

def send_mail (sms_mail):	
	# User/Password para enviar correo electronicos
	mail_origen = 'xxxxxxxxx@valero-torres.es'
	username = 'xxxxxxxxx'
	password = 'yyyyyyyyy'
	
	#Enviar...
	mail_destino = 'xxxxxyyyy@gmail.com'

	# Parametrizacion del mensaje
	msg = MIMEMultipart()
	msg['From'] = mail_origen
	msg['To'] = mail_destino
	msg['Subject'] = "Aviso de Seguridad del Servidor Virtual"
	msg.attach(MIMEText(sms_mail, 'plain'))
	 
	# Modulo smtplib  -- https://docs.python.org/3/library/smtplib.html
	try:
	   smtpObj = smtplib.SMTP('valero-torres.es') # Servidor SMTP
           smtpObj.ehlo()
           smtpObj.starttls()
           smtpObj.ehlo()
	   smtpObj.login(username,password)
	   smtpObj.sendmail(mail_origen, mail_destino, msg.as_string())
	   print 'Successfully correo enviado.'
	   smtpObj.quit()
	except SMTPException:
	   print 'Error: el mensaje no pudo enviarse.'		   
	return;
	
def writelastline (fname):
	f = open (fname, 'a')
	f.write('\n		--> Administrador del Sistema avisado <--\n\n')
	f.close()
	
while True :	
	return_getlastline = subprocess.check_output('tail -1 /var/log/auth.log', shell=True)

	if 'Successful login as root from' in return_getlastline: # Webmin
		txt_mail = subprocess.check_output('tail -5 /var/log/auth.log', shell=True)
		send_mail(txt_mail)
		writelastline('/var/log/auth.log')
	else:
		print (time.ctime(), 'Todo va bien WEBMIN')

	if 'pam_unix(sshd:session): session opened for user root' in return_getlastline: # SSH
		txt_mail = subprocess.check_output('tail -5 /var/log/auth.log', shell=True)
		send_mail(txt_mail)
		writelastline('/var/log/auth.log')
	else:
		print (time.ctime(), 'Todo va bien SSH')

	time.sleep(2)   # Esperar (2 segundos).
Comparte en las Redes Sociales