การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'test' @ 'localhost' (โดยใช้รหัสผ่าน: ใช่) ยกเว้นผู้ใช้รูท


103

ฉันประสบปัญหากับผู้ใช้ mysql ที่ไม่ใช่ root / admin ฉันกำลังทำตามขั้นตอนด้านล่างเพื่อสร้างผู้ใช้และสิทธิ์ของมันแก้ไขฉันหากฉันทำผิด

ผมติดตั้งmysqlในRHEL 5.7 64bitแพคเกจที่ระบุไว้ด้านล่างเมื่อฉันทำrpm installเรามี

  1. สร้าง mysql db โดยใช้mysql_install_dbแล้ว
  2. เริ่มบริการ mysql จากนั้น
  3. โดยใช้mysql_upgradeเรากำลังทำกับเซิร์ฟเวอร์

หลังจากกระบวนการนี้ฉันสามารถเข้าสู่ระบบได้rootแต่ด้วยผู้ใช้ที่ไม่ใช่รูทฉันไม่สามารถเข้าสู่เซิร์ฟเวอร์ได้:

[root@clustertest3 ~]# rpm -qa | grep MySQL
MySQL-client-advanced-5.5.21-1.rhel5
MySQL-server-advanced-5.5.21-1.rhel5


[root@clustertest3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[root@clustertest3 ~]# ls -ld /var/lib/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql 0 Nov  30 11:09 /var/lib/mysql/mysql.sock

mysql> CREATE USER 'golden'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON * . * TO 'golden'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT USER(),CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)

[root@clustertest3 ~]# mysql -ugolden -p
Enter password:
ERROR 1045 (28000): Access denied for user 'golden'@'localhost' (using password: YES)

นี่คือปัญหาที่ฉันกำลังเผชิญมีวิธีแก้ปัญหานี้หรือไม่?


คุณสามารถเข้าสู่ระบบในฐานะรูทแล้วทำได้หรือไม่SELECT * FROM mysql.user
Noam Rathaus

1
ยอมรับคำตอบที่เหมาะกับคุณเพื่อให้ผู้ใช้รายอื่นรู้ว่าคุณแก้ปัญหาของคุณอย่างไร
ReinstateMonica3167040

คำตอบ:


60

อย่าให้สิทธิ์ทั้งหมดในฐานข้อมูลทั้งหมดแก่ผู้ใช้ที่ไม่ใช่รูทมันไม่ปลอดภัย (และคุณมี "รูท" กับบทบาทนั้นอยู่แล้ว)

GRANT <privileges> ON database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

คำสั่งนี้สร้างผู้ใช้ใหม่และให้สิทธิ์ที่เลือก IE:

GRANT INSERT, SELECT, DELETE, UPDATE ON database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

ดูเอกสารเพื่อดูรายละเอียดสิทธิพิเศษทั้งหมด

แก้ไข: คุณสามารถค้นหาข้อมูลเพิ่มเติมด้วยคำค้นหานี้ (เข้าสู่ระบบในฐานะ "root"):

select Host, User from mysql.user;

เพื่อดูว่าเกิดอะไรขึ้น


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

38

หากคุณกำลังเชื่อมต่อกับ MySQL โดยใช้เครื่องระยะไกล (ตัวอย่างโต๊ะทำงาน) ฯลฯ ให้ใช้ขั้นตอนต่อไปนี้เพื่อกำจัดข้อผิดพลาดนี้บน OS ที่ติดตั้ง MySQL

mysql -u root -p

CREATE USER '<<username>>'@'%%' IDENTIFIED BY '<<password>>';
GRANT ALL PRIVILEGES ON * . * TO '<<username>>'@'%%';
FLUSH PRIVILEGES;

ลองลงชื่อเข้าใช้อินสแตนซ์ MYSQL
สิ่งนี้ได้ผลสำหรับฉันในการกำจัดข้อผิดพลาดนี้


1
แม้ว่าจะไม่ทำงานเนื่องจากจะแจ้งข้อผิดพลาดแม้ว่าจะเรียกใช้ "mysql -u root -p"
Marian Klühspies

26

ลอง:

CREATE USER 'golden'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'golden'@'localhost';
FLUSH PRIVILEGES;

หรือใช้งานได้ดียิ่งขึ้น: mysql_setpermissionเพื่อสร้างผู้ใช้


1
วิธีนี้ไม่สามารถแก้ปัญหาได้ สร้างผู้ใช้ 'goldy' @ '%' ระบุโดย 'some_pass'; เป็นคำถามที่ถูกต้อง
pratim_b

ด้วยเหตุผลบางอย่างที่เขา%ควรจะใช้ได้กับโฮสต์ทั้งหมดจึงไม่แก้ ดังนั้นโดยการระบุlocalhostควรใช้งานได้ ถ้าอยากทำงานว่ามีอะไรบางอย่างออกใน MySQL
โนม Rathaus

14

ดูเหมือนว่าคุณกำลังพยายามทำให้ผู้ใช้ 'ทอง' @ '%' แต่ผู้ใช้รายอื่นโดยใช้ชื่อ 'golden' @ 'localhost' กำลังเข้ามาขวางทาง / มีความสำคัญกว่า

ทำตามคำสั่งนี้เพื่อดูผู้ใช้:

SELECT user,host FROM mysql.user;

