การเข้าถึงรูทของ MySQL จากโฮสต์ทั้งหมด


152

ฉันติดตั้งเซิร์ฟเวอร์ MySQL บนเครื่อง Ubuntu ระยะไกลแล้ว rootผู้ใช้จะถูกกำหนดไว้ในmysql.userตารางด้วยวิธีนี้:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

ฉันสามารถเข้าถึงกับผู้ใช้rootจากอินเทอร์เฟซบรรทัดคำสั่งเครื่องระยะไกลเดียวกันโดยใช้mysqlไคลเอนต์มาตรฐาน ตอนนี้ฉันต้องการอนุญาตการเข้าถึงรูทจากทุกโฮสต์บนอินเทอร์เน็ตดังนั้นฉันจึงลองเพิ่มแถวต่อไปนี้ (ซึ่งเป็นสำเนาที่แน่นอนของแถวแรกจากการถ่ายโอนข้อมูลก่อนหน้านี้ยกเว้นhostคอลัมน์):

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

แต่ลูกค้าของฉันบนพีซีส่วนตัวของฉันยังคงบอกฉัน (ฉันบดบัง IP ของเซิร์ฟเวอร์):

ข้อผิดพลาดของ SQL (2003): ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ใน '46 .xxx '(10061)

ฉันไม่สามารถบอกได้ว่าเป็นข้อผิดพลาดการรับรองความถูกต้องหรือข้อผิดพลาดเครือข่าย บนไฟร์วอลล์ของเซิร์ฟเวอร์ฉันเปิดใช้งานพอร์ต3306 / TCPเป็น0.0.0.0/0และนั่นก็ใช้ได้สำหรับฉัน ...


คุณสามารถ telnet ไปยังเครื่องที่พอร์ต 3306
mihaisimi

3
เป็นไปได้ว่า MySQL daemon ไม่ฟังบน 46.xxx แต่ใช้กับ localhost เท่านั้น มองหาbind-addressใน my.cnf
Maxim Krizhanovsky

1
ดังนั้นโลก + สุนัขจึงมีแฮชของรหัสผ่านรูทของคุณความรู้ที่รูทสามารถเข้าถึงได้จากโฮสต์ใด ๆ บนอินเทอร์เน็ตและไบต์แรกของที่อยู่ IP ของคุณ คุณไม่คิดว่านี่เป็นเพียงเล็ก ๆ น้อย ๆเกี่ยวกับ bit?
eggyal

เป็นไปได้ที่ซ้ำกันของการเปิดใช้งานการเชื่อมต่อ MySQL ระยะไกล
ผู้ใช้

คำตอบ:


362

ในกระบวนการนั้นมีสองขั้นตอน:

a) ให้สิทธิ์ เมื่อผู้ใช้รูทดำเนินการแทน'password'ด้วยรหัสผ่านรูทปัจจุบันของคุณ:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

b) ผูกกับที่อยู่ทั้งหมด:

วิธีที่ง่ายที่สุดคือการแสดงความคิดเห็นออกมาในแนวของคุณmy.cnfไฟล์:

#bind-address = 127.0.0.1 

และเริ่ม mysql ใหม่

service mysql restart

โดยค่าเริ่มต้นมันผูกเฉพาะกับ localhost แต่ถ้าคุณแสดงความคิดเห็นบรรทัดมันผูกกับอินเตอร์เฟสทั้งหมดที่พบ bind-address=*แสดงความคิดเห็นออกบรรทัดเทียบเท่ากับ

ในการตรวจสอบว่าบริการ mysql ได้ถูกผูกมัดดำเนินการในฐานะรูท:

netstat -tupan | grep mysql

อัพเดทสำหรับ Ubuntu 16:

ไฟล์กำหนดค่าคือ (ตอนนี้)

/etc/mysql/mysql.conf.d/mysqld.cnf 

(อย่างน้อยในมาตรฐาน Ubuntu 16)


5
ตกลงปัญหาคือที่อยู่ที่มีผลผูกพัน ขอบคุณ. @Darhazer ขอบคุณด้วย :)
lorenzo-s

