PiAlert V1 en guardia para la seguridad del servidor

Un día tuve una idea. Esta idea se plasmó en el proyecto PiAlert. Puedes averiguar qué es a partir de estevídeo. En pocas palabras, PiAlert resulta ser un dispositivo en el que, si hay intentos de inmiscuirse en los servidores, se encienden luces de colores. El sistema calcula el número total de tales eventos. Principalmente he visto intentar conectarme al puerto 22 (SSH) en mis servidores. Por lo general, estos eventos son el resultado de la actividad del bot. Durante el día, en uno de mis VPS, donde se habilitó el sistema de inicio de sesión habitual, se registraron 1.633 intentos de intrusión. En otro servidor, que utilizó un inicio de sesión sin contraseña con una clave SSH, se registraron 9 ataques. Una vez se detectó un intento no autorizado de iniciar sesión en el panel del proyecto de WordPress. El vídeo mencionado muestra una prueba del sistema antes de ponerlo en funcionamiento.



Y aquí hay algunas tomas.





PiAlert en acción





Apagado dispositivo, vista frontal





Dispositivo desactivado, vista lateral



Debo decir que lo que obtuve, en el mejor de los casos, se puede llamar una versión alfa del dispositivo. Compartí el código delproyecto y el modelo para la impresión 3D del caso en el dominio público con la esperanza de que si mi proyecto le interesa a alguien, me ayudarán a mejorarlo por el bien común.



Descripción del proyecto



Después de un incidente reciente con uno de mis servidores, me di cuenta de que realmente me gusta hurgar en los registros y averiguar qué sucedió. Normalmente uso los siguientes comandos:



tail -n 80 -f /var/log/apache2/error.log
tail -n 80 -f /var/log/apache2/access.log
tail -n 80 -f /var/log/auth.log


Es interesante ver a qué páginas intentan acceder los bots desde la nada, o a qué cuentas están intentando iniciar sesión a través de SSH. También parece películas de piratas informáticos. Entonces pensé que podría crear algo que se vea mucho más atractivo que una ventana de terminal. En ese momento nació el proyecto del que hablo aquí.



Los resultados de la supervisión de los intentos de inicio de sesión han cambiado recientemente. Esto sucedió después de que implementé un procedimiento de inicio de sesión más estricto. Es decir, el número de intentos de iniciar sesión en el sistema se redujo drásticamente. Esto se hizo evidente después de que el sistema de monitoreo del servidor que creé funcionó durante 24 horas. A continuación hablaré de esto.



Este material se divide en tres secciones. El primero trata sobre el hardware, el segundo sobre la configuración de servidores y el tercero sobre los programas para Raspberry Pi.



Hardware



Mi dispositivo se ensambla con los siguientes componentes:





Aquí está el diagrama de conexión.





Diagrama de conexión de componentes a la placa



Para conectar el panel LED Blinkt a la Raspberry Pi! Se utilizaron cables de conexión DuPont . Por un lado, los corté y los soldé a los pines correspondientes del puerto GPIO de 40 pines del panel. No pude conectarlo directamente a la placa porque todavía necesitaba conectarle una pantalla.



Me tomó mucho tiempo hacer que el panel funcionara. Al principio, pensé que mi instancia sufría malas conexiones en el conector. Y para resolver esto, tuve que pasar por prueba y error, dedicar mucho más tiempo del que me gustaría dedicarle. Después de que me comuniqué con Pimoroni a través de Twitter, resultó que las primeras versiones de Blinkt! use el pin # 2 para 5V, no el pin # 4 como se muestra en pinout.xyz . Yo, sin embargo, hasta que lo descubrí, ordené a toda prisa otro panel LED Blinkt! En caso de que el mío no funcionara. Y ahora, después de que logré lanzar el primero, necesito pensar en un nuevo proyecto en el que podría usar el segundo. Coloqué



todos estos componentes en un estuche que diseñé en Tinkercad... El cuerpo se imprimió en mi impresora 3D Ender 3 Pro. Conseguí el estuche, pero todavía no podía pensar en cómo hacer sus partes para que encajaran bien entre sí o se unieran entre sí con pestillos. Como resultado, formé un par de postes en una de las partes del cuerpo, diseñados para tornillos M5, que usé para ensamblar el dispositivo terminado. Estos postes se colocan a lo largo de los bordes para que haya suficiente espacio en la carcasa para la Raspberry Pi.



