it-swarm.it

Errore MySQL: accesso negato per l'utente "a" @ "localhost" (utilizzando la password: SÌ)

Uso l'account di root creato l'account 'a'@'%'. Ma non riesco a utilizzare l'account per connettermi al server MySQL quando specifico il parametro Host. Posso collegarmi con successo senza il -h parametro. Si prega di consultare la trascrizione di seguito. Spero che qualcuno mi possa aiutare a spiegarlo. Grazie.

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> 

Modificare:

Sì, MySQL è in ascolto sulla porta 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

Ecco un metodo rapido per verificare come MySQL esegue correttamente l'autenticazione.

Si prega di eseguire questa query:

SELECT USER(),CURRENT_USER();

SER () riporta come hai tentato di autenticarti in mysqld

CURRENT_USER () riporta come ti è stato permesso di autenticarti da mysqld

A volte, USER() e CURRENT_USER() sono diversi. Questo perché l'autenticazione mysql segue un protocollo specifico.

Secondo MySQL 5.0 Guida allo studio di certificazione

enter image description here

le pagine 486.487 indicano quanto segue sull'algoritmo di autenticazione di mysql:

Esistono due fasi del controllo dell'accesso client:

Nella prima fase, un client tenta di connettersi e il server accetta o rifiuta la connessione. Perché il tentativo abbia esito positivo, alcune voci nella tabella utente devono corrispondere all'host da cui si connette il client, il nome utente e la password.

Nella seconda fase (che si verifica solo se un client si è già connesso correttamente), il server controlla ogni query che riceve dal client per vedere se il client dispone di privilegi sufficienti per eseguirlo.

Il server confronta un client con le voci nelle tabelle di concessione in base all'host da cui il client si connette e l'utente fornito dal client. Tuttavia, è possibile che più di un record corrisponda:

I valori host nelle tabelle delle sovvenzioni possono essere specificati poiché i pattern contengono valori jolly. Se una tabella delle sovvenzioni contiene voci da myhost.example.com, %.example.com, %.com E %, Tutti corrispondono a un client che si collega da myhost.example.com.

I pattern non sono consentiti per i valori Utente nelle voci della tabella di concessione, ma è possibile assegnare un nome utente come stringa vuota per specificare un utente anonimo. La stringa vuota corrisponde a qualsiasi nome utente e quindi agisce efficacemente come carattere jolly.

Quando l'host e i valori utente in più record di una tabella utente corrispondono a un client, il server deve decidere quale utilizzare. Lo fa ordinando prima i record con i valori di colonna Host e User più specifici e scegliendo il record corrispondente che si verifica per primo nell'elenco ordinato, l'ordinamento avviene come segue:

Nella colonna host, i valori letterali come localhost, 127.0.0.1 E myhost.example.com Ordinano prima di valori come %.example.com Che contengono caratteri di pattern. I valori dei motivi sono ordinati in base alla loro specificità. Ad esempio, %.example.com È più specifico di %.com, Che è più specifico di %.

Nella colonna Utente, i nomi utente non vuoti vengono ordinati prima dei nomi utente vuoti. Cioè, gli utenti non anonimi ordinano prima degli utenti anonimi.

Il server esegue questo ordinamento all'avvio. Legge le tabelle delle autorizzazioni in memoria, le ordina e utilizza le copie in memoria per il controllo degli accessi.

Da questa descrizione, non è necessario preoccuparsi dell'ordine delle tabelle mysql.user poiché esiste una copia in memoria delle tabelle di concessione che viene ordinata come precedentemente menzionato.

Per quanto riguarda il modo in cui hai effettuato l'accesso, ha funzionato solo mysql -u a. Torna indietro e accedi di nuovo ed esegui questi comandi

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

Assicurati che

  • ogni utente ha una password.
  • non ci sono utenti anonimi (quando l'utente è vuoto)

Questa è solo una supposizione, ma sospetto che mysql -u a Si colleghi tramite localhost perché quando il protocollo di connessione non è specificato, il valore predefinito è connettersi tramite il file socket. Potrebbe esistere una voce in mysql.user Che consente la connessione anonimo localhost.

Esegui questa query:

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

Se torni a una riga senza password, ciò spiega perché mysq -u a Funziona.

AGGIORNAMENTO 2012-01-19 11:12 EDT

Craig Efrein ha sollevato una domanda interessante: se nella tabella mysql.user esistono due nomi utente identici, uno con una password e uno senza, ciò significa che MySQL nega l'autenticazione quando non si utilizza una password?

Questa domanda è un eccellente avvertimento sull'autenticazione utente MySQL.

La chiave primaria di mysql.user è Host, utente. Non ci sono altri indici. Ciò consente più occorrenze di un nome utente. Ogni ricorrenza può avere una password diversa o nessuna password. Ciò consente all'utente 'dbuser' di accedere localmente (dbuser @ localhost) senza password e lo stesso utente effettua l'accesso da un altro server all'interno di un determinato netblock ([email protected]'10.1.2.20 ') con una password come' pass1 'e quell'utente effettua l'accesso da remoto ovunque (dbuser @ '%') con una password remota come 'pass2'.

Dato l'algoritmo di autenticazione utilizzato da MySQL, non vi sono restrizioni per gli utenti con la presenza o l'assenza di una password.

Questo è il motivo per cui la Guida allo studio sulla certificazione MySQL 5.0 dice a pagina 498 Paragrafo 6 nei suoi punti elenco illustra come ripulire il processo di autenticazione :

Su Unix, MySQL viene fornito con uno script mysql_secure_installation che può eseguire diverse utili operazioni relative alla sicurezza sulla tua installazione. Lo script ha le seguenti funzionalità:

  • Imposta una password per gli account di root
  • Rimuovere eventuali account root accessibili in remoto.
  • Rimuovi gli account utente anonimo. Ciò migliora la sicurezza perché impedisce a chiunque di connettersi al server MySQL come root da un host remoto. Il risultato è che chiunque desideri connettersi come root deve prima essere in grado di accedere all'host del server, il che fornisce una barriera aggiuntiva contro gli attacchi.
  • Rimuovere il database di prova (se si rimuovono gli account anonimi, è possibile che si desideri rimuovere anche il database di prova a cui hanno accesso).
27
RolandoMySQLDBA

Il carattere jolly '%' Host non corrisponde a 'localhost'. Per impostazione predefinita, il client mysql proverà a connettersi tramite un socket anziché tramite tcp (di solito in un posto come /var/lib/mysql/mysql.sock).

È possibile modificare la concessione in "a" @ "localhost" o forzare il client a operare sullo stack TCP come:

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

Hai controllato per assicurarti che MySQL stia effettivamente ascoltando il 3306? Esegui un netstat -tlpn e fornisci i risultati. Se non vedi 3306, probabilmente non lo è.

In my.cnf dovresti verificare che --skip-networking sia commentato

[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

Come descritto da @atxdba, per connettere il demone mysql da remoto che non si connette tramite socket, è necessario connettersi da remoto tramite TCP.

Per questo, dovresti specificare --protocol=TCP per ciascuna connessione. Tuttavia, puoi impostarlo in my.cnf sul server:

[client]
protocol=tcp
1
shgnInc