Server Bị Tấn Công Mà Bạn Không Hay Biết
Kiểm tra log xác thực SSH ngay bây giờ:
grep 'Failed password' /var/log/auth.log | wc -l
Trên một VPS mới vừa tiếp xúc với internet công cộng, con số đó có thể lên tới hàng nghìn chỉ trong vài ngày — đôi khi chỉ vài giờ. Botnet liên tục quét toàn bộ không gian IPv4, dò tìm mật khẩu yếu và thông tin đăng nhập mặc định. Lần gần nhất tôi dựng server mới, đã có hơn 3.000 lần thử SSH thất bại trước khi tôi kịp cấu hình xong firewall.
Tôi đã quản lý Linux server production nhiều năm. Bảo vệ SSH khỏi brute force là một trong những việc đầu tiên tôi cấu hình trên bất kỳ máy mới nào — không phải để sau cùng. Có nhiều cách tiếp cận, và chọn sai sẽ lãng phí thời gian hoặc tạo ra cảm giác an toàn ảo.
Các Lựa Chọn Bảo Vệ Chống Brute Force
Cấu Hình iptables / ufw Thủ Công
Bạn có thể chặn IP thủ công bằng iptables hoặc ufw. Nhanh và nhẹ, nhưng hoàn toàn tĩnh. Bạn phải biết trước IP nào cần chặn trước khi bị tấn công — điều đó phủ nhận hoàn toàn mục đích của việc này.
Port Knocking
Ẩn SSH sau một chuỗi port bí mật. Nghe hay về lý thuyết, nhưng rắc rối trong thực tế. Quên chuỗi knock khi đang đi công tác và bạn tự khóa mình ra khỏi server. Cách này cũng bất tiện trong môi trường nhóm khi nhiều người cần truy cập.
Đổi Port SSH Mặc Định
Chuyển SSH từ port 22 sang port khác như 2222 hoặc 8022 sẽ loại bỏ phần lớn các quét tự động. Đây là biện pháp bổ sung tốt — nhưng không phải giải pháp hoàn chỉnh. Kẻ tấn công có chủ đích vẫn sẽ quét toàn bộ các port. Hãy xem đây là bổ sung cho các biện pháp phòng thủ thực sự, không phải thay thế chúng.
Fail2Ban — Chặn Tự Động và Linh Hoạt
Fail2Ban theo dõi log file theo thời gian thực. Khi phát hiện quá nhiều lần đăng nhập thất bại từ cùng một IP, nó tự động thêm rule firewall để chặn địa chỉ đó trong một khoảng thời gian có thể cấu hình. Không cần can thiệp thủ công. Không cần thức đêm canh log. Đây là cách tiếp cận thực sự có thể mở rộng quy mô.
Fail2Ban: Điểm Mạnh và Hạn Chế
Điểm Mạnh
- Phản ứng tự động — chặn tấn công ngay cả khi bạn đang ngủ hoặc không hay biết.
- Cấu hình linh hoạt — bảo vệ SSH, Nginx, Apache, Postfix và hàng chục dịch vụ khác thông qua “jail”.
- Phát hiện dựa trên log — hoạt động với bất kỳ log nào dịch vụ của bạn đã tạo. Không cần agent bổ sung.
- Whitelist dễ dàng — thêm IP của bạn vào danh sách bỏ qua để không bao giờ tự khóa mình ra ngoài.
- Tích hợp với iptables, nftables và ufw — hoạt động cùng firewall hiện có mà không thay thế nó.
Hạn Chế Thực Tế
- Không thay thế được xác thực mạnh — hãy dùng SSH key, không phải mật khẩu. Fail2Ban mua thêm thời gian; nó không làm cho thông tin đăng nhập yếu trở nên an toàn.
- Tấn công phân tán lọt qua được — một botnet sử dụng 10.000 IP khác nhau, mỗi IP chỉ thử một hoặc hai lần, sẽ không kích hoạt lệnh ban. Với loại mối đe dọa này, hãy xem xét CrowdSec hoặc các công cụ dựa trên blocklist.
- Trường hợp đặc biệt với log rotation — nếu file xoay vòng giữa lúc quét, Fail2Ban đôi khi có thể bỏ sót một số entry. Hiếm khi xảy ra trong thực tế, nhưng đáng biết.
- IPv6 cần cấu hình riêng — nhiều cài đặt mặc định chỉ bảo vệ IPv4. Hãy kiểm tra cấu hình của bạn một cách tường minh.
Cấu Hình Khuyến Nghị
Đây là cấu hình tôi dùng trên Linux server tiêu chuẩn bao gồm SSH và web stack:
- Chặn sau 5 lần thất bại trong vòng 10 phút.
- Ban 1 giờ cho lần vi phạm đầu tiên, tăng lên với recidive jail cho những kẻ tái phạm (ban 24 giờ).
- Whitelist IP tĩnh của bạn trước khi làm bất cứ điều gì khác.
- Bật jail cho SSH, Nginx bad request và đăng nhập WordPress nếu có.
- Gửi cảnh báo email cho các lệnh ban mới — tùy chọn, nhưng hữu ích khi xem lại log sau này.
Hướng Dẫn Triển Khai
Bước 1: Cài Đặt Fail2Ban
Trên Debian/Ubuntu:
sudo apt update
sudo apt install fail2ban -y
Trên RHEL/CentOS/Rocky Linux:
sudo dnf install epel-release -y
sudo dnf install fail2ban -y
Bước 2: Tạo File Cấu Hình Cục Bộ
Đừng bao giờ chỉnh sửa trực tiếp /etc/fail2ban/jail.conf — các bản cập nhật sẽ ghi đè lên nó. Thay vào đó, hãy tạo file override cục bộ:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Hoặc bắt đầu với file tùy chỉnh sạch:
sudo nano /etc/fail2ban/jail.d/custom.conf
Bước 3: Cấu Hình SSH Jail
Thêm phần này vào custom.conf của bạn:
[DEFAULT]
# Whitelist IP của bạn — thay bằng IP thực của bạn
ignoreip = 127.0.0.1/8 ::1 YOUR.STATIC.IP.HERE
# Cửa sổ quét: khoảng thời gian nhìn lại để tìm các lần thử thất bại
findtime = 600
# Số lần thất bại trước khi ban
maxretry = 5
# Thời gian ban (tính bằng giây): 3600 = 1 giờ
bantime = 3600
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
Bước 4: Thêm Recidive Jail (Kẻ Tái Phạm)
Jail này là không thể thiếu đối với tôi. Nó bắt những IP quay lại sau khi lệnh ban đầu hết hạn — và áp dụng chặn 24 giờ thay vì chỉ phạt thêm một giờ như cũ:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = 86400 ; 24 giờ
findtime = 86400
maxretry = 3
Bước 5: Bật và Khởi Động Dịch Vụ
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Bước 6: Xác Nhận Đang Hoạt Động
Kiểm tra trạng thái các jail của bạn:
sudo fail2ban-client status
sudo fail2ban-client status sshd
Kết quả mẫu:
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 47
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 2
|- Total banned: 11
`- Banned IP list: 103.45.67.89 185.220.101.12
Bước 7: Gỡ Ban IP Thủ Công (Nếu Cần)
Đã chặn nhầm người dùng hợp lệ — hoặc chính bạn?
sudo fail2ban-client set sshd unbanip 103.45.67.89
Tùy Chọn: Bảo Vệ Nginx Khỏi Bad Request
Đang chạy web server? Thêm các jail này:
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
Kinh Nghiệm Xương Máu
Đây không phải là những cảnh báo lý thuyết. Hầu hết đều đến từ các sự cố thực tế hoặc những tình huống suýt xảy ra trên máy production.
- Whitelist IP của bạn trước — trước khi test hoặc siết chặt cấu hình. Tôi đã tự khóa mình khỏi server remote hơn một lần. Không phải trải nghiệm vui vẻ gì khi 2 giờ sáng mà client đang chờ.
- Kết hợp với xác thực SSH key. Tắt đăng nhập bằng mật khẩu trong
/etc/ssh/sshd_configbằngPasswordAuthentication no. Lúc đó, Fail2Ban trở thành mạng lưới an toàn, không phải tuyến phòng thủ chính. - Theo dõi log theo thời gian thực để thấy chính xác những gì đang tấn công server của bạn:
sudo tail -f /var/log/fail2ban.log - Test regex bộ lọc trước khi triển khai jail tùy chỉnh:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf - Trên server lưu lượng cao, tăng
maxretrylên 10 hoặc giảmbantime. Chặn quá hung hăng có thể ảnh hưởng đến người dùng hợp lệ đằng sau IP chung — NAT của doanh nghiệp là thủ phạm phổ biến nhất.
Kiểm Tra Những Gì Fail2Ban Đang Thực Sự Chặn
Muốn xem chính xác các rule firewall mà Fail2Ban đã thêm vào? Chạy:
sudo iptables -L f2b-sshd -n --line-numbers
Trên các hệ thống mới hơn dùng nftables:
sudo nft list ruleset | grep -A5 fail2ban
Fail2Ban không thể ngăn chặn mọi cuộc tấn công — không công cụ nào làm được điều đó. Nhưng nó giảm đáng kể lượng “nhiễu”, bảo vệ các dịch vụ xác thực bằng mật khẩu và cho bạn cái nhìn rõ ràng về ai đang dò thám server của mình. Hãy cài đặt, tinh chỉnh cho phù hợp với môi trường của bạn, và nó sẽ lặng lẽ làm công việc của mình trong khi bạn ngủ.