Para imprimir el estuche, utilicé PLA de un fabricante desconocido (temperatura de impresión: 217 ° C, tasa de llenado: 10%) Apliqué la configuración habitual que se recoge después de ver varios videos en YouTube .





Resultados de varios intentos de imprimir un corpus





Montaje del cuerpo



Solo logré crear un panel frontal de aspecto decente en mi noveno intento. Cada vez que lo imprimía, resultaba que algo necesitaba moverse un poco, o que en algún lugar, aunque fuera un poco, algo necesitaba ser corregido. Solo usé Tinkercad algunas veces al editar el modelo, y tuve que empezar a trabajar en él casi desde el principio. ¡Quería arreglar la barra de LED Blinkt! usando broches, pero después de algunos intentos fallidos abandoné esta idea y resolví el problema con una pistola de pegamento (¡me encanta esta cosa!). Como resultado, arreglé tanto la pantalla como la placa Raspberry Pi con él. Terminando el trabajo en el caso, estaba resolviendo el problema de colocar el tablero en él. Al principio, no arreglé la placa en la carcasa de ninguna manera, pero debido a esto, conectar un cable USB se convirtió en una verdadera aventura.En la versión final del estuche (si es que podemos decir que algunas de sus versiones serán "definitivas") me gustaría deshacerme de los tornillos, de los agujeros para ellos y de los postes dentro del estuche, y encontrar una manera de conectar las partes del estuche, por ejemplo, con usando pestillos. Si alguien quiere participar en el trabajo del corpus y cambiarlo todo, ¡es bienvenido! Y también quiero cerrar el panel frontal de la caja con algo como vidrio translúcido o un trozo de acrílico. Esto le daría al dispositivo un aspecto acabado, ocultando detalles demasiado "técnicos".Si alguien quiere participar en el trabajo del corpus y cambiarlo todo, ¡es bienvenido! Y también quiero cerrar el panel frontal de la caja con algo como vidrio translúcido o un trozo de acrílico. Esto le daría al dispositivo un aspecto acabado, ocultando detalles demasiado "técnicos".Si alguien quiere participar en el trabajo del corpus y cambiarlo todo, ¡es bienvenido! Y también quiero cerrar el panel frontal de la caja con algo como vidrio translúcido o un trozo de acrílico. Esto le daría al dispositivo un aspecto acabado, ocultando detalles demasiado "técnicos".



La placa Raspberry Pi en la que se basa este proyecto ya se ha utilizado en otro proyecto que necesitaba un puerto GPIO de 40 pines para montar en la parte posterior de la placa. Resultó ser una ventaja. La placa está firmemente fijada en el estuche, en otros proyectos probablemente no la usaré. Por lo tanto, doblé algunos de los pines para colocar mejor todo en el estuche.





¡Todo encaja!



Al final, tuve otra idea, que es que debería equipar el dispositivo con al menos un par de botones. Tal vez ni siquiera los saque, pero simplemente ocúltelos en algún lugar del estuche. Se necesita uno para cambiar entre diferentes tipos de ataques fijos y mostrar su número. Y el segundo debería, con una pulsación corta, apagar la pantalla y, con una pulsación larga, apagar suavemente la Raspberry Pi. Si lo necesito, siempre puedo conectarme a mi dispositivo a través de SSH, y si realmente lo necesito, puedo crear una ruta URL que invoca el comandosudo halt.



Configuración del servidor



Cuando, luego del incidente mencionado anteriormente, estaba fortaleciendo la protección de los servidores y configurando el monitoreo, verifiqué que el programa fail2ban estaría instalado en ellos . Esto es maravilloso FOSS-proyecto. Fail2ban monitorea los registros en el servidor y registra información sobre algo que, en condiciones normales, no debería suceder, como múltiples intentos fallidos de inicio de sesión SSH. A continuación, el programa prohíbe la dirección IP desde la que se originan las solicitudes sospechosas, haciendo esto en caso de que sea un problema potencialmente grave, o si algunos eventos se repiten dentro de un período de tiempo predeterminado. De forma predeterminada, fail2ban monitorea el tráfico SSH, pero el programa también se puede configurar para vigilar algo más, como el número de errores 404 o el número de intentos fallidos de iniciar sesión en el panel de administración de un proyecto de WordPress .



