Proteger /wp-admin/ de WordPress con contraseña: ¡Ojo con esto!

A día de hoy WordPress sigue sin ofrecer una protección contra ataques de fuerza bruta al panel de administración. Solo si se instala JetPack lo incorpora. No obstante es recomendable ponerselo lo más complicado posible a quién quiera acceder a la administración de un WordPress.

Lo primero: No usar nunca como usuario administrador el usuario admin. Ni tampoco publicar entradas con el usuario administrador que hayamos creado en vez del usuario admin. Siempre hay que usuario usuarios con permisos de editor o inferiores para publicar contenidos. No queremos que nadie conozca el usuario que puede administrar el blog. De esta forma ya complicaremos algo un ataque de fuerza bruta.

Una opción que también se debe utilizar si no usamos JetPack o cualquiera de los plugins de seguridad que incorporan un sistema que impide ataques de fuerza bruta (WordFence, iThemes Security formerly Better WP Security, etc) es el plugin Limit Login Attempts de Johan Eenfeldt. Aunque no se ha actualizado en 4 años sigue funcionando perfectamente (ahora hay una versión más nueva basada en este plugin llamado: Limit Login Attempts Reloaded que estamos probando ahora mismo).

Y además de estas opciones lo que estamos haciendo en todos los WordPress que instalamos es proteger la carpeta /wp-admin/ con una contraseña a nivel de servidor.

Como proteger una carpeta en un servidor Linux

Esta protección es bastante sencilla de realizar. En Plesk y CPANEL se puede proteger directamente desde el panel de administración del servidor.

Sino se puede utilizar una herramienta como el Htpasswd Generator de Andreas Gehrke que con un usuario y una contraseña crea el contenido del archivo .htpasswd con el usuario y la contraseña encriptada. Este archivo lo llama el archivo .htaccess especial que creamos dentro de /wp-admin/ y solo permite acceder a usuarios con credenciales.

Protección de /wp-admin/: Problema con admin-ajax.php

Pero hay un pequeño problema con este tema: Y es que en /wp-admin/ hay un archivo llamado admin-ajax.php que muchos temas de WordPress con soporte de Ajax usan cuando muestran la web. Y si bloqueamos todo el contenido de /wp-admin/ a los usuarios al cargar la página se les pide usuario y contraseña para ejecutar el AJAX. Por tanto hay que excluirlo.

Hay otra gente que dice que también se debería de excluir el archivo admin-post.php pero esto es un tema que no tengo claro y que nunca excluyo. Más que nada porque WordPress dentro del Codex en el apartado Brute Force Attacks solo menciona que hay que excluir admin-ajax.php de la protección. No obstante si que me gusta también dejar acceso a los archivos CSS, gif, png, jpg y js de la carpeta. Por si acaso.

Contenido del archivo .htaccess para poner en /wp-admin/

Por tanto el contenido del archivo .htaccess que ponemos en la carpeta /wp-admin/ quedaría así (con el añadido de la protección de los archivo que empiezan por .ht):

AuthType Basic
AuthName "Acceso restringido"
AuthUserFile .htpasswd

Require valid-user

# Allow access to wp-admin/admin-ajax.php and wp-admin/admin-post.php
<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>
<Files admin-post.php>
  Order allow,deny
  Allow from all
  Satisfy any
</Files>
# Allow access to css, gif, png, jpg and js files
<Files "\.(css|gif|png|jpg|js)$">
Order allow,deny
Allow from all
Satisfy any
</Files>
# Stop Apache from serving .ht* files
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

 

OJO: La ruta al archivo .htpasswd la tenéis que personalizar. Más que nada nos interesa que esté fuera de los archivos accesibles directamente a través de Internet (carpeta httpdocs en Plesk). Por ejemplo en Plesk solemos poner el archivo un nivel por encima de la carpeta httpdocs y entonces la ruta al AuthUserFile sería: AuthUserFile /var/www/vhosts/NOMBREDOMINIO.EXTENSION/.htpasswd y habría que cambiar NOMBREDOMINIO.EXTENSION por el nombre de dominio donde está el /wp-admin/ que se quiere proteger.

Quedaría así:

AuthType Basic
AuthName "Acceso restringido"
AuthUserFile /var/www/vhosts/NOMBREDOMINIO.EXTENSION/.htpasswd

Require valid-user

# Allow access to wp-admin/admin-ajax.php and wp-admin/admin-post.php
<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>
<Files admin-post.php>
  Order allow,deny
  Allow from all
  Satisfy any
</Files>
# Allow access to css, gif, png, jpg and js files
<Files "\.(css|gif|png|jpg|js)$">
Order allow,deny
Allow from all
Satisfy any
</Files>
# Stop Apache from serving .ht* files
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

OJO: Si Apache no encuentra el archivo con los usuarios y contraseñas en la ruta indicada, dará un error de servidor 500, pero no dirá que no encuentra el archivo, simplemente da un error de servidor. Si os pasa esto revisar la ruta al archivo.

Como siempre espero que le sirva a alguien.

🙂

Salir de la versión móvil