Một VPS Linux vừa cấp có IP công khai trên Internet, và chỉ sau vài phút đã có các bot tự động thử đăng nhập SSH bằng hàng loạt mật khẩu phổ biến. Bài này hướng dẫn bạn bảo mật VPS Linux bằng 6 việc cơ bản, làm một lần mất khoảng 20–30 phút, áp dụng cho Ubuntu và Debian. Mỗi bước đều có lệnh để sao chép và ảnh minh họa kết quả cần thấy.
Tóm tắt 6 bước:
- Cập nhật hệ thống và cài bản vá bảo mật.
- Đổi mật khẩu root thành mật khẩu mạnh.
- Tạo người dùng thường có quyền
sudo. - Đăng nhập bằng SSH key thay cho mật khẩu.
- Tắt đăng nhập root và đăng nhập bằng mật khẩu qua SSH.
- Bật tường lửa UFW và cài Fail2ban.
Trước khi bắt đầu: bạn cần đăng nhập được vào VPS bằng tài khoản root. Nếu chưa biết cách, xem bài kết nối VPS Linux qua SSH. Trong bài,
203.0.113.25là IP ví dụ vàtdclà tên người dùng ví dụ, hãy thay bằng thông tin của bạn.
Bước 1: Cập nhật hệ thống
Phần lớn lỗ hổng bị khai thác trên VPS là lỗ hổng đã có bản vá nhưng chưa được cài. Vì vậy việc đầu tiên luôn là cập nhật:
apt update && apt upgrade -y
Nếu cập nhật có kernel mới hoặc sau đó xuất hiện file /var/run/reboot-required, hãy khởi động lại VPS bằng lệnh reboot rồi đăng nhập lại.

Để không phải nhớ cập nhật thủ công, bạn có thể bật cập nhật bảo mật tự động:
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
Chọn Yes khi được hỏi. Từ đó các bản vá bảo mật sẽ được cài tự động hằng ngày.
Bước 2: Đổi mật khẩu root
Mật khẩu ban đầu thường được gửi qua email hoặc lưu trong trang quản lý dịch vụ, nên đổi sang mật khẩu riêng mà chỉ bạn biết. Chạy:
passwd
Nhập mật khẩu mới hai lần. Khi gõ, Linux không hiển thị ký tự nào, đó là bình thường. Nên dùng mật khẩu dài từ 14 ký tự trở lên, có chữ hoa, chữ thường, số, ký tự đặc biệt, và lưu trong trình quản lý mật khẩu.
Bước 3: Tạo người dùng 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ể xoá cả hệ thống, và root là tài khoản mà mọi bot đều nhắm tới. Hãy tạo một người dùng thường và cấp quyền sudo để chạy lệnh quản trị khi cần:
adduser tdc
usermod -aG sudo tdc
groups tdc
Lệnh adduser sẽ hỏi mật khẩu cho người dùng mới, các mục Full Name, Room Number… có thể bấm Enter để bỏ qua. Lệnh groups phải hiện chữ sudo là được.

Mở một cửa sổ mới và thử đăng nhập bằng người dùng này (ssh tdc@203.0.113.25), sau đó chạy sudo whoami. Nếu kết quả là root nghĩa là quyền sudo đã hoạt động.
Bước 4: Đăng nhập bằng SSH key
SSH key gồm hai phần: khoá riêng nằm trên máy tính của bạn và khoá công khai đặt trên VPS. Không có khoá riêng thì không đăng nhập được, dù đoán đúng mật khẩu. Đây là cách chặn hiệu quả kiểu tấn công dò mật khẩu.
4.1. Tạo cặp khoá trên máy tính của bạn
Trên Windows 10/11 mở PowerShell, trên macOS hoặc Linux mở Terminal, rồi chạy:
ssh-keygen -t ed25519 -C "may-tinh-cua-ban"
Bấm Enter để lưu ở vị trí mặc định, sau đó đặt một passphrase (mật khẩu bảo vệ khoá). Passphrase có thể bỏ trống, nhưng đặt thì an toàn hơn nếu máy tính bị mất hoặc bị lấy file.

4.2. Chép khoá công khai lên VPS
Trên macOS/Linux, dùng lệnh có sẵn:
ssh-copy-id tdc@203.0.113.25
Trên Windows không có ssh-copy-id, hãy chạy lệnh sau trong PowerShell (một dòng):
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh tdc@203.0.113.25 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Nhập mật khẩu của người dùng tdc lần cuối. Sau đó thử đăng nhập lại bằng ssh tdc@203.0.113.25: nếu chỉ được hỏi passphrase của khoá (hoặc vào thẳng nếu không đặt passphrase) là SSH key đã hoạt động.

Trang quản lý VPS của TDCLOUD cũng có mục Settings → SSH Keys để thêm khoá công khai. Bạn có thể dùng cách này nếu thấy tiện hơn.
Bước 5: Tắt đăng nhập root và đăng nhập bằng mật khẩu
Quan trọng: chỉ làm bước này khi bạn đã đăng nhập thành công bằng SSH key với người dùng
tdcvà dùng đượcsudo. Trong suốt bước này, giữ nguyên phiên SSH đang mở, chỉ đóng sau khi đã thử đăng nhập thành công ở một cửa sổ mới.
Trên Ubuntu 22.04, 24.04 và Debian 12, file /etc/ssh/sshd_config nạp thêm các file trong thư mục /etc/ssh/sshd_config.d/. Một số bản cài sẵn file như 50-cloud-init.conf bật lại PasswordAuthentication yes, khiến bạn sửa file chính mà không có tác dụng. SSH lấy giá trị xuất hiện đầu tiên, nên cách chắc chắn nhất là tạo file có tên bắt đầu bằng 00-:
sudo nano /etc/ssh/sshd_config.d/00-bao-mat.conf
Dán nội dung sau, bấm Ctrl + O, Enter để lưu và Ctrl + X để thoát:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
Kiểm tra cú pháp, xem giá trị đang có hiệu lực rồi khởi động lại dịch vụ SSH:
sudo sshd -t
sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication'
sudo systemctl restart ssh

