4 phút đọc

Mười phút đầu tiên sau khi mua VPS

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.

Robot linh vật cầm đồng hồ bấm giờ, siết ổ khóa lên tủ máy chủ

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.

1. Cập nhật và bật vá tự động

apt update && apt upgrade -y
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades   # chọn Yes

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 đó:

adduser deploy
usermod -aG sudo deploy
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

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.

3. Tắt đăng nhập root và mật khẩu

Tạo file riêng thay vì sửa sshd_config gốc:

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

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:

sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication'

Phải ra permitrootlogin no và passwordauthentication no.

4. Bật tường lửa

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

Thêm OpenSSH trướ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.

# docker-compose.yml (cách viết làm lộ database)
services:
  db:
    image: postgres:16
    ports:
      - "5432:5432"

Sửa bằng một trong hai cách:

    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.

6. Đồng hồ đúng giờ

timedatectl
sudo timedatectl set-ntp true
sudo timedatectl set-timezone Asia/Ho_Chi_Minh

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.
  • Bật sao lưu hay snapshot của nhà cung cấp.

Kiểm tra VPS đang chạy của bạn

Từ máy của bạn:

ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password root@IP-CUA-VPS

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é.

Nguồn

Chia sẻ lên Facebook

Bình luận

Đang tải bình luận…