CSF o Config Server Firewall, es una de las opciones más sencillas que puedes instalar en tu servidor VPS para mejorar la seguridad de tu instalación web. Es un firewall sencillo de configurar (o por lo menos más sencillo que firewalld, fail2ban), pero eso no quita para que haya que prestar un poco de atención a varios parámetros menos conocidos de su configuración para mejorar la seguridad del servidor.
No me voy a meter en detalle en la instalación de CSF, que es muy sencilla, pero sí te voy a comentar unos cuantos parámetros que puedes tunear de manera sencilla para mejorar la configuración de CSF y no perjudicar el rendimiento de tus webs. En este caso concreto, te voy a contar cómo configurar sus listas de bloqueo csf.blocklists para que LFD se encargue de evitar que determinadas direcciones IP lleguen a nuestro servidor.
Tengo instalado CSF/LFD en un servidor Rocky Linux instalado en una instancia en Linode (Akamai) con un procesador con 6 núcleos y 16 GB de RAM, y una instalación LAMP para WordPress. Como panel de control uso Virtualmin/Webmin, que ofrece una interfaz gráfica para CSF.
Instalando CSF en línea de comando en Rocky Linux 9:
#Instalación en carpeta
cd /usr/src
wget https://download.configserver.com/csf.tgz
tar -xzf csf.tgz
cd csf
sudo ./install.sh
#Verificamos que todo funciona
sudo perl /usr/local/csf/bin/csftest.pl
#Activamos despues de configurar todo
sudo vi /etc/csf/csf.conf
TESTING = "0" #Esta en 1
#Reiniciamos
csf -ra
#Comprobamos que funciona
sudo systemctl status csf
sudo systemctl status lfd
Te puede interesar: Cómo evitar que CSF bloquee IPs de Cloudflare o Cómo bloquear BOTS AI y SEO con Cloudflare y con el archivo .htaccess
¿Puede afectar al rendimiento de tu servidor activar estos listados de bloqueo de IP?
Sí, claro, sobre todo si no tienes instalado y activado IPSET. IPSET es una herramienta para la administración de conjuntos de direcciones IP y puertos en Linux. Permite crear, modificar y eliminar conjuntos de direcciones IP, puertos, rangos de direcciones IP y combinaciones de estos elementos que pueden ser referenciados directamente en las reglas del firewall iptables o nftables (evita la necesidad de escribir múltiples reglas de firewall individuales). Vamos, que gestiona de forma eficiente muchos bloqueos de IP.
Lo primero que tienes que hacer antes de seguir es comprobar si tienes instalado IPSET:
ipset --version
Si no te sale nada, tienes que instalarlo:
sudo dnf update
sudo dnf install ipset
Cuando lo tengas instalado, actívalo en CSF (edita /etc/csf/csf.conf o hazlo a través de la GUI de CSF):
- LF_IPSET = «1»
- LF_IPSET_HASHSIZE = «1024»
- LF_IPSET_MAXELEM = «65536»
Como puedes ver en la imagen, he cambiado algunos parámetros en función de los listados que uso yo. Te cuento:
IPSET HASHSIZE
Te recomiendo pasar a LF_IPSET_HASHSIZE = «8192» si tienes listas de IP de más de 20000 IP. Es bastante común. En total tengo unas 40.000 IP, por lo que hay que aumentar el valor de HASHSIZE, para que se gestionen de forma más eficiente las IP. El HASHSIZE define el tamaño inicial de la tabla hash que ipset usa para almacenar las entradas. Si esta tabla es demasiado pequeña, el rendimiento puede disminuir debido a un mayor número de colisiones y a la necesidad de rehashing. Vas a mejorar el tiempo de búsqueda, inserción y eliminación de entradas en ipset.
¿Cómo sabes cuál debes usar? Usa este comando:
ipset list -t
Si sigues con el valor por defecto de 1024, y has activado dos listas, puedes obtener algo como esto:
Name: bl_6_STOPFORUMSPAMV6
Type: hash:net
Revision: 7
Header: family inet6 hashsize 1024 maxelem 65536 bucketsize 12 initval 0xeef4c057
Size in memory: 6584
References: 1
Number of entries: 76
Name: bl_BDEALL
Type: hash:net
Revision: 7
Header: family inet hashsize 8192 maxelem 65536 bucketsize 12 initval 0x0981ff42
Size in memory: 581008
References: 1
Number of entries: 20276
Para 76 IP usas un hashsize de 1024, pero para 20276 sube a 8192. Hay que aumentar el LF_IPSET_HASHSIZE en CSF, por ejemplo, a 8192 (siempre múltiplos de 2).
Vete probando, ya que esto puede consumir más memoria RAM.
IPSET MAXELEM
El valor por defecto puede estar bien, por lo menos en mi caso. Prueba este comando:
sudo ipset list | grep -E 'Number of entries' | awk '{sum += $4} END {print sum}'
Que te dará el número total de IP que está gestionando Ipset y CSF para bloquear. En mi caso salen unas 41.000, así que está por debajo del límite por defecto. Dejo el valor en LF_IPSET_MAXELEM = «65536».
Cambiamos también el número de DENY_IP_LIMIT y DENY_TEMP_IP_LIMIT por si esperamos bloquear muchas IPs
DENY_IP_LIMIT = 4000 #estaba por defecto en 200
DENY_TEMP_IP_LIMIT = 500 (de 10 a 1000)
Al tener activado IPSET, podemos aumentar con seguridad estos valores. Puede ser útil aumentar incluso más estos valores en caso de ataque DDOS, ya que las tablas se pueden llenar muy rápido.
Ahora ya estamos preparados para activar las listas de bloqueo de IPs de CSF, LFD.
- Te puede interesar: Cómo bloquear Bots Maliciosos utilizando User Agents y Cloudflare.
Activamos las listas de bloqueo de IP de CSF, LFD
Tenemos que encontrar el archivo csf.blocklists, que está en: /etc/csf/csf.blocklists o editarlo mediante la GUI.
sudo vi /etc/csf/csf.blocklists
En ese archivo, lo único que tenemos que hacer es descomentar las líneas de cada servicio.
¿Qué listados de bloqueo de IP te recomiendo usar? Pues todos los que puedas en función de la disponibilidad de CPU y RAM de tu servidor. Con una única condición para evitar que el rendimiento de tus páginas web se vean comprometidos: tienes que tener activo IPSET en tu servidor. Solo he dejado sin activar TOR Exit Nodes List.
###############################################################################
# Copyright 2006-2018, Way to the Web Limited
# URL: http://www.configserver.com
# Email: [email protected]
###############################################################################
# This file contains definitions to IP BLOCK lists.
#
# Uncomment the line starting with the rule name to use it, then restart csf
# and then lfd
#
# Each block list must be listed on per line: as NAME|INTERVAL|MAX|URL
# NAME : List name with all uppercase alphabetic characters with no
# spaces and a maximum of 25 characters - this will be used as the
# iptables chain name
# INTERVAL: Refresh interval to download the list, must be a minimum of 3600
# seconds (an hour), but 86400 (a day) should be more than enough
# MAX : This is the maximum number of IP addresses to use from the list,
# a value of 0 means all IPs
# URL : The URL to download the list from
#
# Note: Some of these lists may be very long and could cause serious network
# and/or performance issues unless you are using LF_IPSET in csf, so setting a
# value for the MAX field should be considered
#
# After making any changes to this file you must restart csf and then lfd
#
# If you want to redownload a blocklist you must first delete
# /var/lib/csf/csf.block.NAME and then restart csf and then lfd
#
# Each URL is scanned for an IP/CIDR address per line and if found is blocked
#
# The downloaded list can be a zip file. The zip file MUST only contain a
# single text file of a single IP/CIDR per line
#
# Note: CXS_ is a reserved prefix for the blocklist name and MUST NOT be used
# Spamhaus Don't Route Or Peer List (DROP)
# Details: http://www.spamhaus.org/drop/
SPAMDROP|86400|0|http://www.spamhaus.org/drop/drop.txt
# Spamhaus IPv6 Don't Route Or Peer List (DROPv6)
# Details: http://www.spamhaus.org/drop/
SPAMDROPV6|86400|0|https://www.spamhaus.org/drop/dropv6.txt
# Spamhaus Extended DROP List (EDROP)
# Details: http://www.spamhaus.org/drop/
SPAMEDROP|86400|0|http://www.spamhaus.org/drop/edrop.txt
# DShield.org Recommended Block List
# Details: https://dshield.org
DSHIELD|86400|0|https://www.dshield.org/block.txt
# TOR Exit Nodes List
# Set URLGET in csf.conf to use LWP as this list uses an SSL connection
# Details: https://trac.torproject.org/projects/tor/wiki/doc/TorDNSExitList
#TOR|86400|0|https://check.torproject.org/cgi-bin/TorBulkExitList.py?ip=1.2.3.4
# BOGON list
# Details: http://www.team-cymru.org/Services/Bogons/
BOGON|86400|0|http://www.cymru.com/Documents/bogon-bn-agg.txt
# Project Honey Pot Directory of Dictionary Attacker IPs
# Details: http://www.projecthoneypot.org
HONEYPOT|86400|0|https://www.projecthoneypot.org/list_of_ips.php?t=d&rss=1
# C.I. Army Malicious IP List
# Details: http://www.ciarmy.com
CIARMY|86400|0|http://www.ciarmy.com/list/ci-badguys.txt
# BruteForceBlocker IP List
# Details: http://danger.rulez.sk/index.php/bruteforceblocker/
BFB|86400|0|http://danger.rulez.sk/projects/bruteforceblocker/blist.php
# MaxMind GeoIP Anonymous Proxies
# Set URLGET in csf.conf to use LWP as this list uses an SSL connection
# Details: https://www.maxmind.com/en/anonymous_proxies
MAXMIND|86400|0|https://www.maxmind.com/en/anonymous_proxies
# Blocklist.de
# Set URLGET in csf.conf to use LWP as this list uses an SSL connection
# Details: https://www.blocklist.de
# This first list only retrieves the IP addresses added in the last hour
BDE|3600|0|https://api.blocklist.de/getlast.php?time=3600
# This second list retrieves all the IP addresses added in the last 48 hours
# and is usually a very large list (over 10000 entries), so be sure that you
# have the resources available to use it
BDEALL|86400|0|http://lists.blocklist.de/lists/all.txt
# Stop Forum Spam
# Details: http://www.stopforumspam.com/downloads/
# Many of the lists available contain a vast number of IP addresses so special
# care needs to be made when selecting from their lists
STOPFORUMSPAM|86400|0|http://www.stopforumspam.com/downloads/listed_ip_1.zip
# Stop Forum Spam IPv6
# Details: http://www.stopforumspam.com/downloads/
# Many of the lists available contain a vast number of IP addresses so special
# care needs to be made when selecting from their lists
STOPFORUMSPAMV6|86400|0|http://www.stopforumspam.com/downloads/listed_ip_1_ipv6.zip
# GreenSnow Hack List
# Details: https://greensnow.co
GREENSNOW|86400|0|https://blocklist.greensnow.co/greensnow.txt
El archivo csf.blocklists contiene definiciones de listas de IPs en el siguiente formato:
- NAME: Nombre de la lista.
- INTERVAL: Intervalo de tiempo en segundos para actualizar la lista.
- MAX: Número máximo de IPs a bloquear de la lista (0 significa todas).
- URL: URL desde donde se descarga la lista.
También tienes la opción de cambiar el atributo MAX para modificar el número máximo de IP a tener en cuenta. Puedes evitar problemas de rendimiento, sobre todo en servidores virtualizados con OpenVZ (no soporta IPSET de manera adecuada). Mejor nos vamos a un servidor VPS virtualizado con KVM.
¡Ojo! Si te fijas, hay algunas que necesitan establecer URLGET en csf.conf para usar LWP, ya que utilizan una conexión SSL, lo que te obliga a tener instalados otros paquetes en tu servidor, en el caso de Rocky Linux (es posible que ya los tengas):
dnf install perl-libwww-perl.noarch perl-LWP-Protocol-https.noarch
También puedes añadir otros servicios que ofrecen listas de IP maliciosas, pero los que vienen por defecto pueden ser más que suficientes. Una de las listas más grandes es la de http://www.blocklist.de/en/export.html, con más de 25.000 IP. Así que analiza bien el número de IP que quieres activar en función de los recursos de tu servidor. En https://store.delmarvagroup.com/ tienes más opciones, pero comprueba siempre que funcionan y que están activas. También puedes activar ABUSEIPDB añadiendo las siguientes líneas, pero te tienes que dar de alta (gratis) y conseguir una clave API.
# AbuseIPDB blacklist
# Details: https://docs.abuseipdb.com/#blacklist-endpoint
ABUSEIPDB|86400|20000|https://api.abuseipdb.com/api/v2/blacklist?key=TU_API_KEY&plaintext&limit=20000
Cuando hayas terminado de configurar todo, tienes que reiniciar CSF y LFD:
csf -ra
- Te recomiendo visitar los logs de LFD para ver que todo funciona de manera correcta: /var/log/lfd.log. En estos logs verás las actualizaciones de IPs de cada servicio y si funcionan bien con IPSET.
Conclusión
Estos pasos te pueden servir como guía para crear tu propia configuración. Ajústalos en consecuencia teniendo en cuenta tu memoria RAM en tu servidor, cantidad de IP en las listas y si tienes instalado o no IPSET. Evidentemente, la cantidad de tráfico en tus páginas también afecta mucho. Vas a tener que ir haciendo pruebas y comprobando el rendimiento genera del sistema según vas a activando las diferentes reglas.
Referencias: