it-swarm.com.de

MySQL: Warum gibt es "Test" -Einträge in mysql.db?

Kürzlich ich habe eine Antwort auf eine Frage zu mysql.db gepostet .

Dann musste ich mir überlegen, ob ich jedem diese Frage stellen sollte:

Ich habe jahrelang bemerkt, dass bei der Installation von MySQL 5.0+ mysql.db enthält zwei Einträge, mit denen anonyme Benutzer auf Testdatenbanken zugreifen können.

Sie können es sehen, indem Sie diese Abfrage ausführen:

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)

Sind diese Einträge in der mysql.db ein Sicherheitsrisiko, und wenn ja, warum werden sie einer Neuinstallation standardmäßig hinzugefügt?

UPDATE 2013-06-14 10:13 EDT

Heute Morgen hat jemand meine Frage abgelehnt, was ich wirklich nicht verstehe. In Anbetracht dieses Ereignisses habe ich mir deshalb die Zeit genommen, eine Gegenargumentation zu machen:

Ich habe MySQL 5.6.12 diese Woche für einen Client in dessen Staging-Cluster installiert. Ich beschloss zu überprüfen, ob dies immer noch ein Problem ist:

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>

Weißt du was? Dies ist bis heute ein Problem !!!

MORAL DER GESCHICHTE: Bitte überprüfen Sie Ihre mysql.db sofort nach der Installation und entfernen Sie anonyme Anmeldungen und löschen Sie diese Testeinträge aus mysql.db ohne Verspätung.

37
RolandoMySQLDBA

Bitte beachten Sie, was MySQL 5.0 Certification Study Guide

enter image description here

sagen Sie in seinen Aufzählungspunkten auf Seite 498 Absatz 6:

Unter Unix wird MySQL mit einem Skript mysql_secure_installation geliefert, mit dem mehrere hilfreiche sicherheitsrelevante Vorgänge für Ihre Installation ausgeführt werden können. Das Skript verfügt über die folgenden Funktionen:

  • Legen Sie ein Kennwort für die Root-Konten fest
  • Entfernen Sie alle remote zugänglichen Root-Konten.
  • Entfernen Sie die anonymen Benutzerkonten. Dies verbessert die Sicherheit, da verhindert wird, dass jemand von einem Remote-Host aus eine Verbindung zum MySQL-Server als Root herstellt. Das Ergebnis ist, dass sich jeder, der eine Verbindung als Root herstellen möchte, zuerst beim Server-Host anmelden kann, was eine zusätzliche Barriere gegen Angriffe darstellt.
  • Entfernen der Testdatenbank (Wenn Sie die anonymen Konten entfernen, möchten Sie möglicherweise auch die Testdatenbank entfernen, auf die sie Zugriff haben.).

Führen Sie Folgendes aus, um diese fehlerhaften Einträge zu entfernen:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test';
FLUSH PRIVILEGES;

Wie @DTest in seinem Kommentar zur Frage erwähnt hat, können Sie auch mysql_secure_installation für Sie ausführen.

Wenn sich ein anonymer Benutzer remote bei MySQL anmelden kann, kann ein einfacher Festplattenangriff gestartet werden, um die MySQL-Installation zu beeinträchtigen. Hier ist ein Beispiel:

USE test
CREATE TABLE rolando_tb (a int);
INSERT INTO rolando_tb VALUES (1);
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;

Führen Sie insert 30 Mal aus, und Sie erhalten eine 7-GB-Tabelle

  • Stellen Sie sich vor, Sie erstellen mehrere dieser Tabellen in der Testdatenbank
  • Stellen Sie sich vor, Sie erstellen eine gespeicherte Prozedur in der Testdatenbank
  • Die Möglichkeiten sind endlos, solange test und test_% in mysql.db Vorhanden sind.

Die Ernsthaftigkeit der Sicherung der MySQL-Installation wurde von MySQL AB nicht vollständig dokumentiert, und ich glaube nicht, dass Oracle heute daran interessiert ist.

PDATE 2012-02-18 16:45 EDT

In @ atxdbas Kommentar wurde vorgeschlagen, nur den 'DROP DATABASE-Test' auszuführen. sollte die bevorzugte Methode gegenüber dem Berühren von mysql.db sein. Durch das Löschen der Datenbank mit dem Namen test wird einfach die Datenbank entfernt, die einen Conduit zu einer potenziellen Sicherheitslücke öffnet.

Bitte beachten Sie diese Abfrage:

mysql> select user,Host,db from mysql.db;
+------+------+---------+
| user | Host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.09 sec)

