Vũ Văn HảiFull-stack · AI-native
Hướng dẫnBlog
Trao đổi dự án

© 2026 Vũ Văn Hải · Viết từ kinh nghiệm triển khai thật.

Trang chủHướng dẫnBlogRSS
  1. Hướng dẫn
  2. /VPS
  3. /Cấu hình VPS mới: các bước cơ bản an toàn

Cấu hình VPS mới: các bước cơ bản an toàn

Quy trình dựng một VPS Ubuntu/Debian mới an toàn: tạo user sudo, đăng nhập bằng SSH key, siết cấu hình sshd, bật tường lửa UFW và tắt ping.

Cập nhật: 21 thg 9, 20263 phút đọc
VPSSSHUFWBảo mậtUbuntu
Mục lục
  • Tạo user thường có quyền sudo
  • Đăng nhập bằng SSH key
  • Siết cấu hình SSH (hardening)
  • Bật tường lửa UFW
  • Tắt ping (ICMP echo) rồi reboot
  • Lưu ý

Khi vừa nhận một VPS mới, bạn nên làm ba việc trước tiên: tạo một user thường có quyền sudo (không dùng root), chuyển sang đăng nhập bằng SSH key thay vì mật khẩu, và bật tường lửa. Bài này đi lần lượt từng bước, các lệnh copy-paste được ngay.

Trong toàn bài, thay <username> bằng tên user bạn muốn, <server-ip> bằng IP VPS của bạn. Các IP ví dụ (203.0.113.x) chỉ là placeholder.

Tạo user thường có quyền sudo

Đăng nhập lần đầu bằng root (dùng mật khẩu nhà cung cấp gửi):

ssh root@<server-ip>

Cập nhật gói hệ thống, tạo user mới và thêm vào nhóm sudo:

apt update && apt upgrade -y
adduser <username>
usermod -aG sudo <username>

Đăng xuất rồi đăng nhập lại bằng user mới, kiểm tra sudo hoạt động:

ssh <username>@<server-ip>
sudo -v

Nếu không báo lỗi là được. Tạo thư mục chứa SSH key cho user này:

mkdir ~/.ssh && chmod 700 ~/.ssh

Đăng nhập bằng SSH key

Sinh key trên máy local của bạn (không phải trên VPS).

Nếu bạn đã có sẵn SSH key cho một VPS khác (ví dụ id_ed25519), ĐỪNG chạy lệnh mặc định rồi Enter liên tục - nó sẽ ghi đè key cũ và bạn mất quyền vào VPS kia. Hãy đặt tên riêng cho key mới bằng cờ -f.

Trường hợp đây là VPS đầu tiên:

ssh-keygen -t ed25519 -C "[email protected]"

Trường hợp đã có key khác - đặt tên riêng (ví dụ VPS tên "vps2"):

# Windows (PowerShell)
ssh-keygen -t ed25519 -C "[email protected]" -f $env:USERPROFILE\.ssh\id_ed25519_vps2

# macOS / Linux
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519_vps2

Đẩy public key lên VPS (thay tên file .pub cho đúng nếu đã đặt tên riêng):

# Windows (PowerShell)
scp $env:USERPROFILE/.ssh/id_ed25519.pub <username>@<server-ip>:~/.ssh/authorized_keys

# macOS
scp ~/.ssh/id_ed25519.pub <username>@<server-ip>:~/.ssh/authorized_keys

# Linux
ssh-copy-id <username>@<server-ip>

Nếu đặt tên key khác mặc định, SSH sẽ không tự nhận ra key đó. Thêm cấu hình vào ~/.ssh/config (trên Windows là C:\Users\<username>\.ssh\config, không có đuôi .txt):

# VPS dùng key mặc định
Host vps1
    HostName <server-ip-1>
    User <username>
    IdentityFile ~/.ssh/id_ed25519

# VPS dùng key tên riêng
Host vps2
    HostName <server-ip-2>
    User <username>
    IdentityFile ~/.ssh/id_ed25519_vps2

Từ giờ chỉ cần ssh vps1 hoặc ssh vps2, không phải nhớ IP hay đường dẫn key.

Siết cấu hình SSH (hardening)

Mở file cấu hình sshd:

sudo nano /etc/ssh/sshd_config

Sửa ba dòng sau để tắt IPv6 (bớt một bề mặt tấn công), tắt đăng nhập mật khẩu và tắt đăng nhập bằng root:

AddressFamily inet
PasswordAuthentication no
PermitRootLogin no

Nếu có file .conf được include, xóa hết nội dung trong đó để nó không ghi đè:

sudo nano /etc/ssh/sshd_config.d/*.conf

Khởi động lại SSH (một số bản phân phối dùng sshd thay vì ssh):

sudo systemctl restart ssh

Đăng xuất và thử lại: chắc chắn không còn đăng nhập được bằng root hay bằng mật khẩu.

Bật tường lửa UFW

Cài UFW, cho phép SSH/HTTP/HTTPS rồi bật:

sudo apt install ufw
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
sudo ufw status

Tắt ping (ICMP echo) rồi reboot

Để server không trả lời khi bị ping, mở file rules:

sudo nano /etc/ufw/before.rules

Thêm dòng sau vào ngay dưới khối # ok icmp codes for INPUT:

-A ufw-before-input -p icmp --icmp-type echo-request -j DROP

Cuối cùng khởi động lại server và đăng nhập lại khi máy đã lên:

sudo reboot

Lưu ý

Triệu chứngCách xử lý
Đẩy key rồi vẫn bị hỏi mật khẩuKey đặt tên khác mặc định - thêm IdentityFile vào ~/.ssh/config hoặc dùng ssh -i <đường-dẫn-key>
Restart SSH báo không tìm thấy serviceThử sudo systemctl restart sshd
Lỡ tắt PasswordAuthentication khi chưa đẩy keyDùng console web của nhà cung cấp VPS để vào sửa lại
Bài tiếp theoCài Caddy làm reverse proxy trên VPS bằng Docker

Bài liên quan

  • Đặt app ở đâu trên VPS? Cấu trúc thư mục chuẩn /opt/apps

    Quy ước đặt mỗi app trong một thư mục con của /opt/apps trên VPS: chown thư mục cha một lần duy nhất, từ đó git clone, git pull và sửa .env đều không cần sudo.

    VPS

    VPS
  • Migrate database PostgreSQL giữa hai VPS bằng pg_dump và psql

    Di chuyển toàn bộ một database PostgreSQL (schema lẫn data) từ VPS nguồn sang VPS đích qua máy local: dump bằng pg_dump, restore trong một transaction, verify số dòng, cutover và rollback an toàn.

    Database

    Database
  • Kết nối PostgreSQL trên VPS qua SSH Tunnel từ máy local

    Dùng SSH Tunnel để máy dev kết nối PostgreSQL trên VPS mà không phải mở port 5432 ra internet, kèm cách cấu hình DATABASE_URL cho môi trường local và production.

    Database

    Database

Viết bởi Vũ Văn Hải

Tôi là Hải, full-stack developer ở TP. Hồ Chí Minh. Các bài ở đây đúc kết từ những hệ thống tôi tự dựng và vận hành. Cần dựng hoặc gỡ rối một hệ thống tương tự? Cứ nhắn tôi.

Trao đổi dự ánXem thêm hướng dẫn

Thấy sai sót hoặc lệnh không còn chạy? Báo cho tôi

Mục lục

  • Tạo user thường có quyền sudo
  • Đăng nhập bằng SSH key
  • Siết cấu hình SSH (hardening)
  • Bật tường lửa UFW
  • Tắt ping (ICMP echo) rồi reboot
  • Lưu ý