Publicado el Dejar un comentario

Bloquear accesos por país con Firewall CSF

Bloquear accesos por país con Firewall CSF

Para todos aquellos que en algún momento tengan la necesidad de desarrollar actividades de administración de un servidor Web bajo GNU/Linux, descubrirán que Internet es un entorno más que propicio tanto para la colaboración o distribución de contenidos, como también, para prácticas maliciosas o ataques informáticos por lo que seguramente te resultará de gran utilidad el aprender a bloquear accesos por país con firewall CSF.

En este sentido, les comento que en mi práctica profesional, y concretamente, para el caso de una tienda en línea administrada con Magento, comencé a notar una baja en el performance impresionante, al punto tal en que las peticiones al servidor, se resolvían muy lentamente.

En este contexto, una solución “rápida” y “lógica” era incrementar los recursos del VPS contratado (más memoria RAM, más procesador), con el respectivo costo asociado.

Al revisar los logs de Apache (siempre es una buena práctica, algo tediosa) y las estadísticas del sitio en mi panel de control (con AW Stats o Webanalizer) y las visitas de Google Analytics, descubrí que tenía visitas en varias horas del día, y con distinta intensidad, del robot del buscador Chino llamado Baidu.

Con esta información en consideración, mi primer “movimiento” lógico, fue deshabilitar la indexación del agente/bot Baidu en el home de mi servidor, pero, el problema persistía: Baidu maneja diversos agentes (de contenidos, de imágenes, de video, etc.) para indexar un sitio, y para serles francos, aún y cuando Baidu tiene documentadas las medidas para el manejo de sus bots mediante el archivo robots.txt (puedes consultarlas aquí: http://help.baidu.com/question?prod_en=master&class=498&id=1000973), me dio la impresión de que sus bots no respetaban las instrucciones contenidas en el mismo, por lo cual, teniendo en consideración que el público de la tienda en línea era solo mexicano, procedí a realizar un bloqueo mediante reglas de un Firewall basado en software, inicialmente a China, con posibilidades de extenderlo a todo el mundo y permitir solo IP´s de México y Estados Unidos. Es importante destacar que Baidu, tiene una “página” en la cual uno puede “retroalimentar” y reportar incidentes; la liga es: http://webmaster.baidu.com/feedback/index. Aquí puedes encontrar más información sobre el “bloqueo” a Baidu Spider mediante el archivo robots.txt: http://www.baidu.com/search/robots_english.html

Consideraciones

Este “truco” te funcionará si tienes una distribución Linux en la cual tengas acceso como root o usuario con privilegios. Si tienes un VPS, asegúrate que si realizas por accidente un “bloqueo” a la IP desde la cual te conectas, podrás acceder nuevamente mediante una terminal o consola Web que te ofrezca tu propio proveedor.

Primeros pasos

CSF (ConfigServer Security & Firewall), es un poderoso conjunto de scripts que nos permiten disponer reglas de iptables para constituir un Firewall SPI (Stateful Packet Inspection) basado en software, con detector de intrusiones y seguridad en aplicaciones para servidores Linux.

Si actualmente tienes reglas de IPtables aplicadas en tu server, es muy probable que vayas a tener conflicto con las mismas, por lo cual, es muy probable que decidas qué solución de Firewall pretendes usar, o bien, analizar si CSF puede hacer por tí lo que actualmente estás haciendo con otra solución. Desde mi punto de vista personal, CSF es uno de los Firewalls para servidores Linux más potentes, transparentes y sencillos de usar que he visto.

Puedes conocer más a fondo las características de CSF visitando este link: http://configserver.com/cp/csf.html

Para este tutorial, estaré trabajando sobre Ubuntu Server 14.04.01 de 64 Bits.

De igual manera, la documentación oficial para la instalación de CSF la puedes encontrar aquí: http://download.configserver.com/csf/install.txt

Comentado lo anterior, primero vamos “actualizar” un poco algunas dependencias y paquetes de Perl requeridos:

sudo apt-get install libwww-perl liblwp-protocol-https-perl

Posteriormente, vamos a proceder a descargar y descomprimir el conjunto de scripts de CSF mediante el siguiente comando:

cd /usr/src
sudo wget https://download.configserver.com/csf.tgz
sudo tar -xzf csf.tgz

Ahora, procedemos a realizar la ejecución del script de instalación de CSF:

cd csf
sudo sh install.sh

Si no ha habido mayores problemas, podrás leer en tu pantalla algo como esto:

TCP ports currently listening for incoming connections:
     22

UDP ports currently listening for incoming connections:
     68,45861

Note: The port details above are for information only, csf hasn't been auto-configured.

Don't forget to:
     1. Configure the following options in the csf configuration to suite your server: TCP_*, UDP_*
     2. Restart csf and lfd
     3. Set TESTING to 0 once you're happy with the firewall, lfd will not run until you do so
     «lfd.sh» -> «/etc/init.d/lfd»
     «csf.sh» -> «/etc/init.d/csf»
     el modo de «/etc/init.d/lfd» permanece como 0755 (rwxr-xr-x)
     el modo de «/etc/init.d/csf» permanece como 0755 (rwxr-xr-x)
     Removing any system startup links for /etc/init.d/lfd ...
     Removing any system startup links for /etc/init.d/csf ...
     Adding system startup for /etc/init.d/lfd ...
     /etc/rc0.d/K20lfd -> ../init.d/lfd
     /etc/rc1.d/K20lfd -> ../init.d/lfd
     /etc/rc6.d/K20lfd -> ../init.d/lfd
     /etc/rc2.d/S80lfd -> ../init.d/lfd
     /etc/rc3.d/S80lfd -> ../init.d/lfd
     /etc/rc4.d/S80lfd -> ../init.d/lfd
     /etc/rc5.d/S80lfd -> ../init.d/lfd
     Adding system startup for /etc/init.d/csf ...
     /etc/rc0.d/K80csf -> ../init.d/csf
     /etc/rc1.d/K80csf -> ../init.d/csf
     /etc/rc6.d/K80csf -> ../init.d/csf
     /etc/rc2.d/S20csf -> ../init.d/csf
     /etc/rc3.d/S20csf -> ../init.d/csf
     /etc/rc4.d/S20csf -> ../init.d/csf
     /etc/rc5.d/S20csf -> ../init.d/csf
     «/etc/csf/csfwebmin.tgz» -> «/usr/local/csf/csfwebmin.tgz»

Installation Completed

Lo que debemos saber

CSF es una colección de scripts muy potente, que en un momento determinado, puede inclusive “impedirnos” la conexión remota al servidor si no tenemos muy claro lo que hacemos.

En este sentido, la ruta para la edición de su archivo de configuración, es:

/etc/csf/csf.conf

Dentro del mismo, tenemos 2 líneas que son muy interesantes:

  1. TESTING = “1” – Si está activida esta regla así, es porque tu Firewall está en “modo de prueba” con lo cual, en función del valor asignado en el siguiente punto (testing_interval), pasado ese tiempo, te “borrará” todas las reglas de Firewall con el propósito de “regresar” a la normalidad. En otro caso, si has quedado conforme con la configuración de Firewall, puedes ponerle el valor de “0”, con lo cual, quedará aplicado este sistema.
  2. TESTING_INTERVAL = “5” – Si las reglas de Firewall están en modo de prueba (testing), pasado número de minutos, se “limpiarán” del sistema, volviendo todo a la normalidad.

Bloquear accesos por país con firewall CSF y asignación de permisos de conexiones por país

Particularmente, CSF utiliza los 2 caracteres de país del código ISO de países CIDR (Classless Inter-Domain Routing – enrutamiento entre dominios sin clases) mediante el cual, se “clasifican” los rangos de direcciones IP de cada país. Como comenta CSF en el archivo de configuración, esta lista no es 100% segura ya que algunos ISPs, usan designaciones de IP para sus clientes mediante criterios no geográficos, lo cual dificulta su ubicación.

Por otra parte, la creación de reglas asociadas a grandes rangos de direcciones IP, pueden representar una disminución en el performance del servidor, con lo cual, no es muy recomendado para servidores VPS; aunque en mi caso, lo he usado en VPS de 1 GB de RAM y me fue muy bien, inclusive, me ayudó con tráfico indeseado.

Con ello en consideración, CSF se apoya en los 2 caracteres de país para la asignación en las reglas de Firewall, a partir de los bloques CIDR administrados por Maxmind GeoLite Country, el cual puedes consultar aquí: http://dev.maxmind.com/geoip/legacy/geolite/ (te sugerimos descargar el archivos CSV disponible para crear tus reglas con mayor seguridad y certeza).

Ahora bien, ¿qué haré? Permitiré el tráfico a México y Estados Unidos, y bloquearé al resto del mundo. Para ello, deberemos editar el archivo de configuración de CSF:

sudo nano /etc/csf/csf.conf

Ahora, buscamos las líneas:

CC_DENY = ""
CC_ALLOW = ""

Y nos aseguramos que queden algo así como:

CC_DENY = "AU,CN,JP,TH,IN,MY,KR,SG,HK,TW,PH,VN,RU,FR,EU,DE,IL,SE,IT,NL,GR,ES,AT,GB,BE,AE,KZ,PT,SA,DK,IR,NO,CA,SY,UA,CY,CZ,CH,IQ,TR,RO,BZ,PA,BR,CL,AR,CO,PL,LB,GE,AZ,A2,PS,LT,OM,SK,RS,FI,IS,HU,BG,SI,MD,MK,LI,JE,HR,BA,PY,EE,LV,JO,A1,KG,RE,IE,IM,LY,LU,AM,VG,YE,BY,GI,QA,KW,GP,MQ,GF,ZA,EG,ID,PK,DO,GU,VI,PR,MN,NZ,NP,PG,AP,CR,PE,NG,VE,BS,MA,SC,BB,KE,BN,BH,AW,LC,BD,TK,KH,MO,MV,AF,NC,FJ,WF,AL,UZ,ME,KP,VA,AQ,BM,CW,EC,KN,WS,GG,MT,TJ,ZW,LR,GH,TZ,ZM,MG,AO,NA,CI,SD,CM,MW,MU,GA,ML,BJ,TD,BW,CV,RW,CG,UG,MZ,GM,LS,DZ,GN,CD,SZ,BF,SL,SO,NE,CF,TG,BI,GQ,SS,SN,MR,DJ,KM,TN,YT,LA,MM,LK,NR,VU,BT,FM,PF,TL,TO,ER,ET,TM,GL,KY,JM,GT,MH,MC,AI,GD,MS,TC,AG,TV,SB,BO,SR,CK,NU,TF,NF,PN,SM,AX,FO,SJ,CC,GS,UM,SX,GW,MF,VC,PM,BL,DM,ST,FK,MP,BQ,AS,KI,PW,GY,HN,NI,SV,AD,HT,TT,UY,CU,SH,CX,IO"
CC_ALLOW = "MX,US"

Ahora, guardamos el archivo, y reiniciamos el CSF:

sudo csf -r

Y revisamos las reglas aplicadas:

sudo iptables -L -n

Pasos finales

Por otra parte, con el objetivo de que nuestro Firewall tome acciones a partir de “falsos positivos” o “información confusa” proporcionada por los registros del sistema (syslog/rsyslog), en el archivo /etc/csf/csf.conf, debemos cambiar esto:

# 0 = Allow those options listed above to be used and configured
# 1 = Disable all the options listed above and prevent them from being used
# 2 = Disable only alerts about this feature and do nothing else
# 3 = Restrict syslog/rsyslog access to RESTRICT_SYSLOG_GROUP ** RECOMMENDED **
RESTRICT_SYSLOG = "0"

Por esto:

# 0 = Allow those options listed above to be used and configured
# 1 = Disable all the options listed above and prevent them from being used
# 2 = Disable only alerts about this feature and do nothing else
# 3 = Restrict syslog/rsyslog access to RESTRICT_SYSLOG_GROUP ** RECOMMENDED **
 RESTRICT_SYSLOG = "3"

Con lo anterior, evitarás también “molestas” alertas del tipo:

*WARNING* RESTRICT_SYSLOG is disabled. See SECURITY WARNING in /etc/csf/csf.conf.

Goodie

CSF es un estupedísimo Firewal; para el caso de este material, podría decir que no está reservado solamente para “bloquear” rangos de IP´s de países sino para implementar un cortafuego por software a tu computadora o servidor.

Por ello, si modificas, en el siguiente conjunto de líneas, puede “decidir” qué puertos deseas mantener abiertos y en qué dirección:

# Allow incoming TCP ports
TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995"

# Allow outgoing TCP ports
TCP_OUT = "20,21,22,25,53,80,110,113,443,587,993,995"

# Allow incoming UDP ports
UDP_IN = "20,21,53"

# Allow outgoing UDP ports
# To allow outgoing traceroute add 33434:33523 to this list
UDP_OUT = "20,21,53,113,123"

…e inclusive, si permitirás que hagan “ping” a tu equipo:

# Allow incoming PING
ICMP_IN = "1"

Si has despertado la curiosidad con respecto a las capacidades de CSF, te recomendamos encarecidamente dar un vistazo a todo el fichero de configuración para hacer pruebas y descubrir sus posibilidades. ¡Te encantará! Cpanel lo integra generalmente a través de WHM, lo cual nos “garantiza” en cierto sentido su mejora y mantenimiento constante.

Nota final

Si al aplicar tus reglas de Firewall con CSF te aparece el mensaje de error:

*WARNING* URLGET set to use LWP but perl module is not installed, reverting to HTTP::Tiny

Es probable que te hayas olvidado de instalar paquetes de Perl de apoyo, con lo cual, solo hace falta instalar un módulo faltante mediante lo siguiente:

sudo apt-get install libwww-perl liblwp-protocol-https-perl

¿Qué pasa en este punto? Según comentan en algunos sitios, CSF implementó el procesamiento de peticiones para HTTP y HTTPS, con lo cual, el modelo LWP::UserAgent procesa muchísimo mejor HTTPS que el modelo HTTP::Tiny.

Si quisieramos evitar usar LWP, hay que buscar la línea:

# "1" = HTTP::Tiny
# "2" = LWP::UserAgent
URLGET = "2"

Y dejarla en algo como esto:

# "1" = HTTP::Tiny
# "2" = LWP::UserAgent
URLGET = "1"
Deja un comentario