it-swarm-eu.dev

Chyba MySQL: Přístup byl odepřen uživateli 'a' @ 'localhost' (pomocí hesla: ANO)

Používám root účet vytvořený účet 'a'@'%'. Když však zadám parametr Host, nemůžu se pomocí účtu připojit k serveru MySQL. Mohu se úspěšně připojit bez -h parametr. Podívejte se prosím na přepis níže. Doufám, že mi někdo pomůže vysvětlit to. Dík.

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> 

Upravit:

Ano, MySQL poslouchá na portu 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

Zde je rychlá a špinavá metoda pro kontrolu, jak MySQL provádí úspěšnou autentizaci.

Spusťte prosím tento dotaz:

_SELECT USER(),CURRENT_USER();
_

USER () hlásí, jak jste se pokusili ověřit v mysqld

CURRENT_USER () uvádí, jak vám bylo povoleno ověřování pomocí mysqld

Někdy jsou USER() a CURRENT_USER() odlišné. Je to proto, že autentizace mysql se řídí specifickým protokolem.

Podle MySQL 5.0 Certifikační studijní příručka

enter image description here

stránky 486,487 uvádějí na ověřovacím algoritmu mysql následující:

Existují dvě fáze řízení přístupu klienta:

V první fázi se klient pokusí připojit a server připojení buď přijme, nebo odmítne. Aby byl pokus úspěšný, musí se některá položka v uživatelské tabulce shodovat s hostitelem, ze kterého se klient připojuje, uživatelským jménem a heslem.

Ve druhé fázi (která nastane, pouze pokud se klient již úspěšně připojil) server zkontroluje každý dotaz, který obdrží od klienta, aby zjistil, zda má klient dostatečná oprávnění k jeho provedení.

Server porovnává klienta s položkami v tabulkách grantů na základě hostitele, ze kterého se klient připojuje, a uživatele, který klient poskytuje. Je však možné shodovat více než jeden záznam:

Hodnoty hostitele v tabulkách udělení mohou být specifikovány jako vzory obsahující hodnoty zástupných znaků. Pokud tabulka grantů obsahuje položky z _myhost.example.com_, _%.example.com_, _%.com_ a _%_, všechny se shodují s klientem, který se připojuje z _myhost.example.com_.

Vzory nejsou povoleny pro hodnoty uživatele v položkách tabulky přidělení, ale uživatelské jméno může být zadáno jako prázdný řetězec pro určení anonymního uživatele. Prázdný řetězec odpovídá jakémukoli uživatelskému jménu a účinně tak funguje jako zástupný znak.

Když se hodnoty hostitele a uživatele ve více než jednom záznamu tabulky uživatelů shodují s klientem, server musí rozhodnout, který z nich se použije. Děje se to tak, že nejprve třídí záznamy s nejkonkrétnějšími hodnotami sloupců Host a Uživatel a vybere odpovídající záznam, který se objeví nejprve v seřazeném seznamu. Třídění probíhá následovně:

Ve sloupci hostitele doslovné hodnoty jako localhost, _127.0.0.1_ a _myhost.example.com_ třídí před hodnotami jako _%.example.com_, které v nich mají znaky vzoru. Hodnoty vzorů jsou seřazeny podle toho, jak jsou specifické. Například _%.example.com_ je konkrétnější než _%.com_, což je konkrétnější než _%_.

Ve sloupci Uživatel se neprázdná uživatelská jména třídí před prázdná uživatelská jména. To znamená, že neanonymní uživatelé jsou seřazeni před anonymními uživateli.

Server provede toto třídění při spuštění. Čte tabulky přidělení do paměti, třídí je a pro řízení přístupu používá kopie v paměti.

Z tohoto popisu se nemusíte starat o pořadí tabulek mysql.user, protože existuje kopie paměťových tabulek v paměti, která je tříděna, jak bylo uvedeno výše.

