Tropic Host

Bảo mật VPS từ đầu: SSH keys, firewall và Fail2ban

9 phút đọc
Tropic
Bảo mật VPS từ đầu: SSH keys, firewall và Fail2ban

Bảo mật VPS từ đầu: SSH keys, firewall và Fail2ban

Không nên coi VPS mới là an toàn ngay sau khi cài Ubuntu. Trước khi cấu hình quyền truy cập, máy chủ đã hiển thị với các công cụ quét: chúng thử mật khẩu SSH, tìm control panel bị mở và kiểm tra các lỗ hổng phổ biến. Trong hướng dẫn này, chúng ta sẽ đi qua các bước cơ bản để bảo mật VPS từ đầu: tạo người dùng riêng, cấu hình xác thực bằng SSH key, giới hạn port mạng bằng UFW và thêm Fail2ban. Tất cả bước đều hoạt động với Ubuntu 22.04 và 24.04 khi lệnh được chạy bởi người dùng có quyền sudo.

Trước khi bắt đầu: lập danh sách port

Đừng mở port “cho chắc”. Một web server thông thường cần:

  • 22/tcp — SSH; tốt nhất giới hạn theo IP hoặc chuyển sang port khác như một biện pháp bổ sung;
  • 80/tcp — HTTP; thường cần để chuyển hướng sang HTTPS và xác thực chứng chỉ;
  • 443/tcp — HTTPS.

Port ứng dụng như 3000, 8080 hoặc 9000 không nên truy cập từ internet nếu Nginx hoặc Caddy đang chạy phía trước. Bind ứng dụng vào 127.0.0.1 hoặc chỉ cho phép port đó trên mạng nội bộ. Trước tiên, hãy xem máy chủ đang lắng nghe gì:

sudo ss -tulpn

Sau khi cài Docker, hãy kiểm tra riêng các quy tắc iptables: publish -p 3000:3000 có thể mở port ngoài thiết lập dự kiến. Với dịch vụ công khai, dùng HTTPS proxy và giữ port nội bộ ẩn sẽ an toàn hơn.

Bước 1. Cập nhật hệ thống và tạo quản trị viên

Kết nối VPS bằng thông tin được cấp và cài cập nhật:

sudo apt update
sudo apt full-upgrade -y
sudo apt install -y ufw fail2ban unattended-upgrades

Tạo người dùng cá nhân. Thay alex bằng tên của bạn:

sudo adduser alex
sudo usermod -aG sudo alex

Đừng xóa quyền truy cập ban đầu cho đến khi kiểm thử tài khoản mới trong một cửa sổ terminal riêng. Đây là quy tắc quan trọng: lỗi SSH dễ sửa hơn khi phiên hiện tại vẫn mở.

Bước 2. Tạo SSH key và cài trên máy chủ

Trên máy tính Linux, macOS hoặc Windows PowerShell, chạy:

ssh-keygen -t ed25519 -C "alex@my-computer"

Nhấn Enter để lưu key ở tệp mặc định rồi đặt passphrase. Không bao giờ gửi private key trong chat, đưa vào repository hoặc sao chép lên VPS. Chỉ tệp có phần mở rộng .pub mới được chuyển lên máy chủ:

ssh-copy-id alex@SERVER_IP

Nếu không có ssh-copy-id, hiển thị public key bằng Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub trong PowerShell rồi thêm vào máy chủ:

sudo install -d -m 700 -o alex -g alex /home/alex/.ssh
sudo nano /home/alex/.ssh/authorized_keys
sudo chown alex:alex /home/alex/.ssh/authorized_keys
sudo chmod 600 /home/alex/.ssh/authorized_keys

Dán key trên một dòng và kiểm thử đăng nhập trước khi tắt mật khẩu:

ssh alex@SERVER_IP
sudo whoami

Kết quả mong đợi của lệnh cuối là root. Nếu SSH client không tìm thấy key, hãy chỉ rõ: ssh -i ~/.ssh/id_ed25519 alex@SERVER_IP.

Bước 3. Tắt đăng nhập root và xác thực bằng mật khẩu

Sao lưu cấu hình SSH:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

Đảm bảo tệp chứa các tham số sau:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
MaxAuthTries 3

