Bảo vệ Ubuntu server trước brute force: đừng chỉ “đổi port SSH” rồi hy vọng
Một Ubuntu server vừa public ra Internet gần như chắc chắn sẽ bị quét và thử đăng nhập tự động chỉ sau vài phút. Đây không phải chuyện “nếu”, mà là “khi nào”. Các bot sẽ liên tục thử tài khoản phổ biến như root, admin, ubuntu với hàng loạt mật khẩu rò rỉ. Nếu server của bạn vẫn mở SSH theo cấu hình mặc định và còn cho phép đăng nhập bằng mật khẩu yếu, nguy cơ bị brute force là hoàn toàn thực tế.
Tin tốt là bạn không cần một stack bảo mật phức tạp để giảm mạnh rủi ro này. Chỉ với ba lớp phòng thủ rất thực dụng — UFW, Fail2Ban và SSH key — bạn có thể chặn phần lớn các cuộc tấn công brute force phổ biến, đồng thời giữ hệ thống dễ quản trị.
Bài viết này đi theo hướng thực chiến: không chỉ nói “cài gì”, mà giải thích vì sao cần, nên cấu hình thế nào, và các lỗi dễ khiến bạn tự khóa mình khỏi server.
Hiểu đúng về brute force trên SSH
Brute force là kiểu tấn công thử đi thử lại nhiều tổ hợp username/password cho đến khi thành công. Trên Ubuntu server, mục tiêu phổ biến nhất là dịch vụ SSH vì đây là cổng truy cập quản trị từ xa.
Điều quan trọng cần hiểu:
– Firewall không thay thế xác thực mạnh: mở cổng SSH mà chỉ dựa vào mật khẩu là chưa đủ.
– Fail2Ban không thay thế firewall: nó giúp phát hiện và chặn hành vi lặp lại, nhưng không phải lá chắn duy nhất.
– SSH key mạnh hơn mật khẩu rất nhiều: nếu tắt đăng nhập bằng password và chỉ cho phép key, brute force theo kiểu truyền thống gần như mất đất diễn.
Cách tiếp cận tốt nhất là dùng nhiều lớp bảo vệ:
– UFW để giới hạn bề mặt tấn công ở mức mạng.
– Fail2Ban để tự động chặn IP có hành vi đáng ngờ.
– SSH key để loại bỏ điểm yếu lớn nhất: mật khẩu.
Lớp 1: Khóa bớt bề mặt tấn công bằng UFW
UFW (Uncomplicated Firewall) là giao diện dễ dùng của iptables/nftables, rất phù hợp để thiết lập chính sách mạng cơ bản trên Ubuntu server.
Mục tiêu cấu hình UFW
Bạn nên hướng tới nguyên tắc:
– Mặc định từ chối toàn bộ kết nối đến
– Chỉ cho phép đúng các cổng cần thiết
– Giữ SSH mở trước khi bật firewall, nếu không bạn có thể mất quyền truy cập
Nếu bạn dùng port SSH riêng, ví dụ 2222, hãy mở đúng cổng đó thay vì profile mặc định:
sudo ufw allow 2222/tcp
Nếu server chạy web, mở thêm HTTP/HTTPS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Sau đó mới bật UFW:
sudo ufw enable
Kiểm tra trạng thái:
sudo ufw status verbose
Một số mẹo hữu ích với UFW
– Nếu chỉ quản trị từ IP văn phòng hoặc IP cá nhân cố định, hãy giới hạn SSH theo IP nguồn:
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
– Nếu cần giảm tốc độ quét hoặc thử đăng nhập quá nhiều, bạn có thể dùng rate limiting:
sudo ufw limit OpenSSH
Lệnh này không thay Fail2Ban, nhưng tạo thêm một lớp cản nhẹ với các IP gửi quá nhiều kết nối trong thời gian ngắn.
Sai lầm phổ biến
– Bật UFW trước khi mở SSH
– Đổi SSH sang port khác nhưng quên mở port mới trên UFW
– Mở quá nhiều cổng “cho chắc”
– Cho phép 22/tcp từ mọi nơi dù thực tế chỉ cần vài IP quản trị
UFW không ngăn brute force tận gốc, nhưng nó giúp bạn thu hẹp những gì Internet có thể chạm tới.
Lớp 2: Tự động chặn IP tấn công bằng Fail2Ban
Nếu UFW là cổng kiểm soát ra vào, thì Fail2Ban là bảo vệ đứng quan sát nhật ký và khóa những ai cố phá cửa quá nhiều lần.
Fail2Ban hoạt động thế nào?
Fail2Ban đọc log hệ thống, ví dụ sshd, phát hiện nhiều lần đăng nhập thất bại từ cùng một IP trong một khoảng thời gian, rồi tự động thêm rule chặn IP đó trong firewall.
Điểm mạnh của công cụ này là:
– Chặn bot brute force rất hiệu quả
– Không cần can thiệp thủ công
– Dễ tùy chỉnh theo mức độ nghiêm ngặt mong muốn
Cài đặt và cấu hình cơ bản
Cài Fail2Ban:
sudo apt update
sudo apt install fail2ban
Không nên sửa trực tiếp file mặc định jail.conf. Hãy tạo file riêng:
sudo fail2ban-client status
sudo fail2ban-client status sshd
Nên đặt ngưỡng thế nào?
Không có con số tuyệt đối, nhưng với server quản trị thông thường:
– findtime = 10m
– maxretry = 4 hoặc 5
– bantime = 1h đến 24h
Nếu bạn là người hay gõ sai hoặc có nhiều admin dùng chung hệ thống, đừng cấu hình quá gắt ngay từ đầu. Mục tiêu là chặn bot, không phải gây phiền cho đội vận hành.
Whitelist cẩn thận
Bạn có thể thêm IP tin cậy để không bị khóa nhầm:
ignoreip = 127.0.0.1/8 203.0.113.10
Tuy nhiên, chỉ whitelist khi thật sự cần. Không nên “thả cửa” cả một dải IP rộng chỉ vì tiện.
Lớp 3: Loại bỏ điểm yếu lớn nhất bằng SSH key
Đây là lớp quan trọng nhất. Nếu vẫn cho phép đăng nhập SSH bằng mật khẩu, bot vẫn còn mục tiêu để thử. Khi bạn chuyển sang SSH key, việc brute force password gần như không còn ý nghĩa.
Vì sao SSH key an toàn hơn mật khẩu?
SSH key dùng cặp khóa:
– Private key giữ ở máy cá nhân
– Public key đặt trên server
Server xác minh bạn sở hữu private key mà không cần truyền mật khẩu qua mạng. Một private key đủ mạnh gần như không thể bị brute force theo cách bot SSH thông thường đang làm.
Loại ed25519 hiện là lựa chọn tốt, gọn và an toàn cho đa số trường hợp.
Sau đó copy public key lên server:
ssh-copy-id user@your-server-ip
Hoặc nếu dùng port riêng:
ssh-copy-id -p 2222 user@your-server-ip
Kiểm tra trước khi tắt mật khẩu
Đây là bước sống còn: mở một phiên SSH mới và đăng nhập thử bằng key trước. Đừng đóng phiên hiện tại cho đến khi xác nhận key hoạt động bình thường.
Kiểm tra file ~/.ssh/authorized_keys trên server đã có key chưa, và quyền truy cập hợp lý:
– thư mục ~/.ssh: 700
– file authorized_keys: 600
Tắt đăng nhập bằng mật khẩu
Sửa file cấu hình SSH:
sudo nano /etc/ssh/sshd_config
Các dòng nên kiểm tra:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
Giải thích:
– PubkeyAuthentication yes: bật xác thực bằng key
– PasswordAuthentication no: tắt đăng nhập bằng mật khẩu
– PermitRootLogin no: không cho root đăng nhập trực tiếp qua SSH
Một cấu hình phòng thủ hợp lý cho đa số server nhỏ
Nếu bạn đang quản trị VPS, web server hoặc máy backend nhỏ, cấu hình cân bằng thường là:
– UFW: deny incoming, chỉ mở 22 hoặc 2222, 80, 443
– Giới hạn SSH theo IP nếu có thể
– Fail2Ban: bật jail sshd, maxretry 5, findtime 10m, bantime 1h
– SSH key: dùng ed25519
– Tắt PasswordAuthentication
– Tắt PermitRootLogin
Bộ ba này không làm hệ thống “bất khả xâm phạm”, nhưng chặn được phần lớn tấn công tự động, giảm mạnh tiếng ồn trong log và hạ rủi ro xâm nhập do cấu hình yếu.
Những hiểu lầm cần tránh
“Đổi port SSH là đủ an toàn”
Đổi từ port 22 sang 2222 chỉ giúp giảm bớt bot quét sơ cấp, không phải biện pháp bảo mật cốt lõi. Kẻ tấn công vẫn có thể scan ra cổng mới.
“Có Fail2Ban thì không cần SSH key”
Sai. Nếu vẫn cho phép mật khẩu, bạn vẫn đang giữ một bề mặt tấn công không cần thiết. Fail2Ban chỉ giảm nhịp tấn công, không thay thế xác thực mạnh.
“Firewall bật rồi là xong”
Sai. Firewall kiểm soát truy cập mạng, nhưng không giải quyết chuyện tài khoản yếu, đăng nhập root, hoặc key bị cấu hình sai.
Kết luận
Muốn bảo vệ Ubuntu server trước brute force, đừng trông chờ vào một “mẹo” đơn lẻ. Cách làm hiệu quả nhất là kết hợp nhiều lớp:
– UFW để chỉ mở đúng những gì cần
– Fail2Ban để tự động trừng phạt hành vi đăng nhập bất thường
– SSH key để loại bỏ hoàn toàn rủi ro từ mật khẩu SSH
Nếu phải ưu tiên, hãy làm theo thứ tự này: thiết lập SSH key trước, sau đó siết SSH config, rồi mới bổ sung UFW và Fail2Ban. Quan trọng nhất là luôn thử lại kết nối ở một phiên khác trước khi khóa các cơ chế đăng nhập cũ, để không tự chặn chính mình.
Một Ubuntu server an toàn không nhất thiết phải phức tạp. Nó chỉ cần được cấu hình đúng, đủ chặt, và không để những mặc định nguy hiểm tồn tại quá lâu.