it-swarm.asia

خطأ MySQL: تم رفض الوصول للمستخدم "@" localhost "(باستخدام كلمة المرور: نعم)

يمكنني استخدام الحساب الجذر إنشاء الحساب 'a'@'%'. ولكن لا يمكنني استخدام الحساب للاتصال بخادم 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 [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> 

تعديل:

نعم ، يستمع MySQL على المنفذ 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

فيما يلي طريقة سريعة وقذرة للتحقق من كيفية إجراء MySQL للمصادقة الناجحة.

الرجاء تشغيل هذا الاستعلام:

SELECT USER(),CURRENT_USER();

SER () يبين كيف حاولت المصادقة في mysqld

CURRENT_USER () تبلغ عن كيفية السماح لك بالمصادقة بواسطة mysqld

في بعض الأحيان ، تختلف USER() و CURRENT_USER(). ذلك لأن مصادقة mysql تتبع بروتوكول specfic.

وفقًا لـ دليل دراسة شهادة MySQL 5.0

enter image description here

تذكر صفحات 486،487 ما يلي في خوارزمية مصادقة الخلية:

هناك مرحلتان من التحكم في وصول العميل:

في المرحلة الأولى ، يحاول العميل الاتصال ويقبل الخادم الاتصال أو يرفضه. لمحاولة النجاح ، يجب أن يتطابق بعض الإدخال في جدول المستخدم مع المضيف الذي يتصل به العميل واسم المستخدم وكلمة المرور.

في المرحلة الثانية (التي تحدث فقط إذا كان العميل قد اتصل بالفعل بنجاح) ، يتحقق الخادم من كل استعلام يستلمه من العميل لمعرفة ما إذا كان العميل لديه امتيازات كافية لتنفيذه.

يطابق الخادم العميل مقابل الإدخالات في جداول المنح بناءً على المضيف الذي يتصل به العميل والمستخدم الذي يقدمه العميل. ومع ذلك ، من الممكن أن يتطابق أكثر من سجل واحد:

يمكن تحديد قيم المضيف في جداول المنح حيث تحتوي الأنماط على قيم أحرف البدل. إذا كان جدول المنح يحتوي على إدخالات من myhost.example.com و %.example.com و %.com و % ، فستتطابق جميعها مع عميل يتصل من myhost.example.com.

لا يُسمح باستخدام الأنماط لقيم المستخدم في إدخالات جدول المنح ، ولكن يمكن إعطاء اسم مستخدم كسلسلة فارغة لتحديد مستخدم مجهول. تتطابق السلسلة الفارغة مع أي اسم مستخدم ، وبالتالي تعمل بشكل فعال كحرف بدل.

عندما تتطابق قيم المضيف والمستخدم في أكثر من سجل جدول مستخدم واحد مع العميل ، يجب أن يقرر الخادم أيهما سيستخدم. يتم ذلك عن طريق فرز السجلات بأكثر قيم أعمدة المضيف والمستخدم تحديدًا أولاً ، واختيار السجل المطابق الذي يحدث أولاً في القائمة التي تم فرزها ، ويتم التصنيف على النحو التالي:

في العمود المضيف ، يتم ترتيب القيم الحرفية مثل localhost و 127.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 بالاتصال عبر مضيف محلي لأنه عندما لم يتم تحديد بروتوكول الاتصال ، يكون الافتراضي هو الاتصال عبر ملف المقبس. قد يكون هناك إدخال في mysql.user يسمح باتصال مضيف محلي مجهول.

قم بتشغيل هذا الاستعلام:

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

إذا عدت إلى صف بدون كلمة مرور ، فهذا يفسر تمامًا سبب عمل mysq -u a.

تحديث 2012-01-19 11:12 بتوقيت شرق الولايات المتحدة

Craig Efrein طرح سؤالًا مثيرًا للاهتمام: في حالة وجود اسمين متطابقين في جدول mysql.user ، أحدهما بكلمة مرور والآخر بدون ، هل يعني ذلك أن MySQL يرفض المصادقة عند عدم استخدام كلمة مرور؟

هذا السؤال ممتاز حول مصادقة مستخدم MySQL.

يرجى ملاحظة أن المفتاح الأساسي لـ mysql.user هو Host ، user. لا توجد فهارس أخرى. هذا يسمح بتكرار اسم المستخدم. يمكن أن يكون لكل تكرار كلمة مرور مختلفة أو لا توجد كلمة مرور. يسمح هذا للمستخدم "dbuser" بتسجيل الدخول محليًا (dbuser @ localhost) باستخدام كلمة مرور ونفس تسجيل دخول المستخدم من خادم آخر ضمن netblock ([email protected]'10.1.2.20 ') باستخدام كلمة مرور مثل "pass1" وهذا المستخدم لتسجيل الدخول عن بعد من أي مكان (dbuser @ '٪') بكلمة مرور بعيدة مثل "pass2".

بالنظر إلى خوارزمية المصادقة التي يستخدمها MySQL ، لا توجد قيود مفروضة على المستخدمين بوجود أو عدم وجود كلمة مرور.

لهذا السبب دليل دراسة شهادة MySQL 5.0 يقول في الصفحة 498 الفقرة 6 في نقاطها تبرز كيفية تنظيف عملية المصادقة :

على Unix ، يأتي MySQL مع نص برمجي mysql_secure_installation يمكنه تنفيذ العديد من العمليات المفيدة المتعلقة بالأمان على التثبيت. يحتوي البرنامج النصي على القدرات التالية:

  • قم بتعيين كلمة مرور للحسابات الجذر
  • قم بإزالة أي حسابات جذر يمكن الوصول إليها عن بعد.
  • إزالة حسابات المستخدمين المجهولين. يؤدي ذلك إلى تحسين الأمان لأنه يمنع إمكانية اتصال أي شخص بخادم MySQL كجذر من مضيف بعيد. النتائج هي أنه يجب على أي شخص يريد الاتصال كجذر أولاً أن يكون قادرًا على تسجيل الدخول على الخادم المضيف ، مما يوفر حاجزًا إضافيًا ضد الهجوم.
  • قم بإزالة قاعدة بيانات الاختبار (إذا قمت بإزالة الحسابات المجهولة ، فقد ترغب أيضًا في إزالة قاعدة بيانات الاختبار التي يمكنهم الوصول إليها).
27
RolandoMySQLDBA

لا يتطابق حرف بدل المضيف '٪' مع 'localhost'. بشكل افتراضي ، سيحاول عميل mysql الاتصال عبر مقبس بدلاً من TCP (عادةً ما يكون مكانًا مثل /var/lib/mysql/mysql.sock).

يمكنك إما تغيير المنحة الخاصة بك إلى 'a' @ 'localhost' ، أو إجبار العميل على العمل على المكدس TCP المكدس مثل:

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

هل تحققت للتأكد من أن MySQL يستمع بالفعل على 3306؟ تشغيل netstat -tlpn وتقديم النتائج. إذا كنت لا ترى 3306 فمن المحتمل ألا يكون كذلك.

في my.cnf يجب عليك التحقق من أنه تم التعليق على - skip-network

[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

كما هو موضح فيatxdba ، لربط برنامج mysql daemon من جهاز التحكم عن بعد والذي لا يتم توصيله عبر المقبس ، فأنت بحاجة إلى الاتصال من جهاز التحكم عن بعد عبر TCP.

لهذا ، يجب عليك تحديد --protocol=TCP لكل اتصالات. على الرغم من أنه يمكنك ضبطه في my.cnf على الخادم:

[client]
protocol=tcp
1
shgnInc