7 Bí Quyết Bảo Mật Next.js Trên VPS Cho Website Doanh Nghiệp

11/05/2026 · P T P · Chung

Bí quyết bảo mật ứng dụng Next.js khi chạy trên VPS dành cho website doanh nghiệp

Website doanh nghiệp không chỉ là “bộ mặt online”. Nó thường chứa form liên hệ, dữ liệu khách hàng, tài khoản quản trị, API nội bộ, tích hợp CRM, thanh toán, email marketing. Với Next.js, doanh nghiệp có lợi thế lớn: SSR, SSG, API routes, middleware, hiệu năng tốt. Nhưng khi tự triển khai trên VPS, trách nhiệm bảo mật cũng tăng mạnh.

Khác với nền tảng managed như Vercel, VPS yêu cầu bạn tự kiểm soát OS, firewall, reverse proxy, SSL, process manager, log, backup, cập nhật. Một cấu hình sai nhỏ → lộ biến môi trường, bị brute-force SSH, leak token, chiếm quyền admin, inject API, downtime.

Bài viết này tập trung vào các bí quyết thực tế để bảo mật ứng dụng Next.js khi chạy trên VPS cho website doanh nghiệp.


1. Bảo mật VPS từ lớp nền tảng

Ứng dụng an toàn nhưng VPS yếu → vẫn rủi ro. Hãy bắt đầu từ hệ điều hành.

Cập nhật hệ thống định kỳ

Server lỗi thời → lỗ hổng kernel/package → dễ bị khai thác.

sudo apt update && sudo apt upgrade -y

Bật tự động cập nhật security patch:

sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure unattended-upgrades

Tạo user riêng, không chạy app bằng root

Root chạy app → app bị khai thác → attacker có quyền cao nhất.

Tạo user deploy:

sudo adduser deploy
sudo usermod -aG sudo deploy

Chạy Next.js bằng user này. Không dùng root để npm install, pm2 start, deploy.

Khóa SSH bằng key, tắt password login

Password SSH → brute-force. SSH key → an toàn hơn.

Trong /etc/ssh/sshd_config:

PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes

Restart SSH:

sudo systemctl restart ssh

Lưu ý: mở session SSH thứ 2 để test trước khi đóng session cũ. Sai config → tự khóa khỏi server.

Đổi port SSH? Có ích nhưng không đủ

Đổi port SSH giảm noise bot, không thay thế auth key/firewall.

Port 2222

Sau đó mở firewall đúng port.


2. Cấu hình firewall tối thiểu

VPS public internet → chỉ mở port cần thiết.

Với UFW:

sudo ufw allow 2222/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status

Không mở trực tiếp port Next.js như 3000 ra internet. App nên chạy local:

HOST=127.0.0.1 PORT=3000 npm start

Nginx/Caddy đứng trước → reverse proxy → SSL → rate limit → header bảo mật.


3. Dùng reverse proxy chuẩn: Nginx hoặc Caddy

Next.js production thường chạy sau Nginx. Nginx nhận request public, chuyển vào app nội bộ.

Ví dụ Nginx:

