it-swarm-eu.dev

MySQL-Fehler: Zugriff für Benutzer 'a' @ 'localhost' verweigert (mit Passwort: YES)

Ich benutze das Root-Konto erstellt das Konto 'a'@'%'. Ich kann das Konto jedoch nicht verwenden, um eine Verbindung zum MySQL-Server herzustellen, wenn ich den Host-Parameter anmelde. Ich kann erfolgreich ohne den Parameter -h Verbinden. Bitte beachten Sie das Transkript unten. Ich hoffe, jemand kann mir helfen, es zu erklären. Vielen Dank.

mysql> grant all on *.* to 'a'@'%' identified by a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a' at line 1
mysql> grant all on *.* to 'a'@'%' identified by 'a';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'a'@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                            |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'a'@'%' IDENTIFIED BY PASSWORD '*667F407DE7C6AD07358FA38DAED7828A72014B4E' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> exit
Bye

[[email protected] ~]# mysql -h localhost -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[[email protected] ~]# mysql -h 127.0.0.1 -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[[email protected] ~]# mysql -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[[email protected] ~]# mysql -u a
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, 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>
mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.17, for Linux (x86_64) using readline 5.1

Connection id:      20
Current database:   
Current user:       [email protected]
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.17 MySQL Community Server (GPL)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/lib/mysql/mysql.sock
Uptime:         15 days 15 hours 20 min 18 sec

Threads: 1  Questions: 40  Slow queries: 0  Opens: 41  Flush tables: 1  Open tables: 4  Queries per second avg: 0.000
--------------

mysql> 

Bearbeiten:

Ja, MySQL überwacht Port 3306.

[[email protected] ~]# nmap localhost

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2012-01-18 07:35 CST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1674 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
111/tcp  open  rpcbind
631/tcp  open  ipp
840/tcp  open  unknown
3306/tcp open  mysql

Nmap finished: 1 IP address (1 Host up) scanned in 0.064 seconds
[[email protected] ~]# 
22
Just a learner

Hier ist eine schnelle und schmutzige Methode, um herauszufinden, wie MySQL eine erfolgreiche Authentifizierung durchführt.

Bitte führen Sie diese Abfrage aus:

SELECT USER(),CURRENT_USER();

SER () gibt an, wie Sie versucht haben, sich in mysqld zu authentifizieren

CURRENT_USER () gibt an, wie Sie sich von mysqld authentifizieren durften

Manchmal sind USER() und CURRENT_USER() unterschiedlich. Dies liegt daran, dass die MySQL-Authentifizierung einem bestimmten Protokoll folgt.

Gemäß MySQL 5.0 Certification Study Guide

enter image description here

auf den Seiten 486.487 wird Folgendes zum Authentifizierungsalgorithmus von mysql angegeben:

Es gibt zwei Stufen der Clientzugriffskontrolle:

In der ersten Phase versucht ein Client, eine Verbindung herzustellen, und der Server akzeptiert die Verbindung oder lehnt sie ab. Damit der Versuch erfolgreich ist, muss ein Eintrag in der Benutzertabelle mit dem Host, von dem aus der Client eine Verbindung herstellt, dem Benutzernamen und dem Kennwort übereinstimmen.

In der zweiten Phase (die nur auftritt, wenn ein Client bereits eine erfolgreiche Verbindung hergestellt hat) überprüft der Server jede vom Client empfangene Abfrage, um festzustellen, ob der Client über ausreichende Berechtigungen zum Ausführen verfügt.

Der Server vergleicht einen Client mit Einträgen in den Grant-Tabellen, basierend auf dem Host, von dem aus der Client eine Verbindung herstellt, und dem Benutzer, den der Client bereitstellt. Es ist jedoch möglich, dass mehr als ein Datensatz übereinstimmt:

Hostwerte in Grant-Tabellen können angegeben werden, da Muster Platzhalterwerte enthalten. Wenn eine Grant-Tabelle Einträge aus myhost.example.com, %.example.com, %.com Und % Enthält, stimmen alle mit einem Client überein, der eine Verbindung von myhost.example.com.

Muster für die Benutzerwerte in Grant-Tabelleneinträgen sind nicht zulässig. Ein Benutzername kann jedoch als leere Zeichenfolge angegeben werden, um einen anonymen Benutzer anzugeben. Die leere Zeichenfolge entspricht einem beliebigen Benutzernamen und fungiert somit effektiv als Platzhalter.

Wenn der Host- und der Benutzerwert in mehr als einem Benutzertabellendatensatz mit einem Client übereinstimmen, muss der Server entscheiden, welcher verwendet werden soll. Dazu werden zuerst Datensätze mit den spezifischsten Spaltenwerten für Host und Benutzer sortiert und der übereinstimmende Datensatz ausgewählt, der zuerst in der sortierten Liste auftritt. Die Sortierung erfolgt wie folgt:

In der Host-Spalte werden Literalwerte wie localhost, 127.0.0.1 Und myhost.example.com Vor Werten wie %.example.com Sortiert, die Musterzeichen enthalten. Musterwerte werden nach ihrer Spezifität sortiert. Zum Beispiel ist %.example.com Spezifischer als %.com, Was spezifischer als % Ist.

In der Spalte Benutzer werden nicht leere Benutzernamen vor leeren Benutzernamen sortiert. Das heißt, nicht anonyme Benutzer sortieren vor anonymen Benutzern.

Der Server führt diese Sortierung beim Start durch. Es liest die Grant-Tabellen in den Speicher, sortiert sie und verwendet die speicherinternen Kopien für die Zugriffskontrolle.

Aus dieser Beschreibung geht hervor, dass Sie sich nicht um die Reihenfolge der Tabellen mysql.user kümmern müssen, da eine speicherinterne Kopie der Grant-Tabellen vorhanden ist, die wie zuvor erwähnt sortiert ist.

In Bezug darauf, wie Sie sich angemeldet haben, hat nur mysql -u a Funktioniert. Gehen Sie zurück und melden Sie sich erneut an und führen Sie diese Befehle aus

SELECT USER(),CURRENT_USER();
SELECT user,Host,password FROM mysql.user;

Stelle sicher das

  • jeder Benutzer hat ein Passwort.
  • es gibt keine anonymen Benutzer (wenn der Benutzer leer ist)

Dies ist nur eine Vermutung, aber ich vermute, dass mysql -u a Eine Verbindung über localhost herstellt, da standardmäßig eine Verbindung über die Socket-Datei hergestellt wird, wenn das Verbindungsprotokoll nicht angegeben ist. Möglicherweise ist in mysql.user Ein Eintrag vorhanden, der eine anonyme localhost-Verbindung ermöglicht.

Führen Sie diese Abfrage aus:

SELECT user,Host,password FROM mysql.user WHERE user='' AND Host='localhost';

Wenn Sie eine Zeile ohne Passwort zurückerhalten, erklärt dies vollständig, warum mysq -u a Funktioniert.

UPDATE 2012-01-19 11:12 EDT

Craig Efrein hat eine interessante Frage aufgeworfen: Wenn in der Tabelle mysql.user zwei identische Benutzernamen vorhanden sind, einer mit und ein Passwort ohne Passwort, bedeutet dies, dass MySQL die Authentifizierung verweigert, wenn kein Passwort verwendet wird?

Diese Frage ist ein hervorragender Hinweis zur MySQL-Benutzerauthentifizierung.

Bitte beachten Sie, dass der Primärschlüssel von mysql.user Host, Benutzer ist. Es gibt keine anderen Indizes. Dies ermöglicht das mehrfache Auftreten eines Benutzernamens. Jedes Vorkommen kann ein anderes oder kein Passwort haben. Auf diese Weise kann sich der Benutzer 'dbuser' lokal (dbuser @ localhost) ohne Kennwort und denselben Benutzer von einem anderen Server innerhalb eines bestimmten Netzblocks ([email protected]'10.1.2.20 ') mit einem Kennwort wie' pass1 'anmelden und dieser Benutzer muss sich anmelden von überall (dbuser @ '%') mit einem Remote-Passwort wie 'pass2'.

Angesichts des von MySQL verwendeten Authentifizierungsalgorithmus gibt es keine Einschränkungen für Benutzer mit Vorhandensein oder Nichtvorhandensein eines Kennworts.

Aus diesem Grund wird in MySQL 5.0-Zertifizierungsstudienhandbuch in Abschnitt 6 in seinen Aufzählungspunkten erläutert, wie der Authentifizierungsprozess bereinigt wird ::

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 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.).
27
RolandoMySQLDBA

Der Host-Platzhalter '%' stimmt nicht mit 'localhost' überein. Standardmäßig versucht der MySQL-Client, eine Verbindung über einen Socket anstatt über TCP herzustellen (normalerweise an einem Ort wie /var/lib/mysql/mysql.sock).

Sie können entweder Ihren Zuschuss in 'a' @ 'localhost' ändern oder den Client zwingen, über den Stapel TCP) zu arbeiten, wie:

mysql -u a -p --protocol=TCP
5
atxdba

Haben Sie überprüft, ob MySQL tatsächlich 3306 abhört? Führen Sie ein netstat -tlpn aus und geben Sie die Ergebnisse ein. Wenn Sie 3306 nicht sehen, ist es wahrscheinlich nicht.

In my.cnf sollten Sie überprüfen, ob --skip-network auskommentiert ist

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
language        = /usr/share/mysql/English
bind-address    = 65.55.55.2
# skip-networking
2
Craig Efrein

Wie @atxdba beschrieben, Um eine Verbindung zum MySQL-Daemon von einer Remote-Verbindung herzustellen, die keine Verbindung über einen Socket herstellt, müssen Sie eine Verbindung von einer Remote-Verbindung über TCP herstellen.

Dazu sollten Sie für jede Verbindung den --protocol=TCP Angeben. Sie können es jedoch in my.cnf Auf dem Server einstellen:

[client]
protocol=tcp
1
shgnInc