Seguridad WordPress en tres niveles

Si te preguntas si tu sitio web es seguro, la respuesta rápida es que no, puedes si quieres mejorarla lo máximo posible, y desde luego que debes.

Vamos a ver los tres principales frentes desde los que atacar el problema.

En primer lugar, debes saber que cuando un usuario teclea tu dirección web o hace clic en un enlace que lleve a tu página, suceden varios pasos, aunque para este artículo vamos a simplificarlo mucho con estos pasos:

  1. Se hace una petición a tu URL y dicha petición llega al servicio de DNS (Domain Names Service) que se encarga de llevar dicha petición al servidor web que alberga tu página.
  2. La petición llega a tu servidor y al ser por el puerto 443 (Puerto SSL para https, del 80 para http ya ni hablamos), se encarga de gestionarla el servidor web (Nginx, Litespeed, Apache si no queda otro remedio).
  3. El servidor web llama a los procesos encargados de generar la página web que verá el usuario final, es decir, nuestro CMS que es WordPress y que en el fondo es el lenguaje de programación PHP ejecutando diferentes órdenes.

Pues bien, aquí ya tenemos los tres niveles básicos sobre los que plantear nuestra seguridad web.

Cuanto más arriba actúe en el ámbito de la seguridad (lo que en realidad sería a más bajo nivel), más seguro será, más control tendrás sobre un posible ataque y más independiente será de nuestro servicio de hosting.

Vamos a ver un ejemplo de cada tipo, bueno, el mismo ejemplo desde los tres niveles:

A nivel de DNS

A nivel de DNS o antes de que llegue a nuestro servidor web, tenemos varios servicios disponibles. Por ejemplo los diferentes WAF (Web Application Firewall, defensa del protocolo de capa 7 en el modelo OSI), ya sea el AWS Network Firewall si estamos en los servicios de AWS, el WAF de Sucuri o los servicios de Cloudflare con su WAF, entre otras herramientas.

En este caso os voy a hablar de Cloudflare con un breve ejemplo, ya que el próximo artículo de seguridad para WordPress será precisamente sobre la seguridad WordPress desde Cloudflare.

Uno de los intentos de ataque más comunes en toda instalación de WordPress es el ataque al servicio XML-RPC, que la mayoría de las webs no utilizan. Pues bien, vamos a bloquear los intentos de acceso antes de que lleguen a nuestro servidor web.

Para utilizar los servicios de seguridad de Cloudflare, deberemos gestionar los DNS desde su red.

Una vez cumplamos con esta condición, crearemos una regla desde el dominio correspondiente en nuestra cuenta, Seguridad, WAF, Reglas de firewall y botón Crear una regla de firewall. Le damos el nombre que queramos, por ejemplo Bloquear XMLRPC (si, ya sé que muy original no es) y desde el constructor visual creamos la siguiente regla:

Regla de bloqueo XML-RPC en Cloudflare

Para lo que utilizaremos el Campo «Ruta de URI» con el Operador «contiene» y el Valor «/xmlrpc.php», seleccionando en la acción «Bloquear».

Si le damos a Editar expresión, podemos copiar directamente el siguiente contenido:

(http.request.uri.path contains "/xmlrpc.php")

Ahora podemos poner en nuestro navegador la dirección web y ver cómo aparece bloqueada por el Firewall de Cloudflare sin que dicha petición llegue al servidor web. Si esperamos unas horas y la web tiene algo de tráfico, veremos las predicciones recibidas y bloqueadas.

xmlrpc bloqueado por Cloudflare
Bloqueos XML-RPC desde Cloudflare

Desde el servidor web

En este ejemplo vamos a denegar las peticiones al archivo xmlrpc.php (el encargado de dicho protocolo), desde el servidor web Nginx poniendo el siguiente código en nuestro archivo de configuración:

fastcgi_hide_header X-Pingback;
proxy_hide_header X-Pingback;

location = /xmlrpc.php {
	deny all;
}
Desactivar XML-RPC desde Nginx

Desde WordPress

Es posible desactivar el servicio en nuestro WordPress mediante el uso de un filtro, por lo que podemos poner el siguiente código en el functions.php de nuestro tema hijo o en nuestro plugin de personalizaciones:

add_filter( 'xmlrpc_enabled', '__return_false' );
Bloquear XML-RPC desde PHP en WordPress

O realizar esta misma tarea por medio de plugins, por ejemplo:

O la mayoría de los plugins de seguridad que incluyen esta opción, ya sea Wordfence Security, iThemes Security, SiteGround Security o cualquier otro plugin de seguridad.

En los ejemplos anteriores hemos visto como detener el intento de acceso a XML-RPC desde tres niveles diferentes. Un hipotético ataque muy intenso a nuestro protocolo XML-RPC y desde varios frentes simultáneos podría tirar nuestro servidor si en cada petición está ejecutándose PHP. Sería un poco más difícil si lo paramos antes de llegar a la capa de PHP, actuando desde el servidor web (en este caso Nginx) e imposible, ya que no llegaría a nuestro servidor si actuamos a nivel de DNS.

En el caso del WAF de Cloudflare podría llegar a tumbarse en un ataque coordinado mundial, pero si cae Cloudflare, que aunque es posible también es muy poco probable, vuestro servidor ya habría dejado de funcionar miles de millones de peticiones antes.

Y como ya adelanté hace unas líneas, el tercer y último post de esta triada de seguridad, será sobre diferentes reglas útiles para aplicar desde Cloudflare y bloquear intentos maliciosos de ataque a nuestra web antes de que lleguen a la misma.

P.D.: Primer artículo: ¿Es mi sitio web seguro?.

Tercer artículo: Seguridad WordPress desde Cloudflare.

2 comentarios en «Seguridad WordPress en tres niveles»

Deja un comentario