การเปลี่ยนการอนุญาตโฮสต์สำหรับผู้ใช้ MySQL


43

ฉันมีเงินช่วยเหลือต่อไปนี้สำหรับผู้ใช้ / ฐานข้อมูล

mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost                                             |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost'              |
+---------------------------------------------------------------------------+

เพื่อให้สามารถเข้าถึงภายนอกไปยังฐานข้อมูลที่ฉันจำเป็นต้องเปลี่ยนแปลง localhost %ไป วิธีหนึ่งในการทำเช่นนี้คือการREVOKEอนุญาตทั้งหมดและตั้งค่าอีกครั้ง ปัญหาคือมีชุดรหัสผ่านที่ฉันไม่ทราบดังนั้นหากฉันเพิกถอนการอนุญาตฉันไม่สามารถตั้งค่ากลับคืนได้

มีวิธีการเปลี่ยนชื่อโฮสต์localhostเป็น%(และกลับมาอีกครั้ง) โดยไม่เพิกถอนสิทธิ์หรือไม่

คำตอบ:


58

หากคุณสามารถเข้าถึงmysqlฐานข้อมูลคุณสามารถเปลี่ยนตารางการอนุญาตโดยตรง:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

... และเงื่อนไขแบบอะนาUPDATEล็อกเพื่อเปลี่ยนกลับ

นอกจากนี้คุณอาจต้องทำการเปลี่ยนแปลงmysql.dbตารางเช่นกัน:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';

แก้ไขเล็กน้อย (เวอร์ชั่นเซิร์ฟเวอร์ mysql: 5.7.5-m15 - เซิร์ฟเวอร์ชุมชน MySQL): ทั้งจาก phpmyadmin และพรอมต์คำสั่ง mysql - อัปmysqlเดต userSET Host= 'localhost' userWHERE Host= '%' userและ User= 'XXXdbusr';
Jadeye

1
สำหรับฐานข้อมูลการผลิตฉันจะระวังด้วย% อาจเป็นความเสี่ยงด้านความปลอดภัย หากคุณมีเว็บเซิร์ฟเวอร์หลายแห่งคุณสามารถใช้โฮสต์ที่มีสัญลักษณ์แทนเช่น '192.168.0.%' หรือ ''% .example.com '' อีกทางเลือกหนึ่งคือการเพิ่มผู้ใช้เดียวกันหลายครั้งสำหรับแต่ละโฮสต์หรือสร้างผู้ใช้ที่มีชื่อแยกต่างหากต่อเว็บเซิร์ฟเวอร์
Fx32

ถ้าเช่นฉันพยายามอนุญาตให้เข้าถึงรูทบนเครื่องทดสอบเฉพาะที่ (RasPi ในกรณีของฉัน) สิ่งนี้จะไม่ทำงานตั้งแต่ MySQL 5.7 ดูกระทู้นี้
ราอูลปินโต

@RaulPinto: กระทู้นั้นดูเหมือนจะเกี่ยวกับ phpMyAdmin ซึ่งไม่เกี่ยวข้องกันโดยสิ้นเชิงที่นี่ แต่ก็เป็นสิ่งที่ดีสำหรับผู้ที่ใช้งานเท่านั้น
nickgrim

ดีกว่าที่จะใช้คำสั่งที่มีเอกสารอย่างดีRENAME USER
Antonio Bardazzi

6

คำตอบที่ดีที่สุดเกี่ยวกับStackoverflowแนะนำให้ใช้RENAME USERซึ่งคัดลอกสิทธิ์ผู้ใช้

การใช้ Data Control Language (ข้อความสั่งเป็น GRANT, REVOKE, RENAME และอื่น ๆ ) ไม่ต้องการFLUSH PRIVILEGES;และจำเป็นในสถาปัตยกรรมเช่น Galera หรือการจำลองแบบกลุ่มที่ตาราง MyISAM ไม่ถูกจำลองแบบ


2

ฉันเจอปัญหานี้เช่นกันและโซลูชันที่เสนอไม่ทำงานเนื่องจากสิทธิ์เฉพาะฐานข้อมูลจะไม่ถูกย้ายเช่นกัน ฉันทำอะไรไป:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

และ "มัน" ทำงานได้หรือไม่
Pierre.Vriens

1

หากต้องการเปลี่ยนสิทธิ์อันดับแรกให้ยกเลิกสิทธิ์ทั้งหมดให้กับผู้ใช้ก่อน

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;

นั่นคือปัญหาของฉันฉันไม่สามารถเพิกถอนการอนุญาตได้เนื่องจากรหัสผ่าน โปรดอ่านคำถามของฉัน
Fu86

คุณสามารถตั้งค่าแฮชรหัสผ่านให้เหมือนกับรหัสผ่านเก่าได้ผ่านการอัปเดต คุณไม่จำเป็นต้องรู้รหัสผ่านจริงเพื่อดำเนินการ
drogart

0

ไม่มีตารางจำนวนมากหากคุณมีสิทธิ์อื่นนอกเหนือจาก db (เช่นตารางหรือคอลัมน์เป็นต้น) คุณอาจต้องอัปเดตตารางเหล่านี้ทั้งหมดหรือบางส่วนทั้งนี้ขึ้นอยู่กับสิ่งที่ให้ผู้ใช้ของคุณ:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.