Si, continuamos con la serie de tutoriales basadas en el hecho de que ya tenemos una red privada virtual (VPN) desde la que podremos acceder a la autenticación de servicios a los que solo nosotros accedemos.
Introducción
Hasta el momento hemos tenido éxito en dejar solo las rutas necesarias para NextCloud y dejando en secreto una instancia FreshRSS. La primera ruta es parcial y la segunda, oculta completa. Ahora, nos toca ocultar parcialmente una que puede resultar un poco más compleja debido a que hablamos de WordPress. El sistema de blogs utilizado para casi cualquier cosa y por eso puede tener puertas por todas partes.
Ya no es necesario poner los requisitos puesto que ya los cumplimos todos, así que vamos directo a la teoría.
Desarrollo
La verdad pensé que sería tan sencillo como mandarle un location deny all, pero no. WordPress usa un sistema de rutas y embellecedores de URL que puede hacer que olvides que /wp-login no es lo mismo que /wp-login.php. Además, bloqueando el /wp-admin se te carga también el sistema AJAX, con lo que el contact form 7 dejaría de funcionar. Vamos repasando lo que hemos hecho para evitar todo esto.
1 2 3 4 5 6 7 8 | location = /wp-admin/admin-ajax.php { allow all; # Permitir que el público lo use para formularios/filtros # IMPORTANTE: Aquí debes incluir tu configuración de PHP # para que Nginx sepa cómo procesar el archivo. include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.4-fpm.sock; # Ajusta a tu versión de PHP } |
Debes agregar este fragmento a tu archivo de configuración de nginx después de tu bloque de php. Esto es porque luego bloquearemos la ruta /wp-admin la cual terminará cargándose al admin-ajax.php el cual sirve para muchas funciones, especialmente para los plugins. pero si no tienes casi nada, es posible que solo afecte al funcionamiento de contact form 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | location /wp-admin{ allow 10.0.0.0/24; deny all; include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.4-fpm.sock; # Ajusta a tu versión de PHP } location /wp-login{ allow 10.0.0.0/24; deny all; include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.4-fpm.sock; # Ajusta a tu versión de PHP } location = /wp-login.php { allow 10.0.0.0/24; deny all; include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.4-fpm.sock; # Ajusta a tu versión de PHP } |
Estos bloques son de lo mas predecible. Al igual que en los casos anteriores, basta con definir la ruta que queremos bloquear y pues… bloquearla. Recuerda que la intención es que se pueda acceder por la red privada virtual, así que agrega tu rango de subred con el que tienes configurado WireGuard.
Por ultimo, haremos unos cuantos ajustes de seguridad.
1 2 3 | location ~* (readme.html|debug.log|license.txt) { deny all; } |
Esto es mas para protegerte de descuidos. El archivo readme.html y licence.txt está públicamente accesible. Bloquéalo para no delatar tu versión exacta de WordPress (es mas fácil atacar una versión especifica que atacar al azar hasta que aciertas a la vulnerabilidad que buscas).
Debug.log es un archivo que queda visible si has habilitado la depuración. Hay mucha info sensible allí. Lo mejor es que lo escondas por si las dudas.
Con estos cambios ya no tendrás que preocuparte tanto por ataques de fuerza bruta pues, no pueden forzar la cerradura si no hay cerradura XD.
También te beneficia si tienes pocos recursos, porque tu servidor no tiene que estar atendiendo al ruido de Internet (bots, scrappers, etc) y puede centrarse en el trafico real.
Conclusiones
Pues verás, a diferencia de mi pobre lector de RSS que no tenia muchas visitas indeseadas, mi blog principal si que es atormentado todo el tiempo. Los que responden 200 son solo de tanteo. Confirman que la página existe. Pero los que devuelven otros errores son de ataques. Si no los bloqueara, estarían ahí todo el rato probando combinaciones de contraseñas hasta dar con la correcta y joderme la vida.
Y verás, probablemente puedas comprobar por ti mismo si estos códigos funcionan. Basta con que entres a la url de /wp-admin o /wp-login y encontraras errores 403
Pero el resto del sitio esta completamente funcional.

El hecho de que pueda seguir escribiendo y puedas leer este post, es prueba de que las configuraciones aquí aplicadas han funcionado.
¿Sobre qué ganamos con esto? la verdad, algo mas de paz. Ya no tienes que preocuparte tanto por la calidad de tu contraseña, pero no te descuides, para todo, activa A2F (autenticacion en dos factores) porque aun puedes tener accidentes. Ya sabes, errores de capa 8 jajaja.
En adelante, los logs ya no deberán dar respuestas 200, sino un error 403. Ya es cuestión de modificar las reglas de fail2ban para que bloquee a los que provocan esos errores, pero claro, recordando que no te bloquees a ti mismo porque si olvidas entrar con wireguard activo, puede dejarte pateado afuera.







