Une base de données exposée sur Internet est l'une des premières choses que cherchent les robots : le port 3306 est scanné en permanence, et les bases laissées ouvertes avec un mot de passe faible sont vidées ou prises en otage. Ce guide installe MariaDB et le verrouille. Les commandes valent aussi pour MySQL, à quelques noms de fichiers près.
1. Installer et sécuriser l'installation
apt update && apt install -y mariadb-server
mariadb-secure-installation
Répondez ainsi aux questions :
- Switch to unix_socket authentication :
nsi la question apparaît, car c'est déjà le cas sur Debian et Ubuntu. - Change the root password :
n. Le compte root de MariaDB s'authentifie par le compte root du système, sans mot de passe réseau : c'est plus sûr qu'un mot de passe. - Remove anonymous users, Disallow root login remotely, Remove test database, Reload privilege tables :
Yà chaque fois.
Connectez-vous ensuite en root du système avec la simple commande mariadb.
2. N'écouter qu'en local
Sur Debian et Ubuntu, MariaDB n'écoute par défaut que sur l'adresse locale. Vérifiez-le, car une modification passée ou une autre distribution peut l'avoir changé :
ss -tlnp | grep -E "3306|mariadbd|mysqld"
Vous devez voir 127.0.0.1:3306. Si vous voyez 0.0.0.0:3306 ou *:3306, corrigez dans /etc/mysql/mariadb.conf.d/50-server.cnf :
[mysqld]
bind-address = 127.0.0.1
skip-name-resolve
systemctl restart mariadb
skip-name-resolve évite une résolution DNS à chaque connexion : c'est plus rapide, et les comptes doivent alors être déclarés avec une adresse IP plutôt qu'un nom d'hôte. Si votre application tourne dans Docker, voyez le paragraphe sur Docker plus bas.
3. Un utilisateur par application
N'utilisez jamais le compte root dans une application. Créez une base et un utilisateur par site ou par serveur de jeu, avec les droits sur sa seule base :
CREATE DATABASE boutique CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'boutique'@'localhost' IDENTIFIED BY 'MOT_DE_PASSE_GENERE';
GRANT ALL PRIVILEGES ON boutique.* TO 'boutique'@'localhost';
FLUSH PRIVILEGES;
Générez les mots de passe avec openssl rand -base64 24. Si une application est compromise, l'attaquant n'atteint que sa propre base. Pour un outil qui ne fait que lire, comme un tableau de bord, limitez même les droits à SELECT.
Cas de Docker : un conteneur ne se connecte pas depuis localhost, mais depuis l'adresse du réseau Docker. Le plus simple est de faire tourner la base dans un conteneur du même fichier Compose, sans publier son port. Voir Docker et Docker Compose.
4. Auditer les comptes existants
Sur un serveur déjà en service, listez les comptes et l'origine d'où ils peuvent se connecter :
SELECT user, host FROM mysql.user ORDER BY user;
Tout compte dont la colonne host vaut % accepte les connexions depuis n'importe où. S'il n'est pas indispensable, supprimez-le ou limitez-le :
DROP USER 'ancien'@'%';
RENAME USER 'appli'@'%' TO 'appli'@'localhost';
Vérifiez aussi les droits d'un compte avec SHOW GRANTS FOR 'appli'@'localhost';. Un compte applicatif ne doit jamais avoir ALL PRIVILEGES ON *.*.
5. Accéder à distance sans exposer la base
Pour utiliser un outil graphique comme DBeaver, HeidiSQL ou MySQL Workbench depuis votre ordinateur, passez par un tunnel SSH : la base reste fermée à Internet.
ssh -N -L 3307:127.0.0.1:3306 alex@IP_DU_VPS
Tant que cette commande tourne, connectez votre logiciel à 127.0.0.1 sur le port 3307. La plupart des outils savent aussi créer ce tunnel eux-mêmes, dans un onglet « SSH » de la connexion.
6. Régler la mémoire
Le réglage qui compte le plus est innodb_buffer_pool_size, la mémoire où MariaDB garde les données et les index les plus utilisés. La valeur par défaut, 128 Mo, est trop faible dès que la base grossit. Sur un VPS qui héberge aussi le site ou le serveur de jeu, réservez-lui environ un quart de la RAM :
[mysqld]
innodb_buffer_pool_size = 1G # pour un VPS de 4 Go
max_connections = 100
Pour estimer le besoin, comparez à la taille réelle de vos données :
SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024) AS taille_mo
FROM information_schema.tables WHERE engine = 'InnoDB';
Inutile de dépasser cette taille, augmentée d'une marge de croissance.
7. Sauvegarder
Ne copiez pas les fichiers de /var/lib/mysql pendant que la base tourne : la copie serait incohérente. Exportez plutôt :
mariadb-dump --all-databases --single-transaction --routines --events | gzip > /var/backups/mariadb.sql.gz
--single-transaction produit un export cohérent sans bloquer les applications. Automatisez l'export et envoyez-le hors du serveur : voir sauvegardes avec Borg. Pour restaurer : gunzip -c mariadb.sql.gz | mariadb.
8. Mises à jour
Les versions de maintenance de MariaDB arrivent par les mises à jour normales du système. Si vous avez activé les mises à jour de sécurité automatiques décrites dans les premiers pas, elles s'installent seules. Avant de changer de version majeure, faites un export complet, puis lancez mariadb-upgrade après la mise à jour si elle ne l'a pas fait elle-même.