10. 安全加固

CPA 一旦泄露,等于把你的 ChatGPT/Gemini/Claude 账号的 API 调用权交了出去——账号风控、配额耗尽是小事,部分上游会因此封号。必须认真做这一节。

威胁模型

  • 8317(API + 面板)泄露 → 任何人能用你的 API key 打模型
  • 9090(mihomo 控制)泄露 → 任何人能改你的代理路由、看你流量
  • 1455 / 8085 / 54545(OAuth 回调)泄露时间窗短,但理论上能劫持登录流程
  • /root/CLIProxyAPI/auths/*.json 泄露 → OAuth refresh token 被盗,等于上游账号被偷

必做项

1. 用足够强的 API key

config.yamlapi-keys

api-keys:
  - "sk-cpa-$(openssl rand -hex 24)"   # 自己生成,至少 32 字符

不要用 sk-testsk-12345 这类。

2. 用足够强的管理面板密码

remote-management:
  secret-key: "$(openssl rand -hex 16)"   # 自己生成

3. 安全组只放白名单

云厂商安全组里:

端口来源
22你的公网 IP
8317你的公网 IP / 客户端机器 IP
9090不开放 或 你的公网 IP
其它(1455 等)不开放,登录时走 SSH 隧道

4. 系统防火墙再加一层

云厂商安全组之外,系统防火墙也建议开。CentOS/Rocky/OpenCloudOS:

firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --remove-service=dhcpv6-client
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=你的公网IP port port=8317 protocol=tcp accept'
firewall-cmd --reload

5. 走 SSH 隧道访问管理面板

最干净的方式:把 allow-remote 关掉,远程访问全走 SSH:

remote-management:
  allow-remote: false
# 本地
ssh -L 8317:127.0.0.1:8317 root@服务器IP
# 浏览器开 http://127.0.0.1:8317/management.html

8317 永远不暴露公网,安全组也可以只对自己 IP 开(用来给客户端调用 API)。

推荐项

6. 套 HTTPS(Caddy 反代最简单)

直接 http://你的服务器IP:8317 是明文,API key 在 header 里走外网,建议套 TLS。最省事是 Caddy:

# 假设你有域名 cpa.example.com 已解析到服务器
docker run -d \
  --name caddy \
  --restart unless-stopped \
  -p 443:443 -p 80:80 \
  -v /root/caddy/Caddyfile:/etc/caddy/Caddyfile \
  -v /root/caddy/data:/data \
  caddy:latest

/root/caddy/Caddyfile

cpa.example.com {
    reverse_proxy 127.0.0.1:8317
    @admin path /management.html /v0/management/*
    handle @admin {
        # 限制管理面板只允许你自己 IP
        @allowed_ip {
            remote_ip 你.的.公.IP
        }
        handle @allowed_ip {
            reverse_proxy 127.0.0.1:8317
        }
        respond 403
    }
}

Caddy 自动申请 Let’s Encrypt 证书。客户端把 base URL 改成 https://cpa.example.com,安全组关掉 8317 对外(只让 Caddy 在 443 暴露)。

7. fail2ban / 限流

如果你坚持把 8317 开放给较广 IP 段(比如团队),加个 fail2ban 防爆破:

dnf install -y fail2ban

或者用 nginx + limit_req_zone 加个简单速率限制。

8. OAuth 凭据文件加权限

chmod 700 /root/CLIProxyAPI/auths
chmod 600 /root/CLIProxyAPI/auths/*.json

只有 root 能读,避免容器内 / 共享主机的其它服务捎带读到。

9. 监控异常

定期看:

# 失败请求
docker logs cli-proxy-api 2>&1 | grep -E "warn|error" | tail -50
 
# 不寻常的客户端 IP
docker logs cli-proxy-api 2>&1 | grep -oE '\| +[0-9.]+ +\|' | sort -u

或者在管理面板的 Usage 看每个凭据的 token 用量,异常飙升就调查。

不要做

  • ❌ 把 9090 直接开到 0.0.0.0/0(无 secret,有人扫到立刻接管)
  • ❌ 把 secret-key 存进 git / 截图发群
  • ❌ 把 auths/*.json 备份到任何公开存储
  • ❌ 在共享 VPS 上跑(其它租户能看到端口)
  • ❌ 把 API key 写进客户端代码 push 到 GitHub(即使私库也不要)

备份清单

万一想换机器/重装:

tar czf cpa-backup-$(date +%F).tgz \
  /root/CLIProxyAPI/config.yaml \
  /root/CLIProxyAPI/auths/ \
  /root/mihomo/config.yaml

把 tgz 用 GPG 加密:

gpg --symmetric --cipher-algo AES256 cpa-backup-2026-05-09.tgz
# 输出 cpa-backup-2026-05-09.tgz.gpg
shred -u cpa-backup-2026-05-09.tgz

加密后才能放云盘 / Git。