Fail2ban le permite crear sus propias acciones a las que se llama cuando ocurren varios eventos. Resultó ser más complicado que hacer algo como una simple solicitud de curl, así que terminé recurriendo a GitHub en busca de ayuda. No importa lo que hice, no pude hacer que el sistema funcionara como debería. Para facilitarte la solución de un problema similar, te contaré cómo finalmente logré configurar todo. Es decir, estamos hablando de usar fail2ban en un servidor basado en Debian.



Creemos un archivo jail.localy agreguemos lo siguiente:



[sshd]
enabled = true
port = ssh
banaction = pinotifyred[myhost="SCRIPTHOSTSERVER"]


Aquí SCRIPTHOSTSERVERdebe reemplazarlo con una URL adecuada (por ejemplo, activada dev.testing:8080). Tenga en cuenta que no hay información de protocolo al principio de esta URL, no hay una ruta al final y la dirección no debe terminar con una barra.



Como resultado, resulta que tendremos las acciones habituales asociadas con SSHD, el programa seguirá prohibiendo direcciones IP sospechosas, pero también podremos crear acciones adicionales. Desafortunadamente, no puede simplemente describir el comando que se ejecutará aquí (este era mi problema). En su lugar, debe indicarle al sistema exactamente qué acción tomar. La acción se llama desde un archivo almacenado en una carpeta action.d. Los nombres de los archivos .conf en esta carpeta corresponden a los nombres de las acciones (en nuestro caso, esto pinotifyred.conf). Así es como se ven estos archivos:



[Definition]
#  get-  "http://example.com/red"

actionban = curl --fail "http://<my-host>/red" >> /dev/null

[Init]
#     jail-    :
my-host = SCRIPTHOSTSERVER


Aquí, nuevamente, debe cambiar SCRIPTHOSTSERVERa una URL adecuada (más o menos dev.testing:8080), cumpliendo las mismas reglas que se discutieron anteriormente en la descripción del archivo jail.local.



El código llama a la acción y cambia la variable my-host. No podría hacer que todo funcione sin esa variable.



Este código ejecuta el comando requerido. Declara algunas variables que son necesarias para que fail2ban funcione. Además, la forma en que esto está configurado significa que tenemos la capacidad de enviar solicitudes curl o wget con diferentes parámetros. Entre estos parámetros, por ejemplo, puede haber información sobre qué IP fue prohibida y cuándo sucedió exactamente. Por lo tanto, si desea recibir información más detallada sobre los ataques que, como en mi caso, solo datos sobre su número, puede usar esto. Es decir, para hacer esto, puede colocar un action.darchivo con el siguiente contenido en la carpeta :



[Definition]
# get-  "http://example.com/ban.php?jail=sshd&ip=192.0.2.100":

actionban = curl -G --data-urlencode "jail=%(name)s" --data-urlencode "ip=" --fail "http://<my-host>/ban.php"

[Init]
#     jail-    :
my-host = SCRIPTHOSTSERVER


Me gustaría señalar que probablemente haya un error aquí, ya que la acción se llama dos veces: cuando la IP está bloqueada y cuando está desbloqueada. Planeo abordar esto más tarde, tal vez esto lleve a duplicar el número de ataques.



Software Raspberry Pi



Para ser honesto, mi código es un completo desastre. Fue escrito en Python 3 por una persona (yo) que no conoce Python, pero es capaz de buscar respuestas a preguntas en Internet. Esto, junto con el conocimiento general de programación, me permitió escribir un programa en Python.



No hablaré aquí de preparar la Raspberry Pi para el trabajo SSH, ya que mucha gente ya ha hablado de esto . El código en cuestión está alojado en GitHub . Está representado por un par de archivos. El primer archivo es este pialert.py, comienza al arrancar el sistema. El segundo archivo tm1637.pyes una biblioteca que tomé de este material del sitio de RaspberryTips .



