Khi server MySQL bị “tra tấn” bởi Brute-force
Bạn đã bao giờ check log MySQL và tá hỏa khi thấy hàng ngàn dòng Access denied từ một IP lạ hoắc chưa? Mình từng rơi vào cảnh này một đêm thứ Bảy. Hệ thống giám sát báo CPU server vọt lên 90%. Ban đầu mình tưởng code dính loop, nhưng soi kỹ processlist mới thấy hàng loạt kết nối đang treo ở trạng thái chờ xác thực.
Kẻ tấn công thường dùng script tự động để thử hàng triệu mật khẩu. Ngay cả khi mật khẩu của bạn đủ mạnh, việc MySQL phải xử lý hàng nghìn yêu cầu kết nối mỗi giây vẫn gây tốn RAM và CPU. Thực tế, mỗi thread kết nối có thể chiếm từ 5MB – 10MB RAM. Nếu không chặn đứng, server sẽ sớm cạn kiệt tài nguyên và treo ứng dụng.
Thay vì vật lộn với firewall phức tạp, bạn có thể dùng ngay Connection Control Plugin của MySQL. Plugin này hoạt động như một “người gác cổng” kiên nhẫn. Nó sẽ bắt những kẻ đăng nhập sai phải chờ đợi lâu hơn cho mỗi lần thử kế tiếp.
Cơ chế hoạt động của Connection Control
Plugin này có sẵn từ phiên bản MySQL 5.7.17. Nguyên lý của nó rất thực dụng: Bạn nhập sai càng nhiều, server phản hồi càng chậm. Điều này đánh trực tiếp vào điểm yếu của các script Brute-force là cần tốc độ cao.
Cách server “trừng phạt” kẻ tấn công
Cấu hình này xoay quanh hai thông số quan trọng:
- Threshold: Ngưỡng số lần đăng nhập sai tối đa được phép.
- Delay: Thời gian trễ (milisecond) server áp dụng cho các lần thử thất bại sau khi vượt ngưỡng.
Hãy thử làm một phép tính. Bình thường, một script có thể thử 100 mật khẩu/giây. Nếu bạn đặt delay là 1000ms (1 giây), tốc độ của chúng sẽ giảm xuống chỉ còn 1 mật khẩu/giây. Cuộc tấn công dự kiến mất 2 ngày để hoàn thành giờ đây sẽ kéo dài thành… vài năm.
Các bước cài đặt và cấu hình thực tế
Dưới đây là quy trình kích hoạt tính năng này trên server production.
1. Cài đặt Plugin
Mặc định plugin này không tự bật. Bạn cần đăng nhập MySQL với quyền root và kiểm tra trạng thái hiện tại:
SHOW PLUGINS LIKE 'connection%';
Nếu danh sách trống, hãy chạy lệnh cài đặt hai thành phần chính sau:
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
Kiểm tra lại bằng SHOW PLUGINS. Nếu thấy trạng thái ACTIVE là bạn đã đi được nửa chặng đường.
2. Thiết lập thông số tối ưu
Đừng để giá trị mặc định. Mình thường ưu tiên cấu hình cân bằng để không làm khó các thành viên trong team nếu họ lỡ gõ sai mật khẩu:
-- Cho phép sai tối đa 3 lần
SET GLOBAL connection_control_failed_connections_threshold = 3;
-- Phạt từ 2 giây (2000ms) và tăng dần đến tối đa 10 giây (10000ms)
SET GLOBAL connection_control_min_connection_delay = 2000;
SET GLOBAL connection_control_max_connection_delay = 10000;
Trong đó, min_connection_delay là mức phạt khởi điểm. Nếu kẻ tấn công lì lợm tiếp tục thử, thời gian chờ sẽ tăng dần cho đến khi chạm trần max_connection_delay.
3. Lưu cấu hình vĩnh viễn
Các lệnh SET GLOBAL sẽ bốc hơi nếu MySQL restart. Hãy thêm chúng vào file my.cnf (hoặc mysqld.cnf trên Ubuntu) để đảm bảo an toàn lâu dài:
[mysqld]
plugin-load-add = connection_control.so
connection_control_failed_connections_threshold = 3
connection_control_min_connection_delay = 2000
connection_control_max_connection_delay = 10000
Sau đó, hãy khởi động lại dịch vụ để áp dụng thay đổi:
sudo systemctl restart mysql
Giám sát hiệu quả chặn đứng tấn công
Để biết plugin có đang làm việc hiệu quả hay không, bạn hãy soi bảng thống kê sau:
SELECT * FROM INFORMATION_SCHEMA.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
Bảng này liệt kê chi tiết User và Host (IP) nào đang vi phạm. Nếu thấy một IP lạ có số FAILED_ATTEMPTS lên tới hàng trăm, bạn đã biết chắc chắn Connection Control đang bảo vệ server của mình thành công.
Kinh nghiệm thực tế: Đừng để gậy ông đập lưng ông
Mình từng gặp trường hợp một bạn Junior viết script migration nhưng quên đổi mật khẩu cũ. Script chạy vòng lặp liên tục gọi vào database. Nhờ có Connection Control, server không bị sập vì quá tải connection. Script đó chỉ chạy rất chậm và báo timeout, giúp mình phát hiện và xử lý lỗi chỉ trong 5 phút.
Tuy nhiên, một lưu ý nhỏ: Tránh đặt min_connection_delay quá cao (như 30-60 giây) ngay từ đầu. Nếu hệ thống mạng chập chờn gây lỗi xác thực ngẫu nhiên, chính các user hợp lệ sẽ bị kẹt trong hàng đợi delay, gây trải nghiệm rất tệ.
Lời kết
Connection Control không thay thế hoàn toàn được VPN hay Firewall, nhưng nó là lớp giáp cực kỳ hiệu quả để chống lại các đợt scan tự động. Chỉ mất 5 phút cấu hình, bạn sẽ giảm thiểu được rủi ro bị chiếm quyền điều khiển database và tiết kiệm đáng kể tài nguyên server. Nếu server của bạn đang mở port 3306 công khai, hãy bật nó ngay hôm nay.

