La semana pasada se conoció la noticia de que muchos sitios que utilizan WordPress estaban siendo víctimas de un ataque masivo para robar contraseñas de administrador utilizando el método de la fuerza bruta, provechándose de los administradores que dejan como usuario “admin” y de que el formulario de login de WordPress no dispone, de por sí, de método alguno para prevenir este tipo de ataques (ir probando combinaciones hasta que alguna funciona).
Llevo muchos años utilizando WordPress y me parece interesante compartir algunas de las medidas de seguridad que considero básicas para mantener una instalación segura. No entraré en detalle de ninguno de los temas, pero si alguien quiere que me esplaye un poco más o que escriba un post sobre ello, lo haré.
Establece los permisos de archivos y directorios
Desde el terminal, si tenemos acceso al servidor, nos aseguraremos que los directorios y los archivos tienen los permisos establecidos correctamente. En la mayoría de los casos de la siguiente manera:
Para directorios:
find /path/to/your/wordpress/install/ -type d -exec chmod 755 {} ;
Para archivos:
find /path/to/your/wordpress/install/ -type f -exec chmod 644 {} ;
Establece las claves secretas de tu wp-config.php
Las claves secretas de nuestro WordPress se utilizan para dotar de mayor seguridad a las cookies de nuestro sitio y que terceras personas “no se hagan pasar por nosotros”. Debéis introducirlas en el archivo wp-config.php y podéis generarlas aleatoriamente desde aquí.
Renombra el usuario admin y asegúrate de que su contraseña es segura
La mayoría de los usuarios de WordPress mantienen al usuario “admin” como administrador de su sitio, por lo que si alguien intenta hackearlo lo tendrá el doble de fácil, puesto que solamente tendrá que introducir la contraseña. Por eso es importante no utilizar, ni siquiera tener, un usuario llamado “admin” en el blog. Podemos crear un nuevo administrador utilizando este usuario y a continuación loggearnos con él para borrar el antiguo o también acceder a PhpMyAdmin y modificarlo como se explica aquí.
Sobra decir, que también tendremos que tener una contraseña segura, para lo cual resulta muy interesante “How Secure is My Password”, una página que te indica la fuerza de la misma. Utilizar servicios como 1Password o LastPass también puede ayudarnos.
Mantén actualizados WordPress y los plugins que utilices
Las mayores vulnerabilidades suelen producirse en versiones antiguas de WordPress o en plugins desactualizados, porque los hackers tienen más tiempo para trastear con estas versiones, así que una buena manera de prevenir ataques es mantenerlo todo actualizado siempre y cuando sea posible.
Cambia el Prefijo de la Base de Datos
Por defecto, WordPress establece el prefijo “wp_” en las tablas de nuestra base de datos. Esto supone un problema porque estamos dando pistas de cómo se llaman nuestras tablas: wp_options, wp_posts, wp_comments, etc. Modificando el prefijo conseguiremos ponérselo más difícil a los hackers.
Para hacerlo, si aún no hemos instalado WordPress, nos bastará con editar la siguiente línea en el archivo wp-config.php:
$table_prefix = ‘r235_’;
Podemos cambiar “r235_” por lo que queramos, siempre y cuando contenga números, letras o guiones bajos.
En el caso de que nuestro blog ya tenga un recorrido, tendremos que cambiar el prefijo de todas las tablas existentes, lo que podemos hacer metiendo mano directamente en la base de datos (¡Ojo!) o utilizando el plugin WP Security Scan, que realiza esta tarea automáticamente
Prevenir ataques de fuerza bruta en el login de usuarios
Si utilizas el usuario “admin” del blog o una contraseña sencilla, las probabilidades de que un ataque por fuerza bruta tengan éxito son muy altas, pero si no es así también existe alguna posibilidad puesto que WordPress no limita el número de accesos erróneos en periodos cortos de tiempo, así que a base de paciencia (o utilizando una gran cantidad de ordenadores infectados) se puede conseguir. Para prevenir esto se puede utilizar un plugin, como Simple Login Lockdown o similares.
Proteger el acceso los arhcivos htaccess, wp-config.php y directorio wp-includes
Solamente tú y el servidor deberían tener acceso a estos dos archivos, que son muy importantes puesto que en ellos aparecen datos privados (como la contraseña y usuario de la base de datos) y las normas de redirección del blog.
Para evitar que accedan terceras personas a ellos, añade las siguientes líneas al archivo .htaccess:
Para wp-config.php:
<files wp-config.php>
order allow,deny
deny from all
</files>
Para .htaccess:
<Files .htaccess>
order allow,deny
deny from all
</Files>
Para el directorio wp-includes:
# Block the include-only files.
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
BEGIN WordPress
Desactivar el editor HTML de WordPress para plugins y plantillas
Si alguien accede a tu panel de administración, por defecto tendrá acceso a la edición de tus plantillas y plugins. Es poco recomendable realizar los cambios a los archivos del blog desde la administración porque si metemos la pata no hay vuelta atrás, no tenemos deshacer, así que es bastante recomendable desactivar esta característica añadiendo la siguiente línea en el wp-config.php:
define('DISALLOW_FILE_EDIT', true);
Oculta la versión de WordPress que utilizas
Por defecto, por razones estadísticas WordPress muestra en el código de la cabecera del blog la versión que se está utilizando, lo que puede facilitar la tarea de los hackers a la hora de buscar vulnerabilidades. Para evitar esto, en el archivo functions de nuestra plantilla podemos añadir la siguiente línea:
remove_action('wp_head', 'wp_generator');
Si lo preferimos, también podemos utilizar algún plugin que realiza esta tarea automáticamente, como por ejemplo Secure WordPress.
Realiza copias de seguridad
Aunque no tiene que ver directamente con la seguridad, sí que tiene que ver con que te sientas más seguro y que te ahorres unos cuentos dolores de cabeza en el caso de que algo falle. Para realizar copias de seguridad de la base de datos puedes utilizar un plugin (fácil) o programar un script que realice la tarea automáticamente (hardcore) utilizando CRON.
Un plugin para realizar esta tarea de manera sencilla puede ser WP-DBManager (WordPress Database Backup hace mucho tiempo que no se actualiza).
Si te va lo hardcore, puedes editar el siguiente shell script para dejarlo a tu gusto y luego ejecutarlo periódicamente con CRON:
DBNAME='BASE_DATOS'
DBPASS='CONTRASEÑA'
DBUSER='USUARIO'
#Email al que se enviará por correo la backup
EMAIL="EMAIL"
#El prefijo que utilices en tu base de datos
PREFIX="PREFIJO_DB";
DATE=`date +%Y%m%d` ;
#Exportamos la BD
mysqldump --opt -u $DBUSER -p$DBPASS $DBNAME > backup.sql
#La comprimimos
gzip backup.sql
#Codificamos el archivo como archivo adjunto y lo enviamos por email
uuencode $DBNAME-backup-$DATE.sql.gz $DBNAME-backup-$DATE.sql.gz | mail -s "[bocabit.com] Backup MySQL Completa" $EMAIL
rm $DBNAME-backup-$DATE.sql.gz
Plugins recomendados para asegurar nuestro WordPress
Por último, os dejo un listado algunos de los plugins que yo utilizo para ahorrarme quebraderos de cabeza y mantener WordPress un poco más seguro.
- Akismet: Para evitar el spam en los comentarios del blog.
- Secure WordPress: Desactiva las versiones de WordPress y realiza otras pequeñas tareas.
- WP Security Scan: Detecta vulnerabilidades en nuestra instalación y realiza el cambio de prefijo de la base de datos automáticamente.
- Simple Login Lockdown: Evita ataques de fuerza bruta en el login de usuarios.
- WP-DBManager: Realiza backups de nuestro blog, optimiza y arregla la base de datos.
Si conocéis más plugins o trucos de seguridad os animo a que dejéis un comentario.