Installer un serveur MySQL sur Ubuntu 22.04
MySQL est l’un des systèmes de gestion de base de donnée open-source les plus utilisés de nos jours. MySQL implémente un modèle de base de données relationnelles ainsi qu’un langage de requêtes structuré: SQL (Structured Query Language). Dans cet article nous verrons comment installer un serveur MySQL sur Ubuntu 22.04 ainsi que quelques manipulations de base comme la création d’utilisateurs ou de bases de données.
Prérequis
Nous verrons la procédure d’installation d’un serveur MySQL spécifique à Ubuntu 22.04 sur base des packages disponibles dans les dépôts officiels de la distribution que nous installerons à l’aide d’APT.
Les prérequis sont les suivants:
- Disposer d’une machine avec Ubuntu 22.04 installé et disposant d’un accès à Internet.
- Avoir quelques notions de lignes de commande sous Linux.
- Savoir gérer les packages à l’aide d’APT.
- Savoir gérer un service à l’aide de systemd.
- Disposer des droits nécessaires pour installer les packages à l’aide de
sudo
.
Installation du serveur MySQL
Préparation du système
Nous allons commencer par nous assurer que notre système est à jour.
sudo apt update
sudo apt upgrade
Installation des packages MySQL
Rien de très compliqué ici, il nous suffit d’installer les packages mysql-server
et mysql-client
. Le package client nous permettra par la suite de nous connecter au service MySQL et de créer une base de donnée et un utilisateur.
sudo apt install mysql-server mysql-client
Vérifier la version du service
Nous pouvons vérifier la version du serveur MySQL installé:
mysqld --version
Ce qui devrait vous donner le résultat suivant:
steve@just-sudo-it ~ → mysqld --version
/usr/sbin/mysqld Ver 8.0.34-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
steve@just-sudo-it ~ →
Vérifier l’état du service
Normalement après l’installation le service mysql
est automatiquement démarré et configuré pour un lancement automatique au démarrage de la machine.
sudo systemctl status mysql
Comme nous pouvons le voir ci-dessous, le service est chargé, actif et lancé automatiquement au démarrage de la machine:
steve@just-sudo-it ~ → sudo systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2023-08-26 08:48:58 UTC; 3min 37s ago
Process: 1796 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 1804 (mysqld)
Status: "Server is operational"
Tasks: 37 (limit: 2200)
Memory: 365.2M
CPU: 2.738s
CGroup: /system.slice/mysql.service
└─1804 /usr/sbin/mysqld
août 26 08:48:57 just-sudo-it systemd[1]: Starting MySQL Community Server...
août 26 08:48:58 just-sudo-it systemd[1]: Started MySQL Community Server.
steve@just-sudo-it ~ →
Configuration de base du serveur MySQL
C’est ici que les particularité des packages disponible pour Ubuntu apparaissent:
- Par défaut l’utilisateur « root » de MySQL n’a pas de mot de passe configuré et utilise le socket applicatif pour se connecter au lieu d’un accès réseau traditionnel.
- Un outil de configuration de base des bonnes pratiques de sécurité est disponible:
mysql_secure_installation
.
Ceci implique que nous devons utiliser le client MySQL ou l’outil de configuration moyennant la commande sudo
, obligatoirement.
Lancer l’outil de configuration « mysql_secure_installation ».
La première étape consiste à utiliser mysql_secure_installation
pour appliquer les paramètre de sécurité de base selon nos souhaits:
sudo mysql_secure_instalation
Nous devons maintenant répondre à une série de questions qui serviront à paramétrer le service:
Activer ou non les règles de complexité des mots de passe
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: y
Supprimer ou non les accès anonymes
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL 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? (Press y|Y for Yes, any other key for No) : y
Désactiver ou non les connexion à distance de l’utilisateur root
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? (Press y|Y for Yes, any other key for No) : y
Supprimer ou non la base de donnée de test
By default, MySQL 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? (Press y|Y for Yes, any other key for No) : y
Au final
Une fois ces étapes franchies, MySQL devrait être configuré en fonction de nos réponses. Globalement répondre « oui » à ces questions améliore la sécurité de base de MySQL.
Première connexion au serveur MySQL.
Maintenant que MySQL est configuré et fonctionne. Nous pouvons nous connecter au moteur de bases de données en utilisant le le client MySQL via le socket du service MySQL.
sudo mysql
Nous arrivons alors sur l’invite de commande:
steve@just-sudo-it ~ → sudo mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.34-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
A partir de là, nous avons besoin de quelques bases du langage SQL pour travailler. Ce n’est pas le but de l’article, mais nous allons maintenant voir comment créer une nouvelle base de donnée ainsi qu’un utilisateur et lui attribuer des droits sur la base de données.
Gestion de base d’une base de donnée et d’un utilisateur en SQL
Commençons par voir comment afficher les bases de données existantes, en créer une nouvelle et en supprimer une le cas échéant.
Notez que les instructions SQL se terminent par « ; ». Certains clients sont assez permissifs et acceptent que nous l’oublions, mais mieux vaut prendre les bonnes habitudes directement.
A noter également que généralement les commandes sont indiquées en majuscule par souci de clarté mais qu’il est aussi tout a fait accepter de les entrer en minuscule.
Manipulation de base des bases de données
Afficher les bases de données existantes
SHOW DATABASES;
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0,00 sec)
mysql>
Nous pouvons voir ici que nous avons de base quatre base de données qui sont utilisées par le serveur MySQL lui même. Mieux vaut ne pas bidouiller dedans sans savoir ce qu’on fait.
Créer une base de donnée
La création d’une base de donnée est tout ce qu’il y a de plus simple mais requiert des droits au niveau global du serveur de base de données, ce qui est le cas de l’utilisateur « root » bien sûr.
CREATE DATABASE nom_de_la_db;
Donc si nous voulons créer une base de donnée nommée « justsudoit » nous aurons le résultat suivant:
mysql> CREATE DATABASE justsudoit;
Query OK, 1 row affected (0,02 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| justsudoit |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0,00 sec)
mysql>
Suppression d’une base de donnée
La suppression d’une base de donnée est aussi simple que sa création, il faut toutefois avoir les droits pour le faire.
DROP DATABASE nom_de_la_db;
Ne perdez pas de vue que supprimer une base de donnée est irréversible. Mieux vaut y réfléchir à deux fois.
Gestion de base des utilisateurs
MySQL permet de donner des droits à des utilisateurs que ce soit au niveau su serveur ou au niveau d’une base de donnée spécifique.
Afficher les utilisateurs
Il n’y a pas de commande spécifique à l’affichage des utilisateurs MySQL tout simplement parce que ces données sont contenues dans la base de donnée mysql
. Nous devons donc effectuer une requête SQL:
SELECT user,host,plugin FROM mysql.user;
Cette requête affichera un tableau reprenant le nom d’utilisateur, l’hôte depuis il peut se connecter et le plugin de connexion utilisé pour chaque utilisateur existant dans le base de donnée:
mysql> SELECT user,host,plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | auth_socket |
+------------------+-----------+-----------------------+
5 rows in set (0,00 sec)
mysql>
Créer un nouvel utilisateur
La création d’un utilisateur requiert principalement trois informations:
- un nom d’utilisateur
- un hôte
- un mot de passe
CREATE USER 'utilisateur'@'hôte' IDENTIFIED BY 'mot de passe en clair';
Par exemple si je veux créer un utilisateur « justsudoit » qui peut se connecter uniquement depuis la machine locale avec le mot de passe « i love mysql »…
mysql> CREATE USER 'justsudoit'@'localhost' IDENTIFIED BY 'i love mysql';
Query OK, 0 rows affected (0,01 sec)
mysql>
Chose importante à comprendre c’est que dans la base de donnée c’est la combinaison user+host qui sert de clé principale et qu’il est donc possible d’avoir plusieurs entrées pour un même utilisateur mais avec des valeurs d’hôte différentes.
La définition de l’hôte peut se faire de plusieurs manières:
- Une adresse IP
- Un nom de domaine
- « localhost » (la machine locale)
- En utilisant un « wildcard »:
%
Pour plus d’information à ce sujet, je vous invite à consulter la page officiel sur le site MySQL: https://dev.mysql.com/doc/refman/8.0/en/account-names.html
Supprimer un utilisateur
La suppression d’un utilisateur est similaire à la suppression d’une base de donnée:
DROP USER 'utilisateur'@'hôte';
Il faut bien évidemment qu’il existe une entrée correspondante aussi bien au nom d’utilisateur qu’au nom d’hôte.
Gestion de base des privilèges (droits)
Créer une base de donnée et un utilisateur ne donne pas le droit à cet utilisateur d’utiliser ou modifier la base de donnée. Pour ça nous devons donner des privilèges à l’utilisateur.
GRANT privileges ON cible TO 'utilisateur'@'hôte';
Il y a plusieurs dizaines de privilèges possibles et chacun peut s’appliquer sur une cible (table) précise ou de manière plus générale. La liste des privilèges disponibles sous MySQL 8.0 se trouve ici: https://dev.mysql.com/blog-archive/how-to-grant-privileges-to-users-in-mysql-80/.
Pour donner tous les droits à un utilisateur sur une base de donnée nous pouvons simplement utiliser la commande suivante:
GRANT ALL PRIVILEGES ON cible TO 'utilisateur'@'hôte';
Par exemple si nous voulons donner tous les privilèges à l’utilisateur 'justsudoit'@'%'
sur toutes les tables (qu’elles existent déjà ou non) de la base de donnée justsudoit
, voici ce que nous pouvons faire:
GRANT ALL PRIVILEGES ON justsudoit.* TO 'justsudoit'@'%';
Il faut bien entendu que la base de donnée existe et qu’une correspondance soit trouvée au niveau de la table des utilisateurs.
mysql> GRANT ALL PRIVILEGES ON justsudoit.* TO 'justsudoit'@'%';
Query OK, 0 rows affected (0,01 sec)
mysql>
Il nous faut maintenant nous assurer que les modifications de privilèges sont bien prise en compte. Pour ça nous pouvons forcer leur rechargement:
FLUSH PRIVILEGES;
A partir de là nous avons un utilisateur qui a tous les droits sur une base de donnée définie (mais pas sur le reste). L’étape suivante est de créer la structure de la base de donnée, mais ça c’est une autre histoire et ce sera probablement pour un futur article.
Laisser un commentaire
Vous devez vous connecter pour publier un commentaire.