VPS mới tạo thường chỉ có tài khoản root và mật khẩu gửi qua email. Ngay khi có IP công khai, máy đã bị bot quét cổng SSH. Bài này giúp bạn khóa những cửa dễ bị tấn công nhất trong khoảng 30 phút đầu: tạo user riêng có quyền sudo, đăng nhập bằng SSH key, tắt đăng nhập root, bật tường lửa UFW, cài fail2ban và bật cập nhật bảo mật tự động.
Bạn cần chuẩn bị:
- Một VPS chạy Ubuntu 24.04 LTS, ví dụ IP
203.0.113.10. - Mật khẩu root hoặc key ban đầu do nhà cung cấp cấp.
- Máy tính có OpenSSH client (Linux, macOS, hoặc Windows 10/11 dùng PowerShell).
- Quyền truy cập console web của nhà cung cấp, để cứu máy nếu lỡ tự khóa mình ở ngoài.
Bước 1: Đăng nhập và cập nhật hệ thống
Đăng nhập lần đầu bằng root, sau đó cập nhật toàn bộ gói để vá các lỗ hổng đã biết.
ssh root@203.0.113.10
apt update && apt full-upgrade -y
Nếu có thông báo cần khởi động lại (file /var/run/reboot-required tồn tại), hãy chạy reboot rồi đăng nhập lại. Đặt luôn múi giờ cho log dễ đọc:
timedatectl set-timezone Asia/Ho_Chi_Minh
Bước 2: Tạo user mới có quyền sudo
Làm việc hằng ngày bằng root rất rủi ro. Một lệnh gõ nhầm có thể xóa cả hệ thống. Hãy tạo user riêng, ví dụ deploy, rồi thêm vào nhóm sudo.
adduser deploy
usermod -aG sudo deploy
Lệnh adduser sẽ hỏi mật khẩu. Hãy đặt mật khẩu mạnh, vì bạn vẫn cần nó khi chạy sudo.
Bước 3: Tạo SSH key và chép lên VPS
Trên máy tính của bạn (không phải VPS), tạo cặp khóa Ed25519. Đây là loại khóa ngắn, nhanh và được khuyến nghị hiện nay.
ssh-keygen -t ed25519 -C "ban@may-tinh"
Nên đặt passphrase cho khóa. Sau đó chép khóa công khai lên VPS:
ssh-copy-id deploy@203.0.113.10
Windows không có sẵn ssh-copy-id. Bạn dùng lệnh sau trong PowerShell:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Mở một cửa sổ terminal mới và thử đăng nhập. Nếu vào được mà không phải nhập mật khẩu tài khoản (chỉ passphrase của key), key đã hoạt động.
ssh deploy@203.0.113.10
sudo whoami
Lệnh sudo whoami phải trả về root.
Bước 4: Tắt đăng nhập root và mật khẩu qua SSH
Ubuntu 24.04 đọc các file trong /etc/ssh/sshd_config.d/ trước file chính. Với OpenSSH, giá trị xuất hiện đầu tiên sẽ thắng. Nhiều image cloud có sẵn file 50-cloud-init.conf bật PasswordAuthentication yes. Vì vậy bạn nên tạo file có số thứ tự nhỏ hơn để chắc chắn được áp dụng.
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
Nội dung:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
Kiểm tra cú pháp, sau đó khởi động lại dịch vụ:
sudo sshd -t
sudo systemctl restart ssh
Xác nhận cấu hình thực tế đang chạy:
sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication'
Kết quả phải là permitrootlogin no và passwordauthentication no. Đừng đóng phiên SSH hiện tại cho đến khi đăng nhập thử thành công ở cửa sổ khác.
Bước 5: Bật tường lửa UFW
UFW có sẵn trên Ubuntu. Nguyên tắc: chặn mọi kết nối vào, chỉ mở những cổng cần dùng. Luôn mở SSH trước khi bật UFW.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
Nếu VPS chạy web, mở thêm cổng 80 và 443:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status verbose
Bạn có thể giới hạn tần suất kết nối SSH bằng sudo ufw limit OpenSSH. Quy tắc này chặn IP mở quá 6 kết nối trong 30 giây.
Bước 6: Cài fail2ban chặn IP dò mật khẩu
fail2ban đọc log, phát hiện IP đăng nhập sai nhiều lần và tạm chặn IP đó. Cài gói kèm python3-systemd để fail2ban đọc log qua journald:
sudo apt install -y fail2ban python3-systemd
Không sửa trực tiếp jail.conf vì file này bị ghi đè khi nâng cấp. Tạo file jail.local:
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
backend = systemd
Nếu bạn có IP tĩnh ở văn phòng, thêm vào ignoreip để tránh tự chặn mình. Khởi động và kiểm tra:
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Bước 7: Bật cập nhật bảo mật tự động
Gói unattended-upgrades thường đã có sẵn. Chạy lệnh sau và chọn Yes:
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
Lệnh này tạo file /etc/apt/apt.conf.d/20auto-upgrades với nội dung:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Một số bản vá kernel cần khởi động lại mới có hiệu lực. Nếu chấp nhận VPS tự khởi động lại vào giờ thấp điểm, mở /etc/apt/apt.conf.d/50unattended-upgrades và bỏ comment, chỉnh hai dòng:
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:30";
Chạy thử để xem nó hoạt động thế nào mà không cài thật:
sudo unattended-upgrade --dry-run --debug
Kiểm tra lại
| Hạng mục | Lệnh kiểm tra | Kết quả mong đợi |
|---|---|---|
| Root không SSH được | ssh root@203.0.113.10 | Permission denied |
| Mật khẩu bị tắt | ssh -o PubkeyAuthentication=no deploy@203.0.113.10 | Permission denied (publickey) |
| Tường lửa | sudo ufw status | Status: active, chỉ các cổng đã mở |
| fail2ban | sudo fail2ban-client status sshd | Jail sshd đang chạy |
| Cập nhật tự động | systemctl status unattended-upgrades | active |
Lỗi thường gặp và cách xử lý
Vẫn đăng nhập được bằng mật khẩu sau khi đã tắt
Thường do một file khác trong /etc/ssh/sshd_config.d/ được đọc trước. Chạy grep -ri passwordauthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ để tìm, rồi dùng sudo sshd -T để xem giá trị thực tế.
Báo "Permission denied (publickey)" khi dùng key
Kiểm tra quyền thư mục trên VPS: ~/.ssh phải là 700, authorized_keys là 600, và thuộc sở hữu user deploy. Sửa bằng chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys. Thêm -v vào lệnh ssh để xem chi tiết.
Tự khóa mình ngoài VPS
Dùng console web của nhà cung cấp. Console này kết nối trực tiếp như bàn phím gắn vào máy, không đi qua SSH hay UFW. Sau khi vào, sửa file cấu hình hoặc chạy sudo ufw disable tạm thời.
fail2ban không khởi động
Xem lỗi bằng sudo journalctl -u fail2ban -n 50. Lỗi phổ biến là sai cú pháp trong jail.local hoặc thiếu python3-systemd khi dùng backend = systemd. Lệnh sudo fail2ban-client -t giúp kiểm tra cấu hình.
Sau 7 bước này, VPS của bạn đã có lớp bảo vệ cơ bản. Bước tiếp theo nên làm là thiết lập sao lưu tự động trước khi cài ứng dụng.