En el anterior artículo os mostré las primeras medidas para lograr un WordPress seguro, creando contraseñas seguras y dificultando que algún «amigo de lo ajeno» pueda saber con facilidad cuál es el usuario administrador de vuestra Web.
Hoy me voy a centrar en dos puntos importantes: Proteger la carpeta wp-admin y el archivo wp-config, dos de las claves dentro de toda instalación de WordPress. Y, como extra, un plugin bastante interesante para añadir más seguridad a nuestra Web: Limit Login Attemps
Proteger la carpeta wp-admin
Empezaremos securizando el acceso al panel de administración de nuestro WordPress.
Estamos frente a uno de los principales objetivos de cualquier hacker que desee atacar una web, si consigue el acceso, y más en el caso de hacerlo con privilegios de administrador, podrá hacer lo que desee, así que su protección debe ser una tarea prioritaria para nosotros.
Al igual que lo que hablamos en el anterior artículo podemos proteger el acceso al área de administración de nuestro WordPress bien con plugins o mediante código. Aquí sí que voy a ser un poco más cuidadoso, ya que mediante código lo que vamos a tocar es más delicado y afecta directamente a nuestro servidor.
Para no permitir el acceso no deseado al administrador de nuestro WordPress debemos tocar un archivo que no forma parte del mismo, pero que es “la madre del cordero” de cualquier servidor Web montado sobre Apache, esto es importante, sólo lo encontraréis si vuestro servidor Web es Apache, pero tranquilos, la mayoría de los hosting están montados sobre Apache, y del que ya hemos hablado en ocasiones anteriores. Hablamos del archivo .htaccess.
Para acceder y modificar este archivo, los pasos a seguir son:
1.- Acceder a vuestro servidor vía FTP con un cliente como Filezilla o Coda (el primero es gratuito y el segundo tiene un coste de 99 dólares).
2,.- Una vez accedas vía FTP, en la carpeta wp-admin de nuestra instalación de WordPress deberemos crear, si no existía antes, un archivo con el nombre .htaccess (el punto del inicio antes de la h no es un error, se nombra así para que permanezca oculto). Si ya existiera este archivo, hacemos una copia de seguridad del mismo, por si algo fallara, poder volver a la versión anterior.
Algo importante, estamos creando este archivo en la carpeta wp-admin, si ya se que posiblemente exista otro .htaccess en la raíz, pero ese no se toca, por ahora. Los archivos .htaccess funcionan de forma jerárquica, teniendo preferencia el más cercano a la carpeta que nos encontremos, o sea, que el de la carpeta wp-admin mandará sobre el de la raíz.
3.- Por volver al foco, estamos tratando de proteger el directorio wp-admin para evitar accesos no deseados. Para ello, en el .htaccess de la carpeta wp-admin escribiremos las siguientes líneas.
4.- Veréis que he dejado resaltada la línea 5, tiene su razón. La ruta que debemos poner en esa línea y que define donde está el archivo .htpasswd debe ser una ruta absoluta dentro de tu servidor. Normalmente esa ruta es home/usuario_de_login_en_tu_cpanel/public_html/carpeta_de_tu_WordPress/wp-admin/.htpasswd. Si no lo tienes claro, puedes crear un archivo con las líneas que te dejo a continuación de este párrafo a tu carpeta wp-admin/.htpasswd mediante FTP y ejecutar en el navegador la siguiente url http://Tu_Web/wp-admin/.htpasswd/ruta_absoluta.php evidentemente modificando “Tu_Web” por tu dominio, eso te devolverá la ruta absoluta de tu carpeta wp-admin, o de cualquier otra donde subas este archivo. IMPORTANTE, una vez obtengas la ruta, borra el archivo.
<?php
/* Devuelve la ruta absoluta en el servidor del archivo*/
Echo dirname(__FILE__);
Todavía no hemos acabado, nos queda un paso final.
Con los que hemos hecho, hemos bloqueado completamente el acceso a la carpeta wp-admin, ahora resulta que si tenemos un Theme, Plugin o Widget en nuestro WordPress que tenga que hacer llamadas a la API Ajax de WordPress no va a poder hacerlo, ya que esta API está en esta carpeta, por lo que dejará de funcionar, vamos que hemos hecho un pan con unas hostias. Tranquilos, que tiene arreglo y pasa por añadir unas líneas adicionales a nuestro .htaccess para permitir que estos elementos si tengan acceso a este archivo.
# Establece una restricción a la carpeta wp-admin mediante un archivo .htpasswd
AuthName "Sin acceso"
AuthType Basic
AuthUserFile /home/jfougtnp/public_html/carpeta_wordpress/wp-admin/.htpasswd
AuthGroupFile /dev/null
require valid-user
# Permite a los archivos css, js, jpg, jpeg, gif y png de Themes, Widgets o plugins en acceso al archivo admin-ajax.php para poder ejecutar llamadas a la API Ajax de WordPress
<FilesMatch “.(css|js|jpg|jpeg|gif|png)$”>
Order Allow,Deny
Allow from All
Satisfy Any
</FilesMatch>
<Files admin-ajax.php>
Order Allow,Deny
Allow from All
Satisfy Any
</Files>
Por último, también se puede restringir el acceso a la carpeta mediante IP, es decir, solo permitir el acceso a la IP o IPs (fijas) que deseemos, y restringir el acceso a esa carpeta al resto de IPs. Eso sí, si estamos en el caso anterior, deberemos habilitar el acceso de Themes, plugins y Widgets a la API de AJAX.
En las líneas que os dejo a continuación y que deberíais agregar a vuestro archivo .htaccess las líneas de restricción de acceso por IP están comentadas, para que podáis decidir el método que usáis (protección mediante contraseña o restricción de direcciones IP).
Mediante un archivo .httpasswd
# Establece una restricción a la carpeta wp-admin mediante un archivo .htpasswd o mediante restricción de IP.
#Opción 1. MEDIANTE UN ARCHIVO .HTTPASSWD
AuthName "Sin acceso"
AuthType Basic
AuthUserFile /home/jfougtnp/public_html/capeta_wrodpress/wp-admin/.htpasswd
AuthGroupFile /dev/null
require valid-user
# Permite a los archivos css, js, jpg, jpeg, gif y png de Themes, Widgets o plugins en acceso al archivo admin-ajax.php para poder ejecutar llamadas a la API Ajax de WordPress
<FilesMatch “.(css|js|jpg|jpeg|gif|png)$”>
Order Allow,Deny
Allow from All
Satisfy Any
</FilesMatch>
<Files admin-ajax.php>
Order Allow,Deny
Allow from All
Satisfy Any
</Files>
Mediante control de acceso por IPs
# Establece una restricción a la carpeta wp-admin mediante un archivo .htpasswd o mediante restricción de IP.
#Opción 2. MEDIANTE CONTROL DE ACCESO POR IPS
#Habilita el acceso a wp-admin desde una dirección IP concreta y deniega el acceso desde cualquier otra IP que no este en el listado
#Dejo estas líneas comentadas para que, en caso de no querer habilitarlas, no afecten al acceso
#order deny,allow
#allow from XXX.XXX.XXX.XXX (tu ip)
#allow from XXX.XXX.XXX.XXX (tu otra ip)
#deny from all
# <Files admin-ajax.php>
# Order Allow,Deny
# Allow from all
# Satisfy Any
# </Files>
¿Parece un lío verdad? tranquilos que, como os dije al principio, esto mismo se puede hacer mediante plugins.
Dos de ellos os permiten configurar el archivo .httacces de vuestro WordPress y limitar ciertos aspectos: WP .htaccess Editor es, básicamente, eso, un editor del archivo .htaccess, con el único añadido de permitirte hacer un backup del archivo.
Proteger el archivo wp-config
Situado en la raíz de nuestro hosting, o en la carpeta donde instalamos nuestro WordPress, wp-config es uno de los primeros archivos que se modifican durante la instalación y uno de los más delicados en cuanto a seguridad se refiere.
Dentro de este archivo se sitúa la configuración básica de WordPress, concretamente cuatro ajustes fundamentales:
- Los referentes a la BBDD de MySQL, el verdadero corazón de nuestro sitio.
- Los prefijos de las tablas que componen nuestra BBDD (11 en una instalación limpia y sin plugins, 12 a partir de WordPress 4.4).
- Las claves secretas de nuestro servidor, las famosas Keys y Salts.
- La ruta absoluta de nuestra instalación, que se denomina ABSPATH.
De estos, los tres primero son críticos y, teniendo en cuenta que este archivo se almacena y guarda los datos en texto plano sin ningún tipo de codificación, es uno de los objetivos prioritarios de quien quiera acceder de forma malintencionada, ya que como podéis observar en la imagen inferior, la información que da es bastante exhaustiva y provechosa para alguien con conocimiento… y malas intenciones.
Acerca de cómo generar una nuevas keys y salt y del prefijo de las tablas, y como cambiarlo si ya tenéis vuestro WordPress instalado y no lo habíamos hecho al principio, hablaré más adelante. Ahora lo que voy es a centrarme en cómo impedir que esta info pueda estar disponible para los “amigos de lo ajeno”.
Como siempre tenemos varias vías para proteger este archivo:
- Protegerlo desde el archivo .httaccess.
- Asignar permisos de sólo lectura al archivo wp-config.
- Cambiar de ubicación el archivo.
Protegerlo desde el archivo .htaccess.
La primera y más sencilla opción. Mediante esta regla insertada en el archivo .htaccess de la raíz o la carpeta en la que se encuentre la instalación de WordPress deshabilitamos el acceso a todos los usuarios. Si en algún momento necesitamos modificar algo, bastará con entrar y comentar las líneas, modificar lo que necesitemos y, una vez guardado, quitar la “#” del comentario en la regla.
# Deshabilita el acceso al archivo wp-config
<files wp-config.php>
order allow,deny
deny from all
</files>
Asignar permisos de solo lectura al archivo wp-config.
Por defecto, este archivo tiene una configuración de permisos 644 (lectura y escritura para el admin y sólo lectura para el resto de usuarios, tanto los logeados que no sean admin, como el resto del mundo). Lo aconsejable es variar estos permisos a 444 (lectura para todos). Si necesitamos modificarlo, haremos como antes, cambiar de nuevo estos permisos a 644.
Para modificar los permisos, deberemos acceder vía FTP al sitio Web y, una vez seleccionado el archivo, ir al menú contextual y seleccionar la opción “permisos” en Filezilla o “get info” en Coda ( en otros clientes FTP la opción será bastante similar) para, una vez que nos aparezca la ventana, modificar los permisos, bien a partir de los check disponibles, bien modificando los números.
Cambiar el archivo de ubicación.
La última opción para proteger el archivo wp-config es “sacarlo” de la ruta de instalación de WordPress.
Como ya comente al principio, este archivo se encuentra en la raíz de nuestra instalación de WordPress (html_public/nombre_de_web por ejemplo). Podemos moverlo a la raíz html_public. WordPress lo detectará y funcionará perfectamente.
Limit Login Attemps
Y para acabar, un plugin bastante recomendable, independientemente de si restringimos el acceso a la carpeta wp-admin, Limit Login Attemps, que nos va a permitir configurar el número de intentos fallidos de login en nuestro WordPress, bloqueando el acceso con ese usuario y también definir el tiempo en el que ese usuario estará inhabilitado para volver a intentar el login.
No te vayas todavía
Con esto os dejo pensando hasta el próximo artículo. Todavía nos quedan unos cuantos pasos, a saber:
- Cambiar el prefijo de la base de datos.
- Programar un sistema de backups.
- Desactivar el editor de archivos de WordPress.
- Asignar los permisos adecuados a las carpetas y archivos de nuestro servidor Web.
- Añadir cabeceras de seguridad HTTP a nuestro servidor.
- Establecer las keys y salt de seguridad para fortalecer las cookies.
- Hacer que tu WordPress no parezca un WordPress, y no de pistas.