server {
    listen 80;
    server_name example.com www.example.com;

location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1;

proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

Sau khi có SSL, redirect HTTP → HTTPS.


4. Bật HTTPS đúng cách

Không HTTPS → cookie/session/token có thể bị nghe lén. Website doanh nghiệp bắt buộc HTTPS.

Dùng Let’s Encrypt:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

Kiểm tra auto renew:

sudo certbot renew --dry-run

Bật HSTS cẩn trọng

HSTS ép trình duyệt luôn dùng HTTPS:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Chỉ bật khi chắc chắn toàn bộ domain/subdomain hỗ trợ HTTPS. Sai → người dùng không truy cập được qua HTTP fallback.


5. Quản lý biến môi trường an toàn

Next.js dùng .env, .env.production. Rủi ro lớn: commit nhầm secret lên Git.

Nguyên tắc

Không commit .env*
Không đặt secret trong code
Không dùng NEXT_PUBLIC_ cho dữ liệu nhạy cảm
Phân quyền file .env
Rotate secret định kỳ

.gitignore:

.env
.env.*
!.env.example

Phân quyền:

chmod 600 .env.production

Hiểu rõ NEXT_PUBLIC_

Biến có prefix NEXT_PUBLIC_ được bundle ra client. Nghĩa là người dùng có thể xem.

Sai:

NEXT_PUBLIC_API_SECRET=abc123

Đúng:

API_SECRET=abc123
NEXT_PUBLIC_SITE_URL=https://example.com

Secret chỉ dùng ở server: API route, server action, middleware server-side.


6. Bảo vệ API Routes và Server Actions

Next.js API routes dễ bị xem như “backend nhỏ”. Nếu thiếu auth, validation, rate limit → nguy hiểm.

Luôn xác thực request nhạy cảm

API cập nhật user, gửi email, tạo đơn, export data → cần auth/role.

Ví dụ logic:

– Chưa login → 401
– Login nhưng không đủ quyền → 403
– Dữ liệu sai → 400
– Thành công → 200

Validate dữ liệu đầu vào

Không tin dữ liệu từ client. Dùng Zod/Yup.

import { z } from "zod";

const schema = z.object({ email: z.string().email(), name: z.string().min(2).max(100), });

Validation → giảm injection, spam, crash app.

Rate limit API quan trọng

Form liên hệ, login, reset password, newsletter → dễ bị spam/brute-force.

Có thể rate limit tại:

– Nginx
– App middleware
– Redis-based limiter
– Cloudflare/WAF

Nginx example:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/m;

location /api/ { limit_req zone=api_limit burst=20 nodelay; proxy_pass http://127.0.0.1:3000; }


7. Cookie, session, auth: cấu hình nghiêm ngặt

Nếu dùng NextAuth/Auth.js hoặc custom session, cookie cần flag bảo mật.

Cookie nên có:

HttpOnly → JS không đọc được
Secure → chỉ gửi qua HTTPS
SameSite=Lax hoặc Strict → giảm CSRF
Path=/
– Expiration hợp lý

Ví dụ nguyên tắc:

{
  httpOnly: true,
  secure: process.env.NODE_ENV === "production",
  sameSite: "lax",
  path: "/"
}

Admin panel nên có thêm:

– MFA
– IP allowlist nếu phù hợp
– Session timeout ngắn
– Log đăng nhập
– Chống brute-force


8. Thêm security headers

Security headers → giảm XSS, clickjacking, MIME sniffing, data leak.

Nginx:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

Content Security Policy

CSP mạnh nhưng dễ làm hỏng website nếu cấu hình sai. Bắt đầu bằng report-only, sau đó siết dần.

Ví dụ cơ bản:

add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; connect-src 'self' https:;" always;

Tốt hơn: bỏ 'unsafe-inline' nếu app hỗ trợ nonce/hash.


9. Build và chạy Next.js đúng production mode

Không chạy dev mode trên VPS public.

Sai:

npm run dev

Đúng:

npm ci
npm run build
npm start

Dùng npm ci thay vì npm install trong deploy → cài đúng lockfile, ổn định hơn.

Dùng PM2 hoặc systemd

PM2 giúp app tự restart khi crash.

npm install -g pm2
pm2 start npm --name "company-web" -- start
pm2 save
pm2 startup

App crash → downtime thấp hơn. Nhưng không thay thế monitoring.


10. Kiểm soát dependency và supply chain

Next.js app phụ thuộc nhiều package. Một package độc hại/lỗi thời → rủi ro.

Kiểm tra định kỳ

npm audit
npm outdated

Cập nhật Next.js nhanh khi có CVE. Đặc biệt các lỗi liên quan:

– SSR
– Middleware
– Image optimization
– Auth/session
– Prototype pollution
– XSS

Khóa version bằng lockfile

Commit package-lock.json/pnpm-lock.yaml. Không xóa lockfile tùy tiện.

Hạn chế package không cần thiết

Ít dependency → ít bề mặt tấn công. Tránh package lạ, ít maintainer, quyền quá rộng.


11. Bảo mật upload file và hình ảnh

Website doanh nghiệp thường có upload: avatar, hồ sơ, ảnh sản phẩm, tài liệu.

Rủi ro:

– Upload web shell
– File quá lớn → hết disk
– SVG chứa script
– Malware
– Ghi đè file
– Lộ đường dẫn private

Khuyến nghị:

– Giới hạn MIME type
– Giới hạn size
– Đổi tên file random
– Lưu ngoài thư mục thực thi
– Scan virus nếu file quan trọng
– Không tin extension
– Dùng object storage nếu quy mô lớn

Ví dụ: không cho upload .php, .js, .html, .svg nếu không thật sự cần.


12. Log, monitoring, cảnh báo

Không có log → bị tấn công mà không biết.

Cần theo dõi:

– SSH login fail
– Nginx access/error log
– App error log
– API 401/403/429 tăng bất thường
– CPU/RAM/disk
– SSL expiry
– Process restart liên tục

PM2 logs:

pm2 logs company-web

Nginx logs:

sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

Nên tích hợp Sentry, UptimeRobot, Better Stack, Grafana, Prometheus tùy quy mô.


13. Backup và kế hoạch khôi phục

Bảo mật không chỉ là ngăn tấn công. Còn là phục hồi nhanh khi sự cố xảy ra.

Cần backup:

– Database
– File upload
.env/config quan trọng
– Nginx config
– Source/deploy artifacts nếu cần

Nguyên tắc:

– Backup tự động
– Lưu ngoài VPS
– Mã hóa backup
– Test restore định kỳ
– Có retention: 7 ngày, 30 ngày, 90 ngày

Backup chưa test restore → chưa phải backup thật.


14. Tách quyền DB và dịch vụ nội bộ

Database không nên public nếu không cần. Chỉ app server truy cập.

Nếu DB cùng VPS:

– Bind 127.0.0.1
– User DB quyền tối thiểu
– Password mạnh
– Không dùng root DB trong app

Ví dụ quyền tối thiểu:

– App chỉ cần CRUD DB cụ thể
– Không cần tạo user
– Không cần drop toàn bộ database
– Không cần quyền superuser

Quyền thấp → app bị khai thác cũng giảm thiệt hại.


15. Dùng Cloudflare/WAF nếu phù hợp

Cloudflare giúp thêm lớp bảo vệ trước VPS:

– DDoS protection
– WAF rules
– Bot fight mode
– Rate limiting
– SSL/TLS
– Cache static asset
– Ẩn IP origin nếu cấu hình đúng

Nhưng Cloudflare không thay thế bảo mật server/app. Nếu IP VPS bị lộ, attacker vẫn có thể đánh thẳng. Nên firewall chỉ cho Cloudflare IP truy cập port 80/443 nếu muốn siết mạnh.


Kết luận: Bảo mật Next.js trên VPS là quy trình, không phải checklist một lần

Với website doanh nghiệp, bảo mật Next.js trên VPS cần nhìn theo nhiều lớp: VPS, SSH, firewall, reverse proxy, HTTPS, environment variables, API auth, cookie, headers, dependency, backup, monitoring. Không có cấu hình “ma thuật” nào đủ bảo vệ toàn bộ.

Cách làm thực tế nhất: bắt đầu từ nền tảng tối thiểu an toàn, sau đó siết dần theo rủi ro. Ưu tiên ngay: tắt SSH password, không chạy app bằng root, đóng port 3000, bật HTTPS, bảo vệ .env, validate API, rate limit login/form, backup tự động, cập nhật Next.js thường xuyên.

Bảo mật tốt không làm chậm doanh nghiệp. Ngược lại, nó giảm downtime, giảm rủi ro mất dữ liệu, tăng uy tín với khách hàng. Với Next.js trên VPS, đội kỹ thuật cần coi bảo mật là một phần của quy trình vận hành production hằng ngày.

#doanh #next #quyet #tren #website
Chia sẻ:
← Trước
Tự động deploy Next.js lên VPS bằng GitHub Actions cực nhanh

Bài viết tương tự

Bình luận

Chưa có bình luận. Hãy là người đầu tiên!