VPS mới bị dò SSH trong vòng vài phút sau khi lên mạng. Danh sách việc làm ngay trên Ubuntu: cập nhật tự động, SSH chỉ bằng khóa, tắt đăng nhập root, ufw, cái bẫy Docker đi vòng qua ufw, và đồng hồ đúng giờ.
Xem nhanh trong 1 phút
Sophos từng đặt mười máy giả lập SSH ở mười trung tâm dữ liệu AWS rồi đo xem bao lâu thì có người gõ cửa. Máy ở São Paulo bị thử đăng nhập sau 52 giây. Máy chậm nhất, ở Ireland, cũng chỉ yên được chưa tới hai tiếng. Khi đã bị tìm thấy, trung bình mỗi máy nhận khoảng 13 lần thử mật khẩu mỗi phút, ngày đêm.
Nghĩa là trong lúc bạn còn đang đọc email “VPS của bạn đã sẵn sàng”, bot đã thử root với 123456. Dưới đây là những việc nên làm trước khi cài bất cứ thứ gì khác. Lệnh viết cho Ubuntu 22.04 và 24.04, Debian gần như giống hệt.
unattended-upgrades tự cài bản vá bảo mật mỗi ngày. Nó không tự khởi động lại máy, nên thỉnh thoảng đăng nhập thấy dòng *** System restart required *** thì chọn lúc vắng khách mà reboot.
2. Tạo user riêng và dùng khóa SSH
Trên máy của bạn (không phải VPS), tạo khóa nếu chưa có:
ssh-keygen -t ed25519 -C "laptop-cua-toi"
Trên VPS, tạo user thường có quyền sudo, chép khóa mà nhà cung cấp đã gắn cho root sang user đó:
Nếu lúc tạo VPS bạn chọn đăng nhập bằng mật khẩu, thì từ máy của bạn chạy ssh-copy-id deploy@IP-CUA-VPS để đưa khóa lên.
Mở một cửa sổ terminal mới, thử ssh deploy@IP-CUA-VPS và sudo -v. Được rồi mới làm bước 3. Đừng đóng phiên root đang mở cho tới khi chắc chắn vào lại được.
Tên file bắt đầu bằng 00- là có lý do. Nhiều image cloud của Ubuntu có sẵn file 50-cloud-init.conf ghi PasswordAuthentication yes, và với sshd, giá trị nào đọc trước thì thắng. Đặt file của bạn tên 99-... là cấu hình bị đè mà không báo gì. Kiểm lại cấu hình thật đang chạy:
Thêm OpenSSHtrước khi enable, không thì tự khóa mình ở ngoài. Nhà cung cấp có tường lửa ở bảng điều khiển (Hetzner, DigitalOcean, Vultr, AWS Security Group đều có) thì bật luôn với cùng luật, hai lớp không thừa.
5. Cái bẫy: Docker đi vòng qua ufw
Đây là chỗ nhiều người tưởng đã an toàn. Tài liệu của Docker ghi rõ Docker và ufw không dùng chung được: cổng bạn publish bằng -p hay ports: được Docker chuyển hướng ở bảng nat, trước khi gói tin tới các luật của ufw. Kết quả là ufw status không có cổng 5432, mà Postgres vẫn mở ra cả internet.
ports: - "127.0.0.1:5432:5432" # chỉ máy chủ gọi được
hoặc bỏ hẳn ports: cho database, Redis, admin panel, để app gọi qua mạng nội bộ của compose bằng tên service (db:5432). Chỉ reverse proxy (Caddy, Nginx, Traefik) mới publish 80 và 443.
Kiểm tra từ máy khác, không phải từ chính VPS:
nc -zv IP-CUA-VPS 5432 6379 3306 27017 8080
Cổng nào báo succeeded mà bạn không định mở là phải sửa.
Nghe không liên quan bảo mật, nhưng đồng hồ lệch vài phút là mã TOTP hai lớp báo sai, chứng chỉ TLS bị coi là chưa tới hạn hay đã hết hạn, JWT bị từ chối, và log có giờ sai thì lúc điều tra sự cố không ghép được ai làm gì trước sau. Dòng System clock synchronized: yes là được.
Nếu còn năm phút
sudo apt install fail2ban để chặn IP thử mật khẩu nhiều lần. Đã tắt mật khẩu ở bước 3 thì đây là lớp thêm, chủ yếu cho log đỡ rác.
Đổi cổng SSH khỏi 22 không làm máy an toàn hơn, chỉ bớt bot. Làm thì nhớ mở cổng mới trên ufw và tường lửa của nhà cung cấp trước.
Ra Permission denied (publickey) mà không hỏi mật khẩu là bước 3 đã đúng. Rồi chạy dòng nc -zv ở bước 5. Trên VPS, sudo ss -tlnp liệt kê mọi cổng đang nghe, dòng nào có 0.0.0.0 hay [::] mà không phải 22, 80, 443 thì xem lại.
VPS của bạn chạy ở đâu, và đã ai từng mở ufw status thấy sạch sẽ mà Postgres vẫn lộ ra ngoài chưa? Vào cộng đồng Vibe Code & Bảo Mật kể cho mọi người nghe nhé.
VPSmáy chủSSH/anh/web/muoi-phut-dau-sau-khi-mua-vps-480.webpVPS · máy chủ · SSH
Muoi phut dau tien sau khi mua VPS VPS moi bi do SSH trong vong vai phut sau khi len mang. Danh sach viec lam ngay tren Ubuntu: cap nhat tu dong, SSH chi bang khoa, tat dang nhap root, ufw, cai bay Docker di vong qua ufw, va dong ho dung gio. VPS may chu SSH Sophos tung dat muoi may gia lap SSH o muoi trung tam du lieu AWS roi do xem bao lau thi co nguoi go cua. May o Sao Paulo bi thu dang nhap sau **52 giay**. May cham nhat, o Ireland, cung chi yen duoc chua toi hai tieng. Khi da bi tim thay, trung binh moi may nhan khoang 13 lan thu mat khau moi phut, ngay dem.

