หมวดหมู่: OrbStack

เชื่อมต่อ MySQL, MariaDB สิทธิ์ วิธีไหนดีเชื่อมต่อ MySQL, MariaDB สิทธิ์ วิธีไหนดี

ในการเชื่อมต่อ MySQL และ MariaDB ความแตกต่างหลักในการเชื่อมต่อ อยู่ที่โปรแกรมโปรโตคอล การรับส่งข้อมูล, ขอบเขตการเข้าถึง และความปลอดภัย ครับ


การเชื่อมต่อ 3 รูปแบบหลัก

รูปแบบวิธีการ ลักษณะการทำงานความเร็ว
Unix Socketlocalhostใช้ไฟล์พิเศษ ในระบบไฟล์ Linux เพื่อคุยกันโดยตรงเร็วที่สุด
TCP/IP127.0.0.1 หรือ IPใช้ Network Protocol ในการรับส่งข้อมูลผ่าน Port ปานกลาง
% Remote Accessเป็นการตั้งค่า User Permission ให้รับการเชื่อมต่อจาก IP ใดก็ได้ผ่าน TCP / IPเท่ากับ TCP / IP

ความปลอดภัยและกรณีที่ควรใช้

Unix Socket

เป็นการเชื่อมต่อภายในเครื่องเดียวกันโดยไม่ผ่านระบบ Network

  • ความปลอดภัย: สูงสุด เพราะไม่มีการเปิด Port ให้โลกภายนอกเห็น จำกัดสิทธิ์ผ่าน User Permissions ของตัว OS เอง
  • Case ที่ควรใช้
    • Production Server: เมื่อ Web Server และ Database อยู่บนเครื่อง Physical / VPS ตัวเดียวกัน
  • ข้อควรจำ: หากระบุ Host เป็น localhost ใน Client ส่วนใหญ่ (เช่น PHP, Python) ระบบจะพยายามวิ่งหา Socket ไฟล์โดยอัตโนมัติ

TCP/IP

การรับส่งข้อมูลผ่าน Network Interface

  • ความปลอดภัย: สูง หากจำกัด Bind-address ไว้ที่ 127.0.0.1 หรือระบุ IP เฉพาะของ App Server
  • Case ที่ควรใช้
    • Development : เชื่อมต่อจาก IDE เข้าหา Database ที่รันอยู่
    • Multi-Server: เมื่อแยกเครื่อง Web Server และ DB Server ออกจากกัน

%

ไม่ใช่ “วิธี” เชื่อมต่อ แต่เป็น “สิทธิ์” ของ User ที่อนุญาตให้ Connect มาจากIP ที่ไหนก็ได้

  • ความปลอดภัย: ต่ำที่สุด หากเปิดคู่กับ Firewall ที่ไม่รัดกุม เสี่ยงต่อการโดน Brute-force จากภายนอก
  • Case ที่ควรใช้:
    • ไม่แนะนำให้ใช้บน Production นอกจากจะทำ VPN หรือ White-list IP เท่านั้น

รายละเอียด

  • % คืออะไรในโลกของ MySQL/MariaDB?
    • ในตาราง mysql.user ฟิลด์ Host จะระบุว่า User นั้นสามารถล็อคอินมาจากที่ไหนได้บ้าง
      • Specific IP: เช่น 192.168.1.10
      • IP Range: เช่น 192.168.1.%
      • Wildcard (% ) : หมายถึง “Any Host” หรือทุก IP Address ในโลกที่วิ่งมาถึง Server คุณได้
  • ทำไมถึงบอกว่าเป็น Subset ของ IP ?
    • หากเราวาดวงกลมของสิทธิ์การเข้าถึง
      • วงกลมเล็กที่สุด: คือ Specific IP — เข้าได้เฉพาะจุดเดียว
      • วงกลมที่ใหญ่ขึ้น: คือ IP Range — เข้าได้เฉพาะในวง LAN
      • วงกลมที่ใหญ่ที่สุด: คือ Wildcard (%) — ครอบคลุมทุก IP Address ที่มีอยู่จริง

