2016-04-21 31 views
2

Wir haben ein sehr seltsames Problem auf unserem Server.MySQL localhost Zugriff verweigert, bis Flush

Jeder Benutzer (einschließlich root) kann nicht auf mysql auf dem lokalen System zugreifen und tauscht zwischen den Flushes.

wir einen einfachen PHP-Skript verwenden, um es zu testen ...

$username = "test"; 
$password = "pass123"; 

$conn = new mysqli("localhost", $username, $password); 
if ($conn->connect_error) {echo "[localhost] Connection failed: " . $conn->connect_error;} else echo "[localhost] Connected successfully"; 
echo "<hr>"; 

$conn = new mysqli("127.0.0.1", $username, $password); 
if ($conn->connect_error) {echo "[127.0.0.1] Connection failed: " . $conn->connect_error;} else echo "[127.0.0.1] Connected successfully"; 
echo "<hr>"; 

$conn = new mysqli("192.168.1.2", $username, $password); 
if ($conn->connect_error) {echo "[192.168.1.2] Connection failed: " . $conn->connect_error;} else echo "[192.168.1.2] Connected successfully"; 

So lassen Sie mich durch die Sequenz fort.

  1. MySQL-Benutzer konfiguriert, user @% mit pass123, mit voller Server privs auf allen db.
  2. PHP Script wird ausgeführt. Die ersten beiden Tests scheitern mit Zugriff verweigert. Letzte gelingt.
  3. Mysql Benutzer neu konfiguriert: [email protected]
  4. Skript ausführen: Alle drei verweigert.
  5. MySQL Flush Privs
  6. Erste zwei gelingen. Letzter Fehler (sinnvoll)
  7. MySQL Benutzer konfiguriert: user @%(Original von Stufe 1)
  8. Script auszuführen: Alle drei erfolgreich zu sein. (Hooray? Nein)
  9. MySQL Flush privs (und/oder Server-Neustart)
  10. Zurück 2.

Schritt Wir können nicht Coldfusion oder PHP-Verbindungen aufrecht zu erhalten. Es funktioniert zuerst, die erste Verbindung, wenn [email protected] (so in mysql konfiguriert), aber anschließend fehlschlägt in Coldfusion, und PHP kann nicht zuverlässig verbinden abhängig von Service-Neustarts oder Leerungen. PHP skizziert das Problem wirklich, wie oben gesehen. Aber der JDBC-Konnektor für die Coldfusion scheint zufällig zu funktionieren oder nicht.

Irgendwelche Ideen, was hier passiert? Benutzer @% sollte immer funktionieren, sollte es nicht?


  • MySQL v5.5, PHP v 7, Coldfusion v11 (jdbc .38 neueste). Windows Server 2012.
  • my.cnf ist nicht mit Bind-Adresse konfiguriert (alle Hosts zulässig).
    • max-connections = 500
  • IPv6 deaktiviert (OxFFFFFF)
  • Firewall ist ausgeschaltet.
  • Die gleiche Datenbank, die gleichen Benutzer und die gleiche Konfiguration funktionieren problemlos auf Windows Server 2008, von dem wir versuchen, zu migrieren. Dies sind alles Neuinstallationen jeder Software. Wir konnten einfach Benutzer @% erstellen und zu allen Zeiten eine Verbindung zu allen 3 Tests herstellen.

Zusätzliche Hinweise:

  • "localhost", wenn sie in Browser (lokale IIS) eingegeben haben, funktioniert manchmal, manchmal tut. 127.0.0.1 funktioniert immer einwandfrei.
  • keine Hosts Eintrag, da Win7 + interne DNS verwendet. Wir haben den localhost-Eintrag hinzugefügt, es hat keinen Effekt.
  • IIS hält uns frieren. Die Websites beginnen sich im Browser zu "drehen" und werden nie geladen. Wir müssen ein iisreset ausführen. Wir können nicht feststellen, warum dies geschieht - es scheint zufällig zu sein. Scheint etwas mit dem localhost Problem zu tun, ja?

Antwort

1

