
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:%M:%S el %A %d de %B") | replace("January","Enero") | replace("February","Febrero") | replace("March","Marzo") | replace("April","Abril") | replace("May","Mayo") | replace("June","Junio") | replace("July","Julio") | replace("August","Agosto") | replace("September","Septiembre") | replace("October","Octubre") | replace("November","Noviembre") | replace("December","Diciembre") | replace("Sunday","Domingo") | replace("Monday","Lunes") | replace("Tuesday","Martes") | replace("Wednesday","Miercoles") | replace("Thursday","Jueves") | replace("Friday","Miercoles") | replace("Saturday","Sabado") }}'
{% 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:
Se ha corregido el template del automation y ahora muestra la fecha correctamente aunque en la imagen salga asi, probarlo y vereis.
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
Si quieres conocer otros artículos parecidos a Fail2ban. Instalación e integración en Homeassistant puedes visitar la categoría Automatismos.
Deja una respuesta