Wordpress

¿Qué se prentende conseguir?

El objetivo es proteger con contraseña el acceso a la carpeta wp-admin y al fichero wp-login.php.

De esta forma cuando se intente acceder a la administración de WordPress, iniciar sesión o ver el perfil de usuario, el servidor solicitará un usuario y contraseña, para mostrarnos la página de entrada al dashboard.

Para lograr esto vamos a hacer uso del fichero .htaccess de Apache. Todo el proceso lo haremos conectados por SSH con nuestro servidor. Si no disponemos de SSH tendremos que hacer uso del administrador de archivos que dispongamos en el Panel de Control de nuestro alojamiento.

Las rutas a los servidores virtuales, carpetas y ficheros, son las que tenemos en un servidor VPS gestionado con Webmin/Virtualmin, por lo que pueden variar dependiendo de nuestro servidor o el panel de control que se use. No debería haber muchos problemas en adaptarlas y poner las correctas en cada caso.

Proteger carpeta wp-admin

En primer lugar vamos a crear el fichero de contraseñas .htpasswd. Siempre que sea posible, este fichero debe estar fuera del espacio URI del servidor web. En nuestro caso la ruta a la web de WordPress es «/home/midominio/www», por lo que el fichero lo colocaremos en el directorio superior fuea del alcance de los navegadores web.

# htpasswd -c /home/midominio/.htpasswd nombreusuario

El comando htpasswd crea el fichero .htpasswd, añadiendo un nuevo usuario nombreusuario. Se solicitará la contraseña dos veces.

Si queremos añadir más usuarios al fichero de contraseñas, simplemente se repite el comando anterior pero sin la opción -c.

Para saber más acerca del comando htpasswd, mirar aquí.

A continuación creamos el fichero /home/midominio/www/wp-admin/.htaccess y escribimos el siguiente contenido:

AuthUserFile "/home/midominio/.htpasswd"
AuthType Basic
AuthName "Carpeta privada"
Require valid-user

La regla AuthUserFile indica donde se encuentra el fichero de contraseñas, no olvidarse de modificarlo para poner la ruta correcta.

Con AuthName le indicamos un nombre o descripción para esta carpeta protegida. Este nombre es el que nos aparecerá cuando nos solicite el usuario y contraseña para acceder a la carpeta.

Con esto ya habremos conseguido proteger la carpeta wp-admin. Si desde el navegador queremos entrar ahora en la administración de WordPress, el servidor nos solicitara el usuario y contraseña.

Evitar errores de redirecciones en URL amigables y enlaces permanentes

Cuando configuramos WordPress para que trabaje con URL amigables y enlaces permanentes, es más que probable que tengamos problemas de redirecciones después de proteger la carpeta wp-admin.

Para evitar esto debemos editamos el fichero /home/midominio/www/.htaccess de la raiz del dominio WordPress y añadimos al principio del fichero la siguiente línea.

ErrorDocument 401 default
[...]

Nota: Los puntos y las llaves […] no se ponen. Tan solo las pongo para indicar que hay más contenido en el fichero, arriba o abajo.

Proteger el fichero wp-login.php

Este fichero es necesario protegerlo también con contraseña. Pero antes debemos tener en cuenta algunas cosas importantes.

Como sabemos WordPress es uno de los CMS más utilizados en el mundo, es muy fácil de instalar y de usar, con gran cantidad de plugins para hacer casi cualquier cosa, es de código abierto y se publican regularmente actualizaciones para corregir problemas de seguridad. Sin embargo el hecho de ser tan popular y de código abierto, hace que cualquiera pueda descubrir fácilmente los posibles agujeros de seguridad.

Protegiendo las carpetas wp-admin y el fichero wp-login.php, aumentamos la seguridad de nuestro WordPress y posiblemente evitaremos muchos problemas, pero no olvidemos que ningún sistema es 100% seguro.

Ahora bien, si en nuestra web queremos permitir el registro de nuevos usuarios, quizás proteger el fichero wp-login.php no sea la mejor idea, ya que cada vez que alguien pretenda registrarse o iniciar sesión, el servidor le pedirá la contraseña de acceso al fichero. Si optamos por la seguridad y mantener el fichero protegido, no nos quedará más remedio que implementar algún tipo de sistema alternativo de registro y login, diferente al que viene en WordPress por defecto. También cabe la posibilidad de usar alguno de los muchos plugins que hay y olvidarnos por completo de lo que aquí estamos haciendo. Pero ese no es el objetivo de esta entrada.

Para proteger el fichero wp-login.php, tenemos que editar el fichero /home/midominio/www/.htaccess y colocar al principio, justo a continuación de la línea que hemos añadido antes, el siguiente contenido.

[...]
<Files wp-login.php>
  AuthUserFile "/home/midominio/.htpasswd"
  AuthType Basic
  AuthName "Archivos privados"
  Require valid-user
</Files>
[...]

Nota: No olvidarse de verificar si la ruta al fichero .htpasswd es la correcta.

Permitir las solicitudes Ajax

Al proteger la carpeta wp-admin, no solo estamos evitando el acceso por web, si no también las peticiones a ese directorio desde cualquier script. Sin embargo, si debemos permitir que la api Ajax de WordPress pueda acceder, de lo contrario es posible que dejen de funcionar algunos plugins, temas o widgets que utilicen Ajax.

La api Ajax de WordPress se ejecuta desde el fichero admin-ajax.php. Para concederle acceso debemos editar el fichero /home/midominio/www/.htaccess y añadir lo siguiente al final del fichero.

[...]
<Files admin-ajax.php>
  Order allow,deny
  Allow from all
  Satisfy any
</Files>
Permitir solicitudes a imágenes, ficheros CSS y JavaScript

Es posible que algunos plugins y temas de WordPress necesiten acceder a las imágenes, ficheros CSS, o scripts JavaScript que están contenidos en la carpeta wp-admin. Esto no siempre va a ser necesario, pero si observamos problemas con la visualización de imágenes, CSS o JavaScript, vamos a necesitar crear unos ficheros .htaccess dentro de cada una de las siguientes carpetas images, css y js que hay dentro de wp-admin. Creamos los siguientes ficheros:

/home/midominio/www/wp-admin/images/.htaccess
/home/midominio/www/wp-admin/css/.htaccess
/home/midominio/www/wp-admin/js/.htaccess

El contenido de estos ficheros ha de ser el siguiente.

Order allow,deny
Allow from all
Satisfy any

Y con esto hemos terminado. Utilizar el potencial de .htaccess y los recursos del servidor Apache para proteger las partes delicadas de WordPress, es una buena forma de conseguirlo, sencilla y segura, pero no es la única. Si no queremos liarnos con las directivas y reglas de .htaccess, también se puede utilizar alguno de los plugins que hay para ello. Como por ejemplo WP Secure, que permite restringir el acceso a wp-admin por IP o por tipo de usuario.