No soy experto en seguridad, pero tengo bastante experiencia desarrollando sitios de WordPress y desde mis inicios me di cuenta de que la seguridad es una de las cosas más importantes que hay que aprender. WordPress es una plataforma robusta y muy completa cuya popularidad la ha hecho presa de ataques y security exploits, un sitio web de esta plataforma sin las debidas medidas de seguridad será presa fácil de hackeos y malware.
¿De qué hay que proteger nuestro sitio web? De muchas amenazas: malware, hackers e incluso personas dentro de nuestra organización o la de nuestros clientes que deseen perjudicar el funcionamiento del sitio o robar información. Todo el tiempo se descubren nuevas vulnerabilidades tanto en el core de WordPress como en plugins y themes. Mantener versiones actualizadas de todo no es suficiente, es necesario anticipar las vulnerabilidades y actuar como si supiéramos que un ataque a nuestro sitio web es inminente. Los privilegios de usuario y las contraseñas son tan seguros como el eslabón más débil en la cadena de herramientas, sistemas, tecnologías, hábitos y costumbres de seguridad con que contamos.
La seguridad no es un plugin que se instala ni una lista de mejores prácticas, la seguridad es una forma de pensar, es anticipar riesgos y encontrar debilidades. Cada riesgo o debilidad debe atenderse con una solución y debemos buscar posibles riesgos o debilidades de esa solución.
Hay que partir también del entendido de que los desarrolladores web generalmente no tenemos control sobre la seguridad del servidor, nuestro directorio e instalación pueden estar perfectamente asegurados pero siempre hay la posibilidad de que un ataque venga desde una vulnerabilidad en el servidor. Es por eso que recomiendo contratar el hospedaje web con proveedores serios y que tengan renombre ya que es posible suponer que contarán con experiencia y suficiente seguridad.
Hay tres aspectos que nosotros como desarrolladores web podemos proteger: (1) la seguridad de los archivos en el servidor, (2) la comunicación con el servidor y (3) el acceso a WordPress. A continuación voy a enlistar algunas soluciones para proteger estos tres aspectos. Estas soluciones van más allá de las mejores prácticas comunes para una instalación de WordPress que cualquier desarrollador debería seguir. Estoy seguro de que un experto en seguridad podrá encontrar problemas en mis soluciones pero la experiencia me ha demostrado que implementar estas soluciones es mejor que la alternativa.
SSL
SSL (Secure Sockets Layer) es un protocolo de seguridad que permite establecer comunicación encriptada con el servidor. Es conveniente usarlo porque toda la información que estemos enviando o recibiendo del servidor a través de WordPress estará encriptada, por ejemplo nuestra propia contraseña de acceso. Se puede conseguir un certificado SSL gratuito en Let’s Encrypt y simplemente podemos usar plugins o código para forzar que toda la comunicación con el servidor sea a través de HTTPS (HTTP a través de SSL). En este link hay un artículo muy completo sobre como se puede cambiar un sitio de WordPress de HTTP a HTTPS.
SFTP
Otra forma de comunicación con el servidor que debemos proteger es la conexión FTP. Podemos transferir archivos de forma encriptada usando SFTP (SSH File Transfer Protocol) que es una extensión de SSH (Secure Shell Protocol). Usar SFTP en lugar de simple FTP es una opción que debe estar disponible con el proveedor de hospedaje, así que es un punto a revisar antes de contratar el servicio. Nota: el proveedor de hospedaje que puedo recomendar es DreamHost ya que cuenta con SFTP y pueden tramitar e instalar de forma gratuita el certificado SSL del punto anterior.
Firewalls y monitoreo
Un firewall es un sistema de seguridad que controla el tráfico entrante y saliente de una red. Puede pensarse como una barrera entre tu sitio web y el resto del internet que negará el acceso a conexiones que violen ciertas reglas, por ejemplo que intenten cierto número de conexiones por minuto, IPs maliciosos, que fallen cierto número de intentos de ingresar a WordPress, que usen un nombre de usuario de WordPress inexistente y más. Yo recomiendo dos plugins que realizan esta función pero con diferentes técnicas y características por lo que se pueden usar en conjunto. BulletProof Security realiza algunas funciones básicas como limitar el número de intentos para ingresar a WordPress entre otras cosas pero además usa archivos .htaccess para limitar el acceso a ciertos directorios y archivos riesgosos. Wordfence es otro firewall que además de controlar el tráfico permite escanear de forma periódica los archivos de WordPress, plugins y themes para compararlos con sus respectivos repositorios oficiales y detectar cambios que puedan representar una inyección de malware. Además envía alertas acerca de posibles vulnerabilidades y riesgos. Estos dos plugins se pueden usar muy bien en combinación a pesar de que algunas de sus reglas son redundantes, una redundancia que aumenta la protección.
Hay además un servicio que me parece el mejor y se llama Sucuri.net. Este servicio hace las veces de firewall y escanea periódicamente el sitio web en busca de malware pero además en caso de infección ellos limpian el sitio en cuestión de horas y a veces de minutos. He usado este servicio en casos en los que me contactan clientes nuevos con un sitio hackeado y es la mejor forma de eliminar todo el malware y detectar las vulnerabilidades rápidamente,
Proteger el acceso a WordPress
En este punto hay varias técnicas que se pueden seguir para mantener un sitio protegido. Muchos ataques que reciben los sitios de WordPress son los conocidos como brute-force attacks, que son ataques mediante prueba y error para tratar de adivinar los datos de acceso de la cuenta de administrador. Ciertamente los firewalls pueden ayudar a defender el sitio web de estos ataques pero la defensa debe empezar desde los nombres de usuario y contraseñas que elegimos. Yo recomiendo usar nombres de usuario poco obvios y largos con contraseñas largas que contengan mayúsculas, minúsculas, números y signos. En este link hay un artículo muy completo sobre mejores prácticas para crear contraseñas seguras.
Otra cosa que se puede hacer para proteger el acceso es usar “two factor authentication” o “two step verification” que es una técnica de seguridad que usan muchas plataformas web y consiste en contar con un factor extra, independiente del nombre de usuario y contraseña, que es necesario para ingresar a un sistema. Generalmente se trata de un código (puede también ser un dispositivo como una memoria USB) que es necesario usar para tener acceso una vez que se ingresaron el nombre de usuario y contraseña. En la mayoría de los casos el código puede recibirse por mensaje de texto al teléfono móvil o por correo electrónico al momento en que se quiere ingresar. Por ejemplo si quiero ingresar pongo mi nombre de usuario y contraseña y me llegará un mensaje de texto con el código de acceso extra, así que sólo quien tenga mi móvil podrá tener esa pieza necesaria para ingresar (por ejemplo así funciona en Twitter). Google cuenta con una aplicación disponible para iOS y Android llamada Google Authenticator en la que se pueden tener códigos de acceso para varias cuentas. En esta aplicación los códigos van cambiando cada ciertos segundos así que al momento de ingresar el nombre de usuario y contraseña hay que poner el código vigente en ese momento. Para lograr esto mismo en WordPress yo uso un plugin llamado Google Authenticator que permite usar la propia app de Google.
Hay una tercer cosa que se puede hacer para proteger el acceso que es ocultar el URL de acceso. Es difícil entrar a una casa sin la llave pero es más difícil entrar si ni siquiera se sabe donde está la puerta. Yo uso un plugin llamado WPS Hide Login que permite cambiar el URL de acceso por uno personalizado. Digamos que tu sitio web es “http://example.org/” y por lo tanto el URL para ingresar es “http://example.org/wp-admin/”. Con este plugin ese URL puede quedar desactivado y el URL para ingresar puede ser uno personalizado como “http://example.org/loqueseteocurra/”.
Respaldos
Es una locura mantener un sitio web sin contar con un sistema de respaldos periódicos automatizados. Es cierto que generalmente los servicios de hospedaje web pueden restablecer respaldos a petición, sin embargo algunos sólo guardan respaldos de la última semana o últimas dos semanas; además prefiero no confiar en terceros y contar con mis propios respaldos y en cuestión de respaldos las redundancias son aconsejables. Yo uso un plugin llamado UpdraftPlus que permite hacer respaldos de forma periódica y guardarlos en servidores remotos, pudiendo ser servidores accedidos vía FTP o servicios de terceros como Dropbox, Google Drive, Amazon S3 y otros. Se pueden mantener tantos respaldos de los archivos y de la base de datos como se desee y hay muchas opciones de configuración.