« LINUX:MariaDB » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 213 : | Ligne 213 : | ||
# Répertoire de sauvegarde | # Répertoire de sauvegarde | ||
CHEMIN=/produc/mysql.export | CHEMIN=/produc/mysql.export | ||
# Liste des schémas à sauver (exemple pour deux schémas: dbwaterbear et dbwp" | # Liste des schémas à sauver (exemple pour deux schémas: dbwaterbear et dbwp") | ||
LISTE="dbwaterbear dbwp" | LISTE="dbwaterbear dbwp" | ||
# *************************************************************************** | # *************************************************************************** | ||
Ligne 237 : | Ligne 237 : | ||
---- | ---- | ||
La partie facultative n'est pas nécessaire mais peut être utile pour un autre usage, par exemple, pour charger ce fichier dans un tableur (Excel) ou pour une analyse. | La partie facultative n'est pas nécessaire mais peut être utile pour un autre usage, par exemple, pour charger ce fichier dans un tableur (Excel) ou pour une analyse. | ||
Un fichier de type "sql" est créé au nom du schéma. | |||
On fait appel à ce script dans le Cron de Linux. On ajoute les lignes suivantes dans le fichier "/etc/crontab": | On fait appel à ce script dans le Cron de Linux. On ajoute les lignes suivantes dans le fichier "/etc/crontab": | ||
Ligne 247 : | Ligne 249 : | ||
Cette sauvegarde est une première brique qui doit être intégrée dans processus plus étendu de sauvegarde (backup). | Cette sauvegarde est une première brique qui doit être intégrée dans processus plus étendu de sauvegarde (backup). | ||
Ligne 259 : | Ligne 254 : | ||
---- | |||
#!/bin/bash | |||
# la commande "exit" est placée pour éviter toute exécution intempestive | |||
# mettez cette ligne en commentaire (ajout de #) pour passer outre | |||
exit | |||
# *************************************************************************** | |||
# A adapter selon votre configuration | |||
# Nom et mot de passe d'accès à la base de donnée | |||
DBUSER=root | |||
DBPW=MOT_DE_PASSE_ROOT | |||
# répertoire où se trouve la sauvegarde à restaurer | |||
CHEMIN=/produc/mysql.import | |||
# nom du schema à restaurer | |||
# décommenter la ligne désirée | |||
# Liste des schémas à sauver (exemple pour deux schémas: dbwaterbear et dbwp") | |||
#LISTE="dbwaterbear" | |||
#LISTE="dwp" | |||
# *************************************************************************** | |||
# boucle de restauration pour chaque schéma | |||
for DB in $LISTE | |||
do | |||
/usr/bin/mysql --user=$DBUSER --password=$DBPW < ${CHEMIN}/$DB.sql | |||
done | |||
---- | |||
Version du 27 décembre 2020 à 17:13
But
MariaDB est un gestionnaire de base de données client-serveur utilisant le langage SQL. Il fait suite à MySQL. Il est souvent utilisé au même titre que PostgreSQL, autre gestionnaire de base de données.
Installation
On a besoin d'installer un package qui installera les dépendances nécessaires:
dnf install mariadb-server
Configuration
Les fichiers de configurations se trouvent dans le répertoire "/etc/my.cnf.d". Parmi ceux-ci, un seul nous intéresse: mariadb-server.cnf".
Par défaut, la base de données se crée dans le répertoire "/var/lib/mysql" mais nous préférons l'installer sur un disque à part. Dans notre cas, nous choisissons le répertoire "/produc/mysql".
Il faut le créer:
mkdir /produc/mysql
Il faut le faire appartenir à l'utilisateur pour lequel le service est lancé:
chown -R mysql:mysql /produc/mysql
et les privilèges:
chmod -R 660 /produc/mysql
Maintenant, il faut modifier le fichier configuration du serveur MariaDB, "/etc/my.cnf.d/mariadb-server.cnf". On modifie ou ajoutons quelques options sous la section "[mysqld]":
[server] [mysqld] # répertoire contenant la base de données datadir=/produc/mysql # Socket, PID, journaux: de préférence, ne pas modifier socket=/var/lib/mysql/mysql.sock log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid # niveau de journalisation, utile pour Fail2Ban log-warnings=2 # nécessaire pour OPAC et WATERBEAR ft_min_word_len = 1 # divers options à adapter en fonction de l'utilisation sql-mode="NO_ENGINE_SUBSTITUTION" max_allowed_packet=64M innodb-log-file-size=256M character-set-server=utf8 open_files_limit = 10000
L'option "datadir" définit le répertoire où se placera la base de données comme suggéré ci-dessus.
Activer et lancer le service
Le service à lancer est mariadb. La première commande active le service pour qu'à chaque démarrage du serveur, le service se lance. La seconde lance directement le service. La troisième relance le service.
systemctl enable mariadb systemctl start mariadb systemctl restart mariadb
Sécurité
Lors du premier lancement du serveur, la base de données va être initialisée. Attention, si vous introduisez l'option "ft_min_word_len=1" vue ci-dessus, à postériori, vous devrez effectuer une mise à niveau de la base de données, une réindexation.
A ce stade, il n'existe qu'un utilisateur "root" ayant tous les privilèges mais sans mot de passe. Il est primordial de mettre un mot de passe. En outre, il y existe dans certaines configurations de base un schéma de "test" qui est à supprimer.
Exécutez le script Linux suivant:
mysql_secure_installation
A la majorité des questions de type "Yes or No" (Y/n), on répond "Y" et on donne un mot de passe. Voici un exemple:
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! . In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and haven't set the root password yet, you should just press enter here. . Enter current password for root (enter for none): OK, successfully used password, moving on... . Setting the root password or using the unix_socket ensures that nobody can log into the MariaDB root user without the proper authorisation. . You already have your root account protected, so you can safely answer 'n'. . Switch to unix_socket authentication [Y/n] n ... skipping. . You already have your root account protected, so you can safely answer 'n'. . Change the root password? [Y/n] y New password:<MOT_DE_PASSE_ROOT> Re-enter new password:<MOT_DE_PASSE> Password updated successfully! Reloading privilege tables.. ... Success! . By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. . Remove anonymous users? [Y/n] Y ... Success! . Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. . Disallow root login remotely? [Y/n] Y ... Success! . By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. . Remove test database and access to it? [Y/n] Y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! . Reloading the privilege tables will ensure that all changes made so far will take effect immediately. . Reload privilege tables now? [Y/n] Y ... Success! . Cleaning up... . All done! If you've completed all of the above steps, your MariaDB installation should now be secure. . Thanks for using MariaDB!
Par ce moyen, on ne peut accéder à la base de données que localement. Mais si on se connecte avec un utilisateur Linux "root" ou "mysql", le mot de passe n'est pas nécessaire. Notons que dans les dernières versions, le schéma "test" n'est pas créé.
Vous pouvez aussi utiliser les commandes de ligne SQL, ce que je préfère.
- Changer le mot de passe de l'utilisateur "root"; au passage, on lui confirme tous les privilèges.
Voici le script SQL à mettre dans un fichier du nom, par exemple, "user.root.sql":
alter user 'root'@'localhost' identified by 'MOT_DE_PASSE_ROOT' ; grant all privileges on *.* to 'root'@'localhost' with grant option ; flush privileges ;
On exécute la ligne de commande Linux suivante sans mot de passe car il n'y en a pas encore:
mysql --user=root < user.root.sql
On remarque derrière le nom d'utilisateur "root", le terme "localhost"; il définit l'étendue du réseau ayant accès à la base de données, le FireWall étant une seconde couche de sécurité. Dans ce cas, l'utilisateur "root" ne peut accéder à la base de données qu'à partir de la même machine. Si au lieu de "localhost", on avait mis "%", cette utilisateur peut se trouver n'importe où sur le réseau ou Internet afin d'accéder à la base de données avec tous les droits.
- Eliminer l'utilisateur "mysql".
Voici le script SQL à mettre dans un fichier du nom, par exemple, "user.mysql.sql":
drop user 'mysql'@'localhost' ; flush privileges ;
On exécute la ligne de commande Linux suivante avec le mot de passe cette fois:
mysql --user=root --password=MOT_DE_PASSE_ROOT < user.mysql.sql
- Eliminer le schéma "test" s'il existe.
Voici le script SQL à mettre dans un fichier du nom, par exemple, "drop.test.sql":
DROP SCHEMA IF EXISTS test ;
On exécute la ligne de commande Linux suivante avec aussi le mot de passe:
mysql --user=root --password=MOT_DE_PASSE_ROOT < drop.test.sql
Pour connaître le nom des schémas présents dans la base de données, il suffit de consulter la liste des sous-répertoires contenus dans le répertoire racine de la base de données ("/produc/mysql"). Si le sous-répertoire "test" n'existe pas, la commande ci-dessus est inutile. Deux schémas spéciaux ne peuvent être éliminés "mysql" et "performance_schema".
Notons qu'à ce stade, il n'y a rien dans la base de données. Si on fait une mauvaise manipulation, il suffit de recommencer.
- On commence par arrêter le service mariadb.
- On efface tout le contenu du répertoire racine de la base de données ("/produc/mysql").
- On relance le service mariadb.
Tout est réinitialisé.
Cet utilisateur "root" a tous les droits mais il peut être remplacé par un autre.
L'utilisation de ce dernier doit être réservé pour des tâches générales de gestion, par exemple pour la gestion de schémas, sauvegarde,...). Pour tout autre action, il faut créer des utilisateurs affectés à une tâche précise; cet utilisateur doit avoir des privilèges juste nécessaires à sa fonction. Par exemple, si une application WEB doit accéder à un schéma, un utilisateur spécifique est créé auquel on ne donne que les droits d'accès nécessaire à ce schéma sur une machine précise; idéalement, il ne devrait pas pouvoir modifier la structure du schéma ni ses privilèges; si cette application n'a qu'un droit de consultation, il n'aura que les droits SQL de type "select". Il est évident qu'une action malveillante venant d'un point quelconque du monde peut potentiellement dégrader ou détruire ce schéma. Il faut essayer au maximum de séparer ces tâches, de protéger les tâches les plus cruciales. Mais on assiste de plus en plus à une complète ouverture dans nombre d'applications.
Configurer le mur de feu ou FireWall
Normalement, on doit désactiver l'accès à distance à cette base de données. En l'état il n'y a pas d'utilisateur configuré pour cela.
Vous pouvez explicitement ajouter une règle au FireWall qui rejete ces demandes d'accès en fonction de la configuration. Normalement une bonne configuration doit tout rejeter sauf ce qui est explicitement permis. Le port par défaut est 3306.
Voici cette règle pour IPTABLES:
-A INPUT -p tcp -m tcp --dport 3306 -j DROP
Par contre, si on veux y accéder à distance, il faut ajouter un utilisateur adéquat et ajouter une règle au FireWall.
Dans l'exemple, Notre LAN permet l'accès; son adressage est 192.168.1.0 avec un masque de 255.255.255.0 ou de 24 bits. Nous utilisons IPTABLES; voici la ligne à ajouter:
-A INPUT -p tcp -m tcp --dport 139 -s 192.168.1.0/24 -j ACCEPT
Sauvegarde
Il prendre l'habitude de faire une sauvegarde journalière des schémas importants de la base de données. Ces sauvegardes seront sauvées dans un répertoire, par exemple "/produc/mysql.export" que l'on crèe:
mkdir /produc/mysql.export
Voici un script qui peut effectuer cette tâche que l'on nommera "mysqlsauvegarde.bat" et placé dans le répertoire "/manager/mysql":
#!/bin/bash # *************************************************************************** # A adapter selon votre configuration # Nom et mot de passe d'accès à la base de donnée DBUSER=root DBPW=MOT_DE_PASSE_ROOT # Répertoire de sauvegarde CHEMIN=/produc/mysql.export # Liste des schémas à sauver (exemple pour deux schémas: dbwaterbear et dbwp") LISTE="dbwaterbear dbwp" # *************************************************************************** # boucle d'exportation pour chaque schéma for DB in $LISTE do # création d'un script SQL de création complète du schéma et de son contenu echo DROP SCHEMA IF EXISTS $DB \; > $CHEMIN/$DB.sql echo " " >> $CHEMIN/$DB.sql /usr/bin/mysqldump --user=$DBUSER --password=$DBPW --databases $DB >> $CHEMIN/$DB.sql # début de la partie facultative # création d'un sous-répertoire qui contiendra un fichier texte par table if [ ! -d "$CHEMIN/$DB" ]; then /usr/bin/mkdir $CHEMIN/$DB fi /usr/bin/chmod 777 $CHEMIN/$DB # Sortie des données sous format texte # une ligne par enregistrement avec une tabulation entre chaque champs /usr/bin/mysqldump --user=$DBUSER --password=$DBPW --lock-tables --no-create-info --compact --tab=$CHEMIN/$DB rm -f $CHEMIN/$DB/*.sql # fin de la partie facultative done
La partie facultative n'est pas nécessaire mais peut être utile pour un autre usage, par exemple, pour charger ce fichier dans un tableur (Excel) ou pour une analyse.
Un fichier de type "sql" est créé au nom du schéma.
On fait appel à ce script dans le Cron de Linux. On ajoute les lignes suivantes dans le fichier "/etc/crontab":
# Sauvegarde mysql 45 23 * * * root /manager/mysql/mysqlsauvegarde.bat > /manager/mysql/mysqlsauvegarde.log
Ici on l'appelle tous les jours pendant la nuit à 23h45.
Cette sauvegarde est une première brique qui doit être intégrée dans processus plus étendu de sauvegarde (backup).
Restauration
#!/bin/bash # la commande "exit" est placée pour éviter toute exécution intempestive # mettez cette ligne en commentaire (ajout de #) pour passer outre exit # *************************************************************************** # A adapter selon votre configuration # Nom et mot de passe d'accès à la base de donnée DBUSER=root DBPW=MOT_DE_PASSE_ROOT # répertoire où se trouve la sauvegarde à restaurer CHEMIN=/produc/mysql.import # nom du schema à restaurer # décommenter la ligne désirée # Liste des schémas à sauver (exemple pour deux schémas: dbwaterbear et dbwp") #LISTE="dbwaterbear" #LISTE="dwp" # *************************************************************************** # boucle de restauration pour chaque schéma for DB in $LISTE do /usr/bin/mysql --user=$DBUSER --password=$DBPW < ${CHEMIN}/$DB.sql done