Blog ENI : Toute la veille numérique !
💥 Un livre PAPIER acheté
= La version EN LIGNE offerte pendant 1 an !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

Sécurité et gestion des utilisateurs

Introduction

Savez-vous qu’une bonne partie des attaques informatiques les plus médiatisées concernent les bases de données ? En y réfléchissant, c’est parfaitement logique : les parties les plus sensibles d’un système informatique sont les données personnelles (identifiants, mots de passe, nationalité, salaire, historique de santé…) qui sont stockées dans une base de données. Il est donc impératif de veiller à la sécurisation de vos serveurs MySQL si vous voulez éviter la mauvaise publicité liée à une fuite de données.

Ce chapitre a pour but de vous donner les clés pour assurer la sécurité de votre système MySQL. Notez que nous nous limitons aux éléments spécifiques à MySQL et que d’autres éléments tout aussi importants tels que la sécurisation du serveur hôte ou du réseau ne sont pas abordés.

Sécurisation du serveur

Les questions liées à la sécurité doivent être posées dès l’installation du serveur de base de données. Dans la philosophie de MySQL l’utilisateur doit pouvoir télécharger, installer et utiliser le SGBDR (système de gestion de bases de données relationnelles) sans aucune difficulté. Cette simplicité est l’un des points forts de MySQL, car d’une part cela a permis de démocratiser l’utilisation d’une base de données en rendant accessible cet univers (beaucoup de développeurs ont connu les bases de données grâce à MySQL) et d’autre part, cela donne la possibilité de tester très simplement son application. Mais historiquement, l’installation par défaut a longtemps été beaucoup trop permissive, ce qui explique pourquoi on trouve encore nombre de serveurs mal sécurisés. De gros progrès ont été réalisés à partir notamment de MySQL 5.7.

1. Sécurisation de l’installation

Le but de cette section n’est pas de revenir sur l’installation du serveur qui est détaillée au chapitre Installation du serveur, mais simplement de rappeler quelques points cruciaux concernant la sécurité. Vous devrez certainement les adapter en fonction de votre type d’installation et de votre système d’exploitation.

a. Contrôler les droits

Vous devez créer un groupe et un utilisateur dédié pour lancer l’instance mysqld (cette étape est effectuée automatiquement si vous utilisez un installeur ou votre gestionnaire de paquets) :

$ groupadd mysql 
$ useradd -g mysql mysql 

Le répertoire de données contient les informations sensibles, il doit donc être préservé d’actes de malveillance ou de la visualisation par des personnes non autorisées :

$ cd /usr/local/mysql/ 
$ chown -R root . 
$ chown -R mysql data 
$ chgrp -R mysql . 

mysqld ne doit en aucun cas être exécuté avec l’administrateur système root sous UNIX (ou administrateur sous MS Windows). Un utilisateur avec par exemple le droit FILE pourrait créer des fichiers en tant que root.

b. Ajouter un mot de passe au compte...

Gestion des comptes utilisateurs

1. Introduction

La gestion des utilisateurs de MySQL se fait entièrement grâce à des tables dédiées qui appartiennent au schéma système mysql et grâce à des commandes SQL permettant de créer, modifier et supprimer les comptes utilisateurs et leurs droits.

La table user contient la liste des comptes utilisateurs. Ils sont décrits avec, entre autres, les colonnes host (le nom d’hôte) et user (le nom). Ces deux colonnes représentent la clé primaire de la table. On y trouve également la colonne password (le mot de passe du compte) qui est stockée sous une forme hachée (grâce à la fonction de hachage MySQL password()), ainsi que les droits globaux de l’utilisateur, comme le droit de faire des insertions (INSERT), des lectures (SELECT)…

La table db contient les droits spécifiques à une base de données (ou schémas) de chaque utilisateur.

La table tables_priv contient les droits spécifiques à une table ou à une vue.

La table columns_priv contient les droits spécifiques à une colonne.

La table procs_priv contient les droits pour les routines stockées, c’est-à-dire les procédures et les fonctions stockées.

Les commandes utiles à la gestion des droits sont les suivantes :

  • CREATE USER : permet de créer un compte utilisateur et de lui donner un mot de passe.

  • GRANT : permet de donner des droits, de fournir un mot de passe, de spécifier des limites d’utilisation des ressources (comme de limiter le nombre de connexions par heure).

  • REVOKE : cette commande est le pendant de GRANT. Elle permet de supprimer les droits d’un compte utilisateur tout en conservant le compte.

  • DROP USER : permet de supprimer un compte utilisateur et ses droits associés.

  • SHOW GRANTS : permet de visualiser les droits.

2. Comptes utilisateurs

a. Créer un compte

La syntaxe pour créer un compte utilisateur est la suivante :

mysql> CREATE USER 'utilisateur'@'hôte' IDENTIFIED BY 'mot_de_passe' 

Le compte utilisateur à créer (’utilisateur’@’hôte’) est composé d’un nom d’utilisateur et d’un nom d’hôte (l’adresse IP ou le nom de la machine) entourés...

Plugins de sécurité avancée

1. Validation des mots de passe

Le plugin validate_password permet d’améliorer la sécurité des comptes utilisateurs, en testant la robustesse d’un mot de passe à l’aide de la fonction VALIDATE_PASSWORD_STRENGTH() et, le cas échéant, en empêchant l’utilisateur de créer un mot de passe qui n’est pas suffisamment sécurisé, lors de l’exécution des commandes CREATE USER, GRANT et SET PASSWORD. Lorsque ce plugin n’est pas activé, il est très facile de créer un mot de passe peu sécurisé, par exemple :

mysql> SET PASSWORD = PASSWORD('azerty');  

La commande SHOW PLUGINS permet de savoir si le plugin validate_password est activé :

mysql> SHOW PLUGINS;  
+----------------------+--------+----------------+---------+-------+ 
| Name                 | Status | Type           | Library | License |  
+----------------------+--------+----------------+---------+-------+ 
| mysql_native_password| ACTIVE | AUTHENTICATION | NULL    | GPL   | 
| mysql_old_password   | ACTIVE | AUTHENTICATION | NULL    | GPL   | 
| sha256_password      | ACTIVE | AUTHENTICATION | NULL    | GPL   | 
|...  
+----------------------+--------+----------------+---------+-------+ 
43 rows in set (0,00 sec) 

Si ce n’est pas le cas, l’installer se fait simplement avec la commande INSTALL PLUGIN :

mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 
  
mysql> SHOW PLUGINS;  
+-----------------------+--------+-------------------+------------+---------+ 
| Name                  | Status | Type              | Library    | License | 
+-----------------------+--------+-------------------+------------+---------+ 
| mysql_native_password | ACTIVE | AUTHENTICATION    | NULL       | GPL    ...