ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home เชื่อมต่อฐานข้อมูลบนเซิร์ฟเวอร์ผ่าน SSH Tunnel ด้วย DBeaver

เชื่อมต่อฐานข้อมูลบนเซิร์ฟเวอร์ผ่าน SSH Tunnel ด้วย DBeaver

การเปิดพอร์ตฐานข้อมูล (MySQL 3306 หรือ PostgreSQL 5432) สู่อินเทอร์เน็ตเพียงเพื่อให้ผู้ดูแลเปิดดูข้อมูลด้วยโปรแกรมบนเครื่องตัวเอง เพิ่มความเสี่ยงโดยไม่จำเป็น วิธีที่ปลอดภัยกว่าคือ SSH Tunnel ซึ่งให้โปรแกรมบนเครื่องของคุณส่งการเชื่อมต่อผ่าน SSH ที่เข้ารหัสไปยังเซิร์ฟเวอร์ แล้วเชื่อมต่อฐานข้อมูลที่ localhost ของเซิร์ฟเวอร์อีกที ฐานข้อมูลจึงยังฟังเฉพาะภายในเครื่องได้ตามเดิม

บทความนี้ใช้ DBeaver Community ซึ่งเป็นโปรแกรมฟรีที่ใช้ได้บน Windows, macOS และ Linux รองรับทั้ง MySQL, MariaDB และ PostgreSQL ในโปรแกรมเดียว และมีฟีเจอร์ SSH Tunnel ในตัว

สิ่งที่ต้องเตรียม

หลักการทำงานของ SSH Tunnel

เส้นทางของข้อมูลเป็นดังนี้: DBeaver บนเครื่องคุณ เปิดพอร์ตชั่วคราวบนเครื่องตัวเอง ส่งข้อมูลผ่าน SSH ไปยัง 203.0.113.10:22 จากนั้น SSH Server บนเซิร์ฟเวอร์ส่งต่อไปยัง 127.0.0.1:3306 หรือ 127.0.0.1:5432 ดังนั้นในหน้าตั้งค่าการเชื่อมต่อฐานข้อมูล ค่า Host ต้องเป็นที่อยู่ของฐานข้อมูล เมื่อมองจากเซิร์ฟเวอร์ ซึ่งก็คือ localhost ไม่ใช่ IP สาธารณะ จุดนี้เป็นสาเหตุของความสับสนที่พบบ่อยที่สุด

ขั้นตอนที่ 1: ตรวจสอบฝั่งเซิร์ฟเวอร์

SSH เข้าเซิร์ฟเวอร์ แล้วตรวจว่าฐานข้อมูลฟังพอร์ตอยู่ที่ localhost

sudo ss -ltnp | grep -E ':3306|:5432'

ควรเห็นบรรทัดเช่น 127.0.0.1:3306 จากนั้นตรวจว่า SSH Server อนุญาต TCP Forwarding (ค่าเริ่มต้นคือ yes แต่เซิร์ฟเวอร์ที่ผ่านการ Hardening อาจปิดไว้)

sudo sshd -T | grep -i allowtcpforwarding

ถ้าได้ allowtcpforwarding no ต้องแก้ใน /etc/ssh/sshd_config หรือไฟล์ใน /etc/ssh/sshd_config.d/ ให้เป็น yes ก่อน ขณะแก้ค่า SSH ให้เปิด Session เดิมค้างไว้เสมอ แล้วทดสอบเข้าจากหน้าต่างใหม่ก่อนปิด Session เดิม เพื่อไม่ให้ล็อกตัวเองออกจากเซิร์ฟเวอร์

สุดท้ายทดสอบว่าผู้ใช้ฐานข้อมูลเข้าผ่าน TCP ภายในเครื่องได้ เพราะ Tunnel จะเข้ามาทาง TCP ไม่ใช่ Socket

# MySQL / MariaDB
mysql -h 127.0.0.1 -P 3306 -u shopuser -p shopdb
# PostgreSQL
psql -h 127.0.0.1 -U appuser -d appdb

