การเข้าถึง MySQL ปฏิเสธข้อผิดพลาดเมื่อเชื่อมต่อผ่านอุโมงค์ SSH


12

เป็นเวลาหลายเดือนที่ฉันเชื่อมต่อกับอินสแตนซ์ MySQL ที่ทำงานบนเซิร์ฟเวอร์ทดสอบในพื้นที่ของเราผ่านอุโมงค์ SSH โดยไม่มีปัญหาใด ๆ อย่างไรก็ตามในทันทีโดยที่ไม่มีการเปลี่ยนแปลงใด ๆ ที่ฉันคิดได้เซิร์ฟเวอร์ก็เริ่มปฏิเสธการพยายามเข้าสู่ระบบจาก Sequel Pro ด้วยข้อผิดพลาด:

ไม่สามารถเชื่อมต่อกับโฮสต์ 127.0.0.1 เนื่องจากการเข้าถึงถูกปฏิเสธ

ตรวจสอบชื่อผู้ใช้และรหัสผ่านอีกครั้งและตรวจสอบให้แน่ใจว่าอนุญาตการเข้าถึงจากตำแหน่งปัจจุบันของคุณ

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

ฉันสามารถเข้าสู่ระบบจากเทอร์มินัลเมื่อเชื่อมต่อโดยตรงกับเซิร์ฟเวอร์ผ่าน SSH ไม่ใช่ผ่านอุโมงค์ SSH ปัญหาไม่ได้เฉพาะกับ Sequel Pro หรือตัวฉันเองฉันได้รับข้อผิดพลาดเดียวกันเมื่อเชื่อมต่อผ่าน MySQL Workbench เช่นเดียวกับคนอื่น ๆ ในสำนักงาน ฉันได้รีเซ็ตรหัสผ่านด้วยmysqladminเหตุผลเพื่อความมีเหตุผลนั่นไม่ใช่ปัญหาแน่นอน

เมื่อฉันเริ่มดูมันมากขึ้นฉันสังเกตเห็นว่าข้อผิดพลาดได้รายงานว่าเซิร์ฟเวอร์เป็น "localhost" แทนที่จะเป็น "127.0.0.1" ซึ่งฉันป้อนใน Sequel Pro เพื่อนแนะนำว่านั่นอาจเป็นเพียงการจัดการข้อผิดพลาดที่ไม่ดี แต่ดูเหมือนว่าแปลกที่ให้ความแตกต่างอย่างมีนัยสำคัญระหว่าง localhost และ 127.0.0.1 ใน MySQL

ในความพยายามที่จะแก้ไขปัญหาอุโมงค์ฉันได้รับสิทธิ์เข้าถึง root @% เพื่อให้ฉันสามารถเชื่อมต่อได้โดยตรง ส่วนใหญ่ใช้งานได้ฉันสามารถดูข้อมูลตารางสร้างฐานข้อมูลใหม่ ฯลฯ ปัญหาเดียวคือเมื่อฉันมาเพื่อสร้างผู้ใช้ที่ฉันได้รับข้อผิดพลาด:

ปฏิเสธการเข้าถึงสำหรับผู้ใช้ 'root' @ '%' (ใช้รหัสผ่าน: YES)

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

ใครสามารถช่วยอธิบายเกี่ยวกับสาเหตุที่การเชื่อมต่อทันเนลและ (อาจ) คำสั่งให้ได้รับข้อผิดพลาดถูกปฏิเสธการเข้าถึง?

สำหรับการอ้างอิง MySQ เป็นรุ่น 5.6.16 โดยส่วนใหญ่เป็นการตั้งค่าเริ่มต้นติดตั้งผ่าน Homebrew บนเครื่อง MAC OS X Server

ปรับปรุง

นี่คือรายการของโฮสต์ที่รูทได้รับอนุญาตให้เข้าถึงบน:

mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

ตามที่ฉันเข้าใจแล้วแถวแรก ("%") ควรทำให้คนอื่นซ้ำซ้อนกันจริงหรือ

อัปเดต 2

