Lỗi MySQL: Truy cập bị từ chối cho người dùng 'a' @ 'localhost' (sử dụng mật khẩu: CÓ)


22

Tôi sử dụng tài khoản root đã tạo tài khoản 'a'@'%'. Nhưng tôi không thể sử dụng tài khoản để kết nối với máy chủ MySQL khi tôi chỉ định tham số máy chủ. Tôi có thể kết nối thành công mà không cần -htham số. Xin vui lòng xem bảng điểm dưới đây. Tôi hy vọng ai đó có thể giúp tôi giải thích nó. Cảm ơn.

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> 

Chỉnh sửa:

Có, MySQL đang nghe trên cổng 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
Tôi không phải là chuyên gia về MySql, nhưng tôi đã gặp vấn đề này vài lần, tôi không biết lý do là gì, giải pháp được xác định rõ ràng về máy chủ cùng với 'a'@'%'. vì vậy, bản ghi đầu tiên là 'a'@'%', và bản thứ hai là 'a'@'localhost'.
com

Bạn có thể vui lòng kiểm tra điều tương tự với phiên bản mysql thấp hơn không ..?
Abdul Manaf

sử dụng chi tiết đăng nhập Cpanel để kết nối.
Abu Fahim

Trong trường hợp của tôi, tôi có ba tài khoản đồng nghĩa được tạo theo mặc định, xóa chúng sẽ giải quyết vấn đề này
Joaquín L. Robles

Câu trả lời:


26

Đây là một phương pháp nhanh và bẩn để kiểm tra cách MySQL thực hiện xác thực thành công.

Vui lòng chạy truy vấn này:

SELECT USER(),CURRENT_USER();

USER () báo cáo cách bạn đã cố xác thực trong mysqld

CURRENT_USER () báo cáo cách bạn được phép xác thực bởi mysqld

Đôi khi, USER()CURRENT_USER()khác nhau. Đó là bởi vì xác thực mysql tuân theo một giao thức cụ thể.

Theo Hướng dẫn nghiên cứu chứng chỉ MySQL 5.0

nhập mô tả hình ảnh ở đây

trang 486.487 nêu điều sau đây về thuật toán xác thực của mysql:

Có hai giai đoạn kiểm soát truy cập của khách hàng:

Trong giai đoạn đầu tiên, một khách hàng cố gắng kết nối và máy chủ chấp nhận hoặc từ chối kết nối. Để thử thành công, một số mục trong bảng người dùng phải khớp với máy chủ mà máy khách kết nối, tên người dùng và mật khẩu.

Trong giai đoạn thứ hai (chỉ xảy ra nếu máy khách đã kết nối thành công), máy chủ sẽ kiểm tra mọi truy vấn mà nó nhận được từ máy khách để xem liệu máy khách có đủ đặc quyền để thực hiện hay không.

Máy chủ khớp với máy khách với các mục trong bảng cấp dựa trên máy chủ mà máy khách kết nối và máy khách mà máy khách cung cấp. Tuy nhiên, có thể có nhiều hơn một bản ghi khớp:

Giá trị máy chủ trong bảng cấp có thể được chỉ định là mẫu chứa giá trị ký tự đại diện. Nếu một bảng cấp chứa các từ myhost.example.com, %.example.com, %.com, và %, tất cả trong số họ phù hợp với một khách hàng người nối từ myhost.example.com.

Các mẫu không được phép cho các giá trị Người dùng trong các mục trong bảng cấp, nhưng tên người dùng có thể được cung cấp dưới dạng một chuỗi trống để chỉ định người dùng ẩn danh. Chuỗi trống khớp với bất kỳ tên người dùng nào và do đó hoạt động hiệu quả như một ký tự đại diện.

Khi giá trị Máy chủ và Người dùng trong nhiều bản ghi bảng người dùng khớp với một máy khách, máy chủ phải quyết định sử dụng cái nào. Nó thực hiện điều này bằng cách sắp xếp các bản ghi với các giá trị cột Máy chủ và Người dùng cụ thể nhất trước tiên và chọn bản ghi khớp xảy ra đầu tiên trong danh sách được sắp xếp, Sắp xếp diễn ra như sau:

