Wofür wird die Tabelle mysql.db verwendet?

7

Bezogen auf mein MySQL-Problem

Ich habe einen Benutzer mit USAGE-Berechtigung in mysql.user, aber in mysql.db hat dieser Benutzer Auswählen, Einfügen, Aktualisieren, Löschen. Somit kann der Benutzer die Datenbank erfolgreich abfragen.

Ich kann keine Informationen darüber finden, wie diese mysql.db funktioniert. Ist es wie eine Art zwischengespeicherte Berechtigung? Wird ein mysqld-Neustart es spülen?

mysql> show grants for user@'xx.xx.xx.%';
+-------------------------------------------------------------------------------------------------------------------------------+ 
| Grants for user@xx.xx.xx.%                                      |
+-------------------------------------------------------------------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'user'@'xx.xx.xx.%' IDENTIFIED BY PASSWORD 'xxx' REQUIRE SSL |



 mysql> select host,db,user, select_priv,update_priv,delete_priv  from
 mysql.db where  user='user'; 
 | host         | db   | user    | select_priv | update_priv |  delete_priv | 
 | xx.xx.xx.1   | myDB | user    | Y           | Y           | Y
Bastien974
quelle

Antworten:

6

Aus der docs , mysql.dbist die Tabelle , dass Griffe Datenbank spezifische ERTEILT. Das heißt, wenn Sie in Ihrem GRANTBefehl explizit eine Datenbank angegeben haben , wird diese in dieser Tabelle angezeigt :

GRANT SELECT, INSERT ON foo.* TO `bar`@`localhost`;

Der Benutzer bar@localhosthätte also SELECT und INSERT in der mysql.dbTabelle als 'Y' markiert .

Um Einträge aus dieser Tabelle zu entfernen, müssen Sie ebenfalls die Datenbank angeben:

REVOKE SELECT, INSERT ON foo.* FROM `bar`@`localhost`;

Das Ausgeben einer REVOKE INSERT ON *.*Anweisung (alle Datenbanken) hat keine Auswirkungen auf diese Tabelle.

Außerdem DROP USERbereinigt eine Anweisung alle Einträge in den verschiedenen mysql.*Tabellen, die sich mit der Benutzerauthentifizierung befassen, z mysql.db.

Derek Downey
quelle
Das bedeutet also, dass mysql.db mir explizit diese Berechtigungen für jede Datenbank anzeigt, wenn ich einem Benutzer auf *. * Erteile? Bedeutet dies, dass ein Zuschuss zum Auswählen, Aktualisieren und Löschen am *. * In der Vergangenheit vorgenommen, aber dann widerrufen wurde?
Bastien974
Wenn Sie a GRANT x ON *.*ausführen, sollte die Tabelle mysql.db nicht aktualisiert werden. Die Tabelle wird nur aktualisiert, wenn Sie die Datenbank in der GRANT-Anweisung ausdrücklich erwähnen.
Derek Downey
Die Gewährung für mehrere Datenbanken in mysql.db ist also nur möglich, wenn sie für jede Datenbank explizit gewährt wird. Dann würde ich nach einem Widerruf von *. * USAGE in mysql.user sehen, ABER immer noch datenbankspezifische Berechtigungen in mysql.db?
Bastien974
@ Bastien974 Ja. Sie können sie entfernen, mysql.dbindem Sie mehrere REVOKE-Anweisungen für jede Datenbank ausgeben. *
Derek Downey
2

Es ist nicht gerade ein Cache, sondern der physische Speicher Ihrer Systeminternalen. Berechtigungen sind eine Sache, die dort gespeichert ist. Dort finden Sie auch Tabellen mit Informationen zu gespeicherten Prozeduren, Funktionen und Ereignissen.

Wenn Sie die Abfrageprotokollierung oder Profilerstellung aktiviert und auf eine bestimmte Weise konfiguriert haben, finden Sie diese Informationen auch in MySQL-DB-Tabellen.

Wenn es bei Ihrer Frage darum geht, dass Benutzer die MySQL-DB-Tabellen abfragen können, vermeiden Sie dies . Zuschüsse. Geben Sie stattdessen die entsprechenden Dauerwellen für bestimmte Datenbank- * oder Datenbanknamen ein.

atxdba
quelle
2

Ich habe eine große Vorsichtsmaßnahme, die Sie für Ihre mysql.db ausüben müssen

Führen Sie diese Abfrage bitte aus:

SELECT COUNT(1) test_db_count FROM mysql.db WHERE SUBSTR(db,4) = 'test';

Wenn Sie test_db_count= 2 erhalten, entfernen Sie sie sofort !!!

Hier ist der Grund: Anonyme Benutzer haben Zugriff auf jede Datenbank, deren erste 4 Buchstaben sind test. Sie können viele CRUD-intensive Dinge in einer Testdatenbank ausführen. Möglicherweise möchten Sie die Testdatenbanken auch in etwas völlig anderes umbenennen. Bitte lesen Sie diese Links, da ich dieses Problem bereits im DBA StackExchange behoben habe.

Um die Notwendigkeit zu bestätigen, beachten Sie bitte, was MySQL 5.0 Certification Study Guide in seinen Aufzählungspunkten auf Seite 68 Absatz 6 sagt:

Unter Unix wird MySQL mit einem Skript mysql_secure_installation geliefert, das mehrere hilfreiche sicherheitsrelevante Vorgänge für Ihre Installation ausführen kann. 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 jeder, der eine Verbindung als Root herstellen möchte, sich zuerst auf dem 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;
RolandoMySQLDBA
quelle