วิธีการให้สิทธิ์การเข้าถึงระยะไกลไปยังเซิร์ฟเวอร์ mysql สำหรับผู้ใช้?


118

ถ้าฉันทำSHOW GRANTSในฐานข้อมูล mysql ฉันจะได้รับ

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' 
    IDENTIFIED BY PASSWORD 'some_characters' 
    WITH GRANT OPTION

หากฉันไม่เข้าใจผิดroot@localhostหมายความว่าผู้ใช้rootสามารถเข้าถึงเซิร์ฟเวอร์ได้จากlocalhost. ฉันจะแจ้งให้ MySQL rootอนุญาตให้เข้าถึงเซิร์ฟเวอร์ mysql นี้จากเครื่องอื่น ๆ (ในเครือข่ายเดียวกัน) ได้อย่างไร


6
การเปลี่ยนแปลงง่ายๆlocalhostเพื่อ%ให้สิทธิ์การเข้าถึงรูทไปยังเครือข่ายสาธารณะ อย่าลืมflush privileges;

6
การเพิ่มรูท @% ทำให้คุณมีความเสี่ยงมากและไม่ควรทำ ฉันรู้ว่านี่เป็นโพสต์เก่า แต่คำเตือนนั้นควรอยู่ที่นี่ บัญชีรูทเป็นบัญชีแรกที่กำหนดเป้าหมายโดยผู้โจมตีและ root @ '%' หมายถึงผู้ใช้รูทสามารถเชื่อมต่อกับบัญชี MySQL ของคุณได้จากทุกที่ที่ต้องการ มีความคิดเห็นมากเกินไปที่จะกล่าวถึง แต่คุณควรพยายามลบผู้ใช้ @ '%' ให้มากที่สุดเท่าที่จะเป็นไปได้และผู้ใช้ใด ๆ ที่ประกาศในนั้นควรมีสิทธิ์ที่ จำกัด มาก ไม่ว่าจะเป็นอย่างไรคุณไม่ควรเพิ่ม root @ '%' อย่างแน่นอนและแอปพลิเคชันของคุณไม่ควรคาดหวังว่าจะมีบัญชีนั้นด้วย
Damon


สวัสดีทุกคนควรลบสตริงรหัสผ่านสำหรับคำสั่งนี้ ... มันทำให้เกิดข้อผิดพลาด ... เพียงแค่จบด้วย IDENTIFIED BY แล้วรหัสผ่านเอง
Mário de Sá Vera

คำตอบ:


143

สิ่งนี้ให้สิทธิ์การเข้าถึงรูทด้วยรหัสผ่านเดียวกันจากเครื่องใดก็ได้ใน*.example.com:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%.example.com' 
    IDENTIFIED BY 'some_characters' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

หากการแก้ปัญหาชื่อใช้งานไม่ได้คุณอาจให้สิทธิ์การเข้าถึงโดย IP หรือซับเน็ต:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%'
    IDENTIFIED BY 'some_characters'  
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

GRANTเอกสารไวยากรณ์MySQL


15
ฉันคิดว่า...TO 'root'@'%' IDENTIFIED...จะให้สิทธิ์เข้าถึงจากทุกที่?
Aufwind

3
ฉันดำเนินการคำสั่งใน mysql แต่SHOW GRANTSยังคงแสดงเหมือนเดิม (เหมือนในคำถามของฉัน) FLUSH PRIVILGESฉันยังไม่ได้ทำ มีบางอย่างที่ฉันคิดถึง?
Aufwind

@Aufwind ฉันจะไม่เรียกร้องให้คุณต้องการอะไรอีกนอกจากFLUSH PRIVILEGESนี้ ออกจากระบบและกลับเข้ามาเริ่มบริการ mysqld ใหม่หากคุณสามารถเข้าถึงได้ นอกจากนี้ตรวจสอบให้แน่ใจskip networkingว่าไม่ได้เปิดใช้งานบรรทัดในของคุณmy.cnfแม้ว่าจะไม่ถือว่าคุณSHOW GRANTSยังคงไม่เหมือนเดิม
Michael Berkowski

@Aufwind ล้มเหลวคุณอาจต้องถามที่ ServerFault.com แทน
Michael Berkowski

10
โปรดทราบว่าIDENTIFIED BY PASSWORDมาพร้อมกับตัวเลขฐานสิบหก 41 หลักที่แฮช ใช้IDENTIFIED BY 'password'ถ้าคุณต้องการรวมรหัสผ่านโดยตรง
Rainulf

94

ลอง:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Pa55w0rd' WITH GRANT OPTION;

1
อืมสิ่งที่Pa55w0rdดูเหมือนโง่อย่าบอกฉันว่ารหัสผ่านที่คุณต้องการสร้าง สำหรับทุกคนที่พยายามเข้าสู่ระบบ mysql ของคุณ?
SSpoke

23
โดยทั่วไปจะใช้เพื่อให้รหัสผ่านเป็นตัวยึดตำแหน่งโดยพูดว่า "ใส่รหัสผ่านที่อ่านดีในที่นี้"
moshe beeri