Basierend darauf können die folgenden Datenbanken , auf die anonyme Benutzer vollständig zugreifen :

  • prüfung
  • test_db
  • test_001
  • test_1
  • testdaten

Auf die folgenden Datenbanken können anonyme Benutzer nicht vollständig zugreifen:

  • testdb
  • test1
  • testdaten
  • Test (Test unterscheidet sich von test in Linux-basierten Systemen, ist jedoch immer noch ein Problem für MySQL unter Windows)

Sie müssen sich an diese subtile Regel erinnern, die auf der Tabelle mysql.db Basiert. Wenn Sie sich nicht daran erinnern, wird durch das Erstellen einer Testdatenbank mit dem Namen test oder eines Datenbanknamens mit den ersten 5 Zeichen test_ Dieselbe Art von Sicherheitslücke erneut geöffnet.

Der sicherste Weg, sich an diese Dinge erinnern zu müssen, besteht darin, diese Zeilen nach einer Erstinstallation auszuführen:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

dann kann jede Datenbank mit einem beliebigen Namen über eine ordnungsgemäße Authentifizierung verfügen. Sie können diese beiden Leitungen jederzeit ausführen.

PDATE 2012-02-24 15:20 EDT

Um die Gefahr anonymer Benutzer in mysql.db Offen zu demonstrieren, möchte ich einen Benutzer erstellen, der nur über das Nutzungsrecht verfügt.

Ich werde MySQL 5.5.12 auf meinem Desktop verwenden

Schauen Sie sich zuerst die mysql.db an

mysql> select user,Host,db from mysql.db;
+------+------+---------+
| user | Host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.05 sec)


mysql>

Demnach kann jeder anonyme Joe diese Datenbanken erreichen.

Ich werde eine Datenbank test_mysqldb erstellen

mysql> create database test_mysqldb;
Query OK, 1 row affected (0.00 sec)

mysql> use test_mysqldb
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql>

Lassen Sie uns einen einfachen Vanilla-Benutzer namens Vanilla @ localhost erstellen (kein Passwort)

mysql> CREATE USER [email protected];
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR [email protected];
+---------------------------------------------+
| Grants for [email protected]                |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'Vanilla'@'localhost' |
+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

Als nächstes stellen wir über die DOS-Befehlszeile eine Verbindung zum MySQL-Schema her

C:\>mysql -uvanilla -Dmysql
ERROR 1044 (42000): Access denied for user 'Vanilla'@'localhost' to database 'mysql'

C:\>

OK, großartig. Das habe ich erwartet.

Stellen Sie als Nächstes über die DOS-Befehlszeile eine Verbindung zum Schema test_mysqldb her, erstellen Sie eine Tabelle und laden Sie sie mit Zahlen

C:\>mysql -uvanilla -Dtest_mysqldb
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

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> CREATE TABLE rolando_tb (a bigint unsigned);
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO rolando_tb VALUES (1);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 4 rows affected (0.06 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 8 rows affected (0.06 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM rolando_tb;
+------+
| a    |
+------+
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
+------+
16 rows in set (0.00 sec)

mysql> SELECT database();
+--------------+
| database()   |
+--------------+
| test_mysqldb |
+--------------+
1 row in set (0.00 sec)

mysql>

Hast du das gesehen? Ein Benutzer mit der Berechtigung USAGE kann eine Tabelle in einer Testdatenbank erstellen und mit Daten füllen. Dies ist eine klare und gegenwärtige Gefahr. Aus diesem Grund Ich empfehle dringend, diese Testeinträge aus mysql.db zu löschen , um anonyme Benutzer davon abzuhalten, Testdatenbanken zu erreichen oder auf neu erstellte Testdatenbanken zuzugreifen (indem Sie einen Unterordner unter dem Standard datadir).

Zur Erinnerung, so machen Sie es:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

UPDATE 2013-09-14 20:05 EDT

Um zu demonstrieren, dass DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user=''; tatsächlich funktioniert, habe ich dies heute unter MySQL 5.6.13 ausgeführt:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.13-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

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> select db,user,Host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db      | user | Host |
+---------+------+------+
| test    |      | %    |
| test\_% |      | %    |
+---------+------+------+
2 rows in set (0.43 sec)

mysql> delete from mysql.db where LEFT(db,4)='test';
Query OK, 2 rows affected (0.04 sec)

mysql> select db,user,Host from mysql.db2 where LEFT(db,4)='test';
Empty set (0.00 sec)

mysql>

Bitte nur als öffentliche Bekanntmachung ausführen

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

oder führen Sie einfach mysql-Secure-Installation aus und bringen Sie diese potenzielle Gefahr ins Bett.

30
RolandoMySQLDBA