S ohledem na to, jak jste se přihlásili, fungovalo pouze _mysql -u a_. Vraťte se a přihlaste se znovu a spusťte tyto příkazy

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

Ujistit se, že

  • každý uživatel má heslo.
  • nejsou anonymní uživatelé (pokud je uživatel prázdný)

To je jen hádání, ale mám podezření _mysql -u a_ připojení přes localhost, protože když není specifikován připojovací protokol, výchozí je připojení přes soubor soketu. V _mysql.user_ může existovat položka, která umožňuje anonymní připojení localhost.

Spustit tento dotaz:

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

Pokud vrátíte řádek bez hesla, to plně vysvětluje, proč _mysq -u a_ funguje.

UPDATE 2012-01-19 11:12 EDT

Craig Efrein vyvolal zajímavou otázku: pokud existují dvě identická uživatelská jména v tabulce mysql.user, jedno s heslem a druhé bez, znamená to, že MySQL popírá autentizaci, když nepoužívá heslo?

Tato otázka je výbornou zprávou o ověření uživatele MySQL.

Upozorňujeme, že primárním klíčem mysql.user je Host, user. Nejsou žádné další indexy. To umožňuje více výskytů uživatelského jména. Každý výskyt může mít jiné heslo nebo žádné heslo. To umožňuje uživateli 'dbuser' přihlásit se místně (dbuser @ localhost) bez použití hesla a stejného uživatele přihlášení z jiného serveru v daném netblocku ([email protected]'10.1.2.20 ') s heslem jako' pass1 'a tímto uživatelem se přihlásit vzdáleně odkudkoli (dbuser @ '%') se vzdáleným heslem, jako je 'pass2'.

Vzhledem k autentizačnímu algoritmu, který MySQL používá, neexistují žádná omezení pro uživatele s přítomností nebo chybějícím heslem.

To je důvod, proč MySQL 5.0 Příručka pro certifikační studii uvádí na stránce 498 odstavec 6 ve svých bulletinech uvádí, jak vyčistit proces autentizace:

V Unixu je MySQL dodáván s skriptem mysql_secure_installation, který může při instalaci provádět několik užitečných operací souvisejících se zabezpečením. Skript má následující možnosti:

  • Nastavte heslo pro kořenové účty
  • Odstraňte všechny vzdáleně přístupné kořenové účty.
  • Odebrat anonymní uživatelské účty. Tím se zvyšuje zabezpečení, protože to zabraňuje možnosti kohokoli, kdo by se připojil k serveru MySQL jako root ze vzdáleného hostitele. Výsledkem je, že každý, kdo se chce připojit jako root, se musí nejprve přihlásit k serveru Host, což poskytuje další překážku proti útoku.
  • Odebrat testovací databázi (Pokud odeberete anonymní účty, můžete také chtít odebrat testovací databázi, ke které mají přístup).
27
RolandoMySQLDBA

Zástupný znak hostitele '%' neodpovídá 'localhost'. Ve výchozím nastavení se klient mysql pokusí připojit přes soket namísto tcp (obvykle nějaké místo, jako je /var/lib/mysql/mysql.sock).

Můžete buď změnit svůj grant na '@' localhost ', nebo donutit klienta, aby pracoval na zásobníku TCP jako:

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

Zkontrolovali jste, zda se MySQL skutečně poslouchá na 3306? Spustit netstat -tlpn a poskytnout výsledky. Pokud nevidíte 3306, pak to pravděpodobně není.

V my.cnf byste měli ověřit, že --skip-networking je okomentován

[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

Jak je popsáno v @atxdba, Pro připojení mysql démona ze vzdáleného, ​​který se nepřipojuje přes soket, takže se musíte připojit ze vzdáleného pomocí TCP.

Za tímto účelem byste měli zadat --protocol=TCP za každé připojení. Přesto to můžete nastavit v my.cnf na serveru:

[client]
protocol=tcp
1
shgnInc