Trong cột Host, các giá trị văn chương như localhost, 127.0.0.1myhost.example.comloại trước các giá trị như %.example.com có nhân vật mô hình trong đó. Các giá trị mẫu được sắp xếp theo mức độ cụ thể của chúng. Ví dụ, %.example.comcụ thể hơn %.com, mà cụ thể hơn %.

Trong cột Người dùng, tên người dùng không trống sắp xếp trước tên người dùng trống. Đó là, người dùng không ẩn danh sắp xếp trước người dùng ẩn danh.

Máy chủ thực hiện việc sắp xếp này khi nó bắt đầu. Nó đọc các bảng cấp vào bộ nhớ, sắp xếp chúng và sử dụng các bản sao trong bộ nhớ để kiểm soát truy cập.

Từ mô tả này, bạn không cần phải lo lắng về thứ tự của các bảng mysql.user vì có một bản sao trong bộ nhớ của các bảng cấp được sắp xếp như đã đề cập trước đó.

Đối với cách bạn đăng nhập, chỉ mysql -u alàm việc. Quay lại và đăng nhập lại và chạy các lệnh này

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

Đảm bảo rằng

  • mỗi người dùng có một mật khẩu.
  • không có người dùng ẩn danh (khi người dùng trống)

Đây chỉ là dự đoán, nhưng tôi nghi ngờ mysql -u aviệc kết nối qua localhost vì khi giao thức kết nối không được chỉ định, mặc định là kết nối qua tệp socket. Có thể tồn tại một mục trong mysql.userđó cho phép kết nối localhost ẩn danh.

Chạy truy vấn này:

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

Nếu bạn lấy lại một hàng không có mật khẩu, điều đó giải thích đầy đủ lý do tại sao mysq -u ahoạt động.

CẬP NHẬT 2012-01-19 11:12 EDT

Craig Efrein đưa ra một câu hỏi thú vị: nếu tồn tại hai tên người dùng giống hệt nhau trong bảng mysql.user, một có mật khẩu và một không có, điều đó có nghĩa là MySQL từ chối xác thực khi không sử dụng mật khẩu?

Câu hỏi này là một cái đầu tuyệt vời về xác thực người dùng MySQL.

Xin lưu ý rằng khóa chính của mysql.user là máy chủ, người dùng. Không có chỉ số khác. Điều này cho phép nhiều lần xuất hiện của một tên người dùng. Mỗi lần xuất hiện có thể có một mật khẩu khác nhau hoặc không có mật khẩu. Điều này cho phép người dùng 'dbuser' đăng nhập cục bộ (dbuser @ localhost) mà không cần mật khẩu và cùng một người dùng đăng nhập từ một máy chủ khác trong một netblock cụ thể (dbuser@'10.1.2.20 ') với mật khẩu như' pass1 'và người dùng đó đăng nhập từ xa từ bất cứ đâu (dbuser @ '%') với mật khẩu từ xa như 'pass2'.

Với thuật toán xác thực mà MySQL sử dụng, không có hạn chế nào được đặt ra đối với người dùng có sự hiện diện hoặc vắng mặt của mật khẩu.

Đây là lý do tại sao Hướng dẫn nghiên cứu chứng chỉ MySQL 5.0 cho biết đoạn 6 trong đoạn đầu của nó đưa ra cách làm sạch quá trình xác thực:

Trên Unix, MySQL đi kèm với tập lệnh mysql_secure_installation có thể thực hiện một số hoạt động liên quan đến bảo mật hữu ích trong quá trình cài đặt của bạn. Kịch bản có các khả năng sau:

  • Đặt mật khẩu cho tài khoản root
  • Xóa mọi tài khoản root có thể truy cập từ xa.
  • Xóa tài khoản người dùng ẩn danh. Điều này cải thiện bảo mật vì nó ngăn chặn khả năng bất kỳ ai kết nối với máy chủ MySQL là root từ máy chủ từ xa. Kết quả là bất kỳ ai muốn kết nối với quyền root trước tiên phải có thể đăng nhập vào máy chủ, điều này cung cấp thêm một rào cản chống lại sự tấn công.
  • Xóa cơ sở dữ liệu kiểm tra (Nếu bạn xóa tài khoản ẩn danh, bạn cũng có thể muốn xóa cơ sở dữ liệu kiểm tra mà họ có quyền truy cập).