Bây giờ mở cửa sổ mới và thử ssh tdc@203.0.113.25. Đăng nhập được thì mới đóng phiên cũ. Thử thêm ssh root@203.0.113.25, bạn sẽ nhận thông báo Permission denied (publickey), nghĩa là root và mật khẩu đã bị chặn.
Nếu bạn vẫn muốn root đăng nhập được nhưng chỉ bằng key, thay dòng đầu bằng PermitRootLogin prohibit-password.
Bước 6: Bật tường lửa UFW và cài Fail2ban
6.1. Tường lửa UFW
UFW chỉ cho phép các cổng bạn khai báo, mọi kết nối khác bị chặn. Thứ tự rất quan trọng: mở cổng SSH trước rồi mới bật tường lửa, nếu làm ngược lại bạn sẽ tự khoá mình ở ngoài.
sudo apt install ufw -y
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
sudo ufw status
Dòng allow 80,443/tcp chỉ cần khi VPS chạy website. Nếu bạn đã đổi cổng SSH sang số khác 22, thay OpenSSH bằng cổng đó, ví dụ sudo ufw allow 2222/tcp.

6.2. Fail2ban chặn IP dò mật khẩu
Fail2ban theo dõi nhật ký đăng nhập và tự chặn IP thử sai nhiều lần. Dù đã tắt đăng nhập bằng mật khẩu, Fail2ban vẫn giúp giảm lượng kết nối rác và log rác.
sudo apt install fail2ban python3-systemd -y
sudo nano /etc/fail2ban/jail.local
Dán nội dung sau rồi lưu lại:
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
Cấu hình này chặn 1 giờ những IP đăng nhập sai 5 lần trong 10 phút. Khởi động lại và kiểm tra:
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

Nếu lỡ chặn nhầm IP của chính mình, gỡ chặn bằng: sudo fail2ban-client set sshd unbanip IP_CUA_BAN.
Ghi chú cho AlmaLinux / Rocky Linux
Các bước trên giống nhau về ý tưởng, chỉ khác lệnh:
- Cập nhật:
dnf update -y. - Nhóm quản trị là
wheelthay chosudo:usermod -aG wheel tdc. - Dịch vụ SSH tên là
sshd:sudo systemctl restart sshd. - Tường lửa mặc định là firewalld:
firewall-cmd --permanent --add-service=sshrồifirewall-cmd --reload. Fail2ban cài từ kho EPEL.
Lỡ tự khoá mình ở ngoài thì sao?
Nếu sau khi sửa SSH hoặc bật tường lửa mà không đăng nhập được nữa, đừng cài lại hệ điều hành vội. Hãy dùng VNC Console trong trang quản lý VPS để vào thẳng màn hình máy chủ, không phụ thuộc SSH hay tường lửa. Xem hướng dẫn: kết nối VPS qua VNC Console. Từ đó bạn có thể sửa lại file cấu hình hoặc chạy ufw disable rồi làm lại cho đúng.
TDCLOUD có backup hằng ngày cho toàn bộ gói VPS, nhưng với dữ liệu quan trọng như database, mã nguồn website, bạn vẫn nên tự sao lưu định kỳ ra một nơi khác để chủ động khôi phục khi cần.
Câu hỏi thường gặp
Có nên đổi cổng SSH khỏi 22 không?
Đổi cổng giúp giảm bớt bot quét tự động và log gọn hơn, nhưng không thay thế được SSH key. Nếu đổi, nhớ mở cổng mới trên UFW trước khi khởi động lại SSH.
Mất file khoá riêng thì làm sao?
Đăng nhập qua VNC Console bằng tài khoản người dùng, tạo cặp khoá mới trên máy tính rồi thêm khoá công khai mới vào ~/.ssh/authorized_keys. Nên sao lưu khoá riêng ở nơi an toàn ngay từ đầu.
Lệnh sudo báo "tdc is not in the sudoers file"?
Người dùng chưa được thêm vào nhóm sudo. Đăng nhập root (hoặc qua VNC) và chạy lại usermod -aG sudo tdc, sau đó đăng xuất và đăng nhập lại.
Đã sửa PasswordAuthentication no mà vẫn đăng nhập bằng mật khẩu được?
Thường do một file khác trong /etc/ssh/sshd_config.d/ đặt giá trị yes trước. Chạy sudo sshd -T | grep passwordauthentication để xem giá trị thực tế, và đảm bảo file của bạn có tên bắt đầu bằng 00-.
Nếu cần một VPS Linux để thực hành, bạn có thể tham khảo VPS giá rẻ hoặc VPS tiêu chuẩn tại TDCLOUD. Gặp khó khăn ở bước nào, hãy liên hệ đội hỗ trợ TDCLOUD để được hướng dẫn trực tiếp.