Nghia la trong luc ban con dang doc email "VPS cua ban da san sang", bot da thu `root` voi `123456`. Duoi day la nhung viec nen lam truoc khi cai bat cu thu gi khac. Lenh viet cho Ubuntu 22.04 va 24.04, Debian gan nhu giong het.
## 1. Cap nhat va bat va tu dong
```bash
apt update && apt upgrade -y
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades # chon Yes
```
`unattended-upgrades` tu cai ban va bao mat moi ngay. No khong tu khoi dong lai may, nen thinh thoang dang nhap thay dong `*** System restart required ***` thi chon luc vang khach ma `reboot`.
## 2. Tao user rieng va dung khoa SSH
Tren **may cua ban** (khong phai VPS), tao khoa neu chua co:
```bash
ssh-keygen -t ed25519 -C "laptop-cua-toi"
```
Tren VPS, tao user thuong co quyen sudo, chep khoa ma nha cung cap da gan cho root sang user do:
```bash
adduser deploy
usermod -aG sudo deploy
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
```
Neu luc tao VPS ban chon dang nhap bang mat khau, thi tu may cua ban chay `ssh-copy-id deploy@IP-CUA-VPS` de dua khoa len.
Mo **mot cua so terminal moi**, thu `ssh deploy@IP-CUA-VPS` va `sudo -v`. Duoc roi moi lam buoc 3. Dung dong phien root dang mo cho toi khi chac chan vao lai duoc.
## 3. Tat dang nhap root va mat khau
Tao file rieng thay vi sua `sshd_config` goc:
```bash
sudo tee /etc/ssh/sshd_config.d/00-harden.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
sudo sshd -t && sudo systemctl reload ssh
```
Ten file bat dau bang `00-` la co ly do. Nhieu image cloud cua Ubuntu co san file `50-cloud-init.conf` ghi `PasswordAuthentication yes`, va voi `sshd`, gia tri nao doc truoc thi thang. Dat file cua ban ten `99-...` la cau hinh bi de ma khong bao gi. Kiem lai cau hinh that dang chay:
```bash
sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication'
```
Phai ra `permitrootlogin no` va `passwordauthentication no`.
## 4. Bat tuong lua
```bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
sudo ufw status verbose
```
Them `OpenSSH` **truoc** khi `enable`, khong thi tu khoa minh o ngoai. Nha cung cap co tuong lua o bang dieu khien (Hetzner, DigitalOcean, Vultr, AWS Security Group deu co) thi bat luon voi cung luat, hai lop khong thua.
## 5. Cai bay: Docker di vong qua ufw
Day la cho nhieu nguoi tuong da an toan. Tai lieu cua Docker ghi ro Docker va ufw khong dung chung duoc: cong ban publish bang `-p` hay `ports:` duoc Docker chuyen huong o bang `nat`, truoc khi goi tin toi cac luat cua ufw. Ket qua la `ufw status` khong co cong 5432, ma Postgres van mo ra ca internet.
```yaml
# docker-compose.yml (cach viet lam lo database)
services:
db:
image: postgres:16
ports:
- "5432:5432"
```
Sua bang mot trong hai cach:
```yaml
ports:
- "127.0.0.1:5432:5432" # chi may chu goi duoc
```
hoac bo han `ports:` cho database, Redis, admin panel, de app goi qua mang noi bo cua compose bang ten service (`db:5432`). Chi reverse proxy (Caddy, Nginx, Traefik) moi publish 80 va 443.
Kiem tra tu **may khac**, khong phai tu chinh VPS:
```bash
nc -zv IP-CUA-VPS 5432 6379 3306 27017 8080
```
Cong nao bao `succeeded` ma ban khong dinh mo la phai sua.
## 6. Dong ho dung gio
```bash
timedatectl
sudo timedatectl set-ntp true
sudo timedatectl set-timezone Asia/Ho_Chi_Minh
```
Nghe khong lien quan bao mat, nhung dong ho lech vai phut la ma TOTP hai lop bao sai, chung chi TLS bi coi la chua toi han hay da het han, JWT bi tu choi, va log co gio sai thi luc dieu tra su co khong ghep duoc ai lam gi truoc sau. Dong `System clock synchronized: yes` la duoc.
## Neu con nam phut
- `sudo apt install fail2ban` de chan IP thu mat khau nhieu lan. Da tat mat khau o buoc 3 thi day la lop them, chu yeu cho log do rac.
- Doi cong SSH khoi 22 khong lam may an toan hon, chi bot bot. Lam thi nho mo cong moi tren ufw va tuong lua cua nha cung cap truoc.
- Bat sao luu hay snapshot cua nha cung cap.
## Kiem tra VPS dang chay cua ban
Tu may cua ban:
```bash
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password root@IP-CUA-VPS
```
Ra `Permission denied (publickey)` ma khong hoi mat khau la buoc 3 da dung. Roi chay dong `nc -zv` o buoc 5. Tren VPS, `sudo ss -tlnp` liet ke moi cong dang nghe, dong nao co `0.0.0.0` hay `[::]` ma khong phai 22, 80, 443 thi xem lai.
---
VPS cua ban chay o dau, va da ai tung mo `ufw status` thay sach se ma Postgres van lo ra ngoai chua? Vao [cong dong Vibe Code & Bao Mat](https://www.facebook.com/groups/1867387324580254) ke cho moi nguoi nghe nhe.
## Nguon
- [Exposed: Cyberattacks on Cloud Honeypots](https://assets.sophos.com/X24WTUEQ/at/rgbjvgnx6qwwj7wvx764rmbn/sophos-exposed-cyberattacks-on-cloud-honeypots-wp.pdf), Sophos
- [Packet filtering and firewalls](https://docs.docker.com/engine/network/packet-filtering-firewalls/), Docker
- [Automatic updates](https://documentation.ubuntu.com/server/how-to/software/automatic-updates/), Ubuntu Server
- [OpenSSH server](https://documentation.ubuntu.com/server/how-to/security/openssh-server/), Ubuntu Server