Installer un serveur MySQL sur Ubuntu 22.04

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.

Bash
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.

Bash
sudo apt install mysql-server mysql-client

Vérifier la version du service

Nous pouvons vérifier la version du serveur MySQL installé:

Bash
mysqld --version

Ce qui devrait vous donner le résultat suivant:

Plaintext
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.

Bash
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:

Plaintext
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:

Bash
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

Plaintext
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

Plaintext
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

Plaintext
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

Plaintext
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.

Bash
sudo mysql

Nous arrivons alors sur l’invite de commande:

Plaintext
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

SQL
SHOW DATABASES;
Plaintext
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.

SQL
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:

Plaintext
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.

SQL
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:

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:

Plaintext
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
SQL
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 »…

Plaintext
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:

SQL
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.

SQL
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:

SQL
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:

SQL
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.

Plaintext
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:

SQL
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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.