Bloquear ataques al xmlrpc.php con nginx

Todos los que tenemos algún wordpress y revisamos los logs periódicamente vemos que continuamente hay accesos por POST al xmlrpc.php. Algunas veces son ataques y otras son simples consultas de bots. En cualquier caso son accesos que no me valen para nada y generan tráfico innecesario.

Hace poco revisando unos logs vi miles de accesos por POST desde una ip de Ucrania y con el user agent de GoogleBot. No se que quería pero seguro que nada bueno. 🙂

Lo que recomiendan en muchos sitios de borrar ese fichero a mi no me convence por que si actualizas el wordpress lo vuelves a tener ahí y hay veces que se hace un uso legítimo de ese fichero para, p.e. publicar post desde programas externos.

Una característica habitual de los bots es que hacen las peticiones por HTTP/1.0 en vez del habitual HTTP/1.1 así que aprovechando esta característica he preparado este pequeño código que bloquea las peticiones por POST y HTTP1.0 al xmlrpc.php. Obviamente si el bot trabaja con HTTP/1.1 esto no funcionará.

Lo más interesante de este código es que para evitar ifs anidados concateno dos valores en una variable. Si se cumple la primera condición el valor de la variable es «bot» y si se cumple la segunda añado a lo que tenga la variable el valor «post», de esa forma sólo devuelve 403 si las dos variables cumplen la condición. Este método permite construir tantos ifs anidados como quieras, simplemente hay que añadir más valores a la cadena.

## Block xmlrpc.php POST http1.0
  location ^~ /xmlrpc.php {
    set $mata_bot 0;
    if ($server_protocol ~* "HTTP/1.0") {
        set $mata_bot "bot";
        }
    if ($request_method = POST ) {
        set $mata_bot "${mata_bot}-post";
        }
    if ($mata_bot = "bot-post"){
       return 403;
       }
   }

Espero que le sea útil a alguien más.

Información sobre ataques de fuerza bruta con xmlrpc.php