Bonnes pratiques de sécurité MySQL

MySQLBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez comment renforcer la sécurité de votre base de données MySQL. Nous aborderons les meilleures pratiques essentielles en matière de sécurité, notamment la définition d'un mot de passe pour l'utilisateur root, la création d'utilisateurs dédiés selon le principe du moindre privilège, la gestion des permissions des utilisateurs et la suppression des comptes anonymes. À la fin de ce laboratoire, vous aurez une meilleure compréhension de la manière de sécuriser votre serveur MySQL contre les vulnérabilités courantes.

Sécuriser le compte Root

Une installation MySQL par défaut permet souvent à l'utilisateur root de se connecter sans mot de passe depuis la machine locale. Votre première étape pour sécuriser MySQL consiste à définir un mot de passe fort pour le compte root.

Ouvrez d'abord le terminal depuis votre bureau.

Connectez-vous au serveur MySQL en tant qu'utilisateur root. Dans cet environnement de laboratoire, vous pouvez utiliser sudo pour vous connecter sans mot de passe.

sudo mysql -u root

Une fois connecté, vous verrez l'invite MySQL (mysql>).

Maintenant, définissez un mot de passe pour l'utilisateur root. L'instruction ALTER USER est utilisée pour modifier les comptes utilisateurs. Remplacez YourStrongPassword! par un mot de passe de votre choix.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword!';

Cette commande définit un mot de passe pour l'utilisateur root lors de la connexion depuis localhost. Vous devriez voir la sortie suivante, confirmant que la commande a réussi :

Query OK, 0 rows affected (0.01 sec)

Ensuite, appliquez immédiatement les changements de privilèges en utilisant la commande FLUSH PRIVILEGES.

FLUSH PRIVILEGES;

La sortie sera :

Query OK, 0 rows affected (0.00 sec)

Vous avez maintenant défini avec succès un mot de passe pour l'utilisateur root. Bien que vous puissiez toujours utiliser sudo mysql -u root pour vous connecter, toute tentative de connexion directe avec mysql -u root -p nécessitera désormais le mot de passe que vous venez de définir. C'est une première étape cruciale pour sécuriser votre base de données.

Créer un utilisateur et une base de données dédiés

Utiliser le compte root pour les applications représente un risque de sécurité car il dispose de permissions illimitées. Une bonne pratique consiste à créer des utilisateurs dédiés avec des privilèges limités pour chaque application. Dans cette étape, vous allez créer une nouvelle base de données et un utilisateur ayant accès uniquement à cette base de données.

Créez maintenant une nouvelle base de données pour votre application. Nommons-la app_db.

CREATE DATABASE app_db;

Vous devriez voir cette confirmation :

Query OK, 1 row affected (0.01 sec)

Ensuite, créez un nouvel utilisateur que votre application utilisera pour se connecter à la base de données. Nous nommerons cet utilisateur app_user et lui attribuerons un mot de passe.

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'UserPassword123';

La sortie sera :

Query OK, 0 rows affected (0.01 sec)

Maintenant, accordez les privilèges nécessaires à app_user. Pour cet exemple, nous accorderons les permissions SELECT et INSERT sur toutes les tables de la base de données app_db. Cela suit le principe du moindre privilège, en donnant à l'utilisateur uniquement les permissions dont il a besoin.

GRANT SELECT, INSERT ON app_db.* TO 'app_user'@'localhost';

Appliquez les modifications en vidant les privilèges.

FLUSH PRIVILEGES;

Vous pouvez vérifier les privilèges que vous venez d'accorder en exécutant :

SHOW GRANTS FOR 'app_user'@'localhost';

La sortie affichera les permissions exactes pour app_user :

+------------------------------------------------------------------+
| Grants for app_user@localhost                                    |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                     |
| GRANT SELECT, INSERT ON `app_db`.* TO `app_user`@`localhost`     |
+------------------------------------------------------------------+
2 rows in set (0.00 sec)

Vous avez créé avec succès une base de données et un utilisateur dédiés avec les permissions appropriées.

Gérer les privilèges utilisateur

Les exigences d'une application peuvent changer, et vous pourriez avoir besoin d'ajuster les permissions des utilisateurs en conséquence. Dans cette étape, vous pratiquerez la modification des privilèges en révoquant une permission existante de app_user.

