การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'รูท' @ '%'


29

ฉันเคยเข้าถึงผู้ใช้รูทใน MySQL ได้ดี แต่เมื่อเร็ว ๆ นี้ฉันไม่สามารถ

ฉันสามารถเข้าสู่ระบบได้ดี:

 mysql -u root -p

นี่คือสถานะ mysql หลังจากเข้าสู่ระบบ:

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (i686) using readline 6.2

Connection id:      37
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.28-0ubuntu0.12.04.3 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         4 min 16 sec

Threads: 1  Questions: 112  Slow queries: 0  Opens: 191  
Flush tables: 1  Open tables:  6  Queries per second avg: 0.437
--------------

แต่เมื่อฉันต้องการที่จะดำเนินการใด ๆ เช่น:

mysql> CREATE DATABASE moyennegenerale;
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'moyennegenerale'

ฉันเข้าใจว่า%ใช้เพื่อระบุโฮสต์ใด ๆ แต่สถานะของฉันระบุ localhost อย่างชัดเจน ใครบางคนมีความคิดในสิ่งที่อาจเกิดขึ้น?

คำตอบ:


17

ฉันคิดว่าคุณมีผู้ใช้ที่ไม่ระบุชื่อ

ลองใช้สิ่งนี้:

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

สิ่งนี้จะแสดงสิ่งที่ผู้ใช้ที่ไม่ระบุชื่อ ส่วนใหญ่แล้วคุณจะเห็นบรรทัดที่มีผู้ใช้ว่างโฮสต์%และรหัสผ่านเปล่าดังที่แสดงด้านล่าง:

mysql> select user,host,password from mysql.user;
+-----------+-------------+-------------------------------------------+
| user      | host        | password                                  |
+-----------+-------------+-------------------------------------------+
| lwdba     | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | %           | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| vanilla   | localhost   |                                           |
| mywife    | %           |                                           |
|           | %           |                                           | <<<--- LOOK !!!
| replicant | 10.64.113.% | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| kumar     | %           |                                           |
+-----------+-------------+-------------------------------------------+

ดังนั้นคุณเข้าสู่ระบบได้อย่างไร เรียกใช้แบบสอบถามนี้:

SELECT USER(),CURRENT_USER();

สิ่งนี้บอกอะไรคุณ

  • USER ()รายงานว่าคุณพยายามตรวจสอบสิทธิ์ใน MySQL อย่างไร
  • CURRENT_USER ()รายงานว่าคุณได้รับอนุญาตให้ตรวจสอบสิทธิ์ใน MySQL ได้อย่างไร

ฟังก์ชั่นที่สองCURRENT_USER()แสดงให้เห็นว่าผู้ใช้ที่ไม่ระบุชื่อใดถูกใช้เพื่อเข้าสู่ระบบ

คุณมีสิทธิ์พิเศษอะไรเมื่อคุณลงชื่อเข้าใช้

กรุณาเรียกใช้

SHOW GRANTS;

สิ่งนี้จะเปิดเผยสิทธิ์พิเศษที่คุณมีเมื่อคุณล็อกอินความจริงที่ว่าคุณถูกบล็อกไม่ให้สร้างฐานข้อมูลจะแสดงว่าคุณไม่ได้รูท แต่เป็นผู้ใช้ที่มีสิทธิ์ต่ำกว่า

โปรดล้างข้อมูลผู้ใช้ของคุณ

สำหรับการรีเซ็ตรหัสผ่านรูทโปรดทำดังต่อไปนี้:

echo "SET PASSWORD FOR root@localhost=PASSWORD('password');" > /var/lib/mysql/rootpwd.sql
service mysql restart
rm -f /var/lib/mysql/rootpwd.sql

ผมได้เรียนรู้วิธีที่มีประสิทธิภาพจาก @ShlomiNoach

ให้มันลอง !!!


10

ฉันรู้ว่าคุณทำอะไร

ทำเช่นนี้:

SELECT `User`, `Grant_priv` FROM `mysql`.`user` WHERE `User` = 'root';

คุณอาจสังเกตว่ามันส่งคืน 'N' สำหรับ Grant_priv ดังนั้นทำสิ่งนี้:

