Site icon PlusMagi's Blog By Pitt Phunsanit

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

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


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

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

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

Unix Socket ( Unix-like เช่น Linux, macOS, BSD ) ( Localhost )

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

TCP/IP ( 127.0.0.1 หรือ Specific IP )

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

% ( Wildcard User )

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

รายละเอียด

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

ความเข้าใจผิดที่พบบ่อย ( จุดที่ต้องระวัง! )

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


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

Development ( Local Machine )

Docker Environment

Production Server ( Ubuntu / Linux )


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

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

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

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

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

Exit mobile version