2
คำสั่งนี้มีข้อแม้ตามปกติที่คุณต้องการใช้สำหรับแอปพลิเคชันที่ไม่ต้องกังวลเรื่องความปลอดภัยเช่น dev หรือ QA
einnocent

ถ้ามันไม่ทำงานบน mac ให้ลองเปลี่ยน 'root' @ '%' ด้วย 'root' @ 'localhost' หรือ / etc / hosts ชื่อของคอมพิวเตอร์ที่คุณให้สิทธิ์
moshe beeri

2
อย่าลืมเรียกใช้สิ่งนี้หลังจาก:FLUSH PRIVILEGES;
dane

44

คุณต้องทำตามขั้นตอนบางอย่างเพื่อให้แน่ใจว่า mysql แรกจากนั้นผู้ใช้รูทสามารถเข้าถึงได้จากภายนอก:

  1. ปิดการใช้งานskip-networkingในmy.cnf(เช่น: /etc/mysql/my.cnf)

  2. ตรวจสอบค่าของbind-addressในmy.cnfหากตั้งค่าเป็น127.0.0.1คุณสามารถเปลี่ยนเป็น0.0.0.0อนุญาตให้เข้าถึงจาก IP ทั้งหมดหรือ IP ใดก็ได้ที่คุณต้องการเชื่อมต่อ

  3. ให้สิทธิ์การเข้าถึงระยะไกลแก่ผู้ใช้ root จาก ip ใด ๆ (หรือระบุ ip ของคุณแทน%)

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
        IDENTIFIED BY 'your_root_password'
        WITH GRANT OPTION;
    FLUSH PRIVILEGES;`
  4. เริ่มบริการ mysql ใหม่:

    sudo service mysql restart

คุณต้องเปิดพอร์ต mysql 3306 จากไฟร์วอลล์มิฉะนั้นไคลเอนต์ระยะไกลจะไม่เชื่อมต่อ
David Okwii

เพียงแจ้งสั้น ๆ ในจุดที่ 2 จาก @Khashayar: 0.0.0.0 หมายถึงที่อยู่ IPv4 ใด ๆ * หมายถึงที่อยู่ใด ๆ ไม่ว่าจะเป็น IPv4 หรือ IPv6
Gustavo Pinsard

34
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'YOUR_PASS' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;  

*.* = DB.TABLE คุณสามารถ จำกัด ผู้ใช้เฉพาะฐานข้อมูลและตารางเฉพาะ

'root'@'%'คุณสามารถเปลี่ยนรูทด้วยผู้ใช้ที่คุณสร้างขึ้นและ% คืออนุญาต IP ทั้งหมด คุณสามารถ จำกัด ได้โดยเปลี่ยน% .168.1.1 ฯลฯ ด้วย


หากไม่สามารถแก้ไขได้ให้แก้ไข my.cnf หรือ my.ini และแสดงความคิดเห็นในบรรทัดเหล่านี้

bind-address = 127.0.0.1ถึง#bind-address = 127.0.0.1
และ
skip-networkingถึง#skip-networking

  • รีสตาร์ท MySQL และทำซ้ำขั้นตอนข้างต้นอีกครั้ง

Raspberry Pi ฉันพบการกำหนดค่าที่อยู่ผูกภายใต้ \etc\mysql\mariadb.conf.d\50-server.cnf


2
ตอบเฉพาะที่อธิบาย*.*และ'user'@'address'บางส่วนเท่านั้น ขอบคุณ! :)
ฟิลิปป์

การให้ทั้งหมดใน เชิญแฮกเกอร์เข้ามา
Rick James

นั่นคือเหตุผลที่ฉันอธิบาย *. *
Wasim A.

8

SQL เหล่านั้นให้สิทธิ์แก่ผู้อื่นที่ใช้ร่วมกันทำงาน หากคุณยังไม่สามารถเข้าถึงฐานข้อมูลอาจเป็นไปได้ว่าคุณมีข้อ จำกัด ของไฟร์วอลล์สำหรับพอร์ต ขึ้นอยู่กับประเภทเซิร์ฟเวอร์ของคุณ (และเราเตอร์ใด ๆ ที่อยู่ระหว่างนั้น) ว่าจะเปิดการเชื่อมต่ออย่างไร เปิดพอร์ต TCP 3306 ขาเข้าและกำหนดกฎการเข้าถึงที่คล้ายกันสำหรับเครื่องภายนอก (all / subnet / single IP / etc.)


4

เปิด/etc/mysql/mysql.conf.d/mysqld.cnfไฟล์และแสดงความคิดเห็นในบรรทัดต่อไปนี้:

#bind-address = 127.0.0.1

ทำงานบน Ubuntu 19.4
NgôVăn Thao

3

ในกรณีของฉันฉันพยายามเชื่อมต่อกับเซิร์ฟเวอร์ mysql ระยะไกลบนระบบปฏิบัติการ cent หลังจากผ่านการแก้ปัญหามากมาย (ให้สิทธิ์ทั้งหมดลบการผูก IP เปิดใช้งานเครือข่าย) ปัญหาก็ยังไม่ได้รับการแก้ไข

เมื่อปรากฎว่าในขณะที่มองหาวิธีแก้ปัญหาต่างๆฉันเจอ iptables ซึ่งทำให้ฉันรู้ว่า mysql port 3306 ไม่ยอมรับการเชื่อมต่อ

นี่คือบันทึกเล็ก ๆ เกี่ยวกับวิธีที่ฉันตรวจสอบและแก้ไขปัญหานี้

  • ตรวจสอบว่าพอร์ตยอมรับการเชื่อมต่อหรือไม่:
telnet (mysql เซิร์ฟเวอร์ ip) [portNo]

- การเพิ่มกฎตาราง ip เพื่ออนุญาตการเชื่อมต่อบนพอร์ต:

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ยอมรับ

- ไม่แนะนำสิ่งนี้สำหรับสภาพแวดล้อมการใช้งานจริง แต่หาก iptables ของคุณไม่ได้รับการกำหนดค่าอย่างเหมาะสมการเพิ่มกฎอาจยังไม่สามารถแก้ปัญหาได้ ในกรณีนี้ควรทำดังนี้:

iptables บริการหยุด

หวังว่านี่จะช่วยได้


3

สองขั้นตอน:

  1. ตั้งค่าผู้ใช้ด้วยสัญลักษณ์แทน:
    create user 'root'@'%' identified by 'some_characters'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD 'some_characters' WITH GRANT OPTION

  2. vim /etc/my.cnf
    เพิ่มสิ่งต่อไปนี้:
    bind-address=0.0.0.0

รีสตาร์ทเซิร์ฟเวอร์คุณไม่ควรมีปัญหาในการเชื่อมต่อ


ตามด้วยการรับ "ERROR 1827 (HY000): แฮชรหัสผ่านไม่มีรูปแบบที่ต้องการตรวจสอบว่ามีการใช้อัลกอริทึมรหัสผ่านที่ถูกต้องกับฟังก์ชัน PASSWORD () หรือไม่ คุณช่วยอธิบายได้ไหมว่าฉันผิดอะไรที่นี่?
lampShadesDrifter

2

โดย mysql 8 และเวอร์ชันที่ใหม่กว่าคุณไม่สามารถเพิ่มผู้ใช้ได้โดยให้สิทธิ์ หมายความว่าด้วยแบบสอบถามนี้:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'type-root-password-here' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

mysql จะส่งคืนข้อผิดพลาดนี้:

ข้อผิดพลาด 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณสำหรับไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้กับ 'ระบุรหัสผ่าน' รหัสผ่านที่เขียน 'ที่บรรทัด 1

ซึ่งหมายความว่าคุณไม่มีผู้ใช้รูทสำหรับโดเมน% ดังนั้นคุณต้องแทรกผู้ใช้ก่อนแล้วจึงให้สิทธิ์ดังนี้:

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

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

mysql> FLUSH PRIVILEGES;

อย่าลืมเปลี่ยนรหัสผ่านด้วยรหัสผ่านเฉพาะของคุณ


0

สิ่งนี้ได้ผลสำหรับฉัน แต่มีปัญหาแปลก ๆ ที่แม้แต่ฉันลองครั้งแรกก็ไม่ส่งผลกระทบ ฉันอัปเดตหน้า phpmyadmin และทำให้มันใช้งานได้

หากคุณต้องการเข้าถึง local-xampp-mysql คุณสามารถไปที่ xampp-shell -> เปิดพร้อมรับคำสั่ง

จากนั้น mysql -uroot -p --port = 3306 หรือ mysql -uroot -p (หากมีการตั้งรหัสผ่าน) หลังจากนั้นคุณสามารถให้ acces เหล่านั้นได้จาก mysql shell page (สามารถทำงานได้จาก localhost / phpmyadmin)

เพียงเพิ่มสิ่งเหล่านี้หากมีใครพบหัวข้อนี้และมีปัญหาสำหรับผู้เริ่มต้น


0

Ubuntu 18.04

ติดตั้งและตรวจสอบว่า mysqld us ทำงาน ..

ไปที่ฐานข้อมูลและตั้งค่าผู้ใช้รูท:

sudo mysql -u root
SELECT User,Host FROM mysql.user;
DROP USER 'root'@'localhost';
CREATE USER 'root'@'%' IDENTIFIED BY 'obamathelongleggedmacdaddy';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

แก้ไขสิทธิ์ mysqld และรีสตาร์ท:

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

# edit the line to be this:
bind-address=0.0.0.0

sudo systemctl stop mysql
sudo systemctl start mysql

จากเครื่องอื่นทดสอบ .. Obvs port (3306) บนเครื่อง mysqld ต้องอนุญาตการเชื่อมต่อจากเครื่องทดสอบ

mysql -u root -p -h 123.456.789.666

"การรักษาความปลอดภัย" เพิ่มเติมทั้งหมดของ MySql ไม่ได้ช่วยรักษาความปลอดภัยเลยเพียง แต่ซับซ้อนและทำให้สับสนตอนนี้ง่ายกว่าในสมัยก่อนที่คุณใช้รหัสผ่านที่ยาวมาก

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