2
หากต้องการสอบถามเงินช่วยเหลือปัจจุบัน: `SHOW GRANTS สำหรับ 'root' @ '%';
robsch

5
ในการอนุญาตให้ root @% ให้การอนุญาตแก่ผู้ใช้รายอื่นทันทีหลังจากดำเนินการตามขั้นตอน (a): ให้การใช้งานบน *. * ถึง 'root' @ '%' ด้วยตัวเลือกการอนุญาต
Caleb

1
ไฟล์กำหนดค่าคือ (ตอนนี้) /etc/mysql/mysql.conf.d/mysqld.cnf (อย่างน้อยในมาตรฐาน Ubuntu 16)
jgp

2
ฉันเพียงแค่ต้องทำสิ่งนี้เพื่อให้สามารถเชื่อมต่อกับเซิร์ฟเวอร์จากระยะไกลได้:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

เรียกใช้แบบสอบถามต่อไปนี้:

use mysql;

update user set host='%' where host='localhost'

หมายเหตุ: ไม่แนะนำสำหรับการใช้งานจริง


2
นี่ไม่ใช่ทางออกที่สมบูรณ์แบบ มันอาจทำงานได้ สำหรับฉันมันทำให้เกิดข้อผิดพลาด: ข้อผิดพลาด 1,062 (23000): รายการซ้ำ '% -root' สำหรับคีย์ 'หลัก'
Scriptlabs

2
@Scriptlabs โอกาสที่จะมีมากกว่าหนึ่งรายการในตารางผู้ใช้ที่มีโฮสต์ของ 'localhost' และมากกว่าหนึ่งแถวที่มีรูตรวมถึง root.localhost, root.127.0.0.1, root.::1 ดังนั้นคุณจะดีกว่าการเพิ่มผู้ใช้แยกต่างหากแทนที่จะอัปเดตซึ่งเป็นเหตุผลที่ฉัน downvoting คำตอบนี้
Mike Purcell

4
ไม่ล้างสิทธิ์; ยังจำเป็นหลังจาก?
Nom1fan

1
มันใช้งานได้สำหรับฉัน ลองนี้ update mysql.user set host='%' where user='root'
nur zazin


7

MySQL 8.0 - ไคลเอนต์บรรทัดคำสั่งเปิด mysql ได้รับ
สิทธิ์ทั้งหมดบน *. * เป็น 'root' @ 'localhost';
ใช้ mysql
อัพเดท mysql.user SET host = '%' WHERE user = 'root';
เริ่มบริการ mysql ใหม่


4

MariaDB ทำงานบน Raspbian - ไฟล์ที่มี bind-address นั้นยากที่จะระบุ MariaDB มีข้อมูลบางอย่างที่ไม่ค่อยมีประโยชน์ในเรื่อง

ฉันใช้

# sudo grep -R bind-address /etc 

เพื่อค้นหาตำแหน่งของสิ่งที่น่ารังเกียจ

ฉันต้องตั้งค่าสิทธิ์และโฮสต์ใน mysql เหมือนทุกคนที่กล่าวถึงข้างต้น

และยังมีเวลาสนุกเปิดพอร์ต 3306 สำหรับการเชื่อมต่อระยะไกลกับ Raspberry Pi ของฉัน - ในที่สุดก็ใช้iptables- ถาวร iptables

ทั้งหมดใช้งานได้ดีในขณะนี้


1

หากคุณมีหลายเครือข่ายที่เชื่อมต่อกับระบบปฏิบัติการของคุณคุณต้องระบุเครือข่ายนี้ใน bind-addres จากไฟล์ my.conf ตัวอย่าง:

[mysqld]
bind-address = 127.100.10.234

ip นี้มาจากการกำหนดค่า ethX


1
กรุณาเพิ่มรายละเอียด แฟ้มหรือกรอบงานใดที่ต้องมีการตั้งค่า โปรดเจาะจงมากขึ้นเกี่ยวกับการกำหนดค่า ethX
BPS

1

ในกรณีของฉันการตั้งค่า "ที่อยู่ผูก" เป็นปัญหา ความคิดเห็นการตั้งค่านี้ในmy.cnfไม่ได้ช่วยเพราะในกรณีของฉัน mysql ตั้งค่าเริ่มต้นเป็น 127.0.0.1 ด้วยเหตุผลบางอย่าง

หากต้องการตรวจสอบการตั้งค่าที่ MySql ใช้อยู่ให้เปิดบรรทัดคำสั่งในกล่องท้องถิ่นของคุณ:

mysql -h localhost -u myname -pmypass mydb

อ่านการตั้งค่าปัจจุบัน:

Show variables where variable_name like "bind%"

คุณควรเห็น 0.0.0.0 ที่นี่หากคุณต้องการอนุญาตการเข้าถึงจากโฮสต์ทั้งหมด หากไม่ใช่กรณีนี้ให้แก้ไข/etc/mysql/my.cnfและตั้งค่าการผูกที่อยู่ใต้ส่วน [mysqld]:

bind-address=0.0.0.0

ในที่สุดรีสตาร์ทเซิร์ฟเวอร์ MySql ของคุณเพื่อรับการตั้งค่าใหม่:

sudo service mysql restart

ลองอีกครั้งและตรวจสอบว่ามีการตั้งค่าใหม่


-2

mysql_update คือสิ่งที่คุณต้องการ

ฉันไม่รู้ว่าทำไมทุกคนจะทำตามวิธีการที่ซับซ้อนมากขึ้นในการแก้ไขปัญหานี้เมื่อ MySql สร้างเครื่องมือที่ทำสิ่งนี้แล้ว ...

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