Fail2ban. Instalación e integración en Homeassistant

Hola a todos, hoy os traemos esta guía para la instalación y configuración de Fail2ban en Home Assistant.

Cabe reseñar que gran parte de lo que os explicamos aquí es trabajo de Kevin Fronczak

Se han traducido, y modificado ciertos aspectos para dejarlo totalmente operativo en la versión actual de Home Assistant en castellano

En primer lugar diremos que fail2ban es un software que se encarga de detectar fallos de login y banear la ip que los produce si los fallos llegan al limite que configuremos.

Se trata pues, de una herramienta muy útil para proteger nuestras redes.

Vamos al lio, lo primero que tenemos que hacer es instalar Fail2Ban

Instalación de Fail2Ban

Actualizamos repositorios

sudo apt-get update

Instalamos fail2ban

sudo apt-get install fail2ban

Instalamos iptables

sudo apt-get install iptables

Una vez instalado vamos a configurarlo

Configuración

Fail2ban ya viene prácticamente configurado para la mayoría de servicios, por lo que es sencillo de configurar

Creamos el archivo /etc/fail2ban/fail2ban.local y pegamos dentro lo siguiente:

[Definition]
logtarget = SYSLOG

Ahora copiamos el archivo de configuración de fail2ban para no sobreescribirlo

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Lo editamos

sudo nano /etc/fail2ban/jail.local

Tenemos la opción de añadir la IP de los equipos que no queremos banear en caso de equivocación

ignoreip = 127.0.0.1 192.168.X.XX

Podemos modifcar el tiempo que estará baneada la IP, por defecto 10 minutos

bantime = 600

Ahora añadimos las “jails” de los servicios a controlar

[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5

[ha]
enabled = true
filter = ha
action = %(action_mwl)s
logpath = /home/homeassistant/.homeassistant/home-assistant.log
maxretry = 5

Con estas jails, controlaremos los accesos por SSH y los accesos al frontend de HA

Puedes añadir, o modificar si ya las hay, todas las jails que quieras, para controlar otros servicios como ftp, owncloud, http, etc.

Por ultimo nos falta crear los filtros de HA para que fail2ban pueda funcionar correctamente:

sudo nano /etc/fail2ban/filter.d/ha.conf

y pegamos lo siguiente:

[INCLUDES]
before = common.conf

[Definition]
failregex = ^%(__prefix_line)s.*Login attempt or request with invalid authentication from <HOST>.*$
ignoreregex =

Por último autorizamos a Fail2ban a ejecutarse y lo iniciamos

sudo systemctl enable fail2ban

sudo systemctl start fail2ban

Y ya está, ahora solo nos falta integrarlo en HA

También puedes monitorizar su estado mediante HA como te explicábamos en esta guía

Para comprobar que las jails están operativas puedes usar el siguiente comando:

sudo fail2ban-client status

y obtendrás algo parecido a esto:

Lo importante es lo marcado en amarillo, lo otro son pruebas que aún no he eliminado

Integración en Home Assistant

Creamos un directorio llamado bin y guardamos estos archivos

Para la integración de fail2ban, haremos uso de los comandos SSH como te explicábamos aquí

Añadimos los sensores:

- platform: command_line
  name: ip_baneos
  command: ssh pi@127.0.0.1 sudo bash /home/homeassistant/.homeassistant/bin/gen_ban_list.sh
  scan_interval: 120

- platform: file
  file_path: /home/homeassistant/.homeassistant/ip_ban_list.json
  name: IP baneada SSH
  value_template: '{{ value_json.ssh }}'

- platform: file
  file_path: /home/homeassistant/.homeassistant/ip_ban_list.json
  name: IP baneada HA
  value_template: '{{ value_json.ha }}'

Para que se muestren correctamente los sensores platform: file, debes incluir el directorio /.homeassistant en el whitelist.

Debes modificar el encabezamiento de tu configuration.yaml y añadir lo que está en amarillo de la siguiente imagen:

Una vez que crees el grupo de sensores te aparecerá algo así:

Si pruebas a acceder por ejemplo por ssh con un password incorrecto, el resultado que obtendrás sera este:

Por último tan solo queda automatizar los avisos por telegram para estar informados si se produce un baneo.

- alias: Notificaciones Fail2ban
  trigger:
    - platform: state
      entity_id: sensor.ip_baneada_ssh
    - platform: state
      entity_id: sensor.ip_baneada_ha
  condition:
    condition: or
    conditions:
      - condition: template
        value_template: '{{ states.sensor.ip_baneada_ssh.state != "Ninguna" }}'
      - condition: template
        value_template: '{{ states.sensor.ip_baneada_ha.state != "Ninguna" }}'
  action:
    - service: notify.telegram
      data_template:
        message: 'IP baneada a las {{ now().strftime("%h %d, %Y at %H:%M:%S") }}
                 {% if states.sensor.ip_baneada_ssh.state != "Ninguna" %}
                 Intentos de acceso SSH desde {{states.sensor.ip_baneada_ssh.state}}
                 {% endif %}
                 {% if states.sensor.ip_baneada_ha.state != "Ninguna" %}
                 Intentos de acceso fallido a HA desde {{states.sensor.ip_baneada_ha.state}}
                 {% endif %}'

Con este automation, recibirás un mensaje como este:

Sí, el formato de la fecha es feo como el solo, pero no se cambiarlo, así que si tu si sabes, ya me dices como lo hago.

Pues esto es todo, como siempre si tienes cualquier duda, deja tu comentario o pregúntanos en el grupo de telegram

Un saludo al grupo de python de telegram por su ayuda.

Fuentes:

https://www.fororaspberry.es/viewtopic.php?t=226

https://kevinfronczak.com/blog/banning-ips-on-homeassistant-and-ssh

También te podría gustar...

Deja un comentario