El autor seleccionó a Code.org para recibir una donación como parte del programa Write for DOnations .
Introducción
Secure Shell (SSH) es un protocolo de red criptográfico para operar servicios de red de forma segura. Se utiliza normalmente para el control remoto de un sistema informático o para transferir archivos. Cuando SSH se expone a la Internet pública, se convierte en un problema de seguridad. Por ejemplo, encontrará bots que intentan adivinar su contraseña mediante métodos de fuerza bruta.
PyFilter tiene como objetivo filtrar todas las solicitudes de inicio de sesión ilegítimas a su servidor y bloquearlas si se envían demasiadas. Funciona leyendo archivos de registro y verificando si una solicitud fallida provino de la misma dirección IP dentro de un período de tiempo configurable por el usuario. Luego, agrega reglas al firewall si captura demasiados intentos fallidos, lo que niega la posibilidad de conectarse a su servidor.
En este tutorial, instalarás y configurarás PyFilter para bloquear solicitudes SSH. Luego, instalarás PyFilter como un servicio y, opcionalmente, configurarás la sincronización de prohibiciones entre servidores, una función que permite que varios servidores compartan la lista de direcciones IP prohibidas, y habilitarás a PyFilter para que registre datos de ubicación sobre una dirección IP. Por último, explorarás cómo anular la prohibición de direcciones IP.
Prerrequisitos
Para completar este tutorial, necesitarás:
- Un servidor Ubuntu 16.04 configurado siguiendo la guía de configuración inicial del servidor Ubuntu 16.04 , incluido un usuario sudo no root y un firewall.
- Python 3, que ya está instalado por defecto en Ubuntu 16.04.
- PIP instalado con
sudo apt-get install python3-pip
.
- (Opcional) Redis se instala siguiendo Cómo instalar Redis en Ubuntu 16.04 si desea configurar la función de sincronización de prohibición entre servidores de PyFilter en el Paso 4 .
Paso 1: Descargar y configurar PyFilter
Descargaremos PyFilter clonando su repositorio desde Github. Vaya a su directorio de inicio y clone el repositorio:
- cd ~
- git clone https://github.com/Jason2605/PyFilter.git
Esto creará un directorio llamado PyFilter
. Mueva esta carpeta a la /usr/local
carpeta:
- sudo mv PyFilter /usr/local/PyFilter
Luego cambia al /usr/local/PyFilter
directorio:
- cd /usr/local/PyFilter
A continuación, debemos crear un archivo de configuración. PyFilter viene con un archivo de configuración predeterminado ubicado en Config/config.default.json
. Lo copiaremos y editaremos la versión copiada en lugar de editar el archivo predeterminado directamente. De esta manera, si algo saliera mal, tendrás el archivo de configuración predeterminado con el que comparar.
Copiar el archivo de configuración predeterminado:
- sudo cp Config/config.default.json Config/config.json
Puede utilizar el less
comando para ver el contenido del archivo de configuración:
- less Config/config.json
La configuración predeterminada requiere que las solicitudes se realicen dentro de los 5 segundos posteriores a la última solicitud y que esto ocurra 5 veces; bastará para comenzar. Ejecutemos PyFilter y asegurémonos de que todo funcione.
Paso 2: Ejecutar PyFilter
La descarga de PyFilter incluye un script llamado run.sh
que debes usar para iniciar PyFilter.
Primero, cambie los permisos del script para hacerlo ejecutable.
- sudo chmod +x run.sh
Una vez otorgados los permisos, ejecute el script para iniciar PyFilter:
- ./run.sh
PyFilter comenzará a observar los registros y verá el resultado a medida que ocurren los eventos:
OutputNo file to check within rule: MysqlNo file to check within rule: ApacheNo file to check within rule: NginxChecking Ssh logs
De forma predeterminada, PyFilter prohíbe las direcciones IP que realizan cinco o más solicitudes fallidas en un plazo de cinco segundos desde la solicitud fallida anterior. Puede cambiar esto en el archivo de configuración de PyFilter.
/usr/local/PyFilter/Log
Estos resultados también se registran en el directorio.
Cuando una IP haya alcanzado los límites que justifican una prohibición, verá un resultado similar a este:
Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name.
Nota : Si accidentalmente se bloquea su Droplet porque se ha prohibido a sí mismo, puede seguir el tutorial Cómo usar la consola de DigitalOcean para acceder a su Droplet para volver a ingresar. Luego, siga los pasos del Paso 6 para eliminar la IP prohibida.
Para cerrar PyFilter, presione CTRL+C
.
Ahora instalemos PyFilter como un servicio para que se ejecute automáticamente.
Paso 3: Creación de un servicio para PyFilter
Ahora que sabes que PyFilter funciona, configurémoslo para que se ejecute como un servicio para que se inicie cada vez que reiniciemos el servidor.
Dentro del PyFilter
directorio, hay un script llamado install.sh
que crea un servicio para PyFilter y le permite ejecutarse al iniciar el sistema.
Modifica el script para poder ejecutarlo:
- sudo chmod +x install.sh
Luego ejecuta el script:
- ./install.sh
Verá este resultado, indicando que la instalación fue exitosa:
OutputService created and enabled, check the status of it by using "sudo systemctl status PyFilter"
Así que hagamos exactamente eso para garantizar que todo funcione correctamente:
- sudo systemctl status PyFilter
Verá este resultado, que muestra que el servicio es active
:
Output● PyFilter.service - PyFilter Loaded: loaded (/etc/systemd/system/PyFilter.service; enabled; vendor preset: enabled) Active: ^active^ (running) since Wed 2018-03-21 18:55:35 UTC; 12s ago Main PID: 8383 (bash) CGroup: /system.slice/PyFilter.service ├─8383 bash /usr/local/PyFilter/run.sh ├─8384 sudo python3 run.py └─8387 python3 run.py
Si ve un error, revise los pasos de instalación nuevamente.
A continuación, veamos cómo configurar PyFilter para compartir direcciones IP prohibidas con otros servidores.
Paso 4: Configuración de PyFilter para la sincronización de prohibiciones entre servidores (opcional)
La sincronización de prohibiciones entre servidores permite que la dirección IP prohibida se sincronice con todos los demás servidores que usan PyFilter para protegerlos y prohíban esa dirección incluso si no cumple con los requisitos para ser prohibida. Esto significa que puede estar un paso por delante de posibles bots que apunten a sus otros sistemas, ya que la IP ya está prohibida.
Como se indica en los requisitos previos, necesitará tener Redis instalado y configurado.
También necesitas el redis
módulo Python, que puedes instalar con pip
:
- pip3 install redis
Luego edita tu archivo de configuración para usar Redis en lugar de SQLite. Abre el Config/config.json
archivo en tu editor de texto:
- nano Config/config.json
Localice la siguiente línea:
Configuración/config.json
"database": "sqlite"
Cambiar sqlite
a redis
:
Configuración/config.json
"database": "redis"
A continuación, cambie la información de conexión de Redis. Busque esta sección del archivo:
Configuración/config.json
"redis": { "host": "127.0.0.1", "password": null, "database": 0, "sync_bans": { "active": true, "name": "your_hostname", "check_time": 600 } },
Modifique esta sección para que incluya los detalles de conexión de su servidor Redis. Luego, dentro de la sync_bans
sección, cambie el name
nombre de host. Este nombre debe ser único para cada sistema individual que ejecute PyFilter y utilice el mismo servidor Redis para que la sincronización de prohibición entre servidores funcione correctamente.
Guarde el archivo y salga del editor. Luego reinicie PyFilter para aplicar estos cambios:
- sudo systemctl restart PyFilter
PyFilter ahora está instalado y funcionando.
Paso 5: Configuración de PyFilter para recopilar datos de ubicación sobre direcciones IP (opcional)
PyFilter puede recuperar datos de ubicación sobre la IP prohibida para brindar información estadística sobre el origen de la mayoría de los ataques. Este módulo opcional agregará esta información a los registros de PyFilter.
Para utilizar esta función, primero necesitas el geoip2
módulo Python, que puedes instalar con pip
:
- pip3 install geoip2
Una vez que haya instalado este módulo, reinicie PyFilter para que reconozca el nuevo módulo:
- sudo systemctl restart PyFilter
Ahora, cuando veas una dirección IP prohibida, verás información adicional sobre la IP:
Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name. The IP was from United Kingdom.
PyFilter ahora registra con éxito de qué país provienen las solicitudes.
Por último, veamos cómo desbloquear una dirección.
Paso 6: Desbloqueo de direcciones IP
PyFilter es simplemente un medio para prohibir direcciones IP mediante la creación de reglas de iptables. Cuando prohíbe una IP, actualiza las reglas del firewall y luego guarda instantáneas de las reglas en los archivos /usr/local/PyFilter/Config/blacklist.v4
y /usr/local/PyFilter/Config/blacklist.v6
.
A continuación se muestra un ejemplo de varias direcciones IPv4 prohibidas en /usr/local/PyFilter/Config/blacklist.v4
:
/usr/local/PyFilter/Config/blacklist.v4
# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018*filter:INPUT ACCEPT [217:30580]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [249:30796]-A INPUT -s 203.0.113.13/32 -j DROP-A INPUT -s 203.0.113.14/32 -j DROP-A INPUT -s 203.0.113.15/32 -j DROPCOMMIT# Completed on Thu Mar 22 19:53:04 2018
Para desbloquear esta dirección IP, abra el archivo de lista negra asociado en su editor de texto:
- sudo nano /usr/local/PyFilter/Config/blacklist.v4
Elimine las reglas de iptables asociadas del archivo. En este caso, hemos eliminado 203.0.113.13
del archivo:
/usr/local/PyFilter/Config/blacklist.v4
# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018*filter:INPUT ACCEPT [217:30580]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [249:30796]-A INPUT -s 203.0.113.14/32 -j DROP-A INPUT -s 203.0.113.15/32 -j DROPCOMMIT# Completed on Thu Mar 22 19:53:04 2018
Luego guarde el archivo y cierre el editor. Reinicie PyFilter con sudo systemctl restart PyFilter
y PyFilter actualizará las reglas de su firewall usando este archivo.
Consulte Cómo enumerar y eliminar reglas de firewall de Iptables para obtener más información sobre la administración de reglas con iptables.
También puedes indicarle a PyFilter que ignore ciertas direcciones IP agregándolas a la sección de lista blanca dentro del /usr/local/PyFilter/Config/config.json
archivo.
Conclusión
Ahora tienes PyFilter instalado y monitoreando tus conexiones SSH.
Para obtener más información sobre cada sección del archivo de configuración y cómo configurar la monitorización de otros servicios, como MySQL y Apache, consulte el sitio de PyFilter .