MySQLエラー:ユーザー 'a' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)


22

アカウントを作成したルートアカウントを使用します'a'@'%'。しかし、hostパラメーターを指定すると、アカウントを使用してMySQLサーバーに接続できません。-hパラメータなしで正常に接続できます。以下のトランスクリプトをご覧ください。誰かがそれを説明するのを手伝ってくれることを願っています。ありがとう。

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 a@%                                                                                            |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'a'@'%' IDENTIFIED BY PASSWORD '*667F407DE7C6AD07358FA38DAED7828A72014B4E' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> exit
Bye

[root@localhost ~]# mysql -h localhost -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -h 127.0.0.1 -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# 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:       a@localhost
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> 

編集:

はい、MySQLはポート3306でリッスンしています。

[root@localhost ~]# 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
[root@localhost ~]# 

1
私はMySqlの専門家ではありませんが、この問題を何度か見ました。理由はわかりません。解決策はに加えて明示的にホストを定義すること'a'@'%'でした。したがって、最初のレコードは'a'@'%'で、2番目のレコードはです'a'@'localhost'
コム

下位のmysqlバージョンで同じことをテストしてください。
アブドゥルマナフ

Cpanelログインの詳細を使用して接続します。
アブファヒム

私の場合、私は彼らがこの問題を解決するだろう削除、デフォルトで作成した3つのAnnonymousのアカウントを持っていた
ホアキン・L.ロブレス

回答:


26

MySQLがどのように認証を成功させるかを確認するための、手っ取り早い方法です

このクエリを実行してください:

SELECT USER(),CURRENT_USER();

ユーザー()は、mysqldで認証しようとした方法を報告します

現在の使用者()は、mysqldによる認証の許可方法を報告します

時々、USER()そしてCURRENT_USER()異なっています。これは、mysql認証が特定のプロトコルに従うためです。

MySQL 5.0認定スタディガイドによると

ここに画像の説明を入力してください

486,487ページには、mysqlの認証アルゴリズムに関する次の記述があります。

クライアントアクセス制御には2つの段階があります。

最初の段階では、クライアントは接続を試み、サーバーは接続を受け入れるか拒否します。成功するためには、ユーザーテーブルの一部のエントリが、クライアントが接続するホスト、ユーザー名、およびパスワードと一致する必要があります。

2番目の段階(クライアントが既に正常に接続している場合にのみ発生します)では、サーバーはクライアントから受信するすべてのクエリをチェックして、クライアントに実行に十分な特権があるかどうかを確認します。

サーバーは、クライアントが接続するホストとクライアントが提供するユーザーに基づいて、許可テーブルのエントリとクライアントを照合します。ただし、複数のレコードが一致する可能性があります。

パターンにはワイルドカード値が含まれているため、許可テーブルのホスト値を指定できます。助成金のテーブルからエントリが含まれている場合は myhost.example.com%.example.com%.com、および%、それらのすべてから接続するクライアントに一致しますmyhost.example.com

許可テーブルエントリのユーザー値にはパターンを使用できませんが、匿名ユーザーを指定するためにユーザー名を空の文字列として指定できます。空の文字列は任意のユーザー名と一致するため、事実上ワイルドカードとして機能します。

複数のユーザーテーブルレコードのホストとユーザーの値がクライアントと一致する場合、サーバーはどちらを使用するかを決定する必要があります。これを行うには、最も具体的なHost列とUser列の値を持つレコードを最初に並べ替え、並べ替えられたリストの最初に出現する一致するレコードを選択します。並べ替えは次のように行われます。

ホスト列に、などのリテラル値localhost127.0.0.1およびmyhost.example.comソート先のような値の%.example.com それらのパターンの文字を持っています。パターン値は、具体性に応じてソートされます。たとえば、%.example.comはよりも%.com具体的です%

[ユーザー]列では、空白でないユーザー名が空白のユーザー名よりも先にソートされます。つまり、非匿名ユーザーは匿名ユーザーよりも先にソートされます。

サーバーは、起動時にこのソートを実行します。許可テーブルをメモリに読み取り、並べ替え、メモリ内のコピーを使用してアクセス制御を行います。

この説明から、前述のようにソートされたグラントテーブルのメモリ内コピーがあるため、mysql.userテーブルの順序について心配する必要はありません。

ログイン方法に関しては、うまくいきましたmysql -u a。戻って再度ログインし、これらのコマンドを実行します

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

確認してください

  • すべてのユーザーはパスワードを持っています。
  • 匿名ユーザーはいません(ユーザーが空白の場合)

これは単なる推測に過ぎmysql -u aませんが、接続プロトコルが指定されていない場合、デフォルトではソケットファイルを介して接続するため、localhostを介して接続すると思われます。mysql.user匿名のlocalhost接続を許可するエントリが存在する場合があります。

このクエリを実行します。

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

パスワードなしで行を取得する場合、それは完全に理由を説明します mysq -u aます。

