Montar un wordpress con docker

Si, esta es una receta muy sencilla y muy rápida. Quizá no sea perfecta, pero en caso de que quieras montar un servidor wordpress sin preocuparte de instalaciones y milongas, este es el método.

Voy a suponer que ya sabes lo que es docker y docker-compose, es más, voy a dar por hecho que los tienes instalados en el servidor donde quieres instalar wordpress, si eso no es así vete disparado a google y búscalo (me lo agradecerás).

Vamos a hacer una instalación donde la base de datos y los archivos de wordpress estén en directorios de la misma máquina y no dentro del contenedor, de manera que podamos reiniciar y actualizar los contenedores preservando los datos. Para ello creamos una estructura haciendo algo similar a esto (pongo como se hace en linux):

mkdir wordpress
cd wordpress
mkdir db
mkdir archivos
mkdir docker
cd docker

Ahora viene lo bueno, creamos dentro del directorio docker el archivo docker-compose.yml con este contenido:

version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - "../db:/var/lib/mysql"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    links:
      - db
    ports:
      - "80:80"
    volumes:
      - ../archivos:/var/www/html
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress

Y con esto ya tenemos todo el pescado vendido. Nos metemos en el directorio docker (donde está el docker-compose.yml) y ejecutamos:

docker-compose up -d

Puedes comprobar que todo está funcionando en cualquier momento con el comando docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
 18b4c06458b7        wordpress:latest    "docker-entrypoint.s…"   36 seconds ago      Up 32 seconds       0.0.0.0:80->80/tcp    docker_wordpress_1
 211c0832d549        mysql:5.7           "docker-entrypoint.s…"   39 seconds ago      Up 35 seconds       3306/tcp, 33060/tcp   docker_db_1

Ahora, para instalar, de verdad, el wordpress debemos conectar a http://localhost y podremos comenzar la instalación:

Y después de poner todos los datos tendremos un wordpress funcional en el puerto 80, con el añadido de que para realizar un backup solo tenemos que parar los contenedores y copiar los directorios db y archivos (o llevárnoslos a otro servidor).

Hay muchas mejoras que hacer si queremos que esto esté listo para producción como, por ejemplo, hacer que vaya por https (para eso lo mejor es poner un proxy inverso), pero ya lo veremos un poco más adelante. Por ahora, si queréis parar los servicios solo tenéis que ejecutar, desde el directorio docker la instrucción:

docker-compose stop

Y, lo bueno, es que tu máquina no ha sufrido ningún cambio de configuración ni ha instalado ningún paquete de más… Todo ventajas.

Parando un ciberataque a tu wordpress

Este lunes, a eso de media tarde, detectamos en la web de uno de nuestros clientes que estaba recibiendo una cantidad inusualmente alta de intentos de login fallidos. Nuestro cliente, que usa wordpress, tiene un cierto nivel de visitas digamos, importante, lo que le hace un blanco para bots y escaneadores de redes habitualmente, por lo que siempre recibe cierta cantidad de estos intentos fallidos, pero al cabo de unos minutos nos dimos cuenta de que esta vez era distinto… Estabamos en medio de uno de los mayores ataques a sitios wordpress de la historia. Este es el volumen que mostraba wordfence (el plugin de seguiridad que usamos):

Como vemos se llegaron a los 10 millones de ataques y, como dicen en su blog se trataba de un ataque distribuido masivo de fuerza bruta muy importante. De hecho indicaban que:

  • El ataque había llegado a 14.1 millones de ataques por hora.
  • El número toral de IPs involucradas fueron más de 10,000.
  • Se estaban atacando más de 190.000 sitios WordPress por hora.
  • Esta es la campaña más agresiva que nunca hemos visto por volumen de ataques por hora.

La razón que proponían como posible fuente de este ataque fue el filtrado masivo de credienciales que salió a la luz el 5 de diciembre y que dejaba expuestos millones de contraseñas nuevas que poder utilizar en un ataque de este tipo.

Así que, en medio de toda esta vorágine y recibiendo un montón de alertas, teníamos que hacer algo para proteger nuestro sitio, manteniendo el servicio y evitando que los chicos malos se nos colasen hasta la cocina.

Además de tomar las medidas habituales, nosotros escogimos un camino que nadie más podía tomar, utilizar el nuevo plugin wordpress de nomorepass que acabábamos de desarrollar y que todavía no estaba distribuido (ahora ya lo está) y que contenía una nueva opción más que interesante: «Solo permitir el acceso mediante la app».

Con esta simple opción aunque los robots consiguieran un usuario y un password válido para el sitio no podrían entrar, porque solo se permitiría entrar a aquellos que usaron el código qr y la app para enviar sus credenciales. Esta simple medida, junto con el baneo de ips y otras medidas habituales consiguieron devolver la normalidad al sitio y, sobre todo, estar seguros de que no se podían haber colado.

Como ya os he contado muchas veces, la mejor contraseña es la que no conocemos, así evitaremos todos los ataques por ingeniería social y estaremos un poquito más seguro sin tener que cambiar – todavía – la infraestructura de acceso a nuestros sitios.

Por todo ello,  os recomiendo usar nomorepass.