ขั้นตอนที่ 2: สร้างการเชื่อมต่อใหม่ใน DBeaver

  1. เปิด DBeaver คลิกเมนู Database แล้วเลือก New Database Connection (หรือไอคอนปลั๊กที่มุมซ้ายบน)
  2. เลือกชนิดฐานข้อมูล MySQL, MariaDB หรือ PostgreSQL แล้วกด Next
  3. ในแท็บ Main กรอกข้อมูลฐานข้อมูลเมื่อมองจากเซิร์ฟเวอร์:
    • Server Host: localhost (หรือ 127.0.0.1)
    • Port: 3306 สำหรับ MySQL/MariaDB หรือ 5432 สำหรับ PostgreSQL
    • Database: shopdb
    • Username และ Password: ผู้ใช้ฐานข้อมูล ไม่ใช่ผู้ใช้ SSH

ขั้นตอนที่ 3: ตั้งค่า SSH Tunnel

  1. ในหน้าต่างเดียวกัน ไปที่แท็บ SSH (บางรุ่นอยู่ในกลุ่ม Network configs หรือกดปุ่ม SSH ที่ด้านล่างของหน้า Main ชื่อและตำแหน่งอาจต่างกันเล็กน้อยตามเวอร์ชัน)
  2. เลือก Use SSH Tunnel
  3. Host/IP: 203.0.113.10 และ Port: 22 (หรือพอร์ตที่เปลี่ยนไว้ตาม วิธีเปลี่ยน SSH Port บน Linux Server)
  4. User Name: deploy
  5. Authentication Method: เลือก Public Key แล้วเลือกไฟล์ Private Key ในช่อง Private key (เช่น ~/.ssh/id_ed25519 หรือ C:\Users\ชื่อผู้ใช้\.ssh\id_ed25519) และใส่ Passphrase ถ้ามี หรือเลือก Password ถ้าเซิร์ฟเวอร์ยังใช้รหัสผ่าน
  6. กดปุ่ม Test tunnel configuration ถ้าสำเร็จจะมีข้อความยืนยันว่าเชื่อมต่อ SSH ได้

ไม่จำเป็นต้องระบุ Local port ปล่อยว่างไว้ DBeaver จะเลือกพอร์ตว่างบนเครื่องให้อัตโนมัติ

ขั้นตอนที่ 4: ทดสอบและบันทึกการเชื่อมต่อ

  1. กดปุ่ม Test Connection ด้านล่าง ครั้งแรก DBeaver จะขอดาวน์โหลด Driver ของฐานข้อมูล ให้กด Download
  2. ถ้าสำเร็จจะแสดงหน้าต่าง Connected พร้อมเวอร์ชันของฐานข้อมูล
  3. กด Finish การเชื่อมต่อจะปรากฏใน Database Navigator ทางซ้าย

สำหรับฐานข้อมูลที่ใช้งานจริง ควรเปิดตัวเลือก Read-only connection หรือเลือก Connection type เป็น Production ในส่วน General ของการตั้งค่าการเชื่อมต่อ เพื่อป้องกันการแก้ไขข้อมูลโดยไม่ตั้งใจ (ตำแหน่งตัวเลือกอาจต่างกันตามเวอร์ชัน)

ทางเลือก: เปิด Tunnel เองด้วยคำสั่ง ssh

ถ้าใช้โปรแกรมอื่นที่ไม่มีฟีเจอร์ SSH Tunnel หรือต้องการแยกการจัดการ Tunnel ออกมา ให้เปิด Tunnel ด้วย OpenSSH ซึ่งมีมาในตัวบน macOS, Linux และ Windows 10/11

ssh -N -L 3307:127.0.0.1:3306 [email protected]

