Instalar, configurar y securizar MariaDB
La página de IBM developerWorks no para de sorprenderme. Muchas de las veces que busco documentación técnica, cursos, tutoriales, etc. allí están ellos, y con un material gratuito y de muy alta calidad. La última, fue con la instalación de este blog. Tengo un VPS contratado con Ubuntu, que he ido actualizando poco a poco, y que lo tengo bastante pelado. Me decidí por instalar en él WordPress (tras mucho analizar otros sistemas para publicar artículos tipo Dokuwiki, Octopress, Jekyll, Pelican, etc.). Lo primero que me sorprendió es que no soporta PostgreSQL de forma oficial (que sería mi primera opción), por mis reticencias con MySQL, pero más tarde de acordé del fork que se creó hace un tiempo, llamado MariaDB. Leyendo un poco, parece ser que MariaDB es “binariamente” (si es que eso existe en castellano) compatible con MySQL (es decir, que el protocolo de comunicación, los ficheros de base de datos, etc. son totalmente compatibles, si no iguales).
Bueno, a lo que iba. Ya que con PostgreSQL no se puede (o por lo menos, no está oficialmente soportado), opté por instalar MariaDB. Desde su web tienen un asistente muy sencillo para configurar los repositorios de las distribuciones Linux más comunes (openSUSE, Debian, Ubuntu, Red Hat, CentOS, etc.). Tienen paquetes precompilados para prácticamente todas las versiones y arquitecturas (la única que echo en falta es Red Hat 7, aunque se lo perdono porque acaba de salir hace nada…).
Una vez configurados los repositorios, toca la parte de la instalación; sencillísima como siempre:
sudo apt-get update
sudo apt-get install mariadb-server php5-mysql
Lo que más miedo me da de estas instalaciones tan “sencillísimas” es que muchas veces dejan el servidor o el servicio instalado bastante desprotegido. Durante la instalación, se nos pregunta que si queremos ponerle una contraseña al usuario root de MariaDB/MySQL…. Pero qué cosas, nos permite dejarlo en blanco. MAL MAL MAL. Como decía, gracias a los tutoriales de developerWorks, descubrí que hay un comando muy sencillo que te “quita” todas esas inseguridades; a saber:
- Ponerle una contraseña al usuario root de MariaDB/MySQL en condiciones.
- Eliminar el usuario anonymous
- Deshabilitar el acceso remoto de root
- Eliminar la base de datos test
- Recargar los privilegios
El comando mágico es mysql_secure_installation
, aunque parece que no está muy afinado, ya que nada más lanzarlo da un error:
/usr/bin/mysql_secure_installation: 379: /usr/bin/mysql_secure_installation: find_mysql_client: not found
También da un error al intentar borrar la base de datos test:
Remove test database and access to it? [Y/n]
- Dropping test database...
ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist
... Failed! Not critical, keep moving...
- Removing privileges on test database...
... Success!
Puedes ver la salida completa del comando en este Gist:
Una vez hecho esto, ya podemos decir que nuestra instalación está bastante adecentada. Lo que nos quedaría, si usamos un cortafuegos (que deberíamos), sería limitar el acceso. Si la regla por defecto es denegar las conexiones entrantes, no deberíamos tener problema; si no, deberíamos añadir una regla para denegar las conexiones remotas entrantes al puerto 3306. El siguiente listado muestra los comandos necesarios para configurar el cortafuegos de manera rápida con UFW, permitiendo el acceso desde fuera por SSH, HTTP y HTTPS, denegando todo el resto de tráfico entrante, y permitiendo por defecto el tráfico saliente:
sudo apt-get install ufw
sudo ufw enable
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh/tcp
sudo ufw allow http/tcp
sudo ufw allow https/tcp
sudo ufw status
Por último, y como algo particular para WordPress, crearemos una base de datos, un usuario y le daremos permisos al usuario sobre esa base de datos, para lo que ejecutaremos el comando mysql -uroot -p
, introduciendo después la contraseña asignada antes al usuario root, y ejecutando los siguientes comandos desde el shell de MariaDB:
CREATE DATABASE wordpress;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'pickApassword';
GRANT ALL PRIVILEGES ON wordpress .* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
exit