แก้ไขปัญหาการให้สิทธิ์ ผู้ใช้ root @% ยังไม่ได้รับสิทธิ์ทั้งหมดด้วยส่วนเสริมwith grant optionในตอนท้ายดังนั้นจึงสามารถทำทุกอย่างยกเว้นให้สิทธิ์ ยังคงอยากรู้ว่าทำไมอุโมงค์ SSH ถึงถูกปฏิเสธ


ดังนั้นก่อนที่คุณจะสร้างบัญชี "%" คุณได้สร้าง "127.0.0.1" และ "localhost" และทั้งสองอย่างนี้ไม่ทำงานถูกต้องหรือไม่
Sverre

localhost ใช้งานได้จริงหากคุณอยู่บนโฮสต์ที่ถูกต้องดังนั้นในทางทฤษฎีแล้ว 127.0.0.1 เท่านั้น (เครือข่ายเทียบเท่ากับ localhost) ควรทำงานผ่านช่องสัญญาณ ssh ในยูนิกซ์เช่น OS อย่างน้อยที่สุด
Sverre

คำตอบ:


18

ใน MySQL localhostคำสำคัญถูกสงวนไว้สำหรับการเชื่อมต่อโดยใช้ซ็อกเก็ต MySQL และคุณควรใช้ที่อยู่ IP 127.0.0.1สำหรับการเชื่อมต่อ TCP ไปยังพอร์ตเครือข่าย MySQL ใน 127.0.0.1 ซึ่งหมายความว่าทั้งสองเซิร์ฟเวอร์ต้องให้สิทธิ์กับผู้ใช้งานจากเฉพาะ127.0.0.1, และลูกค้าจะต้องใช้-h 127.0.0.1ไปผ่านอุโมงค์แทนการเชื่อมต่อกับซ็อกเก็ตท้องถิ่น

ในการอนุญาตให้คุณเข้าถึงโดยใช้การส่งต่อพอร์ต SSH คุณต้องการ:

GRANT SELECT ON *.* TO user@`127.0.0.1`

จากนั้นเรียกใช้

FLUSH PRIVILEGES;

และอาจเป็นไปได้

FLUSH QUERY CACHE;

หากยังใช้งานไม่ได้ให้รีสตาร์ทกระบวนการเซิร์ฟเวอร์

ในข้อความข้อผิดพลาด 127.0.0.1 หลังจากการค้นหา DNS ย้อนกลับได้รับการแปลเพื่อlocalhostทำให้การแก้จุดบกพร่องยาก

ตามที่อธิบายในคู่มือ :

ใน Unix โปรแกรม MySQL จะปฏิบัติต่อ hosthost local ชื่อเป็นพิเศษในลักษณะที่แตกต่างจากสิ่งที่คุณคาดหวังเมื่อเปรียบเทียบกับโปรแกรมที่ใช้เครือข่ายอื่น ๆ สำหรับการเชื่อมต่อกับ localhost โปรแกรม MySQL พยายามเชื่อมต่อกับเซิร์ฟเวอร์ภายในโดยใช้ไฟล์ซ็อกเก็ต Unix สิ่งนี้เกิดขึ้นแม้ว่าจะมีการระบุตัวเลือก- -portหรือ-Pเพื่อระบุหมายเลขพอร์ต เพื่อให้แน่ใจว่าไคลเอนต์ทำการเชื่อมต่อ TCP / IP ไปยังเซิร์ฟเวอร์ภายในให้ใช้--hostหรือ-hเพื่อระบุค่าชื่อโฮสต์ของ127.0.0.1หรือที่อยู่ IP หรือชื่อของเซิร์ฟเวอร์ท้องถิ่น คุณยังสามารถระบุโปรโตคอลการเชื่อมต่ออย่างชัดเจนแม้กระทั่งสำหรับโฮสต์ในพื้นที่โดยใช้--protocol=TCPตัวเลือก ตัวอย่างเช่น:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

--protocolตัวเลือกที่ช่วยให้คุณสามารถสร้างประเภทใดประเภทหนึ่งของการเชื่อมต่อแม้ในขณะที่ตัวเลือกอื่น ๆ ตามปกติจะเริ่มต้นกับบางโปรโตคอลอื่น ๆ