Có tôi đã thử, nó trả về một hàng không có mật khẩu. Cảm ơn lời giải thích tuyệt vời của bạn và đề nghị cuốn sách chứng nhận MySQL.
Chỉ là người học

2
Rolando, nếu có hai tên người dùng giống hệt nhau tồn tại trong bảng mysql.user, một tên có mật khẩu và một không có, điều đó có nghĩa là MySQL từ chối xác thực khi không sử dụng mật khẩu?
Craig Efrein

@Craig - Câu hỏi của bạn rất đáng chú ý. Tôi sẽ chuyển nó vào câu trả lời của tôi và giải quyết nó ở đó.
RolandoMySQLDBA

Cảm ơn bạn đã trả lời chi tiết, trong trường hợp của tôi, tôi đã có người dùng ẩn danh được cấu hình bằng cách nào đó.
SoweLie

@RolandoMySQLDBA, có thể tất cả các thông tin trong nghiên cứu hướng dẫn cấp giấy chứng nhận đã được tìm thấy trong MySQL trực tuyến thủ công?
Pacerier

5

Ký tự đại diện '%' không khớp với 'localhost'. Theo mặc định, máy khách mysql sẽ cố gắng kết nối qua một ổ cắm chứ không phải tcp (thường là một số nơi như /var/lib/mysql/mysql.sock).

Bạn có thể thay đổi cấp của bạn thành 'a' @ 'localhost' hoặc buộc máy khách hoạt động trên ngăn xếp TCP như:

mysql -u a -p --protocol=TCP

Tôi đã thử, nhưng vẫn không gặp may.
Chỉ là người học

Làm cách nào để định cấu hình tùy chọn này my.cnfđể không cần tham số này nữa?
shgnInc

1
Bạn không. Nếu bạn không chỉ định tên máy chủ -h, nó giả sử "localhost" có nghĩa là nó đang tìm kiếm một ổ cắm, không phải là cổng TCP với cờ giao thức. Bạn có thể thiết lập một aliase shell nếu bạn cảm thấy mệt mỏi khi phải gõ tất cả các đối số.
atxdba

2

Bạn đã kiểm tra để chắc chắn rằng MySQL thực sự đang nghe trên 3306 chưa? Chạy một netstat -tlpn và cung cấp kết quả. Nếu bạn không thấy 3306 thì có lẽ là không.

Trong my.cnf, bạn nên xác minh rằng --skip-mạng được nhận xét

[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

Tôi cũng làm như vậy trong câu hỏi. và cũng đã làm những gì bạn nói trong câu trả lời của bạn nhưng vẫn còn vấn đề tương tự.
Abdul Manaf

Bạn có thể cung cấp kết quả từ truy vấn sau: chọn người dùng, máy chủ lưu trữ từ mysql.user;
Craig Efrein

Có, MySQL đang nghe trên cổng 3306. Xem chỉnh sửa của tôi.
Chỉ là người học

Bạn cũng có thể muốn dùng thử mysql -u người dùng -p -h 127.0.0.1. Nếu nó hoạt động thì tôi tin rằng mysql của nó không biết cách giải quyết localhost. Một mục nhập cho localhost trỏ đến 127.0.0.1 trong tệp / etc / hosts của bạn sẽ giải quyết điều đó.
Craig Efrein

Bạn đã chạy Flush Đặc quyền?
Craig Efrein

1

Như @atxdba đã mô tả, Để kết nối daemon mysql từ xa không kết nối qua ổ cắm, do đó bạn cần kết nối từ xa qua TCP.

Đối với điều này, bạn nên chỉ định --protocol=TCPmỗi mỗi kết nối. Mặc dù, bạn có thể thiết lập nó my.cnftrên máy chủ:

[client]
protocol=tcp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.