Normalmente, cuando se desarrolla una web en WordPress, la seguridad es algo que no se tiene muy en cuenta pero que cada vez es más necesario trabajar. Ya sea que estás aquí por curiosidad o porque has vivido las consecuencias de una mala seguridad en tu WordPress, no lo dejes de lado y ten en cuenta cada punto descrito a continuación.
Índice de Contenido
¿WordPress es seguro?
Algo que debemos tener claro desde el primer momento es que en todas las webs del planeta siempre existirá algún riesgo. Es por esto que trabajar la seguridad no trata de evitar al 100% los riesgos, sino de minimizarlos todo lo que podamos.
Sabiendo lo anterior te respondería a la pregunta del encabezado diciendo que no, WordPress no es seguro, pero no por ser WordPress en concreto.
Ahora, si modificamos la pregunta podremos verlo desde otra perspectiva:
¿WordPress podría ser más seguro?
Sin duda. Y abajo descubrirás algunos métodos para lograrlo.
Qué tener en cuenta al mejorar la seguridad para WordPress
Cómo hacer que mi sitio web sea seguro, la pregunta del millón. A continuación descubrirás un gran número de consejos e implementaciones que harán tu web en WordPress bastante más segura.
1. Auditoría de seguridad
Si nos preocupa la seguridad de nuestra web en WordPress y no contamos con los conocimientos adecuados, una auditoría es de lo más recomendable. Así le informarán sobre qué mejoras son las mejores para su web en concreto.
2. Contraseñas
Las contraseñas son nuestra llave de acceso, quien cuente con ella o con una copia tendrá libre entrada a nuestra web. Sabiendo esto supongo que no quedará duda de la importancia de tener una contraseña segura. Para lograr esto podemos recomendar:
- Cambiar contraseñas cada periodo de tiempo
- No compartir contraseñas, y mucho menos las de administrador
- Añadir diferentes caracteres:
- Mayúsculas y minúsculas
- Números
- Caracteres especiales
- Tenerla solo en la memoria
Una buena estrategia para crear una contraseña es usar una frase que recordemos y usar las iniciales. Por ejemplo, para la frase “Haz el amor y no la guerra” podríamos tener la siguiente contraseña: “heaynlg”. Además, podremos colocar el nombre y el apellido del autor en mayúsculas al principio y final de la misma. Como es John Lennon, sería “JheaynlgL”. Y para asegurarla aún más, una barra baja junto con su año de nacimiento: “JheaynlgL_40”.
Si no queremos usar esta estrategia siempre podremos usar un generador de contraseñas seguras como esta de Roboform. De todos modos, usemos la estrategia que usemos, siempre debemos tener algún mail seguro asociado a nuestra cuenta, y sobre todo, saber cómo recuperar la contraseña de WordPress desde PhpMyAdmin para salvar posibles situaciones difíciles.
3. Nombres de usuario
Los nombres de usuario también pueden ser un punto débil de la seguridad para WordPress. De hecho, hay ciertas formas muy sencillas con las que se pueden obtener los diferentes nombres de usuario. Una de ellas es a través de la URL en el navegador. Sería tan fácil como:
- Colocar el dominio en el buscador: ejemplo.com
- Seguirlo con la siguiente estructura: ?author=1
Esto nos devolvería todos los posts creados por el usuario con id = 1, que muy comúnmente es el administrador de la web. Y no solo esto, también tendremos acceso al nombre de usuario utilizado por el usuario con id = 1.
Existen varias formas de evitar que estos datos sean tan fácilmente accesibles. Por ejemplo:
- ¡No usar el mismo nombre de usuario que en el acceso!
- Podríamos modificar nuestro “user_nicename” mediante SQL o en phpMyAdmin
- Añadir código en nuestro .htaccess para redirigir cuando se añada ese formato de URL:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^author= [NC]
RewriteRule ^ /? [L,R=301]
Añadir código en nuestro archivo functions.php:
function wh_author() {
if ( ! is_admin() ) {
if ( preg_match( '/author=([0-9]*)/i', $_SERVER['QUERY_STRING'] ) ) {
wp_redirect( home_url() );
exit;
}
}
}
add_action( 'init', 'wh_author' );
Usar un plugin como “stop user enumeration”
Si queremos evitar la carga por id pero sí que funcionen las páginas de autor, tendremos que verificar que en Ajustes/Enlaces permanentes no está seleccionada la opción “simple”.
4. Página de acceso
La página de acceso va en línea con los dos puntos anteriores. Uno de los ataques más comunes en las páginas de acceso es el Phishing. Un ataque en el que se te muestra una página de acceso falsa para que añadas los datos voluntariamente. Para evitar esto recomendamos siempre fijarnos bien en que el dominio de nuestra página de acceso es el que debe ser.
Otra implementación muy interesante para tener una capa extra de seguridad en nuestra página de acceso sería añadir un ReCAPTCHA en nuestro WordPress, por ejemplo, en nuestro los formularios de acceso y registro.
5. Modifica la URL de la página de acceso
Para acceder al panel de control de WordPress podremos hacerlo a través de la URL por defecto midominio.com/wp-admin. Una forma sencilla para ocultar la página de acceso sería modificando la URL. Existen varios plugins que proporcionan esta funcionalidad, entre los que destacamos:
- WPS Hide Login
- Change wp-admin login
6. Limita los intentos de acceso
Los de fuerza bruta son los ataques más comunes para conseguir el usuario y la clave de acceso. Una fácil solución para evitarlos es mediante el uso de alguna herramienta que bloquee el acceso tras varios intentos.
Existen varios plugins que nos proporcionarán esta funcionalidad, como “Limit Login Attempts Reloaded”.
7. Doble factor de autenticación
Esto no es más que una verificación en dos pasos en lugar de uno. Dependiendo de la herramienta que usemos podremos verificar nuestra identidad mediante un código recibido a nuestro móvil o a nuestro mail.
Existen muchos plugins con esta funcionalidad, como “Two Factor” o “Two Factor Authentication”..
8. Errores PHP en WordPress
Muchas veces, nuestra web puede mostrar errores que provienen del código. Esto puede ser información relevante de la que cualquier atacante malintencionado puede beneficiarse. Para evitar que se presenten estos errores, podremos escribir la siguiente línea de código en nuestro archivo wp-config.php, una línea después de la apertura <?php:
error_reporting(0);
9. Bloquea el editor de archivos
En nuestro panel de control encontraremos el editor de archivos en Apariencia/Editor de archivos. Desde ahí tendremos acceso a varios de los archivos vitales de nuestra web, como functions.php. Si alguien ha podido acceder a nuestra cuenta de administrador podría hacer mucho daño en estos archivos.
Así que, para aumentar nuestra seguridad para WordPress, tendría sentido anular este acceso. Para hacerlo podremos añadir el siguiente código en nuestro archivo wp-config.php:
define( 'DISALLOW_FILE_EDIT', true );
10. Usuarios nuevos
Debemos evitar al máximo el acceso a nuestra web. Así que reduzcamos el número de usuarios al mínimo posible. Si, por ejemplo, somos la única persona que cuenta con acceso debemos asegurarnos que el registro de nuevos usuarios esté desactivado.
Para comprobarlo podemos entrar en nuestro panel de control, en: Ajustes/Generales/Miembros/Cualquiera puede registrarse
Es muy probable que necesitemos que existan otros usuarios en nuestra web. Por ejemplo para crear contenido o diseñar nuevas páginas. Debemos ser muy minuciosos con los privilegios que les estemos dando, esto es vital para nuestra seguridad. Para esto existe en WordPress una variedad de perfiles de usuario con diferentes privilegios:
- Super Admin
- Administrador
- Editor
- Autor
- Colaborador
- Suscriptor
Podemos visitar esta página para conocer los privilegios de cada uno.
11. Añadir código externo
Muchas veces podemos encontrar trozos de código que prometen alguna solución a nuestros problemas. En ciertos casos puede ser muy útil, pero si no entendemos el código mejor no usarlo. Esto es porque podemos estar añadiendo alguna debilidad a nuestra web sin siquiera saberlo.
12. Versión de WordPress
Por defecto WordPress nos muestra qué versión se está usando a través de una metaetiqueta llamada “generator”. Esto es información de valor para posibles atacantes. Es por esto que es un plus dejar de mostrar estos datos. Para hacerlo podremos añadir el siguiente código en nuestro functions.php:
remove_action( 'wp_head', 'wp_generator' );
13. Plugins
Según varios estudios, más del 20% de las webs en WordPress que han sido hackeadas, ha sido a través de un agujero de seguridad en un plugin. Intentemos limitar el uso de plugins y sustituyámoslos por funcionalidades creadas en código. Si no tenemos más opción que el uso de algún plugin, es vital que provengan de fuentes fiables.
14. Temas
En WordPress solo podremos tener activo un tema, y además, se recomienda tener un segundo para tenerlo de respaldo en caso el principal se rompa. Aparte de estos dos no se recomienda tener más temas instalados debido a que pueden convertirse en potenciales agujeros de seguridad para WordPress.
Eliminar temas de WordPress es una tarea relativamente sencilla, pero debemos tener en cuenta una serie de puntos como que al eliminarlos por FTP no se eliminan los datos de la base de datos, etc. Lee el artículo de este blog dedicado a este tema para más información.
15. Tema hijo
Si queremos personalizar la estructura de archivos de nuestro tema, modificar parte de su código o añadir código personalizado, siempre se recomienda el uso de un tema hijo. Estos temas no se verán afectados por ninguna actualización y nos permitirán tener nuestro código más organizado.
16. Actualizaciones
Mantener actualizados nuestros plugins, temas y el core es vital para minimizar riesgos de seguridad en nuestro WordPress.
Antes de realizar alguna actualización es muy importante tener un back up disponible por si aparece algún tipo de problema. Recordemos que una actualización es una modificación del código, por lo que debemos tratarlas con cuidado.
Se recomienda tener un registro de cada actualización que se realiza, con fecha incluida. Así podremos reconocer en qué actualizaciones pueden estar provocando errores, y a qué fecha recuperar nuestra web.
17. Evita instalación de temas y plugins
Una vez hayamos terminado con el desarrollo de nuestra web es muy probable que no necesitemos instalar nuevos plugins y/o temas. Esta funcionalidad la podemos anular con una simple línea de código sumando así otro poquito en seguridad. Para lograrlo podremos añadir el código siguiente en nuestro wp-config.php:
define( 'DISALLOW_FILE_MODS', true );
18. Spam
Hace años, el Spam era una de las principales vías por las que los atacantes accedían a una web o instalaban algún tipo de malware. Aunque el número a bajado considerablemente, es una práctica de lo más recomendable el uso de alguna herramienta que nos proteja ante estos incómodos mensajes.
Existen muchos plugins antispam para WordPress, destacamos “Akismet” y “Antispam Bee”.
19. Prefijo en la base de datos
El prefijo por defecto en WordPress es “wp_”, y toda persona con unos mínimos conocimientos en WordPress lo sabrá.
En la base de datos de WordPress se encuentra casi todo el contenido de nuestra web. De hecho también encontraremos datos tan delicados como el nombre de usuario, claves, etc.
Puedes hacerte a la idea de lo delicado que puede ser que alguien obtenga acceso ¿no? Así que una práctica no solo recomendable, sino esencial, es modificar este prefijo para aumentar nuestra seguridad en WordPress y complicar un poquito más el acceso a atacantes malintencionados.
Normalmente podemos modificar este prefijo en el momento de la instalación. En el caso que no lo hayas modificado siempre puedes hacerlo a través del archivo wp-config.php, donde encontraremos una líne de código como la siguiente:
$table_prefix = 'wp_';
Solo tendremos que modificar wp_ por el prefijo que decidamos. Además, es importante que también cambiemos el prefijo de todas las tablas desde PhpMyAdmin, ya que si no lo hacemos nuestra web solo mostrará una pantalla blanca.
20. Seguridad mediante Keys y Salts
Los Keys y Salts son textos aleatorios usados para mejorar la encriptación de nuestras claves y añadir capas extra de seguridad para WordPress. Se generan automáticamente cuando instalamos WordPress, pero puede haber varios motivos por los que cambiarlos sea una gran opción, como:
- Nuestra web ha sido infectada con malware
- Alguien no perteneciente a nuestro círculo de confianza ha tenido acceso a estos datos
Podremos cambiar los Keys y Salts a través de plugins de WordPress como Salt Shaker. O también podremos hacerlo manualmente siguiendo los siguientes pasos:
- Crea un backup para asegurarnos que tenemos un punto de restauración en caso que algo falle
- Accede al generador que nos proporciona WordPress para obtener el código generado de forma automática
- Accede al archivo wp-config.php. Lo encontraremos en la carpeta raíz de nuestra web, a la que tendremos acceso vía FTP o con el gestor de archivos de nuestro servidor
- Busca por ‘AUTH_KEY’ y sustituye todos los elementos por los obtenidos en el paso dos
- Guarda y cierra la ventana
21. XML-RPC
XML-RPC es una API que realiza llamadas remotas a través de http y el lenguaje de marcado XML. Dicho de una forma sencilla, XML-RPC nos permite interactuar con nuestra web de forma remota, además de ser usado por plugins como Jetpack. Podemos imaginarnos cómo afecta esto a la seguridad de WordPress.
Desde la versión 3.5 de WordPress, XML-RPC viene por defecto y no permite su desinstalación desde el panel de control.
Las conexiones que XML-RPC permite pueden ser aprovechadas para realizar ataques DDoS, por esto puede ser beneficioso eliminar esta funcionalidad.
Existen muchos plugins para eliminar XML-RPC o, incluso solo para protegernos de algunos ataques manteniendo el uso de esta API. Pero si queremos deshabilitarlo mediante código con WordPress será tan sencillo como añadir el siguiente código en nuestro functions.php:
add_filter( 'xmlrpc_enabled', '__return_false' );
22. Archivo wp-config.php
Este archivo contiene los Salts, Keys, los detalles de acceso a la base de datos y otros datos muy, pero que muy delicados. Entonces no está de más dificultar el acceso a atacantes malintencionados.
Entre los expertos en seguridad para WordPress hay quien dice que cambiar la localización del archivo puede ser una buena práctica, mientras que hay quien dice lo contrario. Yo prefiero denegar el acceso mediante .htaccess añadiendo el siguiente código:
<files wp-config.php>
order allow, deny
deny from all
</files>
Además, una medida extra de seguridad sería cambiar los permisos de edición del archivo. En el punto siguiente explico cómo.
23. Permisos en los archivos
Los servidores cuentan con capacidad para definir qué permisos tiene cada archivo dependiendo de qué usuario. Los permisos pueden ser de lectura, escritura y ejecución y pueden ser definidos para propietarios, grupos o públicos. Hay casos (como en el de wp-config.php) en los que es mejor definir lectura y escritura solo para propietarios (600). Si queremos saber más sobre esto podremos leer el artículo en este enlace.
24. Cabeceras de seguridad en WordPress
Cuando colocamos el dominio de la web en nuestro navegador o hacemos clic en un enlace estamos solicitando datos al servidor donde están alojados. El servidor recibe la llamada y recoge los datos para entregarlos a través de internet. En la respuesta se incluye el texto, las imágenes y funcionalidades de la web correspondiente.
Pero también se incluyen otros datos, con información sobre el servidor y algunas configuraciones, que pueden ser de valor para cualquier atacante. Para tratar de evitar esto podemos añadir una serie de cabeceras de seguridad para wordPress. Entre ellas encontramos:
- Strict-Transport-Security: Evita la interacción si no es a través de https
- Content-Security-Policy: Puede evitar ataques XSS definiendo qué fuentes son permitidas cuando se cargan archivos
- Permissions-Policy: A través de esta cabecera podremos informar al navegador si se debe permitir el acceso a algunos elementos de hardware como la cámara, el micro, etc. Para este ejemplo se deniega acceso a la cámara y el micrófono
- X-Frame-Options: Para evitar cargar la página en un iframe externo al dominio
- X-Content-Type-Options: Esta cabecera previene la carga de archivos que no están correctamente definidos mediante MIME
Antes que incluyas este código debes saber que es posible que cree conflicto con alguna configuración de tu web. Así que se recomienda que solo una persona con conocimientos realice la imlementación y, además, tener garantizado un acceso a través de FTP o el gestor de archivos de tu servidor para modificar el código en caso se rompa la web. Dicho esto, aquí te dejo el código:
function add_security_headers() {
header( 'X-Frame-Options: SAMEORIGIN' );
header( 'X-Content-Type-Options: nosniff' );
header( 'X-XSS-Protection: 1;mode=block' );
header( "Permissions-Policy: camera 'none', microphone: 'none'" );
header( 'Strict-Transport-Security: max-age=31536000' );
header( 'Content-Security-Policy: default-src self' );
}
add_action( 'send_headers', 'add_security_headers' );
25. Dispositivos personales
Uno de los principales problemas de seguridad de nuestra web provienen desde nuestro dispositivo y del modo en que interactuamos con él. Así que debemos usar nuestros dispositivos con responsabilidad. Unas buenas prácticas sería:
- Mantén tu sistema operativo y navegador actualizados
- Usa inicio de sesión con contraseña
- Usa un firewall en el router
- Usa un antivirus de calidad
26. Hosting
Un hosting es un espacio en un servidor donde puedes alojar los datos que quieras. Es un dispositivo físico con su sistema operativo, procesador, disco duro, memoria, etc. Aparte de afectar directamente en el rendimiento de tu web, la calidad del hosting también influye en la seguridad. Un hosting a un precio anual muy bajo nunca será recomendable.
27. Usa la última versión estable de PHP y MySQL
PHP es el lenguaje en que WordPress está construido. Los servidores suelen ofrecer soporte a versiones antiguas por no más de 2 o 3 años. Esto quiere decir que, si estamos usando una versión anterior, es muy probable que nuestra seguridad no esté cubierta.
Versiones antiguas del lenguaje pueden influir directamente en el rendimiento de la web.
Deberíamos tener posibilidad de actualizar PHP a través del panel de control de nuestro servidor.
MySQL es el lenguaje utilizado para gestionar la base de datos. Al igual que PHP, nuestro MySQL debería contar con la mejor versión hasta el momento.
28. Usa conexiones seguras
Puede parecer una tontería, pero si nos conectamos a través del Wifi gratuito del vecino, o si nos conectamos al panel de control de nuestro WordPress a través del ordenador del hotel, no podremos saber si es una conexión segura.
29. Certificado SSL
Un certificado SSL nos permitirá transferir datos cifrados entre nuestro navegador y el servidor donde se encuentra la web. Es lo que permite el acceso a nuestra web a través de https en lugar de http, y además, muestra como un candadito de seguridad junto a la URL en el navegador.
30. Archivos SVG
Subir SVG a WordPress de procedencia sospechosa puede llegar a ser un serio problema. Esto es debido a que este tipo de archivos pueden fácilmente contener código malicioso.
WordPress por defecto no permite la subida de archivos SVG, aunque estos archivos son tan ligeros y escalables sin pérdida de calidad, que pueden realmente ser beneficiosos para el rendimiento de nuestra web. Si activamos esta funcionalidad debemos asegurarnos que tomamos todas las medidas de seguridad posibles.
Conclusión
La seguridad para WordPress es un factor muy a tener en cuenta y que cada vez tiene mayor relevancia. Llevar un control exhaustivo, así como realizar las implementaciones más adecuadas para nuestro proyecto es vital para que nuestra web no corra riesgos innecesarios.
Hay algunas implementaciones que pueden afectar al rendimiento. Es importante que sepamos dónde y cómo realizar estas implementaciones para evitar posibles impactos en la optimización de nuestra web.
Si necesitas una agencia de desarrollo WordPress, cuenta con nosotros. Estaremos encantados de valorar tu proyecto.
En el apartado 3. Nombres de usuario, añadiría como medida inicial preventiva en el momento de hacer una instalación nueva, usar un usuario temporal, para crear luego otra cuenta de administración (la definitiva), desde la que borraremos la temporal. Asi evitamos tener una ID 1 como superusuario y hacer más complicada su localización a los posibles atacantes.
Gran post!
Muy buena esa Raúl!
Muchas gracias