2
อา! จากนั้นอธิบายว่าทำไมฉันเห็น localhost ในข้อความแสดงข้อผิดพลาดเมื่อฉันคาดว่าจะเห็น 127.0.0.1 ไม่น้อยไปกว่านี้ผู้ใช้รูทได้รับสิทธิ์ทั้งหมด @ 127.0.0.1 แต่ฉันยังคงได้รับข้อผิดพลาดถูกปฏิเสธการเข้าถึงเมื่อเชื่อมต่อผ่านอุโมงค์ SSH คำสั่งที่แน่นอนฉันวิ่งคือ:grant all on *.* to 'root'@'127.0.0.1' with grant option;
อดัม

ฉันมีปัญหานี้และเห็นได้ชัดว่าเป็นปัญหาของโฮสต์และซ็อกเก็ต เมื่อฉันพิมพ์ssh -h 127.0.0.1 -u root -pจากระยะไกลบนเซิร์ฟเวอร์การเชื่อมต่อจะถูกปฏิเสธ
fuzzyTew

ฉันแก้ไขการ-h 127.0.0.1เชื่อมต่อที่ล้มเหลวบนเซิร์ฟเวอร์โดยการรีบูท mysql แต่ซ็อกเก็ต ssh ยังคงไม่ทำงาน
fuzzyTew

ไปเลย. 1. เซิร์ฟเวอร์ต้องให้สิทธิ์กับ @ 127.0.0.1 สิ่งนี้ไม่ได้ใช้สำหรับฉันจนกว่าฉันจะรีบูตเซิร์ฟเวอร์ 2. การเชื่อมต่อโลคอลต้องเป็น 127.0.0.1 ไม่ใช่โลคัลโฮสต์เพื่อให้ทันเนลใช้แทนโลคัลซ็อกเก็ต
fuzzyTew

1

ฉันเคยเห็นในอดีตด้วย ssh tunels ว่ามีความแตกต่างระหว่าง Grant all to "localhost" และให้ทั้งหมดเป็น "127.0.0.1" ดังนั้นลองให้สิทธิ์เป็น "127.0.0.1 แทนหรือเพิ่มเติมจาก" localhost "ของคุณ


หรือตรงข้ามในกรณีของคุณดูเหมือนว่า
Sverre

ขอบคุณฉันได้อัปเดตคำถามเพื่อรวมรายการโฮสต์รากไว้แล้ว ฉันพบว่ามันแปลกที่แม้จะป้อน "127.0.0.1" เป็นเซิร์ฟเวอร์ MySQL ใน Sequel Pro แต่ข้อผิดพลาดของ MySQL ได้รายงานว่าเป็น "localhost" ฉันไม่คิดว่านี่เป็นปัญหา
อดัม

คุณมีรหัสผ่านสำหรับผู้ใช้ที่แตกต่างกันทั้งหมดหรือไม่ นอกจากนี้เมื่อคุณเชื่อมต่อกับ mysql เหนืออุโมงค์สิ่งที่เป็นไวยากรณ์ที่คุณใช้จริง?
Sverre

มีข้อ จำกัด ใด ๆ เกี่ยวกับผู้ใช้รูทในการตั้งค่า mysql ของคุณหรือไม่?
Sverre

เพียงรันgrantคำสั่งอีกครั้งด้วยidentified by ..เพื่อให้แน่ใจว่ารหัสผ่านรูททั้งหมดเหมือนกัน แต่ไม่มีความสุข
อดัม

0

แทนที่จะใช้ภาคต่อของการสร้างอุโมงค์คุณจะสร้างอุโมงค์ด้วยตัวเองอย่างไร?

ssh -Cc blowfish -Nf -vv -L3306: localhost: 3306 sshuser @ domain

จากนั้นเชื่อมต่อกับผลสืบเนื่องไปที่ 127.0.0.1:3306 คุณเชื่อมต่อได้ไหม? มีอะไรปรากฏบนเทอร์มินัลของคุณ (หรือบันทึกลูกค้า ssh)?

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