Mi programa Python actúa como un servidor HTTP (sé que no es para producción, pero sigue siendo un simple proyecto doméstico) escuchando todas las solicitudes. Este es un programa de un solo subproceso, por lo que si hay muchas solicitudes, lo más probable es que falle. El programa espera a que llegue la URL y, si está registrado con ella, realiza la acción. La acción consiste en encender el LED de Blinkt !, al estilo Larson Scanner , y aumentar el contador. La elección del color del LED depende de la URL.



Estoy usando 4 colores:



  1. Azul: indica que se realizó un ataque en mi sitio de WordPress .
  2. Rojo: ataque SSH al servidor A.
  3. Púrpura: ataque SSH al servidor B.
  4. Verde: ataque de URL contra el servidor C.


Quizás, con el tiempo, ampliaré el conjunto de ataques registrados por el dispositivo. Pero incluso lo que es ahora le permite estar al tanto de los eventos sin conectarse a los servidores.



En mi código, los errores no se manejan y no se monitorea un posible desbordamiento del contador. El programa, entre otras cosas, me muestra que incluso mi red doméstica está siendo constantemente atacada en forma de solicitudes de URL especiales. Los atacantes intentan acceder a la red a través de cualquier vulnerabilidad que descubren (esto arroja excepciones, pero esto no detiene el programa).



Una de las últimas tareas que tuve que resolver mientras trabajaba en el proyecto fue configurar la Raspberry Pi. Es decir, necesitaba que el tablero iniciara el script inmediatamente después de cargarlo, y luego todo funcionaría. Este problema se resuelve editando el archivo /etc/rc.local. Usé el editor vi para agregar un comando al archivo que generalmente se usa para iniciar programas:



python3 /home/pi/PiAlert/pialert.py &


Después de eso, solo me quedaba un problema por resolver. Fue para proporcionar acceso ininterrumpido para mi VPS a la Raspberry Pi, que estaba en la red doméstica, detrás de un firewall y tenía una dirección IP dinámica. Podría usar DNS dinámico o cualquiera de los innumerables servicios que existen. Sin embargo, alguien de la comunidad Reddit autohospedada creó un servicio gratuito freemyip.com, que resuelve exactamente el problema que necesitaba resolver. Y lo resuelve bien. El servicio aún no es muy popular, y estoy seguro de que, debido a su costo gratuito, no se mantendrá como está por mucho tiempo. Pero considerando lo fácil que es trabajar con él, con mucho gusto lo pagaría. Encontré otro servicio interesante en la misma comunidad, sliceport.com . Lo intentaré algún día también.



Salir





La



demostración de PiAlert es un dispositivo que no se puede comparar con algunas de las mejores cosas de piratería de las películas. Su propósito es recordarte que todos los días miles de bots intentan acceder a algo a lo que no deberían tener acceso. El dispositivo que creé simplemente transfiere información sobre tales intentos al mundo real, recordándonos. También salió bastante lindo.



¿Qué otras cosas buenas puedo decir sobre PiAlert? El dispositivo parece neutral y es muy flexible. Si decido que ya no lo necesito tal como está, puedo reescribir el código y convertirlo en un reloj. O puedo convertirlo en un contador de visitas a las páginas de mi sitio. De hecho, hay toneladas de opciones para usar LED RGB y una pantalla de 4 dígitos. Además, mi dispositivo resultó ser compacto. Se coloca frente a mí en mi escritorio cuando escribo código y me recuerda que hay personas en el mundo que están haciendo cosas malas. El PiAlert requiere muy poca energía para funcionar, por lo que puede funcionar con baterías. Se puede colocar en cualquier lugar de la casa siempre que se pueda conectar a una red WiFi. Allí simplemente hará su trabajo.Y si necesito otra red, bastará con conectarme a la Raspberry Pi vía SSH o crear un nuevo archivowpa_supplicant.confen /boot.



Como resultado, quiero señalar que mi código, por supuesto, no se ve muy bien. Puede y debe refactorizarse. Si alguna vez aprendo Python, lo haré allí mismo. El caso también se puede mejorar y yo, nuevamente, si domino algún tipo de programa de modelado 3D, trabajaré en el caso. Pero, si no lo toma en cuenta, puedo decir que estoy contento con lo que hice.



¿Está planeando hacer un dispositivo similar a PiAlert?



All Articles