Trên Ubuntu, cài đặt có thể nằm trong /etc/ssh/sshd_config.d/*.conf, vì vậy hãy kiểm tra cấu hình thực tế:

sudo sshd -t
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries'

Nếu sshd -t báo lỗi, đừng khởi động lại dịch vụ cho đến khi sửa cú pháp. Sau khi kiểm tra thành công, áp dụng cài đặt:

sudo systemctl reload ssh

Giữ kết nối SSH cũ và kiểm thử đăng nhập bằng key trong cửa sổ mới. Tắt mật khẩu khi chưa xác minh key là cách phổ biến nhất khiến mất quyền truy cập máy chủ.

Bước 4. Cấu hình UFW mà không chặn SSH

UFW là wrapper thuận tiện cho các quy tắc mạng Linux. Trước tiên đặt mặc định an toàn, sau đó cho phép SSH và port web:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable

Chỉ xác nhận kích hoạt sau khi đã thêm quy tắc SSH. Xem lại kết quả:

sudo ufw status verbose
sudo ufw status numbered

Với IP văn phòng cố định, bạn có thể giới hạn SSH cho địa chỉ đó:

sudo ufw delete allow 22/tcp
sudo ufw allow from YOUR.PUBLIC.IP to any port 22 proto tcp comment 'SSH office'

Chỉ dùng tùy chọn này với IP cố định và quyền truy cập provider console: nếu địa chỉ thay đổi, bạn có thể tự khóa mình khỏi máy chủ.

Cách mở tạm thời một port ứng dụng

Nếu cần kiểm tra dịch vụ trực tiếp, hãy tạo quy tắc giới hạn nguồn:

sudo ufw allow from YOUR.PUBLIC.IP to any port 8080 proto tcp

Sau khi kiểm thử, xóa bằng số hiển thị trong ufw status numbered:

sudo ufw delete RULE_NUMBER

Đừng dùng sudo ufw allow 1:65535/tcp: quy tắc như vậy biến firewall thành hình thức.

Bước 5. Bật Fail2ban cho SSH

Fail2ban phân tích log và thêm quy tắc chặn tạm thời sau nhiều lần đăng nhập thất bại. Nó không thay thế SSH key hoặc firewall, nhưng giảm nhiễu từ các cuộc brute-force tự động.

Tạo cấu hình cục bộ để cập nhật package không ghi đè cài đặt:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Đặt các giá trị hợp lý trong phần [DEFAULT]:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
banaction = ufw

[sshd]
enabled = true
port = 22

Khởi động dịch vụ và kiểm tra jail:

sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

Trong output sshd, kiểm tra số lần thất bại và địa chỉ bị chặn. Đừng thêm IP của bạn vào danh sách ban. Với ngoại lệ vĩnh viễn, dùng ignoreip = 127.0.0.1/8 YOUR.PUBLIC.IP trong [DEFAULT].

Bước 6. Bật cập nhật tự động

Cập nhật tự động hữu ích cho các package bảo mật, nhưng việc reboot kernel vẫn cần quản lý:

sudo dpkg-reconfigure -plow unattended-upgrades
sudo systemctl status unattended-upgrades

Mỗi tuần một lần, kiểm tra có cần reboot không:

test -f /var/run/reboot-required && echo 'Требуется перезапуск'

Trước khi reboot thủ công, hãy chắc chắn bạn có key hoạt động và quyền truy cập console VPS. Sau reboot, kiểm tra dịch vụ ứng dụng, Nginx, UFW và Fail2ban.

Bước 7. Kiểm tra kết quả từ bên ngoài

Kiểm tra cơ chế bảo vệ từ máy tính khác, không chỉ đọc cấu hình:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no alex@SERVER_IP

Lệnh phải kết thúc bằng thông báo từ chối. Kiểm thử riêng đăng nhập bằng key đang hoạt động:

ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 alex@SERVER_IP

Trên VPS, kiểm tra địa chỉ lắng nghe và các quy tắc:

sudo ss -lntup
sudo ufw status numbered
sudo fail2ban-client status sshd

Port ứng dụng nên lắng nghe trên 127.0.0.1 nếu không dành cho truy cập trực tiếp. Từ máy bên ngoài, bạn có thể dùng nmap SERVER_IP, nhưng chỉ quét máy chủ của mình: kiểm tra hạ tầng người khác khi chưa được phép có thể vi phạm pháp luật và quy định nhà cung cấp.

Sao lưu và khôi phục

Bảo vệ SSH không chống lại dữ liệu bị xóa, lỗi quản trị viên hoặc ứng dụng bị xâm nhập. Lưu bản sao cơ sở dữ liệu, cấu hình và tệp người dùng tách khỏi VPS. Thiết lập tối thiểu là sao lưu hằng ngày, giữ vài phiên bản của những ngày trước và kiểm tra khôi phục định kỳ.

Đừng ghi mật khẩu hoặc token vào script văn bản thuần. Nếu secret bị lộ, hãy thu hồi ngay và tạo secret mới.

Cách chọn VPS cho dự án an toàn

Bảo mật bắt đầu từ quyền kiểm soát hạ tầng. Trên VPS, bạn có thể tự chọn hệ điều hành, quy tắc firewall, phương thức truy cập, bản sao lưu và vị trí dịch vụ. Với website hoặc API nhỏ, mạng ổn định, SSD và recovery console quan trọng hơn số virtual core dư thừa.

Khi khởi chạy dự án trên VPS tại tropic.host, hãy xác định trước các điểm vào công khai: trong hầu hết trường hợp, SSH, HTTP và HTTPS là đủ. Giữ cơ sở dữ liệu và control panel trong mạng nội bộ. Khi dự án lớn lên, tách VPS cho ứng dụng, cơ sở dữ liệu và giám sát giúp cô lập các miền lỗi.

Lỗi thường gặp

  • Tắt mật khẩu trước khi kiểm thử đăng nhập bằng key. Giữ phiên hiện tại mở và kiểm tra đăng nhập mới riêng.
  • Để 22/tcp mở cho toàn thế giới dù có thể chỉ cho phép các địa chỉ đáng tin cậy.
  • Publish port Docker trực tiếp. Trước tiên kiểm tra quy tắc Docker và UFW.
  • Cài Fail2ban rồi không bao giờ xem log nữa. Sau khi thay đổi, kiểm tra journalctl -u ssh và trạng thái jail.

Kết luận

Bảo vệ VPS cơ bản không tốn nhiều thời gian khi thực hiện đúng thứ tự: tạo người dùng riêng, cài SSH key, xác minh quyền truy cập, tắt đăng nhập root và mật khẩu, bật UFW, cấu hình Fail2ban và thiết lập cập nhật tự động. Sau đó thêm sao lưu, logging và giám sát bên ngoài.

Những bước này không làm máy chủ bất khả xâm phạm, nhưng loại bỏ các lỗi cấu hình ban đầu phổ biến nhất. Bước tiếp theo là điều chỉnh hồ sơ bảo mật theo ứng dụng cụ thể: cập nhật dependency, hạn chế quyền dịch vụ, bảo vệ admin panel và thường xuyên kiểm tra port mở.

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

Có cần đổi port SSH mặc định không?

Không nhất thiết. Chuyển port làm giảm nhiễu từ các cuộc quét tự động nhưng không thay thế key, tắt mật khẩu, UFW hoặc Fail2ban. Nếu đổi port, hãy cập nhật quy tắc firewall và tham số port trong jail Fail2ban.

Phải làm gì nếu mất quyền truy cập sau khi cấu hình UFW?

Dùng web hoặc rescue console của nhà cung cấp, sau đó kiểm tra quy tắc SSH và cấu hình sshd. Đừng đóng phiên đang hoạt động cho đến khi xác nhận đăng nhập mới.

Fail2ban có đủ để bảo vệ SSH không?

Không. Fail2ban phản ứng với các lần đăng nhập thất bại đã xảy ra. Nền tảng bảo vệ phải là SSH key, tắt xác thực mật khẩu, quyền người dùng tối thiểu và firewall giới hạn.

Có thể chỉ cho phép SSH từ một địa chỉ IP không?

Có, nếu địa chỉ cố định: thêm quy tắc UFW allow from cho IP đó. Hãy chuẩn bị quyền truy cập provider console hoặc phương án dự phòng vì kết nối sẽ bị chặn khi IP thay đổi.

Nên kiểm tra bảo mật VPS bao lâu một lần?

Sau mỗi thay đổi với SSH, firewall hoặc publish port Docker, hãy chạy kiểm tra port và thử đăng nhập. Khi bảo trì định kỳ, xem cập nhật và log ít nhất mỗi tuần, đồng thời thường xuyên kiểm thử khôi phục bản sao lưu.