Kürzlich habe ich eine Antwort auf eine Frage zu mysql.db gepostet .
Dann musste ich mir überlegen, ob ich jedem diese Frage stellen sollte:
Ich habe seit Jahren festgestellt, dass bei der Installation von MySQL 5.0+ mysql.db
zwei Einträge vorhanden sind, 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)
mysql.db
Handelt es sich bei diesen Einträgen um ein Sicherheitsrisiko, und wenn ja, warum werden sie standardmäßig zu einer neuen Installation hinzugefügt?
UPDATE 2013-06-14 10:13 EDT
Heute morgen hat jemand meine Frage abgelehnt, die ich wirklich nicht verstehe. In Anbetracht dieses Ereignisses habe ich mir folgende Zeit genommen, um eine Gegenargumentation zu machen:
Ich habe diese Woche MySQL 5.6.12 für einen Client in dessen Staging-Cluster installiert. Ich habe mich entschlossen zu prü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>
Erraten Sie, was? Dies ist bis heute ein Problem !!!
MORAL DER GESCHICHTE: Bitte überprüfen Sie mysql.db
sofort nach der Installation, entfernen Sie anonyme Anmeldungen und löschen Sie diese Testeinträgemysql.db
unverzüglich.
mysql_secure_installation
auf einer Neuinstallation, die die anonymen Benutzer entfernt.Antworten:
Bitte beachten Sie den MySQL 5.0 Certification Study Guide
sagen Sie in seinen Aufzählungspunkten auf Seite 498 Absatz 6:
Führen Sie Folgendes aus, um diese fehlerhaften Einträge zu entfernen:
Wie @DTest in seinem Kommentar zu der Frage erwähnte, können Sie auch mysql_secure_installation ausführen, um dies für Sie zu tun .
Wenn sich ein anonymer Benutzer remote bei MySQL anmelden kann, kann ein einfacher Festplattenangriff gestartet werden, um die Installation von MySQL zu beeinträchtigen. Hier ist ein Beispiel:
Führen Sie Insert 30-mal aus und Sie erhalten eine 7 GB-Tabelle
mysql.db
Die Ernsthaftigkeit der Sicherung der mysql-Installation wurde von MySQL AB nicht vollständig dokumentiert, und ich glaube, Oracle ist heute nicht daran interessiert.
UPDATE 18.02.2012 16:45 Uhr EDT
Es wurde von @ atxdbas Kommentar vorgeschlagen, dass nur 'DROP DATABASE test' ausgeführt wird. sollte die bevorzugte Methode gegenüber dem Berühren von mysql.db sein. Durch das Löschen der genannten Datenbank wird
test
lediglich die Datenbank entfernt, die einen Kanal zu einer potenziellen Sicherheitslücke öffnet.Bitte beachten Sie diese Abfrage:
Auf diese Weise können anonyme Benutzer uneingeschränkt auf die folgenden Datenbanken zugreifen :
Auf die folgenden Datenbanken können anonyme Benutzer nicht vollständig zugreifen:
Test
unterscheidet sich vontest
Linux-basierten Systemen, ist aber immer noch ein Problem für MySQL unter Windows)Sie müssen sich an diese subtile Regel erinnern, die auf der
mysql.db
Tabelle basiert . Wenn Sie sich nicht daran erinnern, wird durch das Erstellen einer Testdatenbank mit dem Namentest
oder eines Datenbanknamens, dessen erste 5 Zeichentest_
lauten, dieselbe Art von Sicherheitslücke erneut geöffnet.Die sicherste Möglichkeit, sich an diese Dinge zu erinnern, besteht darin, diese Zeilen nach einer Erstinstallation auszuführen:
Dann kann jede Datenbank mit einem beliebigen Namen eine ordnungsgemäße Authentifizierung einrichten. Sie können diese beiden Zeilen jederzeit ausführen.
UPDATE 2012-02-24 15:20 EDT
Um die Gefahr, anonyme Benutzer zu haben, offen darzulegen
mysql.db
, , möchte ich einen Benutzer erstellen, der nur über die Nutzungsberechtigung verfügt.Ich werde MySQL 5.5.12 auf meinem Desktop verwenden
Schauen Sie sich zuerst die Datei mysql.db an
Danach kann jeder anonyme Joe diese Datenbanken erreichen.
Ich erstelle eine Datenbank test_mysqldb
Erstellen wir einen einfachen Vanille-Benutzer namens vanilla @ localhost (kein Passwort)
Als nächstes stellen wir über die DOS-Befehlszeile eine Verbindung zum mysql-Schema her
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
Hast du das gesehen? Ein Benutzer mit
USAGE
Berechtigungen kann eine Tabelle in einer Testdatenbank erstellen und mit Daten füllen. Dies ist eine klare und gegenwärtige Gefahr . Aus diesem Grund empfehle ich dringend, diese Testeinträge aus mysql.db zu löschen , um anonyme Benutzer davon abzuhalten, auf Testdatenbanken zuzugreifen oder auf neu erstellte Testdatenbanken zuzugreifen (indem Sie einen Unterordner unter der Standardeinstellung erstellen)datadir
).Zur Erinnerung, so machen Sie es:
UPDATE 2013-09-14 20:05 EDT
Um zu demonstrieren, dass das
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
tatsächlich funktioniert, habe ich dies heute auf MySQL 5.6.13 ausgeführt:Nur als gemeinnützige Ankündigung, bitte ausführen
oder einfach mysql-secure-installation ausführen und diese potenzielle gefahr ins bett legen.
quelle
DELETE from mysql.db WHERE Db LIKE 'test%';
Hinweis machen, dass die Großschreibung des Feldnamens wichtig ist. Wenn Ihr Feldname also istDb
und nichtdb
, funktioniert die obige Abfrage nicht.