MySQL Initial Configuration และ Security Hardening

หลังติดตั้งระบบจัดการฐานข้อมูลเสร็จแล้ว สิ่งที่ต้องทำก่อนนำไปใช้งานจริงคือการตั้งค่าเบื้องต้นและเสริมความปลอดภัย เพราะการตั้งค่า 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 และเว็บแอปพลิเคชันทั่วไป