MySQL
MySQL est un système de gestion de base de données relationnelle open source. Ce guide vous montrera comment sécuriser et auditer un serveur MySQL. Le nom est une combinaison de "My", le nom de la fille du co-fondateur Michael Widenius, et de "SQL", l'abréviation de Structured Query Language.
Avant de commencer
-
Assurez-vous d'avoir suivi les guides Mise en route et Sécurisation de votre serveur. Assurez-vous que le nom d'hôte de Linode est défini.
Vérifiez le nom d'hôte de votre Linode. La première commande doit afficher votre nom d'hôte court et la seconde doit afficher votre nom de domaine complet (FQDN).
hostname hostname -f
Remarque Si vous avez un nom de domaine enregistré pour votre site Web, ajoutez le domaine au serveur Linode sur lequel vous prévoyez d'installer la pile LAMP. Si vous n'avez pas de nom de domaine enregistré, remplacez
example.com
avec l'adresse IP du serveur Linode dans les instructions suivantes. -
Mettez à jour votre système :
sudo yum update
Remarque Ce guide est écrit pour un utilisateur non root. Les commandes qui nécessitent des privilèges élevés sont préfixées par
sudo
. Si vous n'êtes pas familier avec lesudo
commande, vous pouvez consulter notreGuide des utilisateurs et des groupes. -
Afin de sécuriser et d'auditer MySQL, vous devez disposer d'un serveur Linux avec le
MySQL Server
services en cours d'exécution. Pour plus d'informations sur l'installation de MySQL, veuillez consulter Installer MySQLRemarque Les instructions de ce guide sont basées sur Ubuntu 18.04, bien que toutes les étapes soient indépendantes de la distribution, à l'exception des noms de packages et des gestionnaires de packages.
Utilisation du programme d'installation sécurisé de MySQL
Le package mysql-server est préconfiguré avec un utilitaire appelé mysql_secure_installation
qui est utilisé pour configurer un point de départ sécurisé pour le serveur MySQL, en supprimant les utilisateurs anonymes et en vous permettant de spécifier la stratégie de force de mot de passe souhaitée.
mysql_secure_installation
est un script shell disponible sur les systèmes Unix, et vous permet de sécuriser l'installation de MySQL en vous permettant de :
- définir un mot de passe pour les comptes root
- supprimer les comptes root accessibles depuis l'extérieur de l'hôte local
- supprimer les comptes d'utilisateurs anonymes
- supprimer la base de données de test, accessible par défaut aux utilisateurs anonymes
Commencez le processus de sécurité en exécutant cet utilitaire immédiatement après l'installation de mysql-server.
-
Appelez l'utilitaire en exécutant la commande suivante :
sudo mysql_secure_installation
-
Le processus de configuration commence et l'utilitaire vous invite à spécifier si vous souhaitez activer le plug-in de validation de mot de passe utilisé pour tester les mots de passe et améliorer la sécurité. Il est recommandé d'activer cette fonctionnalité.
Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD PLUGIN 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 plugin? Press y|Y for Yes, any other key for No: y
-
Après avoir activé le plug-in de mot de passe, spécifiez votre politique de validation de mot de passe en fonction du niveau de force des mots de passe souhaités.
There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 Please set the password for root here. New password: Re-enter new password: Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
-
Supprimer les utilisateurs anonymes. Il s'agit d'une option de sécurité importante car les attaquants peuvent tirer parti des utilisateurs anonymes pour accéder au serveur de base de données.
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 la connexion root à distance, il s'agit d'une configuration de sécurité extrêmement importante car elle empêche les attaquants de s'authentifier à distance sur le serveur MySQL en tant que root ou d'effectuer des attaques par force brute de mot de passe. L'authentification à distance peut également être complètement désactivée, nous verrons comment procéder dans la section suivante.
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
-
Supprimez la base de données de test créée lors du processus d'installation de mysql-server, cette base de données est créée à des fins de test, en tant que bonne pratique, il est recommandé de supprimer cette base de données.
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
-
Rechargez les tables de privilèges pour vous assurer que toutes les modifications sont appliquées et effectives.
Vous avez maintenant une base sécurisée avec laquelle travailler, dans la section suivante, trouvez les instructions pour changer la racine par défaut nom d'utilisateur et mot de passe.Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y Success. All done!
Modifier l'utilisateur "root"
Par défaut, le serveur MySQL est prédéfini avec un superuser/admin
compte qui a accès à tous les privilèges et fonctionnalités des bases de données et des utilisateurs de la base de données. Compte tenu de ce contrôle et de cet accès inégalés, il est important de verrouiller et de sécuriser le compte root, car les attaquants ciblent généralement le compte root sur un serveur MySQL, car il a le potentiel de fournir un accès complet aux bases de données et aux utilisateurs de bases de données.
La première étape pour sécuriser l'utilisateur "root" consiste à changer le nom d'utilisateur de root
à quelque chose de plus inflexible, l'objectif est de rendre le nom d'utilisateur root aussi difficile à deviner ou à forcer brutalement pour les attaquants. Après quoi, il est également recommandé de changer le root
mot de passe du compte régulièrement comme une bonne pratique.
-
Connectez-vous au serveur MySQL avec la commande suivante :
sudo mysql -u root
-
Modifiez le nom d'utilisateur du compte "root" en exécutant la requête suivante :
rename user 'root'@'localhost' to '<new-username>'@'localhost';
-
Changer la
root
mot de passe du compte à quelque chose de fort et difficile à deviner, il est recommandé d'utiliser un générateur de mot de passe. Si vous avez activé le plug-in de vérification du mot de passe lors du processus d'installation sécurisée, vous devez fournir un mot de passe qui répond aux exigences de la politique en termes de force.ALTER USER 'example_username'@'localhost' IDENTIFIED BY '<new-password>';
-
Rechargez la table des privilèges pour vous assurer que toutes les modifications sont enregistrées et activées en exécutant la commande suivante :
flush privileges;
-
Pour confirmer si la
root
le nom d'utilisateur et le mot de passe sont modifiés, exécutez la requête suivante :use mysql; select user,host,authentication_string from mysql.user;
Cela affiche les tables utilisateur stockées dans la base de données mysql et devrait refléter les modifications apportées.
+------------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+------------------+-----------+-------------------------------------------+
| example_user | localhost | *A2550B00C6DF81DACE33551E8293462F6CAE33DA |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *241DC5A20F017D55EE82E46E7996784ED4A5CD8A |
+------------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)
Création d'un nouvel utilisateur
Une bonne pratique de sécurité est le concept de ségrégation par fonctions ou rôle. Cela signifie que pour chaque base de données ou application qui utilise la base de données, créez un nouvel utilisateur disposant des autorisations CRUD pour cette base de données particulière. Cela garantit qu'à tout moment, un seul utilisateur a accès à une base de données à la fois et que les utilisateurs ne peuvent pas accéder à d'autres bases de données.
-
Créer un
Test
base de données, en exécutant la requête suivante dans MYSQL :create database Test;
-
Créez l'utilisateur responsable de la gestion de cette base de test :
CREATE USER '<username>'@'localhost' IDENTIFIED BY '<password>';
-
Attribuez les autorisations CRUD appropriées à l'utilisateur pour le
Test
base de données :GRANT SELECT,UPDATE,DELETE ON Test.* TO '<username>'@'localhost';
-
Il est important de noter que ces privilèges ne s'appliquent qu'au
Test
base de données, si vous créez un utilisateur pour une application telle quephpMyAdmin
, vous devez fournir à l'utilisateurroot
autorisations. -
Si vous décidez de supprimer un utilisateur particulier, exécutez la requête suivante :
drop user '<username>'@'localhost';
-
Rechargez la table des privilèges pour vous assurer que les modifications apportées sont appliquées et activées en exécutant la requête suivante :
flush privileges;
Configuration MySQL personnalisée
Vous pouvez maintenant configurer une configuration personnalisée sécurisée pour MySQL qui fournit des options de configuration de sécurité supplémentaires.
-
Le fichier de configuration global de MySQL se trouve dans
/etc/mysql/my.cnf
, toutes les configurations globales personnalisées doivent être définies dans le fichier de configuration. -
La configuration personnalisée doit être spécifiée pour mysqld (démon MySQL), les options affichées dans l'image sont des configurations de sécurité personnalisées.
-
Après avoir ajouté les configurations personnalisées, vous devez redémarrer le
mysql
service pour s'assurer que toutes les modifications sont appliquées.systemctl restart mysql
Auditer la sécurité MySQL
Vous pouvez maintenant auditer la sécurité du serveur MySQL en utilisant un outil appelé MySAT. MySAT effectue plusieurs tests pour analyser les configurations de bases de données et les politiques de sécurité. MySAT permet d'évaluer et donc d'augmenter la sécurité de la base de données MySQL. MySAT est un simple script SQL, facile à comprendre et facile à entretenir. Les résultats MySAT sont sortis au format HTML.
-
Clonez le dépôt MySAT Github en exécutant la commande suivante :
git clone https://github.com/meob/MySAT.git
-
Après avoir cloné le répertoire, naviguez dans le répertoire MySAT, où le
mysat.sql
le fichier est localisé et il est utilisé en conjonction avec le serveur MySQL pour sortir les résultats dans unMySAT.htm
fichier. -
Auditez la sécurité en exécutant la commande suivante :
mysql --user=<root-user> -p<password> --skip-column-names -f < mysat.sql > MySAT.htm
-
Comme indiqué, MySAT nécessite un accès root à MySQL pour exécuter les tests requis, après avoir exécuté la commande, le fichier MySAT.htm est généré, copiez le fichier MySAT.htm et le
mysat.css
fichier sur un serveur Apache ou NGINX, ou téléchargez-les localement avecscp
, afin que vous puissiez analyser les résultats de l'audit. -
Les résultats sont formatés dans un format simple à lire et à comprendre, où les configurations sont vérifiées et les résultats sont codés par couleur en fonction de leur configuration actuelle et de la façon dont cela affecte la sécurité du serveur mysql. Par exemple, une vérification de configuration qui a échoué est codée en orange et une vérification réussie est codée en vert.
-
Le rapport d'audit révèle quelles configurations doivent être changées ou modifiées et vous présente une image de haut niveau de la sécurité globale du serveur MySQL.