一句話說明

在 VPS 上跑 AI 應用不是 python app.py 就好,SSH 防護、防火牆、反向代理和容器安全都需要逐項設定。

為什麼 VPS 部署需要額外注意安全

用 Vercel 或 Cloudflare Pages 部署靜態網站,平台已經幫你處理好大部分安全設定。但 AI 應用通常需要 GPU、長時間連線、自訂模型載入,這些只能在 VPS 上做。VPS 意味著你要自己管整台機器的安全。

飛飛在做滲透測試時,最常見的 VPS 問題是:SSH 用密碼登入、防火牆沒開、應用直接用 root 跑、debug mode 忘記關。

SSH 防護

禁用密碼登入

第一件事是改成 SSH Key 登入並禁用密碼:

# 在本機產生 SSH Key(如果還沒有)
ssh-keygen -t ed25519 -C "[email protected]"

# 把公鑰複製到伺服器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server

# 在伺服器上修改 SSH 設定
sudo nano /etc/ssh/sshd_config

修改以下設定:

PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
MaxAuthTries 3
sudo systemctl restart sshd

修改前確保你的 SSH Key 登入已經測試成功,否則改完後你會被鎖在外面。

改預設 Port

SSH 預設用 22 port,改成其他 port 可以減少自動化掃描的干擾。不是安全措施,但可以降低雜訊。

Port 2222

改完後記得在防火牆開對應的 port。

防火牆設定

用 UFW(Uncomplicated Firewall):

# 預設拒絕所有連入
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 開 SSH(如果改了 port 就改這裡)
sudo ufw allow 2222/tcp

# 開 HTTP 和 HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 啟用
sudo ufw enable
sudo ufw status

不要開不需要的 port。AI 應用常用的 port 如 8080、3000、5000 不應該直接暴露,用 Nginx 反向代理。

Nginx 反向代理

不要讓 AI 應用直接面對外網。用 Nginx 做反向代理:

server {
    listen 443 ssl http2;
    server_name your-ai-app.com;

    ssl_certificate /etc/letsencrypt/live/your-ai-app.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-ai-app.com/privkey.pem;

    # 安全 Headers
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 限制請求大小(防止大量輸入攻擊)
    client_max_body_size 10M;

    # 超時設定(AI 應用回應時間較長)
    proxy_read_timeout 120s;
    proxy_connect_timeout 10s;

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

AI 應用通常需要比一般 Web 應用更長的超時時間。proxy_read_timeout 設 120 秒是因為 LLM 推論可能需要 30-60 秒。但不要設太長(如 600 秒),避免慢速攻擊佔用連線。

SSL/TLS 設定

用 Let's Encrypt 免費取得 SSL 憑證:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-ai-app.com

Certbot 會自動修改 Nginx 設定並設定自動續約。確認自動續約有運作:

sudo certbot renew --dry-run

Docker 容器安全

如果用 Docker 部署 AI 應用:

不要用 root 跑容器

# 建立非 root 使用者
RUN addgroup --system app && adduser --system --ingroup app app
USER app

限制資源

# docker-compose.yml
services:
  ai-app:
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 4G
        reservations:
          memory: 2G

AI 模型載入可能吃掉大量記憶體。設定 limits 可以防止一個容器把整台機器的資源用光。

不要把 .env 放進映像

# .dockerignore
.env
.git
node_modules

環境變數用 docker-compose.ymlenv_file 或 Docker secrets 傳入,不要 build 進映像。

監控和日誌

部署完不代表結束。設定基本的監控:

# 安裝 fail2ban 防暴力破解
sudo apt install fail2ban
sudo systemctl enable fail2ban

# 查看登入失敗記錄
sudo journalctl -u sshd | grep "Failed"

# 查看 Nginx 存取日誌
sudo tail -f /var/log/nginx/access.log

AI 應用的日誌要特別注意:不要在日誌中記錄使用者的 prompt 內容(可能包含敏感資訊)。記錄 request metadata(時間、IP、token 使用量)即可。

安全考量

VPS 的 AI 應用安全有幾個特殊的考量:

模型檔案保護。如果你的 VPS 上有自訓練的模型檔案,設定檔案權限只讓應用使用者可以讀取。不要把模型放在 web root 下。

API Key 管理。AI 應用可能需要呼叫 OpenAI 或 Claude API。API Key 放在環境變數裡,不要放在程式碼或設定檔中。如果 Key 外洩,攻擊者可以用你的額度。

資源耗盡攻擊。AI 推論是計算密集的操作。沒有 Rate Limiting 的 AI API 端點,攻擊者可以送大量請求耗盡你的 GPU 資源或 API 額度。

定期更新。sudo apt update && sudo apt upgrade 要定期做。設定 unattended-upgrades 自動安裝安全更新。

知識檢測

讀完文章後,測試一下你對這個主題的理解。

常見問題

VPS 要選哪家?

看你的 AI 應用需求。只需要 CPU 推論(Ollama 跑小模型):Linode、DigitalOcean、Vultr 的標準方案即可,月費約 $10-40 美金。需要 GPU:Lambda Cloud、Vast.ai、或 GCP/AWS 的 GPU 實例,但成本高很多。

用 Docker 還是直接跑?

建議用 Docker。環境可重現、容易更新、資源可以隔離。直接跑在主機上容易遇到 Python 版本衝突和依賴問題,特別是 AI 應用常需要特定版本的 PyTorch 或 CUDA。

需要設定 CDN 嗎?

AI API 端點不適合用 CDN 快取(每次回應都不同)。但如果你的 AI 應用有前端頁面,前端靜態資源可以用 Cloudflare 或其他 CDN 加速。

如何備份 VPS?

定期做 snapshot 是最簡單的方式。大部分 VPS 供應商都有 snapshot 功能。另外用 pg_dump(PostgreSQL)或 mysqldump(MySQL)備份資料庫,備份檔案存到不同的儲存位置(S3 或其他 VPS)。

用 AI 產生的 Nginx 設定安全嗎?

AI 產生的 Nginx 設定通常可以運作,但安全 Headers 和 SSL 設定經常不夠完善。建議用 Mozilla SSL Configuration Generator 檢查你的 SSL 設定,用 securityheaders.com 檢查 HTTP Headers。