Récemment, j'ai posté une réponse à une question sur mysql.db .
Ensuite, je me suis dit que je devrais poser cette question à tout le monde:
Pendant des années, j'ai remarqué que lors de l'installation de MySQL 5.0+, mysql.db
deux entrées permettent aux utilisateurs anonymes d'accéder à la base de données de test.
Vous pouvez le voir en lançant cette requête:
mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G
*************************** 1. row ***************************
Host: %
Db: test
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
*************************** 2. row ***************************
Host: %
Db: test\_%
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
2 rows in set (0.00 sec)
Ces entrées constituent-elles mysql.db
un risque pour la sécurité et, dans l'affirmative, pourquoi sont-elles ajoutées par défaut à une nouvelle installation?
MISE À JOUR 2013-06-14 10:13 EDT
Ce matin, quelqu'un a voté contre ma question, ce que je ne comprends vraiment pas. À la lumière de cet événement, voici pourquoi j'ai pris le temps de faire une réfutation:
J'ai installé MySQL 5.6.12 pour un client cette semaine dans son cluster de stockage intermédiaire. J'ai décidé de vérifier si le problème persiste:
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)
mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db | user | host |
+---------+------+------+
| test | | % |
| test\_% | | % |
+---------+------+------+
2 rows in set (0.10 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2013-06-14 10:10:13 |
+---------------------+
1 row in set (0.00 sec)
mysql>
Devine quoi? C'est toujours un problème même à ce jour !!!
MORAL OF THE STORY: Veuillez vérifier votre mysql.db
immédiatement après l’installation, effacer les identifiants anonymes et effacer ces entrées de test mysql.db
sans délai.
mysql_secure_installation
une nouvelle installation, qui supprime les utilisateurs anonymes.Réponses:
Veuillez noter quel guide d'étude de la certification MySQL 5.0
Page 498 Paragraphe 6:
Pour vous débarrasser de ces mauvaises entrées, lancez ceci s'il vous plaît:
Comme @DTest l'a mentionné dans son commentaire à la question, vous pouvez également exécuter mysql_secure_installation pour cela pour vous.
Si un utilisateur anonyme peut se connecter à MySQL à distance, une simple attaque de disque peut être lancée pour nuire à l'installation de mysql. Voici un exemple:
Exécutez l'insertion 30 fois et vous obtenez une table de 7 Go
mysql.db
Le sérieux de la sécurisation de l'installation mysql n'a pas été complètement documenté par MySQL AB, et je ne pense pas que Oracle veuille l'intégrer aujourd'hui.
MISE À JOUR 2012-02-18 16:45 EDT
Le commentaire de @ atxdba a suggéré que le test DROP DATABASE soit exécuté; devrait être la méthode préférée par rapport à mysql.db. La
test
suppression de la base de données nommée supprime simplement la base de données qui ouvre un conduit vers une faille de sécurité potentielle.Veuillez prendre note de cette requête:
Sur cette base, les bases de données suivantes sont entièrement accessibles aux utilisateurs anonymes :
Bien que les utilisateurs anonymes ne puissent pas accéder complètement aux bases de données suivantes:
Test
est différent destest
systèmes basés sur Linux, mais c'est toujours un problème pour MySQL sous Windows)Vous devrez vous rappeler cette règle subtile basée sur la
mysql.db
table. Si vous ne vous en souvenez pas, la création d'une base de données de test nomméetest
ou d'un nom de base de données contenant les 5 premiers caractèrestest_
réouvrira le même type de trou de sécurité.Le moyen le plus sûr d'éviter de se souvenir de ces choses est d'exécuter ces lignes après une installation initiale:
alors toute base de données avec n'importe quel nom peut avoir une configuration d'authentification appropriée. Vous pouvez toujours exécuter ces deux lignes à tout moment.
MISE À JOUR 2012-02-24 15:20 EDT
Pour démontrer ouvertement le danger d'avoir des utilisateurs anonymes
mysql.db
, je voudrais créer un utilisateur qui ne dispose que du privilège d'utilisation.J'utiliserai MySQL 5.5.12 sur mon bureau
D'abord, regardez le mysql.db
Selon cela, n'importe quel Joe anonyme peut accéder à ces bases de données.
Je vais créer une base de données test_mysqldb
Créons un utilisateur plain vanilla appelé vanilla @ localhost (sans mot de passe)
Ensuite, depuis la ligne de commande DOS, connectons-nous au schéma mysql
OK super. C'est ce à quoi je m'attendais.
Ensuite, à partir de la ligne de commande DOS, connectons-nous au schéma test_mysqldb, créons une table et chargez-la avec des nombres.
As-tu vu ça? Un utilisateur disposant de
USAGE
privilèges peut créer une table dans une base de données de test et la remplir avec des données. C'est un danger clair et présent . C'est pourquoi je recommande fortement de supprimer ces entrées de test de mysql.db pour dissuader les utilisateurs anonymes d'accéder aux bases de tests ou aux bases de données de test nouvellement créées (en créant un sous-dossier par défautdatadir
).Pour rappel, voici comment procéder:
MISE À JOUR 2013-09-14 20:05 EDT
Pour démontrer que cela
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
fonctionne réellement, j’exécutais ceci sur MySQL 5.6.13 aujourd’hui:Juste comme une annonce de service public, s'il vous plaît exécuter
ou exécutez simplement mysql-secure-installation et mettez ce risque potentiel au lit.
la source
DELETE from mysql.db WHERE Db LIKE 'test%';
note que la capitalisation du nom de champ est importante. Donc, si votre nom de champ estDb
et nondb
, la requête ci-dessus ne fonctionnera pas.