LibraHostDocumentation

Documentation

Guides complets pour tous nos services d'hébergement

🛡️ Installer MySQL / MariaDB sur un VPS#

Guide complet et détaillé pour installer, sécuriser et optimiser MariaDB sur un serveur VPS. Ce tutoriel approfondi vous accompagne étape par étape pour une configuration professionnelle adaptée à l'hébergement web, aux applications métier, à l'e-commerce ou aux serveurs de jeux.

🎯 Objectifs de ce guide#

  • Installation propre de MariaDB sur Ubuntu/Debian
  • 🔒 Sécurisation avancée avec authentification forte et isolation des services
  • Optimisation des performances pour un usage en production
  • 🔧 Configuration fine adaptée à votre charge de travail
  • 🛠️ Résolution des problèmes les plus courants

1️⃣ Préparation du système#

📦 Mise à jour complète du système#

# Mise à jour de la liste des paquets sudo apt update # Mise à niveau de tous les paquets installés sudo apt upgrade -y

🔧 Installation des outils essentiels#

# Outils de base pour l'administration sudo apt install -y curl wget gnupg2 software-properties-common apt-transport-https ca-certificates

🕒 Configuration du fuseau horaire#

# Voir l'heure actuelles date # Configurer le fuseau horaire (important pour les logs) sudo timedatectl set-timezone Europe/Paris # Vérifier la configuration timedatectl status

2️⃣ Installation détaillée de MySQL ou MariaDB#

Méthode 1 : Depuis les dépôts Ubuntu/Debian#

# Installation de MariaDB sudo apt install -y mariadb-server mariadb-client # Démarrage et activation sudo systemctl start mariadb sudo systemctl enable mariadb # Vérification sudo systemctl status mariadb

Méthode 2 : Depuis le dépôt officiel MariaDB (recommandé)#

# Ajout de la clé GPG MariaDB sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc' # Ajout du dépôt curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup | bash # Installation sudo apt update sudo apt install -y mariadb-server

✅ Vérification de l'installation#

# Version installée mariadb --version # Processus en cours d'exécution ps aux | grep mysql # Ports en écoute sudo netstat -tlnp | grep :3306 # Test de connexion basique sudo mysql -u root

3️⃣ Sécurisation avancée de l'installation#

🔒 Assistant de sécurisation#

sudo mysql_secure_installation

Configuration détaillée des options :

  1. Validate Password Plugin : Y

    • Niveau de sécurité : 2 (STRONG)
    • Longueur minimale : 12 caractères
    • Mélange majuscules/minuscules/chiffres/symboles
  2. Mot de passe root : Créez un mot de passe fort

    • Exemple : MyS3cur3P@ssw0rd!2024
    • Évitez les mots du dictionnaire
    • Stockez-le dans un gestionnaire de mots de passe
  3. Supprimer utilisateurs anonymes : Y

  4. Désactiver connexion root distante : Y

  5. Supprimer base de données test : Y

  6. Recharger les privilèges : Y


4️⃣ Gestion des utilisateurs et privilèges#

👤 Création des bases de données et utilisateurs locaux#

Connexion en tant que root#

sudo mysql -u root -p

Création des bases de données#

-- Création des bases de données CREATE DATABASE production_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE staging_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Création d'utilisateurs pour accès local uniquement#

-- Utilisateur pour l'application (privilèges limités) CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppStr0ng!Pass2024'; GRANT SELECT, INSERT, UPDATE, DELETE ON production_app.* TO 'app_user'@'localhost'; -- Utilisateur pour les sauvegardes (lecture seule) CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'BackupSecur3!2024'; GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON production_app.* TO 'backup_user'@'localhost'; -- Utilisateur pour l'administration (privilèges étendus) CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'AdminP0w3r!2024'; GRANT ALL PRIVILEGES ON production_app.* TO 'admin_user'@'localhost'; GRANT ALL PRIVILEGES ON staging_app.* TO 'admin_user'@'localhost'; -- Utilisateur pour monitoring (privilèges de lecture système) CREATE USER 'monitor_user'@'localhost' IDENTIFIED BY 'M0nit0r!Secur3'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor_user'@'localhost'; -- Application des modifications FLUSH PRIVILEGES; -- Vérification des utilisateurs créés SELECT User, Host FROM mysql.user WHERE Host = 'localhost'; EXIT;