ดังนั้น % จึงเป็นตัวแทน ที่รวมเอาทุก ๆ IP Address เข้าไว้ด้วยกันเพื่อให้จัดการสิทธิ์ได้ง่ายขึ้นครับ

ความเข้าใจผิดที่พบบ่อย

แม้ว่า % จะแปลว่า “ทุก IP” แต่ใน MySQL/MariaDB มันมี “ข้อยกเว้น” ที่สำคัญมากครับ
% ไม่รวม localhost (ในบางกรณี)
โดยปกติ MySQL จะมองว่าการเชื่อมต่อผ่าน Unix Socket กับการเชื่อมต่อผ่าน TCP/IP เป็นคนละช่องทางกัน

  • ถ้าคุณสร้าง User 'pitt'@'%' บางครั้งคุณอาจจะล็อคอินด้วย -h localhost ไม่ได้
  • คุณต้องล็อคอินด้วย -h 127.0.0.1 แทน เพื่อให้ระบบมองว่าเป็น Network IP แล้วไปเช็คสิทธิ์ใน %

การใช้งานใน Environment ต่าง ๆ

Development

  • แนะนำ: ใช้ TCP/IP (127.0.0.1)
  • เหตุผล: ตั้งค่าง่าย และ Tools ส่วนใหญ่บน macOS / Windows ทำงานกับ TCP ได้เสถียรกว่าการงมหา Path ของ Socket ไฟล์

Docker Environment

  • แนะนำ: ใช้ TCP/IP
  • เหตุผล: ในโลกของ Docker แต่ละ Container คือ “คนละเครื่อง” ดังนั้นมันจะคุยผ่าน Socket ไม่ได้
  • การตั้งค่า: ให้ App เชื่อมไปที่ Hostname ตามชื่อ Service ใน docker-compose.yml

Production Server

  • แนะนำ: ใช้ Unix Socket
  • เหตุผล: ประสิทธิภาพดีที่สุดและปลอดภัยที่สุด เพราะไม่ต้องเปิด Port 3306 ทิ้งไว้

สรุปการเลือกใช้ ตาม OS

OS / Environmentวิธีที่แนะนำทำไม?
Linux Unix Socketเร็วที่สุด ปลอดภัยที่สุด ไม่ต้องผ่าน Network Card
macOS TCP/IP สะดวกที่สุด ลดปัญหาเรื่องหา Path ของ Socket ไม่เจอ
Windows TCP/IP เป็นวิธีมาตรฐานเพียงวิธีเดียวที่ทำงานได้สถียร
Docker TCP/IP เพราะ Container คุยข้ามกันผ่าน Socket ไม่ได้

ข้อควรระวังเรื่องความปลอดภัย

  1. ห้ามเปิด % สำหรับ User root โดยเด็ดขาด
  2. การใช้ % คือการเปิดประตูบ้านทิ้งไว้ทุกบาน
    • เสี่ยงต่อการ Brute-force: ใครก็ตามที่รู้ IP Server ของคุณสามารถพยายามเดารหัสผ่านได้จากทั่วโลก
    • ควรใช้คู่กับ Firewall: หากจำเป็นต้องใช้ % จริง ๆ คุณควรจำกัดที่ระดับ Firewall ให้เฉพาะ IP ที่ไว้ใจเท่านั้นที่ผ่าน Port 3306 เข้ามาได้
  3. หากต้องใช้ Remote Access ให้ใช้การ SSH Tunneling แทนการเปิด Port 3306 ตรง ๆ
  4. ตรวจสอบ bind-address ในไฟล์ config เสมอว่าไม่ได้เผลอเปิดรับทุก IP (0.0.0.0) โดยไม่จำเป็น
  5. ถ้าคุณรันบน Docker, ปกติเราจะใช้ % เพราะ IP ของ Container ลูกจะเปลี่ยนไปเรื่อย ๆ ทุกครั้งที่ Restart แต่เราจะ “ซ่อน” Port 3306 ไว้ไม่ให้ Public ออกไปข้างนอก เพื่อความปลอดภัยครับ

อ่านเพิ่มเติม