# Bảo mật VPS Ubuntu: 10 bước cần làm ngay sau khi cài đặt

> Hướng dẫn bảo mật VPS Ubuntu 24.04 từng bước: SSH key, tắt đăng nhập mật khẩu, UFW, Fail2ban, cập nhật tự động và sao lưu, kèm lệnh chính xác và lỗi cần tránh.

Source: https://zopanel.net/vi/blog/secure-ubuntu-vps  
Updated: 2026-10-09

## Ý chính

- Việc quan trọng nhất là đăng nhập SSH bằng key và tắt đăng nhập bằng mật khẩu.
- Bật tường lửa UFW chỉ mở cổng thật sự cần, nhưng nhớ mở SSH trước khi bật.
- Ubuntu Server bật sẵn cập nhật bảo mật tự động; Debian cần cài unattended-upgrades.
- Docker bỏ qua UFW với cổng được publish, nên phải tự kiểm soát cổng của container.

Bảo mật VPS Ubuntu bắt đầu từ bốn việc: đăng nhập SSH bằng key thay cho mật khẩu, không dùng root để đăng nhập trực tiếp, bật tường lửa chỉ mở các cổng cần thiết, và giữ hệ thống luôn được vá. Làm xong bốn việc này trong 15 phút đầu tiên, bạn đã chặn được phần lớn các cuộc tấn công tự động nhắm vào VPS mới.

Bài viết đi qua 10 bước cụ thể cho Ubuntu 24.04 (phần lớn áp dụng nguyên cho Ubuntu 22.04 và Debian 12), với lệnh chính xác, cách kiểm tra từng bước đã có hiệu lực, và những lỗi khiến người quản trị tự khoá mình ngoài server. Cuối bài là phần ZoPanel làm sẵn những gì, để bạn biết bước nào còn phải tự làm.

## Vì sao phải bảo mật VPS ngay khi vừa tạo?

Một VPS có IP public sẽ bị các bot quét cổng và thử đăng nhập SSH gần như ngay sau khi khởi động. Bạn có thể tự thấy điều này: mở `sudo journalctl -u ssh` sau một ngày, sẽ có các lần thử đăng nhập bằng `root`, `admin`, `test`… từ những IP bạn không hề biết.

Các cuộc tấn công này không nhắm vào riêng bạn. Chúng thử mật khẩu yếu, dịch vụ quên chưa đóng, phần mềm chưa vá trên hàng triệu máy cùng lúc. Vì vậy, mục tiêu không phải là "không ai tấn công được", mà là **không để lại những lỗ hổng dễ dãi mà bot tự động khai thác được**.

## Checklist bảo mật VPS Ubuntu

| Bước | Việc cần làm | Mức độ |
| --- | --- | --- |
| 1 | Cập nhật hệ thống, bật cập nhật bảo mật tự động | Bắt buộc |
| 2 | Tạo user có sudo, không làm việc bằng root | Bắt buộc |
| 3 | Đăng nhập SSH bằng key ed25519 | Bắt buộc |
| 4 | Tắt đăng nhập mật khẩu và root qua SSH | Bắt buộc |
| 5 | Bật tường lửa UFW | Bắt buộc |
| 6 | Cài Fail2ban chống dò mật khẩu | Nên làm |
| 7 | Đóng dịch vụ không cần thiết | Nên làm |
| 8 | Đồng bộ thời gian | Nên làm |
| 9 | Sao lưu ra ngoài server | Bắt buộc |
| 10 | Theo dõi log và cảnh báo | Nên làm |

Trước khi bắt đầu: hãy chắc chắn bạn có **console dự phòng** (VNC/console trên trang quản lý của nhà cung cấp VPS). Nếu cấu hình SSH sai, đó là cách duy nhất để vào lại.

## Bước 1: Cập nhật hệ thống và bật vá bảo mật tự động

```bash
sudo apt update
sudo apt full-upgrade -y
```

Kiểm tra xem có cần khởi động lại không (thường là sau khi cập nhật kernel):

```bash
[ -f /var/run/reboot-required ] && echo "Cần reboot"
```