5️⃣ Configuration des accès distants (optionnel)#

⚠️ Attention : Les accès distants présentent des risques de sécurité. Ne les activez que si nécessaire et toujours avec des restrictions d'IP.

🔧 Étape 1 : Configuration du serveur MariaDB#

Modifier la configuration pour écouter sur toutes les interfaces#

# Éditer le fichier de configuration sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Trouvez la ligne bind-address et modifiez-la :

# AVANT (accès local uniquement) bind-address = 127.0.0.1 # APRÈS (accès depuis toutes les interfaces) bind-address = 0.0.0.0

Redémarrer MariaDB pour appliquer les changements#

sudo systemctl restart mariadb # Vérifier que le serveur écoute sur toutes les interfaces sudo netstat -tlnp | grep :3306 # Vous devriez voir : 0.0.0.0:3306 au lieu de 127.0.0.1:3306

🔐 Étape 2 : Création d'utilisateurs pour accès distant#

# Reconnection à MariaDB sudo mysql -u root -p
-- Utilisateur avec IP spécifique (recommandé) CREATE USER 'remote_admin'@'192.168.1.100' IDENTIFIED BY 'RemoteStr0ng!2024'; GRANT SELECT, INSERT, UPDATE, DELETE ON production_app.* TO 'remote_admin'@'192.168.1.100'; -- Application des modifications FLUSH PRIVILEGES; -- Vérification des utilisateurs distants SELECT User, Host FROM mysql.user WHERE Host != 'localhost'; EXIT;

🛡️ Étape 3 : Configuration du pare-feu#

# Autoriser l'accès depuis une IP spécifique sudo ufw allow from 192.168.1.100 to any port 3306 # Vérifier les règles du pare-feu sudo ufw status numbered

🧪 Étape 4 : Test de la connexion distante#

# Depuis un autre serveur, tester la connexion mysql -h 163.5.xxx.xxx -u remote_user -p production_app # Ou avec telnet pour tester la connectivité telnet 163.5.xxx.xxx 3306

6️⃣ Optimisation avancée des performances#

📊 Outils de tuning#

Installation de MySQLTuner#

# Installation depuis les dépôts sudo apt install -y mysqltuner # Ou téléchargement de la version la plus récente wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl chmod +x mysqltuner.pl # Exécution de l'analyse sudo mysqltuner # ou sudo perl mysqltuner.pl

7️⃣ Stratégies de sauvegarde et restauration#

💾 Sauvegardes avec mysqldump#

Script de sauvegarde automatisé#

# Créer le répertoire de sauvegardes sudo mkdir -p /backup/mysql sudo chown mysql:mysql /backup/mysql # Créer le script de sauvegarde sudo nano /usr/local/bin/mysql-backup.sh
#!/bin/bash # Script de sauvegarde MySQL automatisé # Configuration BACKUP_DIR="/backup/mysql" MYSQL_USER="backup_user" # A remplacer par votre utilisateur MYSQL_PASSWORD="BackupSecur3!2024" # A remplacer par votre mot de passe DATE=$(date +%Y%m%d_%H%M%S) RETENTION_DAYS=7 # Création du répertoire avec la date mkdir -p "$BACKUP_DIR/$DATE" # Liste des bases à sauvegarder DATABASES=("production_app" "staging_app") for db in "${DATABASES[@]}"; do echo "Sauvegarde de $db en cours..." # Sauvegarde complète avec structure et données mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD \ --single-transaction \ --routines \ --triggers \ --events \ --hex-blob \ --lock-tables=false \ $db > "$BACKUP_DIR/$DATE/${db}_full.sql" # Compression de la sauvegarde gzip "$BACKUP_DIR/$DATE/${db}_full.sql" echo "Sauvegarde de $db terminée : ${db}_full.sql.gz" done # Sauvegarde des utilisateurs et privilèges echo "Sauvegarde des utilisateurs et privilèges..." mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT User, Host FROM mysql.user;" > "$BACKUP_DIR/$DATE/users_list.txt" # Suppression des anciennes sauvegardes find $BACKUP_DIR -type d -mtime +$RETENTION_DAYS -exec rm -rf {} + echo "Sauvegarde terminée le $(date)"
# Rendre le script exécutable sudo chmod +x /usr/local/bin/mysql-backup.sh # Test du script sudo /usr/local/bin/mysql-backup.sh

