Cấu hình UFW, Fail2ban và bảo vệ SSH cần bắt đầu từ đường truy cập quản trị. Theo tài liệu Ubuntu và OpenSSH, UFW kiểm soát lưu lượng mạng, SSH quyết định cách xác thực, còn Fail2ban đọc dấu hiệu thất bại trong nhật ký để thực hiện chặn IP. Từ cơ chế này, nên triển khai từng lớp, kiểm tra kết quả rồi mới chuyển bước.
Hướng dẫn dưới đây dành cho tình huống minh họa: máy Ubuntu đã có OpenSSH, UFW và Fail2ban, người quản trị có quyền sudo và biết cổng SSH thực tế. Đây là cấu hình tham khảo, chưa được thử nghiệm trên máy của bạn. Trước khi làm, hãy chuẩn bị console cứu hộ, giữ phiên SSH hiện tại, sao lưu những tệp sắp sửa và ghi lại quy tắc firewall đang có. Không áp dụng nguyên mẫu vào máy chưa kiểm kê dịch vụ.
1. Mở đường SSH trước khi bật UFW
Ubuntu hướng dẫn mở cổng bằng ufw allow và xem quy tắc bằng ufw status numbered. Với ví dụ SSH đang nghe TCP 22, lần lượt chạy:
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status numbered
Thay 22 bằng cổng thực tế trước khi chạy. Nếu máy phục vụ ứng dụng khác, hãy bổ sung các cổng đã xác định cần thiết trước khi bật firewall; không coi mẫu SSH này là cấu hình đầy đủ cho mọi máy chủ.
Sau khi bật, mở phiên SSH mới để kiểm tra rồi mới đóng phiên cũ. Manpage UFW cảnh báo thao tác kích hoạt có thể làm rơi kết nối hiện hữu. Nếu cần khôi phục khẩn cấp qua console, sudo ufw disable sẽ tắt UFW; sau đó sửa quy tắc và kiểm tra lại. Khi xóa quy tắc bằng sudo ufw delete SỐ, phải đối chiếu lại danh sách hiện tại, tránh dùng số thứ tự đã ghi từ trước.

2. Kiểm chứng đăng nhập bằng khóa rồi siết xác thực
Theo Ubuntu, SSH hỗ trợ xác thực bằng khóa công khai. Nếu chưa có khóa, có thể tạo trên máy cá nhân bằng ssh-keygen -t ed25519, rồi dùng ssh-copy-id ten_quan_tri@may_chu khi đường đăng nhập hiện tại còn hoạt động. Thay các tên minh họa bằng thông tin thật và điều chỉnh cổng theo môi trường. Mở một phiên mới bằng khóa, kiểm tra quyền sudo trước khi cân nhắc tắt mật khẩu hoặc cấm root đăng nhập.
Với tài khoản quản trị thường đã hoạt động, mẫu chính sách chỉ dùng khóa có thể gồm bốn dòng sau:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
Theo manpage OpenSSH, password và keyboard-interactive là hai tùy chọn riêng; PermitRootLogin no cấm root đăng nhập SSH. Không áp dụng nguyên mẫu nếu hệ thống đang cần keyboard-interactive cho quy trình xác thực khác. Trước hết phải xác định chính sách truy cập thực tế.
Ubuntu cho phép đặt cấu hình trong /etc/ssh/sshd_config hoặc các tệp /etc/ssh/sshd_config.d/*.conf. Phần lớn chỉ thị OpenSSH lấy giá trị gặp đầu tiên, nên thêm một dòng cuối tệp chưa chắc thay đổi giá trị đang có hiệu lực. Hãy kiểm tra các tệp được Include và khối Match liên quan. Chạy sudo sshd -t để kiểm tra cú pháp; dùng sudo sshd -T để xem cấu hình hiệu lực, bổ sung -C với tham số kết nối khi cần kiểm tra một trường hợp Match.
Chỉ khi kiểm tra hợp lệ mới áp dụng bằng sudo systemctl restart ssh.service theo hướng dẫn Ubuntu. Sau đó đăng nhập lại từ cửa sổ mới bằng tài khoản và khóa dự kiến. Nếu thất bại, giữ đường truy cập còn dùng được, hoàn nguyên tệp vừa sửa hoặc phục hồi bản sao lưu, chạy lại sudo sshd -t rồi khởi động lại dịch vụ. Không tiếp tục siết firewall trong lúc chưa xác định được nguyên nhân lỗi SSH.

3. Bật Fail2ban với nguồn nhật ký phù hợp
Dự án Fail2ban khuyến nghị tùy chỉnh trong jail.local hoặc jail.d/*.local thay vì sửa trực tiếp jail.conf. Ví dụ, tạo /etc/fail2ban/jail.d/sshd.local với nội dung:
[sshd]
enabled = true
port = 22
maxretry = 5
findtime = 10m
bantime = 1h
Đây là bộ giá trị minh họa: IP đạt ngưỡng năm lần thất bại được bộ lọc nhận diện trong mười phút sẽ bị chặn một giờ. Cổng phải khớp SSH thực tế; điều chỉnh ngưỡng theo nhật ký và nhu cầu quản trị.
Chọn backend sau khi xác định nơi SSH ghi nhật ký. Nếu dùng systemd journal và đã có thư viện Python systemd cần thiết, có thể thêm backend = systemd vào jail. Manpage Fail2ban nêu backend này dùng journalmatch và không nhận logpath. Nếu dùng nhật ký tệp, hãy đối chiếu đường dẫn tồn tại với cấu hình gói đang cài, thay vì chép một đường dẫn trên Internet rồi mặc định rằng jail đã đọc đúng dữ liệu.
Kiểm tra trước bằng sudo fail2ban-client -t. Khi dịch vụ đang chạy, nạp lại với sudo fail2ban-client reload, rồi xem sudo fail2ban-client status sshd. Đối chiếu trạng thái với nhật ký đăng nhập; không lấy số IP bị chặn làm mục tiêu. Nếu chặn nhầm, dùng sudo fail2ban-client set sshd unbanip IP_THUC_TE qua đường quản trị còn hoạt động. Để hoàn nguyên chính sách, phục hồi tệp .local đã sao lưu, kiểm tra rồi nạp lại. Việc đọc nhật ký và chặn theo ngưỡng là lớp bổ sung; vẫn cần kiểm chứng riêng đường SSH và quy tắc mạng.