Theo [tài liệu chính thức của Ubuntu](https://ubuntu.com/server/docs/how-to/software/automatic-updates/), Ubuntu Server cài sẵn `unattended-upgrades` và tự cài bản vá bảo mật ngay sau khi cài đặt. Mặc định nó **không tự khởi động lại**, nên bản vá kernel chỉ có hiệu lực khi bạn reboot. Hãy lên lịch reboot định kỳ vào giờ ít truy cập.

Trên Debian 12, cần tự cài:

```bash
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
```

## Bước 2: Tạo user riêng có quyền sudo

Làm việc hằng ngày bằng root nghĩa là mọi lệnh gõ nhầm đều chạy với toàn quyền. Tạo một user riêng:

```bash
sudo adduser quantri
sudo usermod -aG sudo quantri
```

Mở một terminal mới và thử `ssh quantri@IP-VPS`, rồi `sudo -v` để chắc chắn user này dùng được sudo trước khi đi tiếp.

## Bước 3: Đăng nhập SSH bằng key

Trên **máy tính của bạn** (không phải VPS), tạo cặp khoá ed25519, loại khoá mà tài liệu OpenSSH của Ubuntu khuyên dùng:

```bash
ssh-keygen -t ed25519 -C "laptop-cong-ty"
ssh-copy-id quantri@IP-VPS
```

Đặt passphrase cho khoá. Nếu laptop bị mất, khoá có passphrase vẫn chưa dùng được ngay. Thử lại `ssh quantri@IP-VPS`: nếu vào được mà không hỏi mật khẩu của user, key đã hoạt động.

## Bước 4: Tắt đăng nhập bằng mật khẩu và root qua SSH

Đây là bước quan trọng nhất, và cũng là bước dễ tự khoá mình nhất. **Giữ nguyên phiên SSH hiện tại** cho tới khi kiểm tra xong.

Ubuntu đọc các file trong `/etc/ssh/sshd_config.d/` trước file cấu hình chính, và với sshd, giá trị đọc được **đầu tiên** sẽ thắng. Một số image cloud có sẵn file như `50-cloud-init.conf` bật `PasswordAuthentication yes`, vì vậy hãy đặt tên file của bạn bắt đầu bằng `00-` để nó được đọc trước:

```bash
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf > /dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
EOF
```

Kiểm tra cú pháp, xem giá trị thực tế, rồi khởi động lại SSH:

```bash
sudo sshd -t
sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication'
sudo systemctl restart ssh
```

Mở **terminal thứ hai** và đăng nhập lại bằng key. Chỉ khi thành công mới đóng phiên cũ.

### Có nên đổi cổng SSH?

Đổi cổng 22 sang cổng khác làm log bớt nhiễu, nhưng không thay thế được SSH key. Nếu đổi, lưu ý Ubuntu 24.04 dùng **socket activation** cho SSH: sau khi sửa `Port`, chỉ restart `ssh` là chưa đủ. Theo [hướng dẫn của Ubuntu về socket activation](https://discourse.ubuntu.com/t/sshd-now-uses-socket-based-activation-ubuntu-22-10-and-later/30189), bạn cần:

```bash
sudo ufw allow 2222/tcp          # mở cổng mới TRƯỚC
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
sudo ss -tlnp | grep 2222
```

Thử kết nối cổng mới, rồi mới xoá quy tắc cho cổng 22.

## Bước 5: Bật tường lửa UFW

Nguyên tắc: chặn mọi kết nối vào, chỉ mở những gì cần. **Mở SSH trước khi bật UFW**, nếu không phiên hiện tại sẽ bị cắt.

```bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
```

Nếu nhà cung cấp VPS có thêm cloud firewall (security group), hãy cấu hình cả ở đó.

**Lưu ý với Docker:** [tài liệu Docker](https://docs.docker.com/engine/network/packet-filtering-firewalls/) nói rõ Docker và UFW không tương thích: cổng container được publish (`-p 8080:80`) đi vòng qua quy tắc UFW. Muốn ứng dụng Docker chỉ truy cập qua reverse proxy, hãy publish vào `127.0.0.1:8080:80` thay vì `8080:80`.

## Bước 6: Cài Fail2ban chống dò mật khẩu

Khi đã tắt mật khẩu SSH, dò mật khẩu SSH không còn tác dụng, nhưng Fail2ban vẫn hữu ích để giảm tải và bảo vệ các dịch vụ khác (mail, FTP, trang đăng nhập).

```bash
sudo apt install fail2ban python3-systemd
sudo tee /etc/fail2ban/jail.local > /dev/null <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true
backend = systemd
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
```

`backend = systemd` giúp Fail2ban đọc log từ journal. Điều này quan trọng trên Debian 12, nơi `rsyslog` không còn được cài mặc định nên thường không có `/var/log/auth.log`. Thêm IP văn phòng của bạn vào `ignoreip` để không tự chặn mình.

## Bước 7: Đóng dịch vụ không cần thiết

Liệt kê mọi cổng đang lắng nghe:

```bash
sudo ss -tulpn
```

Với mỗi dòng, hỏi: dịch vụ này có cần nhận kết nối từ internet không? MariaDB, PostgreSQL, Redis gần như luôn chỉ nên nghe ở `127.0.0.1`. Dịch vụ không dùng thì gỡ hẳn (`sudo apt purge ...`) thay vì chỉ chặn cổng.

## Bước 8: Đồng bộ thời gian

Log sai giờ khiến điều tra sự cố rất khó, và một số hệ thống xác thực (mã 2FA, license, chứng chỉ) phụ thuộc giờ chính xác.

```bash
timedatectl
sudo timedatectl set-timezone Asia/Ho_Chi_Minh
```

Dòng `System clock synchronized: yes` cho biết đồng bộ NTP đang hoạt động.

## Bước 9: Sao lưu ra ngoài server

Bảo mật không chỉ là ngăn tấn công, mà còn là khôi phục được khi có sự cố. Bản sao lưu nằm trên chính VPS sẽ mất cùng VPS khi bị mã hoá tống tiền hoặc khi nhà cung cấp gặp sự cố. Tối thiểu:

- snapshot định kỳ ở nhà cung cấp VPS;
- sao lưu file và database ra một nơi khác (S3, máy chủ khác), có mã hoá;
- **thử khôi phục** ít nhất một lần, vì bản sao lưu chưa thử khôi phục là bản sao lưu chưa chắc dùng được.

## Bước 10: Theo dõi log và cảnh báo

Vài lệnh nên quen tay:

```bash
sudo journalctl -u ssh --since today      # đăng nhập SSH
last -n 20                                # phiên đăng nhập gần đây
sudo fail2ban-client status sshd          # IP đang bị chặn
df -h                                     # ổ đĩa sắp đầy?
```

Tốt hơn nữa là có cảnh báo tự động khi dịch vụ dừng, ổ đĩa đầy hay chứng chỉ sắp hết hạn, để bạn không phải nhớ kiểm tra.

## Bảo mật VPS Ubuntu với ZoPanel: phần nào đã có sẵn?

Nếu bạn dùng VPS để làm hosting, [trình cài đặt ZoPanel](/vi/docs/install) tự làm khá nhiều bước ở trên. Theo [tài liệu bảo mật](/vi/docs/security):

- **Cập nhật:** trình cài đặt nâng cấp toàn bộ gói hệ thống và bật cập nhật bảo mật tự động (unattended-upgrades).
- **Tường lửa:** UFW được bật, chỉ mở cổng SSH của bạn, 80, 443 và 8888 (giao diện panel), và tự bật khi khởi động. Thành phần nào cài thêm (mail, DNS, FTP) tự mở cổng của nó. Quản lý quy tắc ở **Bảo mật → Tường lửa**.
- **Fail2ban:** jail `sshd` (5 lần sai trong 10 phút, chặn 1 giờ) và jail riêng cho đăng nhập panel (8 lần sai trong 15 phút, chặn 1 giờ).
- **Cách ly giữa các website:** mỗi tài khoản là một user Linux riêng, có pool PHP-FPM riêng, giới hạn CPU/RAM/tiến trình riêng, quota ổ đĩa, và `/proc` được mount với `hidepid` để khách không thấy tiến trình của nhau.
- **Trung tâm bảo mật:** chấm điểm server và panel, kiểm tra root đăng nhập SSH bằng mật khẩu, SSH dùng mật khẩu, Fail2ban, bản vá đang chờ, đồng bộ giờ, dịch vụ mở ra cổng công khai, tài khoản UID 0 thừa… và có nút **Sửa ngay** cho những mục sửa tự động được an toàn. Với các mục SSH, panel kiểm tra bạn đã có key trước khi sửa, nên không thể tự khoá mình.
- **Panel:** xác thực hai lớp (có thể bắt buộc cho mọi quản trị viên), giới hạn IP truy cập panel, nhật ký hoạt động chống sửa đổi, tường lửa ứng dụng web (ModSecurity + OWASP CRS) và quét mã độc hằng tuần.

Phần bạn vẫn phải tự làm: tạo SSH key, giữ console dự phòng, và đưa bản sao lưu ra ngoài server. ZoPanel cần cài trên **server mới**, nên thứ tự hợp lý là: tạo VPS → thêm SSH key → [cài ZoPanel](/vi/docs/requirements) → mở **Trung tâm bảo mật** và xử lý từng mục còn đỏ.

Vì sao panel hosting cũng cần được thiết kế để giới hạn thiệt hại khi bị tấn công, bạn có thể đọc thêm trong bài [Vì sao control panel hosting không nên chạy bằng root](/vi/blog/secure-hosting-panel-architecture).

## Những lỗi khiến bạn tự khoá mình ngoài VPS

1. **Bật UFW trước khi mở SSH.** Phiên hiện tại bị cắt ngay. Luôn `ufw allow OpenSSH` trước.
2. **Tắt mật khẩu trước khi thử key.** Hãy thử đăng nhập bằng key ở một terminal khác trước.
3. **Đổi cổng SSH mà quên mở cổng mới trên UFW và cloud firewall**, hoặc quên `restart ssh.socket` trên Ubuntu 24.04.
4. **Đóng phiên SSH cũ quá sớm.** Giữ nó tới khi chắc chắn phiên mới vào được.
5. **Tin rằng UFW chặn được container Docker.** Không, với cổng đã publish.
6. **Nghĩ sao lưu trên cùng VPS là đủ.** Không đủ khi chính VPS gặp sự cố.

## Kết luận

Một VPS Ubuntu an toàn không đòi hỏi công cụ đắt tiền: SSH key, tắt mật khẩu, tường lửa, vá tự động và sao lưu ra ngoài đã đóng phần lớn cánh cửa mà bot tìm kiếm. Phần khó là làm đúng thứ tự để không tự khoá mình, và duy trì đều đặn về sau.

Nếu VPS của bạn dùng để chạy website, bạn có thể [cài ZoPanel miễn phí](/vi/pricing) (gói Free: 3 tài khoản hosting, 10 website, 10 database, không giới hạn thời gian) để có sẵn tường lửa, Fail2ban, cách ly từng website và Trung tâm bảo mật kiểm tra định kỳ cho bạn. Bước tiếp theo nên đọc: [chống brute force SSH](/vi/blog/ssh-brute-force-protection).

## Câu hỏi thường gặp

### Bảo mật VPS Ubuntu cần làm những gì đầu tiên?

Bốn việc đầu tiên: cập nhật hệ thống, đăng nhập SSH bằng key, tắt đăng nhập bằng mật khẩu và root qua SSH, rồi bật tường lửa UFW chỉ mở SSH, 80 và 443. Sau đó cài Fail2ban và thiết lập sao lưu ra ngoài server.

### Có nên đổi cổng SSH mặc định 22 không?

Đổi cổng giúp log bớt các lần dò tự động, nhưng không làm server an toàn hơn đáng kể nếu bạn đã dùng SSH key và tắt mật khẩu. Nếu đổi, trên Ubuntu 24.04 phải chạy `systemctl daemon-reload` và `systemctl restart ssh.socket`, và mở cổng mới trên tường lửa trước.

### Ubuntu có tự cài bản vá bảo mật không?

Có. Ubuntu Server cài sẵn và bật `unattended-upgrades` cho bản vá bảo mật, nhưng mặc định không tự khởi động lại. Bản vá kernel chỉ có hiệu lực sau khi reboot, nên hãy lên lịch reboot định kỳ.

### Vì sao UFW không chặn được cổng của Docker?

Docker tự thêm quy tắc NAT để chuyển hướng traffic tới container trước khi traffic đi qua quy tắc UFW. Cách an toàn là publish cổng vào `127.0.0.1` và để nginx làm reverse proxy phía trước.

### Cài control panel có làm VPS kém an toàn hơn không?

Có thể, nếu panel chạy bằng root và lộ ra internet mà không có lớp bảo vệ. Hãy chọn panel có tách quyền, xác thực hai lớp, giới hạn IP truy cập và chính sách cập nhật rõ ràng, và luôn cập nhật panel lên bản mới nhất.