คำสั่งนี้เปิดพอร์ต 3307 บนเครื่องคุณ แล้วส่งต่อไปยังพอร์ต 3306 ของเซิร์ฟเวอร์ ตัวเลือก -N คือไม่เปิด Shell หน้าต่างจะค้างไว้เฉย ๆ ซึ่งเป็นเรื่องปกติ จากนั้นในโปรแกรมให้เชื่อมต่อไปที่ 127.0.0.1 พอร์ต 3307 โดยไม่ต้องตั้ง SSH ใช้พอร์ตฝั่งเครื่องคุณที่ไม่ใช่ 3306 เพื่อไม่ชนกับ MySQL ที่อาจติดตั้งอยู่บนเครื่องเดียวกัน กด Ctrl+C เพื่อปิด Tunnel ถ้าเข้าเซิร์ฟเวอร์บ่อย สามารถบันทึกค่าเหล่านี้ใน ไฟล์ ~/.ssh/config ด้วยคำสั่ง LocalForward

ตรวจสอบผลลัพธ์

ใน Database Navigator ขยายการเชื่อมต่อจนเห็นรายชื่อตาราง แล้วเปิด SQL Editor (ปุ่ม SQL บนแถบเครื่องมือ) ลองรันคำสั่ง

-- MySQL / MariaDB
SELECT CURRENT_USER(), @@hostname, VERSION();
-- PostgreSQL
SELECT current_user, inet_server_addr(), version();

MySQL ควรแสดงผู้ใช้เป็น shopuser@localhost หรือ [email protected] และ PostgreSQL ควรแสดง inet_server_addr เป็น 127.0.0.1 ซึ่งยืนยันว่าเชื่อมต่อผ่าน Tunnel ไม่ใช่ผ่านพอร์ตสาธารณะ

ปัญหาที่พบบ่อย

Access denied for user 'shopuser'@'127.0.0.1' หรือ 'shopuser'@'localhost'

ใน MySQL บัญชี 'shopuser'@'localhost' และ 'shopuser'@'127.0.0.1' ถือเป็นคนละบัญชี ถ้าเซิร์ฟเวอร์เปิด skip_name_resolve การเชื่อมต่อผ่าน Tunnel จะถูกมองเป็น 127.0.0.1 และไม่ตรงกับบัญชี localhost แก้โดยสร้างบัญชีสำหรับ 127.0.0.1 เพิ่ม พร้อมให้สิทธิ์เท่าเดิม

CREATE USER 'shopuser'@'127.0.0.1' IDENTIFIED BY 'รหัสผ่านเดิมหรือรหัสใหม่';
GRANT ALL PRIVILEGES ON shopdb.* TO 'shopuser'@'127.0.0.1';

Public Key Retrieval is not allowed (MySQL 8)

เกิดกับบัญชีที่ใช้ caching_sha2_password เมื่อเชื่อมต่อแบบไม่ใช้ SSL ไปที่แท็บ Driver properties แล้วตั้ง allowPublicKeyRetrieval เป็น true ในกรณีนี้ถือว่าปลอดภัยพอสมควร เพราะข้อมูลวิ่งผ่าน SSH ที่เข้ารหัสอยู่แล้ว

SSH ล้มเหลว: Auth fail, invalid privatekey หรือ administratively prohibited

Auth fail ให้ตรวจชื่อผู้ใช้ SSH และว่า Public Key อยู่ใน ~/.ssh/authorized_keys ของผู้ใช้นั้น ถ้าไฟล์ Key เป็นรูปแบบ PuTTY (.ppk) ให้ Export เป็น OpenSSH ด้วย PuTTYgen ก่อน ส่วน administratively prohibited แปลว่าเซิร์ฟเวอร์ปิด TCP Forwarding ให้แก้ตามขั้นตอนที่ 1 ถ้าเป็นผู้ใช้ Hosting บน Plesk หรือ DirectAdmin ผู้ใช้นั้นต้องได้รับสิทธิ์ SSH ก่อนจึงจะใช้ Tunnel ได้

หากตั้งค่าตามขั้นตอนแล้วยังเชื่อมต่อไม่ได้ ติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security