Proteger una web no es fácil, pues siempre iremos varios pasos detrás de las técnicas más avanzadas de intrusión y hackeo ya que, normalmente, no nos dedicamos profesionalmente a la seguridad web.
Además, debemos ser conscientes de que en lo que respecta a la seguridad web hay algunas reglas que siempre se cumplen:
- La seguridad 100% no existe
- Toda web está siendo constantemente atacada las 24 horas del día, todos los días del año
- Ninguna web está libre de ser atacada, da igual su contenido, tamaño o tecnología empleada
Pero no es momento de abandonar el barco, sino de ser responsables, y como capitanes de la nave que alberga nuestro negocio y contenidos, tomar medidas para evitar, en lo posible, que hundan nuestro navío. Así que, desplieguen velas y pongamos rumbo a puerto seguro.
Vale, ya dejo las analogías marineras, me vine un poco arriba 😀
Poniéndonos manos a la obra, hay varias medidas que podemos tomar para protegernos al máximo, aplicando estrategias de contención de amenazas a cuántos niveles podamos:
- Seguridad desde una CDN
- Seguridad desde el hosting
- Seguridad desde la aplicación (en nuestro caso WordPress)
En esta ocasión vamos a ver cómo proteger WordPress prácticamente a prueba de bombas.
Índice de contenidos
Seguridad básica en WordPress
Empezando por el final, a lo primero que debemos recurrir a la hora de proteger WordPress son los principios básicos de seguridad para aplicaciones:
- Contraseñas seguras y, a ser posible, doble verificación 2FA
- WordPress, plugins y temas siempre actualizados
- Limitar los permisos a archivos sensibles (
wp-config.php
y.htaccess
) - Desactivar la ejecución de PHP en carpetas de archivos
- Añadir cabeceras de seguridad HTTP
La mayoría de estas medidas, por no decir todas, las podemos aplicar a nuestra web instalando un buen plugin de seguridad, con lo que tendríamos en su mayor parte cubierta la seguridad de la aplicación.
Ya solo nos faltaría proteger la instalación mediante un cortafuegos que nos proteja de:
- Exploits malintencionados
- Ataques DDOS
- Vulnerabilidades XSS
- Tráfico indeseado
- Solicitudes no deseadas
- Inyecciones de malware
El mejor cortafuegos para WordPress
Llegado el punto de aplicar un cortafuegos a WordPress lo mejor que vas a encontrar es el nG Firewall de Perishable Press.
nG Firewall es un potente y bien optimizado conjunto de reglas mod_rewrite que verifica todas las solicitudes de URL contra un conjunto de directivas y expresiones regulares para Apache/.htaccess o Nginx.
Funciona a nivel del servidor, lo cual es óptimo para el rendimiento porque evita la necesidad de cargar PHP y MySQL únicamente para bloquear peticiones innecesarias o no deseadas. Esta es una de las razones por las que la seguridad a nivel del servidor es mejor que usar un plugin u otro script PHP. Un cortafuegos a este nivel va a liberar recursos de tu sitio.
¿Por qué debería instalar el Firewall nG?
El Firewall nG está diseñado para ser liviano y súper rápido. Ofrece un equilibrio óptimo entre seguridad y rendimiento, brindando una protección significativamente mejor que los otros firewalls.
Cada versión de nG se basa en versiones anteriores, fortaleciendo patrones exitosos, eliminando patrones obsoletos y, por supuesto, añadiendo nuevos patrones y reglas basados en datos actuales.
El resultado es un firewall que se desarrolla de forma acumulativa y se prueba exhaustivamente, basado en un código con un historial probado . Estas son algunas de las principales características y objetivos del cortafuegos nG:
- Seguridad a través de la simplicidad
- Amplia protección de cortafuegos
- Ajustado para minimizar los falsos positivos
- Ligero, modular, flexible y rápido
- Completamente automático, sin necesidad de configuración
- Mejora la seguridad, reduce la carga del servidor, conserva los recursos
- Código abierto, fácil de usar y completamente gratis
- No se requiere WordPress: funciona en cualquier sitio web
- 100% compatible con WordPress
¿De qué me protege el Firewall nG?
El Firewall nG protege contra multitud de tipos de ataques y amenazas, incluyendo:
- Directory Traversal
- HTTP Response Splitting
- (XSS) Cross-Site Scripting
- Cache Poisoning
- Exploits Dual-Header
- Inyección de código SQL/PHP
- Inyección/inclusión de archivos
- Inyección de byte null
- Exploits de WordPress como timthumb y fckeditor
- Exploits de PHP como c99shell, rom2823, r3vn330, sux0r y más
- Fugas de información de PHP
Además, el Firewall nG protege contra un amplio rango de peticiones malintencionadas, bad bots, spam y más basura. El cortafuegos nG usa mod_rewrite
de Apache, así que funciona con todo tipo de métodos de petición HTTP: GET, POST, PUT, DELETE y todos los demás. Todo esto resulta en una robusta protección para tu web.
¿Cómo se instala el cortafuegos nG?
Para esta guía me voy a remitir a la instalación en un servidor Apache, con archivo .htaccess
, puesto que la instalación en Nginx es algo más complicada, y sobre todo porque la mayoría de los que me leéis es lo que usáis, pero si tu servidor es Nginx en este enlace tienes su guía específica.
Volviendo a la instalación, en realidad es muy sencilla, solo son 3 pasos:
- Descarga la última versión del nG Firewall del sitio original, pues se actualiza con frecuencia, y descomprime el ZIP en tu ordenador.
- Abre el archivo TXT del firewall, incluido en el ZIP.
- Copia y pega el contenido del TXT del firewall al principio del archivo
.htaccess
de tu instalación.
En una instalación nueva, el archivo .htaccess
de WordPress tendrá unas líneas como estas:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Pues simplemente abre el archivo .htaccess
para editarlo y copia y pega todo el contenido del TXT antes de esas líneas, y te quedará algo así (recortado para no alargar mucho aquí el código):
# 8G FIREWALL v1.1 (beta) 20230214 # https://perishablepress.com/8g-firewall/ # 8G:[CORE] ServerSignature Off Options -Indexes RewriteEngine On RewriteBase / # 8G:[QUERY STRING] <IfModule mod_rewrite.c> RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC,OR] RewriteCond %{QUERY_STRING} ([a-z0-9]{4000,}) [NC,OR] RewriteCond %{QUERY_STRING} (/|%2f)(:|%3a)(/|%2f) [NC,OR] RewriteCond %{QUERY_STRING} (order(\s|%20)by(\s|%20)1--) [NC,OR] RewriteCond %{QUERY_STRING} (/|%2f)(\*|%2a)(\*|%2a)(/|%2f) [NC,OR] RewriteCond %{QUERY_STRING} (`|<|>|\^|\|\\|0x00|%00|%0d%0a) [NC,OR] RewriteCond %{QUERY_STRING} ((.*)header:|(.*)set-cookie:(.*)=) [NC,OR] RewriteCond %{QUERY_STRING} (ckeditor|ckfinder|fckeditor|fullclick) [NC,OR] RewriteCond %{QUERY_STRING} (localhost|127(\.|%2e)0(\.|%2e)0(\.|%2e)1) [NC,OR] RewriteCond %{QUERY_STRING} (cmd|command)(=|%3d)(chdir|mkdir)(.*)(x20) [NC,OR] … … … # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Una vez hayas pegado el código del cortafuegos guarda los cambios en el archivo .htaccess
y comprueba que todo funcione correctamente en tu web.
¿Puede provocar falsos positivos el Firewall nG?
Una duda razonable que puede surgir cuando bloqueas tráfico y peticiones sospechosas o directamente malintencionadas es si, por algún fallo en la configuración del cortafuegos podríamos estar bloqueando tráfico legítimo, por ejemplo de buscadores.
El firewall nG está probado desde hace años, en sus distintas versiones y actualizaciones, y está libre de falsos positivos.
¿Puedo registrar la actividad del Firewall nG?
Pues sí, en el caso de que quieras tener un registro de la actividad del cortafuegos, al final de cada sección del mismo hay una linea comentada o inactiva, que si la activas guardará un archivo de registro con la actividad de esa sección de protección.
Por ejemplo, en las reglas de REQUEST_METHOD tienes lo siguiente:
# 8G:[REQUEST METHOD] <IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|trace|track) [NC] RewriteRule .* - [F,L] # RewriteRule .* /nG_log.php?log [END,NE,E=nG_REQUEST_METHOD:%1] </IfModule>
La línea # RewriteRule .* /nG_log.php?log [END,NE,E=nG_REQUEST_METHOD:%1] está comentada (tiene un # delante), y si quitas el # se activará la creación del registro para esta sección. Quedaría así:
# 8G:[REQUEST METHOD] <IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|trace|track) [NC] RewriteRule .* - [F,L] RewriteRule .* /nG_log.php?log [END,NE,E=nG_REQUEST_METHOD:%1] </IfModule>
¿Funciona el firewall nG?
En todos los sitios en los que realizo mantenimiento web de sitios WordPress añado, entre otras cosas, el cortafuegos nG y lo que he observado en todas las webs a continuación es lo siguiente:
- Menor consumo de recursos del servidor.
- Eliminación de tráfico innecesario.
- Reducción drástica de spam.
- Webs 99,99% seguras.
Nota: La versión 8G (Beta) tiene algunas reglas que provocan un error al tratar de acceder a páginas de la administración de WordPress que tengan parámetros, por ejemplo
/wp-admin/admin.php?page=x
, así que ahora mismo la versión más operativa es la estable 7G.
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!
Buenos días Fernando
Muy interesante el artículo
Sólo me genera una duda. Si se actualiza con tanta frecuencia el código, la manera de tenerlo al día es estar pendiente para descargar nuevas versiones y sustituir en .htaccess?
Exacto, pero vamos, que tampoco es como para estar todo el día revisando, y si tu suscribes a la newsletter de Perishable Press te avisan
¿Vale para SiteGround?
¿No tienes ellos ya su propio cortafuegos a nivel de servidor? ¿Se solaparía?
Saludos!
Lo tienen, y no se solapan, se complementan 😉
Tremendo, cada día se aprende algo nuevo contigo. A probarlo, gracias Fernando!!!
Excelente Fernando!.. quiero aportar que yo uso Nginx (nginx/1.18.0) y usando el Setup que indican que en la página oficial falla la instalación, al menos a mi me pasó usando sus indicaciones. Me funcionó de esta forma. Dejo la guía en caso de que alguien le pase también.
En el archivo nginx.conf
http {
COPIA Y PEGAR contenido de 7g-firewall.conf
.
.
}
En el archivo /etc/nginx/sites-enabled/www.sudominio.conf
En las dos locaciones tanto para el puerto 80 como el 443 recuerden que hay dos secciones de server.
server {
COPIA Y PEGAR contenido de 7g.conf
.
.
.
}
Verifican en consola con nginx -t si todo está OK reinician nginx en consola con: service nginx restart
Ostras, pues muchas gracias por compartirlo 😉
Hola Fernando entiendo yo que para un servidor compartido no valdria ya que se instala a nivel servidor bien as puesto
Vale igual, siempre y cuando tengas acceso al archivo .htaccess de tu instalación, lo que sucede en el 99,99% de los compartidos.
Ahora bien, puede haber alguna regla «superior» del hosting, que inhabilite reglas que tú añadas al .htaccess, estas u otras.