Programmation des sauvegardes avec cron#

# Éditer la crontab sudo crontab -e # Ajouter ces lignes pour des sauvegardes automatiques # Sauvegarde quotidienne à 2h du matin 0 2 * * * /usr/local/bin/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1 # Sauvegarde hebdomadaire complète le dimanche à 1h 0 1 * * 0 /usr/local/bin/mysql-backup.sh >> /var/log/mysql-backup-weekly.log 2>&1

🔄 Restauration de sauvegardes#

Restauration complète d'une base#

# Décompression si nécessaire gunzip /backup/mysql/20241201_020000/production_app_full.sql.gz # Restauration mysql -u admin_user -p'AdminP0w3r!2024' production_app < /backup/mysql/20241201_020000/production_app_full.sql

Restauration sélective de tables#

# Extraire seulement une table de la sauvegarde sed -n '/^-- Table structure for table `ma_table`/,/^-- Table structure for table `/p' sauvegarde.sql > ma_table.sql # Restaurer cette table spécifique mysql -u admin_user -p production_app < ma_table.sql

🔍 Monitoring avec des outils système#

Configuration de Fail2Ban pour MySQL#

# Créer un filtre pour les tentatives de connexion MySQL sudo nano /etc/fail2ban/filter.d/mysql-auth.conf
[Definition] failregex = ^%(__prefix_line)s.*\[Warning\] Access denied for user '.*'@'<HOST>'.*$ ignoreregex =
# Configuration dans jail.local sudo nano /etc/fail2ban/jail.local
[mysql-auth] enabled = true filter = mysql-auth logpath = /var/log/mysql/error.log maxretry = 3 bantime = 3600 findtime = 600
# Redémarrer Fail2Ban sudo systemctl restart fail2ban sudo fail2ban-client status mysql-auth

8️⃣ Résolution des problèmes courants#

🚨 Erreurs d'authentification#

"Access denied for user 'root'@'localhost'"#

# Solution 1: Réinitialisation du mot de passe root sudo systemctl stop mysql sudo mysqld_safe --skip-grant-tables & mysql -u root # Dans MySQL: USE mysql; UPDATE user SET authentication_string=PASSWORD('NouveauMotDePasse') WHERE User='root'; FLUSH PRIVILEGES; EXIT; # Relancer MySQL normalement sudo systemctl start mysql

🌐 Problèmes de connectivité#

Vérification de la configuration réseau#

# Vérifier les ports en écoute sudo netstat -tlnp | grep :3306 # Tester la connectivité locale telnet localhost 3306 # Vérifier les règles de pare-feu sudo ufw status sudo iptables -L

Diagnostic des connexions#

-- Voir les connexions actives SHOW PROCESSLIST; -- Voir les variables de connexion SHOW VARIABLES LIKE 'max_connections'; SHOW VARIABLES LIKE '%timeout%'; -- État des connexions SHOW STATUS LIKE 'Connections'; SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Aborted_connects';

🎉 Conclusion#

Votre serveur MySQL/MariaDB est maintenant configuré de manière professionnelle avec :

  1. Sécurité renforcée - Authentification forte, utilisateurs dédiés, chiffrement
  2. Performances optimisées - Configuration fine selon votre usage
  3. Sauvegardes fiables - Stratégie de sauvegarde/restauration automatisée
  4. Résolution d'erreurs - Guide complet des problèmes courants

Cette configuration vous garantit une base de données stable, sécurisée et performante pour vos applications en production. N'oubliez pas de maintenir votre système à jour et de surveiller régulièrement les performances !