更新2012-01-19 11:12 EDT

Craig Efreinは興味深い質問を提起しました:mysql.userテーブルに2つの同一のユーザー名があり、1つはパスワードあり、もう1つはパスワードがない場合、MySQLはパスワードを使用しない場合に認証を拒否しますか?

この質問は、MySQLユーザー認証に関する優れたヘッズアップです。

mysql.userの主キーはhost、userであることに注意してください。他のインデックスはありません。これにより、ユーザー名の複数の出現が許可されます。出現ごとに異なるパスワードを設定することも、パスワードを設定しないこともできます。これにより、ユーザー 'dbuser'はパスワードなしでローカル(dbuser @ localhost)にログインでき、同じユーザーは 'pass1'などのパスワードで特定のネットブロック(dbuser@'10.1.2.20 ')内の別のサーバーからログインし、そのユーザーはログインできます「pass2」などのリモートパスワードを使用して、どこからでも(dbuser @ '%')リモートから。

MySQLが使用する認証アルゴリズムを考えると、パスワードの存在または不在のユーザーに制限はありません。

これが、MySQL 5.0認定スタディガイドの箇条書きの498段落6で、認証プロセスをクリーンアップする方法を示している理由です。

Unixの場合、MySQLにはmysql_secure_installationスクリプトが付属しており、インストールでいくつかの有用なセキュリティ関連の操作を実行できます。このスクリプトには次の機能があります。

  • ルートアカウントのパスワードを設定する
  • リモートアクセス可能なルートアカウントを削除します。
  • 匿名ユーザーアカウントを削除します。これにより、リモートホストからrootとしてMySQLサーバーに接続する可能性を防ぐため、セキュリティが向上します。その結果、rootとして接続したい人は誰でも最初にサーバーホストにログインできる必要があり、これは攻撃に対する追加の障壁となります。
  • テストデータベースを削除します(匿名アカウントを削除する場合、アクセスできるテストデータベースも削除することをお勧めします)。

はい、試しましたが、パスワードなしで行を返します。素晴らしい説明をありがとう、MySQL認定書をお勧めします。
ちょうど学習者

2
Rolando、mysql.userテーブルに2つの同一のユーザー名が存在する場合、1つはパスワードあり、もう1つはパスワードがない場合、MySQLはパスワードを使用しない場合に認証を拒否しますか?
クレイグエフレイン

@Craig-あなたの質問は非常に注目に値します。私はそれを答えに転送し、そこで対処します。
-RolandoMySQLDBA

詳細な回答をありがとう、私の場合、匿名ユーザーを何らかの形で構成しました。
SoWeLie

@RolandoMySQLDBA、認定スタディガイドのすべての情報は、MySQLオンラインマニュアルにすでに記載されていますか?
Pacerier

5

「%」ホストワイルドカードは「localhost」と一致しません。デフォルトでは、mysqlクライアントはtcp(通常は/var/lib/mysql/mysql.sockのような場所)ではなくソケットを介して接続しようとします。

許可を 'a' @ 'localhost'に変更するか、クライアントをTCPスタックで次のように動作させることができます。

mysql -u a -p --protocol=TCP

試しましたが、それでも運はありません。
ちょうど学習者

my.cnfこのパラメーターをもう必要としないためにこのオプションを構成する方法は?
shgnInc 14年

1
あなたはしません。-hホスト名を指定しない場合、「localhost」と見なされ、プロトコルフラグなしのTCPポートではなく、ソケットを探していることを意味します。すべての引数を入力するのにうんざりしている場合は、シェルエイリアスを設定できます。
atxdba 14年

2

MySQLが実際に3306でリッスンしていることを確認しましたか?netstat -tlpnを実行し、結果を提供します。3306が表示されない場合は、おそらくそうではありません。

ではmy.cnfのあなたは、--skip-ネットワークがコメントアウトされていることを確認する必要があります

[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

私も質問で尋ねたのと同じことをしました。また、あなたの答えであなたが言ったことをしましたが、まだ同じ問題があります。
アブドゥルマナフ

次のクエリの結果を提供できますか。mysql.userからユーザー、ホストを選択してください。
クレイグエフライン

はい、MySQLはポート3306でリッスンしています。編集をご覧ください。
ちょうど学習者

mysql -u user -p -h 127.0.0.1を試すこともできます。それがうまくいけば、localhostを解決する方法を知らないmysqlを信じています。/ etc / hostsファイルの127.0.0.1を指すlocalhostのエントリはそれを解決します。
クレイグエフライン

Flush Privilegesを実行しましたか?
クレイグエフライン

1

@atxdbaが説明したように、ソケット経由で接続しないリモートからmysqlデーモンを接続するには、TCP経由でリモートから接続する必要があります。

これには、--protocol=TCP各接続ごとに指定する必要があります。ただし、my.cnfサーバー上で設定できます。

[client]
protocol=tcp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.