คุณควรเห็นสองรายการ:

1) ผู้ใช้ = ทองโฮสต์ =%

2) user = golden, host = localhost

ทำคำสั่งเหล่านี้:

DROP User 'golden'@'localhost';
DROP User 'golden'@'%';

รีสตาร์ท MySQL Workbench

จากนั้นทำคำสั่งเดิมของคุณอีกครั้ง:

CREATE USER 'golden'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'golden'@'%';

จากนั้นเมื่อคุณพยายามลงชื่อเข้าใช้ MySQL ให้พิมพ์ดังนี้:

ป้อนคำอธิบายภาพที่นี่

กด 'ทดสอบการเชื่อมต่อ' และป้อนรหัสผ่าน 'รหัสผ่าน'


2
นี่เป็นทางออกเดียวที่ฉันพบที่นี่ซึ่งมีความสำคัญ ขอบคุณที่ดีครับ
Sumuk Shashidhar

8

ก่อนอื่นฉันสร้างผู้ใช้โดยใช้:

CREATE user user@localhost IDENTIFIED BY 'password_txt';

หลังจาก Googling เห็นสิ่งนี้ฉันได้อัปเดตรหัสผ่านของผู้ใช้โดยใช้:

SET PASSWORD FOR 'user'@'localhost' = PASSWORD('password_txt');

และฉันสามารถเชื่อมต่อได้ในภายหลัง


3

สำหรับใครก็ตามที่ทำตามคำแนะนำทั้งหมด แต่ปัญหายังคงมีอยู่

ตรวจสอบขั้นตอนการจัดเก็บและดู DEFINERS ตัวกำหนดเหล่านั้นอาจไม่มีอยู่อีกต่อไป

ปัญหาของฉันปรากฏขึ้นเมื่อเราเปลี่ยนโฮสต์ตัวแทน (%) เป็น IP เฉพาะทำให้ฐานข้อมูลปลอดภัยมากขึ้น น่าเสียดายที่มีบางมุมมองที่ยังคงใช้ "user" @ "%" แม้ว่า "user" @ "172 .... " จะถูกต้องในทางเทคนิคก็ตาม


ขอบคุณที่พาฉันไปถูกทาง ฉันไม่รู้ด้วยซ้ำเกี่ยวกับการตั้งค่าความปลอดภัยของ SQL ในมุมมองและขั้นตอนที่จัดเก็บ ฉันลงเอยด้วยการตั้งค่าการรักษาความปลอดภัย SQL เป็น Invoker ในมุมมองของฉันเพื่อให้ใช้สิทธิ์ของผู้ใช้ที่ดำเนินการคำสั่งแทนที่จะเป็นผู้ใช้ที่สร้างมุมมอง นี่คือลิงค์สำหรับอ้างอิง: dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html
Justin

2

ฉันมีปัญหาที่คล้ายกันและในภายหลังฉันพบว่าเป็นเพราะฉันเปลี่ยนชื่อโฮสต์ของฉัน (ไม่ใช่localhost)

ดังนั้นฉันจึงได้รับการแก้ไขโดยระบุไฟล์ --host=127.0.0.1

mysql -p mydatabase --host=127.0.0.1

2

ตามวิธีการสร้างผู้ใช้ของคุณ MySQL ตีความลักษณะที่แตกต่างออกไป ตัวอย่างเช่นหากคุณสร้างผู้ใช้เช่นนี้:

create user user01 identified by 'test01';

MySQL คาดว่าคุณจะให้สิทธิพิเศษบางอย่างโดยใช้ไฟล์ grant all on <your_db>.* to user01;

อย่าลืม flush privileges;

แต่ถ้าคุณสร้างผู้ใช้แบบนั้น (โดยส่งที่อยู่ IP) คุณต้องเปลี่ยนเป็น:

create user 'user02'@'localhost' identified by 'teste02';

ดังนั้นเพื่อให้สิทธิพิเศษบางอย่างคุณต้องทำเช่นนั้น:

grant all on <your_db>.* to user02@localhost;
flush privileges;

2

ตรวจสอบให้แน่ใจว่าผู้ใช้มีรายการ localhost ในตารางผู้ใช้ นั่นคือปัญหาที่ฉันพบ EX:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

1

สำหรับการค้นหาที่น่ารำคาญมาที่นี่หลังจากค้นหาข้อความแสดงข้อผิดพลาดนี้:

การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'someuser @ ที่ไหนสักแห่ง' (ใช้รหัสผ่าน: ใช่)

ปัญหาสำหรับฉันไม่ได้ใส่รหัสผ่านในเครื่องหมายคำพูด เช่น. ฉันจำเป็นต้องใช้-p'password'แทน-ppassword


0

ในกรณีของฉันข้อผิดพลาดเดียวกันเกิดขึ้นเนื่องจากฉันพยายามใช้ mysql โดยพิมพ์ "mysql" แทน "mysql -u root -p"


0

เชื่อมต่อเซิร์ฟเวอร์ของคุณจาก mysqlworkbench และเรียกใช้คำสั่งนี้ -> แก้ไขผู้ใช้ 'root' @ 'localhost' ระบุโดย 'yourpassword';


-8

เพียงเพิ่มชื่อคอมพิวเตอร์แทน "localhost" ในชื่อโฮสต์หรือที่อยู่โฮสต์ MySQL

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