Supposons que app_user ne doive désormais pouvoir lire les données (SELECT) mais pas ajouter de nouvelles données (INSERT). Vous devez révoquer le privilège INSERT.

Utilisez l'instruction REVOKE pour supprimer le privilège INSERT de app_user sur la base de données app_db.

REVOKE INSERT ON app_db.* FROM 'app_user'@'localhost';

Vous verrez la confirmation suivante :

Query OK, 0 rows affected (0.00 sec)

Appliquez les changements en vidant les privilèges.

FLUSH PRIVILEGES;

Vérifiez maintenant que le privilège a été révoqué en consultant à nouveau les privilèges de l'utilisateur.

SHOW GRANTS FOR 'app_user'@'localhost';

La sortie devrait maintenant montrer que app_user n'a que le privilège SELECT sur app_db. Le privilège INSERT a disparu.

+--------------------------------------------------------------+
| Grants for app_user@localhost                                |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                 |
| GRANT SELECT ON `app_db`.* TO `app_user`@`localhost`         |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)

Cela démontre comment gérer efficacement les permissions des utilisateurs pour s'adapter aux exigences de sécurité changeantes.

Supprimer les comptes utilisateurs anonymes

Par défaut, certaines installations de MySQL créent des comptes utilisateurs anonymes, qui ont un nom d'utilisateur vide. Ces comptes représentent un risque de sécurité car ils peuvent permettre un accès non autorisé. Il est essentiel, pour la sécurité, de les vérifier et de les supprimer s'ils existent.

Vous pouvez identifier les utilisateurs anonymes en interrogeant la table mysql.user pour les entrées avec un nom d'utilisateur vide.

SELECT User, Host FROM mysql.user WHERE User = '';

Si des utilisateurs anonymes existent, cette requête les listera. Une nouvelle installation sur Ubuntu peut en inclure un, mais les versions plus récentes de MySQL/MariaDB n'ont souvent pas d'utilisateurs anonymes par défaut.

Si vous voyez des résultats comme :

+------+-----------+
| User | Host      |
+------+-----------+
|      | localhost |
+------+-----------+
1 row in set (0.00 sec)

Alors vous devriez supprimer l'utilisateur anonyme avec l'instruction DROP USER, en spécifiant à la fois le nom d'utilisateur (qui est une chaîne vide '') et l'hôte :

DROP USER ''@'localhost';

Vous devriez voir cette confirmation :

Query OK, 0 rows affected (0.01 sec)

Cependant, si votre requête renvoie un ensemble vide comme :

Empty set (0.00 sec)

Cela signifie qu'il n'y a pas d'utilisateurs anonymes dans votre base de données, ce qui est déjà sécurisé. Dans ce cas, si vous essayez de supprimer un utilisateur anonyme inexistant, vous obtiendrez une erreur :

ERROR 1396 (HY000): Operation DROP USER failed for ''@'localhost'

Cette erreur est attendue si aucun utilisateur anonyme n'existe, et vous pouvez continuer en toute sécurité.

Après avoir vérifié les utilisateurs anonymes et les avoir supprimés si nécessaire, videz les privilèges pour vous assurer que les modifications sont appliquées :

FLUSH PRIVILEGES;

Vérifiez à nouveau qu'aucun utilisateur anonyme ne reste en exécutant la requête SELECT :

SELECT User, Host FROM mysql.user WHERE User = '';

Cette requête devrait renvoyer un ensemble vide, confirmant qu'aucun utilisateur anonyme n'existe :

Empty set (0.00 sec)

Vous avez vérifié et corrigé avec succès une vulnérabilité de sécurité potentielle de votre serveur. Vous pouvez maintenant quitter le shell MySQL.

exit;

Résumé

Dans ce laboratoire, vous avez appris et appliqué plusieurs bonnes pratiques essentielles de sécurité MySQL. Vous avez sécurisé avec succès le compte root avec un mot de passe, créé un utilisateur d'application dédié avec des permissions limitées selon le principe du moindre privilège, géré l'accès des utilisateurs en révoquant des privilèges, et vérifié et traité les comptes utilisateurs anonymes potentiels.

En mettant en œuvre ces mesures de sécurité fondamentales, vous pouvez améliorer considérablement la posture de sécurité de votre base de données MySQL et la protéger contre les accès non autorisés et les menaces potentielles.