Die Antwort gefunden, sorry Jungs, hätte nur einen Moment mehr recherchieren sollen. https://serverfault.com/questions/122472/allowing-wildcard-access-on-mysql-db-getting-error-access-denied-for-use

Manchmal finden wir die richtigen Stichworte, indem wir darüber reden, dass Gummienteffekt.

Grundsätzlich, natürlich, mysql standardmäßig enthält einen leeren Benutzerdatensatz mit einem Host von localhost, die jeden Benutzer @% ersetzt. Dies führt zu diesem Verhalten. Löschen Sie den Benutzer und das Problem wurde behoben. Jetzt kann meine Firewall wieder eingeschaltet werden ... wow.

Die IIS Probleme, die ich erwähnt sind ein Thema für einen anderen Tag nehme ich an ...

+1

Die Erklärung ist nicht ganz richtig. Wenn ein Benutzer versucht, eine Verbindung zum MySQL-Server herzustellen, betrachtet MySQL die Zeilen aus der Tabelle mysql.user in einer bestimmten Reihenfolge. Sie haben Recht, dass MySQL vor jedem ** 'user' @ '%' ** ** '' @ 'localhost' ** bestellt, und das wird zuerst überprüft. In MySQL ist der Host-Wert von 'localhost' * nicht * auch mit der Loopback-IP 127.0.0.1. Es ist überhaupt keine IP-Verbindung. Es ist eine Verbindung auf dem lokalen Server, über einen Socket, der * kein * IP-Socket ist. Dieser Eintrag in der Benutzertabelle betrifft also nur Clients auf dem lokalen Server und keine Verbindung über IP. – spencer7593

+1

Alle DML (INSERT/UPDATE/DELETE) Änderungen gemacht die msyql.user, mysql.db, et al. Tabellen sind * nicht * wirksam, bis ein FLUSH PRIVILEGES den MySQL-Server veranlasst, die Tabellen zu lesen und die Speicherstrukturen neu zu füllen. Wenn Berechtigungen durch GRANT- und REVOKE-Anweisungen geändert werden, werden die Änderungen wirksam, ohne dass eine FLUSH PRIVILEGES-Anweisung ausgeführt werden muss. – spencer7593

+0

Tolle Erklärung, das macht jetzt mehr Sinn. Dieses Zeug sollte zum Lesen benötigt werden, es ist einfach wichtig.Nicht sicher, ob Sie in der Lage sind, meine Antwort zu verbessern/zu bearbeiten, würde es vorziehen, Kredit zu geben, wo Kredit fällig ist. – Barry

1

Wenn ich mich richtig erinnere, fand ich zu einem Zeitpunkt, dass ich 2 Benutzer haben musste. Überprüfen Sie, ob ein zweiter Benutzer [email protected] vorhanden ist, bevor Sie fortfahren.

Das war, weil% eigentlich nicht für lokale Verbindungen über den UNIX-Socket übereinstimmen, und stattdessen die [email protected] Datensatz wird

Diese Frage verwendet werden könnte hilfreich sein: Mysql enabling remote and local access

Denken Sie daran, dass alle Änderungen an den Benutzer Tabelle erfordert eine FLUSH PRIVILEGES bevor Änderungen wirksam werden.

+0

100% richtig, versuchten wir doppelte Benutzer zu vermeiden, und haben nur den einen Benutzer in mysql. Lassen Sie unsere Firewall & VPN die Sicherheit von Login Access Points behandeln. – Barry

+2

Ja, leider glaube ich nicht, dass du hier herumkommst, wenn du lokale Verbindungen ausführst. Beachten Sie auch, dass (ich denke) es einen Unterschied zwischen localhost und 127.0.0.1 gibt (einer ist der UNIX-Socket und einer ist der Loop-Back-Schnittstelle) – edhurtig

+0

Dies ist ein häufiges Missverständnis. ''user' @ '%'' stimmt mit allem überein, * es sei denn, es existiert ein spezifischerer Host-Wert für diesen Benutzer * ... oder Sie treffen den leeren Benutzernamen, weil Sie die Erstinstallation nicht ordnungsgemäß gesichert haben. –