หลังติดตั้งระบบจัดการฐานข้อมูลเสร็จแล้ว สิ่งที่ต้องทำก่อนนำไปใช้งานจริงคือการตั้งค่าเบื้องต้นและเสริมความปลอดภัย เพราะการตั้งค่า Default ที่มาพร้อมการติดตั้งมักไม่เหมาะกับสภาพแวดล้อม Production ที่ต้องรองรับ Traffic จริงและเผชิญกับภัยคุกคามจากภายนอก
บทความนี้จะอธิบายการตั้งค่า MySQL หลังติดตั้งอย่างครบถ้วน ตั้งแต่การปรับ Configuration File, จัดการ User และสิทธิ์, ตั้งค่า Password Policy, เปิด SSL/TLS, จำกัด Network Access ไปจนถึง Audit Logging เพื่อให้ระบบพร้อมรองรับงาน Production อย่างปลอดภัย
ทำความเข้าใจ Configuration File
ไฟล์ Configuration หลักอยู่ที่ตำแหน่งต่างกันตาม OS — บน Ubuntu อยู่ที่ /etc/mysql/mysql.conf.d/mysqld.cnf ส่วนบน CentOS อยู่ที่ /etc/my.cnf การตั้งค่าทั้งหมดจะอยู่ใน Section [mysqld] เปิดไฟล์ด้วย Text Editor แล้วปรับตามคำแนะนำด้านล่าง
ปรับ InnoDB Buffer Pool
InnoDB Buffer Pool เป็นพื้นที่ Cache ที่สำคัญที่สุดสำหรับประสิทธิภาพ ค่า Default มักตั้งไว้ต่ำเกินไป แนะนำให้ตั้งเป็น 50-70% ของ RAM ทั้งหมดสำหรับ Dedicated Database Server
[mysqld]
innodb_buffer_pool_size = 1G
innodb_buffer_pool_instances = 1
สำหรับเซิร์ฟเวอร์ที่มี RAM 2 GB ให้ตั้ง Buffer Pool ไว้ที่ 1 GB ส่วนเซิร์ฟเวอร์ที่มี RAM 4 GB ขึ้นไป ให้ตั้งที่ 2-3 GB และเพิ่ม innodb_buffer_pool_instances เป็น 2-4 เพื่อลด Contention
ตั้งค่า Character Set และ Collation
เพื่อรองรับภาษาไทยและอักขระ Unicode อย่างครบถ้วน ควรตั้ง Character Set เป็น utf8mb4 ซึ่งรองรับทั้ง Emoji และอักขระพิเศษ
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
ปรับ Log Settings
เปิด Error Log และ Slow Query Log เพื่อติดตามปัญหาและ Query ที่ทำงานช้า
[mysqld]
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
ค่า long_query_time = 2 หมายความว่า Query ที่ใช้เวลามากกว่า 2 วินาทีจะถูกบันทึกลง Slow Query Log เหมาะสำหรับการวิเคราะห์และ Optimize Query ที่เป็นปัญหา
จำกัด Network Access
หากไม่ต้องการให้เข้าถึงจากภายนอก ให้ตั้ง bind-address เป็น 127.0.0.1 เพื่อรับ Connection เฉพาะจาก localhost เท่านั้น
[mysqld]
bind-address = 127.0.0.1
skip-name-resolve
skip-name-resolve ช่วยให้ระบบไม่ต้อง Resolve DNS ทุกครั้งที่มี Connection เข้ามา ช่วยลด Latency และป้องกันปัญหา DNS Lookup ที่ช้า แต่หมายความว่า GRANT Statement ต้องใช้ IP Address แทน Hostname
ลบ User และ Database ที่ไม่จำเป็น
หลังรัน mysql_secure_installation แล้ว ควรตรวจสอบ User ที่เหลืออยู่อีกครั้ง
SELECT user, host, authentication_string FROM mysql.user;
ลบ User ที่ไม่จำเป็นออก และตรวจสอบว่า Root Login ได้เฉพาะจาก localhost เท่านั้น
DROP USER IF EXISTS ''@'localhost';
DROP USER IF EXISTS ''@'%';
DROP DATABASE IF EXISTS test;
ตั้งค่า Password Policy
MySQL 8.0 มี validate_password Component ที่บังคับให้ตั้งรหัสผ่านแข็งแกร่ง ตรวจสอบว่าเปิดใช้งานอยู่
SHOW VARIABLES LIKE 'validate_password%';
หากยังไม่ได้เปิด ให้ติดตั้ง Component แล้วตั้งค่าระดับความเข้มงวด
INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
เพิ่มการตั้งค่าเหล่านี้ลงใน Configuration File ด้วย เพื่อให้คงอยู่หลัง Restart
ใช้หลัก Least Privilege สำหรับ User
ทุก User ควรได้รับสิทธิ์เท่าที่จำเป็นเท่านั้น ไม่ควรใช้ GRANT ALL PRIVILEGES สำหรับ Application User แต่ควรระบุสิทธิ์ที่ต้องใช้จริง
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'SecureP@ssw0rd!2024';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'webapp'@'localhost';
FLUSH PRIVILEGES;
แยก User สำหรับแต่ละหน้าที่ เช่น User สำหรับ Application อ่านเขียนข้อมูล, User สำหรับ Backup ที่มีสิทธิ์ SELECT และ LOCK TABLES, User สำหรับ Monitoring ที่มีสิทธิ์ PROCESS และ REPLICATION CLIENT
เปิด SSL/TLS สำหรับ Connection
MySQL 8.0 สร้าง Self-signed Certificate ไว้ให้อัตโนมัติ ตรวจสอบว่า SSL เปิดใช้งานอยู่
SHOW VARIABLES LIKE '%ssl%';
หากต้องการบังคับให้ทุก Connection ใช้ SSL ให้เพิ่มใน Configuration File
[mysqld]
require_secure_transport = ON
หรือบังคับเฉพาะบาง User ด้วย REQUIRE SSL
ALTER USER 'webapp'@'%' REQUIRE SSL;
ตั้งค่า Connection Limits
จำกัดจำนวน Connection เพื่อป้องกันไม่ให้ระบบถูกใช้งานเกินกำลัง
[mysqld]
max_connections = 150
max_connect_errors = 10
wait_timeout = 600
interactive_timeout = 600
max_connections กำหนดจำนวน Connection พร้อมกันสูงสุด, max_connect_errors กำหนดจำนวนครั้งที่ Connection ล้มเหลวก่อนจะ Block Host นั้น ส่วน wait_timeout และ interactive_timeout กำหนดเวลาตัด Connection ที่ไม่มีการใช้งาน (หน่วยเป็นวินาที)
เปิด General Query Log ชั่วคราวเพื่อ Audit
สำหรับการตรวจสอบความปลอดภัย สามารถเปิด General Query Log ชั่วคราวเพื่อดูทุก Query ที่เข้ามา แต่ไม่ควรเปิดตลอดเวลาเพราะจะกระทบ Performance อย่างมาก
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
ปิดกลับหลังตรวจสอบเสร็จ
SET GLOBAL general_log = 'OFF';
ปิดฟีเจอร์ที่ไม่จำเป็น
ปิดฟีเจอร์ที่ไม่ได้ใช้เพื่อลด Attack Surface
[mysqld]
local_infile = 0
symbolic-links = 0
local_infile = 0 ปิดการ LOAD DATA LOCAL ที่อาจถูกใช้อ่านไฟล์จากเครื่อง Client โดยไม่ได้ตั้งใจ และ symbolic-links = 0 ป้องกันการใช้ Symbolic Link ที่อาจเป็นช่องโหว่
Restart และตรวจสอบ
หลังแก้ไข Configuration File ทั้งหมดแล้ว ให้ Restart Service และตรวจสอบว่าระบบทำงานปกติ
sudo systemctl restart mysqld
sudo systemctl status mysqld
หากเกิดข้อผิดพลาด ให้ตรวจสอบ Error Log ที่กำหนดไว้เพื่อหาสาเหตุ
sudo tail -50 /var/log/mysql/error.log
สรุป
การตั้งค่าเบื้องต้นและเสริมความปลอดภัยหลังติดตั้งเป็นขั้นตอนที่ขาดไม่ได้สำหรับระบบ Production สิ่งสำคัญที่ต้องทำ ได้แก่ ปรับ InnoDB Buffer Pool ให้เหมาะกับ RAM, ตั้ง Character Set เป็น utf8mb4, เปิด Slow Query Log, จำกัด bind-address, บังคับ Password Policy ที่เข้มงวด, ใช้หลัก Least Privilege สำหรับ User, เปิด SSL สำหรับ Connection และปิดฟีเจอร์ที่ไม่จำเป็น เมื่อทำตามแนวทางเหล่านี้ ระบบจัดการฐานข้อมูลจะมีทั้งประสิทธิภาพและความปลอดภัยที่เหมาะสมกับงาน Production
แนะนำบริการ DE
หากต้องการเซิร์ฟเวอร์ที่ตั้งค่าและปรับแต่งฐานข้อมูลได้อิสระพร้อม Root Access เต็มรูปแบบ Cloud VPS ของ DE รองรับทั้ง Ubuntu และ CentOS มาพร้อม SSD Storage ที่ให้ IOPS สูง เหมาะกับการรันระบบจัดการฐานข้อมูลที่ต้องการประสิทธิภาพในการอ่านเขียน
สำหรับผู้ที่ต้องการฐานข้อมูลที่ตั้งค่าความปลอดภัยให้พร้อมใช้งาน Cloud Hosting ของ DE มาพร้อมการตั้งค่าที่เหมาะสมสำหรับ WordPress และเว็บแอปพลิเคชันทั่วไป