UPDATE `mysql`.`user` SET `Grant_priv` = 'Y' WHERE `User` = 'root';
FLUSH PRIVILEGES;
SELECT `User`, `Grant_priv` FROM `mysql`.`user`;

และวาลลา! หวังว่าจะช่วย


นอกจากนี้เพื่อเหตุผลด้านความปลอดภัยคุณควรลบผู้ใช้รูทเสมอหลังจากสร้าง dba ใหม่ .. เพียงตรวจสอบให้แน่ใจว่าพวกเขาได้รับสิทธิ์ทั้งหมดแล้วในตอนท้ายด้วยตัวเลือก GRANT .. บิตนั้นสำคัญ
Kevin Florida

นี้รวมกับการปิดและเปิดการเชื่อมต่อใหม่ (ในกรณีของฉันจาก HeidiSQL) ได้หลอกลวง!
xorinzor

4

หลังจากที่คุณป้อนเป็นrootผู้ใช้ตรวจสอบสิทธิ์ของคุณ:

 mysql> show grants for 'root'@'localhost';

หลังจากตรวจสอบสิทธิ์ของคุณแล้วคุณสามารถลองมอบสิทธิ์ทั้งหมดให้กับผู้ใช้รายอื่นหรือคุณสามารถลองมอบrootสิทธิ์ทั้งหมดให้กับผู้ใช้อีกครั้ง:

 mysql> grant all privileges on *.* to 'root'@'localhost';

หากrootผู้ใช้ของคุณไม่มีสิทธิ์คุณสามารถลองกู้คืนได้ดังนั้น:

หยุดmysqldเซิร์ฟเวอร์

รีสตาร์ทเซิร์ฟเวอร์ด้วยวิธีนี้ mysqld_safe --skip-grant-table

กู้คืนrootสิทธิ์ด้วย:

 mysql> flush privileges;
 mysql> grant all privileges on *.* to 'root'@'localhost' with grant option;

นี่คือสิ่งที่ฉันได้รับหลังจากการแสดงมอบให้กับคำสั่ง 'root' @ 'localhost': ERROR 1141 (42000): ไม่มีการให้สิทธิ์ดังกล่าวสำหรับผู้ใช้ 'root' บนโฮสต์ 'localhost'

เอาต์พุตของคำสั่งที่สองคืออะไร

2
มีวิธี "ดีกว่า" ในการทำเช่นนี้ใน Debian ซึ่งคุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์ เช่นเดียวกับการrootเชื่อมต่อเป็นและใช้รหัสผ่านในdebian-sys-maint@localhost /etc/mysql/debian.cnfผู้ใช้นั้นมีสิทธิ์ทั้งหมดใน MySQL สิ่งที่ดีคือคุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์
Anders

ลองสิ่งนี้ sudo mysql --defaults-file = / etc / mysql / debian.cnf
Anders

0

สิทธิ์ของคุณอาจลดลง?

นอกจากนี้คุณสามารถลองสร้างบัญชีอื่นด้วยสิทธิ์ของรูทได้

และลบผู้ใช้รูทและสร้างใหม่ด้วยสิทธิ์ที่ระบุ

สิ่งนี้อาจมีประโยชน์: http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

C.5.4.1.2 - LINUX (สร้างไฟล์ด้วยคิวรีที่สร้างผู้ใช้ใหม่ที่มีสิทธิ์ใช้งานรูทแบบเต็ม)

C.5.4.1.1 - Windows (สร้างไฟล์ด้วยเคียวรีที่สร้างซึ่งเป็นผู้ใช้ใหม่ที่มีสิทธิ์ใช้งานรูทแบบเต็ม)

ข้อความค้นหา: (สร้างผู้ใช้รูท)

  CREATE USER 'new_root'@'%' IDENTIFIED BY '***';
  GRANT ALL PRIVILEGES ON *.* TO 'new_root'@'%' IDENTIFIED BY '***' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

คู่มือผู้ใช้ MySQL สร้างผู้ใช้: http://dev.mysql.com/doc/refman/5.5/en/adding-users.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.