上一篇 下一篇 分享链接 返回 返回顶部

FastGPT 生产部署安全手册:从公网入口到密钥、数据库与备份配置全加固

发布人:慈云数据-客服中心 发布时间:8小时前 阅读量:3

FastGPT 安全加固方案|附配置文件

前言

FastGPT 是一个面向企业和开发者的知识库问答、AI 应用编排与大模型能力集成平台。它通常会接入 OpenAI、Azure OpenAI、OneAPI、PostgreSQL、MongoDB、向量数据库、对象存储、第三方登录、企业内部接口等组件。一旦部署到公网,FastGPT 就不再只是一个“AI 工具”,而是一个承载业务数据、知识库文档、用户身份、API Key、模型调用权限和内部服务访问能力的核心系统。

很多团队在初次部署 FastGPT 时,更关注“能不能跑起来”“模型能不能调用”“知识库能不能上传”,而忽略了安全加固。常见问题包括:管理后台直接暴露公网、默认口令未修改、数据库端口开放、没有 HTTPS、缺少访问频率限制、日志中泄露敏感信息、API Key 明文分散存放、容器权限过高、对象存储桶公开、备份未加密等。这些问题一旦被利用,轻则造成 Token 被盗刷、知识库泄露,重则导致企业内部接口被间接访问,甚至引发合规风险。

本文将围绕 FastGPT 的实际部署场景,从网络、反向代理、身份认证、数据库、容器、配置文件、日志审计、备份恢复、运维监控等方面,给出一套较完整的安全加固方案,并附上可参考的 Nginx、Docker Compose、环境变量与系统防火墙配置示例。你可以根据自己的部署方式进行裁剪和落地。


一、安全加固总体思路

FastGPT 的安全加固不应只依赖某一个配置项,而应采用“分层防御”的方式。简单来说,可以分为以下几层:

  1. 入口层安全:通过 HTTPS、反向代理、WAF、访问频率限制、IP 白名单等方式降低公网攻击面。
  2. 身份层安全:强化管理员账号、用户权限、第三方登录、API Token 管理。
  3. 应用层安全:关闭不必要的调试信息,限制上传文件类型和大小,做好接口权限校验。
  4. 数据层安全:保护 MongoDB、PostgreSQL、Redis、对象存储和向量数据,避免数据库裸奔。
  5. 运行环境安全:降低容器权限,隔离网络,限制资源,最小化宿主机暴露端口。
  6. 密钥安全:统一管理 OpenAI Key、数据库密码、JWT Secret、对象存储密钥等敏感信息。
  7. 审计与恢复:记录关键日志,建立告警机制,定期备份并验证恢复流程。

安全加固的目标不是“绝对安全”,而是尽可能降低暴露面、提高攻击成本、减少误配置带来的风险,并保证出现问题时能够追踪、恢复和止损。


二、部署架构建议

推荐的 FastGPT 生产部署架构如下:

用户浏览器
   ↓ HTTPS
Nginx / 网关 / WAF
   ↓ 内网转发
FastGPT Web / API 服务
   ↓
MongoDB / PostgreSQL / Redis / 向量数据库
   ↓
对象存储 / 模型网关 / 第三方大模型服务

核心原则:

  • 只暴露 Nginx 的 80/443 端口,不要将 FastGPT、MongoDB、PostgreSQL、Redis 等服务端口直接暴露到公网。
  • 数据库与应用服务放在同一个私有网络中,仅允许容器或内网主机访问。
  • 模型网关单独管理,例如使用 OneAPI、LiteLLM、OpenAI Proxy 时,应设置调用额度、鉴权、日志审计和限流。
  • 管理后台限制访问范围,企业内部使用时建议通过 VPN、堡垒机、零信任网关或 IP 白名单访问。
  • 生产环境与测试环境分离,不要共用数据库、模型 Key、对象存储 Bucket 和管理员账号。

三、Nginx 反向代理安全配置

Nginx 是 FastGPT 公网入口的第一道防线。它不仅负责 HTTPS,还可以做安全响应头、请求体限制、限流、防爬虫和基础访问控制。

以下是一个参考配置:

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

    return 301 https://$host$request_uri;
}

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

server {
    listen 443 ssl http2;
    server_name fastgpt.example.com;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    client_max_body_size 50m;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    access_log /var/log/nginx/fastgpt_access.log;
    error_log /var/log/nginx/fastgpt_error.log warn;

    location / {
        limit_req zone=fastgpt_limit burst=30 nodelay;

        proxy_pass http://fastgpt: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;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
}

配置说明

  • return 301 https://$host$request_uri:强制 HTTP 跳转 HTTPS。
  • client_max_body_size 50m:限制上传文件大小,避免大文件拖垮服务。
  • limit_req_zone:限制单 IP 请求频率,防止接口被刷。
  • Strict-Transport-Security:启用 HSTS,降低中间人攻击风险。
  • X-Frame-Options:防止页面被恶意嵌入 iframe。
  • proxy_read_timeout 300s:适配大模型生成内容时间较长的情况。

如果 FastGPT 只给企业内部员工使用,建议进一步增加 IP 白名单:

location / {
    allow 10.0.0.0/8;
    allow 192.168.0.0/16;
    allow 203.0.113.10;
    deny all;

    proxy_pass http://fastgpt:3000;
}

如果无法固定 IP,可以考虑接入 Cloudflare Zero Trust、Tailscale、WireGuard、OpenVPN 或企业 SSO 网关。


四、Docker Compose 安全配置参考

很多 FastGPT 部署都基于 Docker Compose。默认情况下,为了方便调试,部分服务可能会映射端口到宿主机。生产环境中,应尽量减少端口暴露,并使用内部网络通信。

下面是一个简化后的安全配置示例:

version: "3.8"

services:
  fastgpt:
    image: ghcr.io/labring/fastgpt:latest
    container_name: fastgpt
    restart: always
    env_file:
      - .env
    depends_on:
      - mongo
      - postgres
    networks:
      - fastgpt_internal
    expose:
      - "3000"
    read_only: false
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    logging:
      driver: json-file
      options:
        max-size: "100m"
        max-file: "5"

  mongo:
    image: mongo:6
    container_name: fastgpt_mongo
    restart: always
    command: ["mongod", "--auth", "--bind_ip_all"]
    environment:
      MONGO_INITDB_ROOT_USERNAME: fastgpt_root
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD}
    volumes:
      - ./data/mongo:/data/db
    networks:
      - fastgpt_internal
    expose:
      - "27017"
    security_opt:
      - no-new-privileges:true
    logging:
      driver: json-file
      options:
        max-size: "100m"
        max-file: "5"

  postgres:
    image: ankane/pgvector:latest
    container_name: fastgpt_pg
    restart: always
    environment:
      POSTGRES_USER: fastgpt
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: fastgpt
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    networks:
      - fastgpt_internal
    expose:
      - "5432"
    security_opt:
      - no-new-privileges:true
    logging:
      driver: json-file
      options:
        max-size: "100m"
        max-file: "5"

  nginx:
    image: nginx:1.25-alpine
    container_name: fastgpt_nginx
    restart: always
    depends_on:
      - fastgpt
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
      - ./logs/nginx:/var/log/nginx
    networks:
      - fastgpt_internal
    security_opt:
      - no-new-privileges:true

networks:
  fastgpt_internal:
    driver: bridge

加固要点

  • FastGPT、MongoDB、PostgreSQL 使用 expose,只在 Docker 内部网络可访问。
  • 只有 Nginx 映射 80443 到宿主机。
  • 数据库密码通过 .env 注入,不要直接写死在 docker-compose.yml 中。
  • 日志设置 max-sizemax-file,避免日志无限增长占满磁盘。
  • no-new-privileges:true 可降低容器内进程提权风险。
  • cap_drop: ALL 可减少容器 Linux capability,但实际生产中需结合镜像运行情况测试。

五、环境变量配置文件示例

.env 文件是 FastGPT 部署中最容易被忽视的敏感文件。它通常包含数据库密码、模型 Key、JWT Secret、对象存储密钥等,一旦泄露,攻击者可能直接接管系统或盗刷模型额度。

参考配置如下:

NODE_ENV=production

MONGO_ROOT_PASSWORD=请替换为高强度随机密码
POSTGRES_PASSWORD=请替换为高强度随机密码

JWT_SECRET=请替换为至少32位随机字符串
TOKEN_KEY=请替换为至少32位随机字符串
ROOT_KEY=请替换为高强度管理员初始化密钥

OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_API_KEY=sk-请替换为真实Key

S3_ENDPOINT=https://s3.example.com
S3_ACCESS_KEY=请替换为对象存储AccessKey
S3_SECRET_KEY=请替换为对象存储SecretKey
S3_BUCKET=fastgpt-private

建议使用以下方式生成随机密钥:

openssl rand -base64 32

.env 文件权限建议设置为:

chmod 600 .env
chown root:root .env

同时必须将 .env 加入 .gitignore

.env
.env.*
!.env.example

生产环境中,不建议将真实密钥提交到 Git 仓库,也不建议通过聊天工具、文档截图、工单附件等方式传播密钥。更成熟的做法是接入 Vault、AWS Secrets Manager、阿里云 KMS、腾讯云 KMS、Kubernetes Secret 或 CI/CD Secret 管理系统。


六、数据库安全加固

FastGPT 依赖的数据库中可能存储用户信息、应用配置、知识库索引、对话记录、文件元数据等内容,因此数据库安全是重中之重。

MongoDB 加固建议

  1. 必须开启认证:不要使用无密码 MongoDB。
  2. 禁止公网访问:不要将 27017 映射到公网。
  3. 使用最小权限账号:不要让应用长期使用 root 用户连接。
  4. 定期备份:备份文件应加密保存。
  5. 限制容器网络:仅允许 FastGPT 服务访问 MongoDB。

创建业务账号示例:

use fastgpt

db.createUser({
  user: "fastgpt_app",
  pwd: "请替换为高强度密码",
  roles: [
    { role: "readWrite", db: "fastgpt" }
  ]
})

PostgreSQL / pgvector 加固建议

  1. 使用强密码:避免 123456password、项目名等弱口令。
  2. 关闭公网端口:不要暴露 5432
  3. 限制连接来源:通过 Docker 网络、防火墙或 pg_hba.conf 控制来源。
  4. 定期执行 VACUUM 和备份:保持性能与可恢复性。
  5. 按环境分库:生产、测试、开发不要共用一个数据库。

备份示例:

docker exec fastgpt_pg pg_dump -U fastgpt fastgpt > backup_fastgpt_$(date +%F).sql

备份后建议加密:

gpg -c backup_fastgpt_2025-01-01.sql

七、系统防火墙配置

即使 Docker Compose 已经限制端口,宿主机防火墙仍然是必要的兜底措施。以 Ubuntu 的 UFW 为例:

ufw default deny incoming
ufw default allow outgoing

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp

ufw enable
ufw status verbose

如果 SSH 只允许固定办公 IP 访问,建议这样配置:

ufw delete allow 22/tcp
ufw allow from 203.0.113.10 to any port 22 proto tcp

如果服务器部署在云平台,还需要同时检查云安全组。很多安全事故并不是系统防火墙没配,而是云安全组放开了 0.0.0.0/0:270170.0.0.0/0:54320.0.0.0/0:6379

生产环境建议只开放:

  • 80/tcp:用于 HTTP 跳转 HTTPS。
  • 443/tcp:用于 HTTPS 访问。
  • 22/tcp:仅允许可信 IP 或通过堡垒机访问。

八、账号与权限安全

FastGPT 的账号体系也需要进行安全治理。尤其是管理员账号、团队权限、应用发布权限、API 调用权限,都应按照最小权限原则进行配置。

建议如下:

  1. 管理员账号单独使用:不要多人共用同一个管理员账号。
  2. 启用强密码策略:密码长度建议不少于 12 位,包含大小写、数字和特殊字符。
  3. 离职人员及时禁用:建立账号回收流程。
  4. 区分开发、测试、生产权限:避免普通用户拥有生产环境管理权限。
  5. 定期检查 API Token:清理长期不用的 Token。
  6. 限制公开应用范围:不要将内部知识库应用直接公开到互联网。
  7. 谨慎开启注册入口:如果不是公网 SaaS,不建议开放任意用户注册。

如果企业已经有统一身份认证体系,建议通过 OIDC、OAuth2、LDAP、企业微信、飞书或钉钉等方式接入统一登录,并在身份提供方侧启用 MFA。这样可以减少本地账号管理压力,也能更方便地做离职回收和登录审计。


九、模型 API Key 与额度保护

FastGPT 往往会连接大模型服务,API Key 一旦泄露,攻击者可以直接消耗你的模型额度。相比普通业务接口,模型 API Key 的经济风险更明显,因为调用成本可能在短时间内快速增加。

建议采取以下措施:

  1. 不要在前端暴露模型 Key:所有模型调用必须由后端代理完成。
  2. 每个环境使用独立 Key:生产、测试、开发环境分开。
  3. 设置额度上限:在 OpenAI、Azure、OneAPI 或云厂商侧设置预算限制。
  4. 启用调用日志:记录调用来源、模型名称、Token 消耗和异常峰值。
  5. 定期轮换 Key:尤其是人员变动或疑似泄露后。
  6. 按应用分配 Key 或渠道:便于定位异常消耗来源。
  7. 限制高成本模型:对 GPT-4、Claude、Gemini 高阶模型设置更严格权限。

如果使用 OneAPI 或类似模型网关,可以为不同团队、应用和用户设置独立令牌,并配置额度、频率、模型白名单和过期时间。这样即使某个应用 Token 泄露,也不会影响整个组织的模型账户。


十、文件上传与知识库安全

FastGPT 的知识库功能通常支持上传文档、网页抓取、文本导入等能力。这些入口如果不加限制,可能带来恶意文件、超大文件、敏感数据误上传等风险。

建议:

  1. 限制上传大小:Nginx 与应用层都应限制。
  2. 限制文件类型:只允许业务需要的格式,如 PDF、DOCX、TXT、MD、CSV。
  3. 对象存储私有化:Bucket 不应公开读写。
  4. 敏感文件分级管理:涉及合同、财务、人事、客户数据的知识库应单独授权。
  5. 禁止普通用户上传可执行文件:如 .sh.exe.js.php 等。
  6. 对外分享谨慎开启:公开问答应用可能间接泄露知识库内容。
  7. 定期清理过期文档:避免历史数据长期堆积。

对象存储建议使用私有 Bucket,并通过服务端生成临时访问链接。不要将 AccessKey 写入前端,也不要将 Bucket 设置为公共读写。


十一、日志审计与告警

安全不是配置完就结束,持续监控同样重要。FastGPT 生产环境至少应关注以下日志:

  • Nginx 访问日志与错误日志。
  • FastGPT 应用日志。
  • 数据库登录与异常查询日志。
  • 模型网关调用日志。
  • 系统 SSH 登录日志。
  • 容器重启与异常退出日志。

可以重点关注以下异常行为:

  1. 单 IP 高频访问登录接口。
  2. API Token 调用量突然升高。
  3. 模型 Token 消耗异常增长。
  4. 知识库批量下载或异常查询。
  5. 管理员账号异地登录。
  6. 数据库连接失败次数异常。
  7. 容器频繁重启。
  8. 磁盘空间快速下降。

简单的日志查看命令:

docker logs --tail=200 fastgpt
docker logs --tail=200 fastgpt_nginx
tail -f ./logs/nginx/fastgpt_access.log

更成熟的方案可以接入 Prometheus、Grafana、Loki、ELK、Datadog、阿里云 SLS 或腾讯云 CLS,并设置告警规则。对于模型调用费用,还应设置单日预算告警和异常消耗告警。


十二、备份与恢复方案

没有经过验证的备份,等于没有备份。FastGPT 涉及数据库、对象存储、配置文件和证书等多类数据,需要统一规划。

建议备份内容包括:

  1. MongoDB 数据。
  2. PostgreSQL / pgvector 数据。
  3. 对象存储中的上传文件。
  4. .env 配置文件。
  5. Nginx 配置和 SSL 证书。
  6. Docker Compose 文件。
  7. 自定义模型配置与应用配置。

备份策略建议采用“3-2-1 原则”:

  • 至少保留 3 份数据。
  • 使用 2 种不同介质或存储位置。
  • 至少 1 份异地备份。

示例备份脚本:

#!/bin/bash
set -e

BACKUP_DIR="/backup/fastgpt/$(date +%F)"
mkdir -p "$BACKUP_DIR"

docker exec fastgpt_mongo mongodump \
  --username fastgpt_root \
  --password "$MONGO_ROOT_PASSWORD" \
  --authenticationDatabase admin \
  --out /tmp/mongo_backup

docker cp fastgpt_mongo:/tmp/mongo_backup "$BACKUP_DIR/mongo"

docker exec fastgpt_pg pg_dump -U fastgpt fastgpt > "$BACKUP_DIR/postgres.sql"

cp .env "$BACKUP_DIR/env.backup"
cp docker-compose.yml "$BACKUP_DIR/docker-compose.yml"

tar -czf "$BACKUP_DIR.tar.gz" "$BACKUP_DIR"
gpg -c "$BACKUP_DIR.tar.gz"
rm -rf "$BACKUP_DIR" "$BACKUP_DIR.tar.gz"

实际使用时,建议将数据库密码从安全的 Secret 管理系统中读取,而不是直接写在脚本里。同时,应定期在测试环境执行恢复演练,确认备份文件真的可用。


十三、上线前安全检查清单

上线前可以按照以下清单逐项确认:

  • [ ] 已启用 HTTPS,HTTP 自动跳转 HTTPS。
  • [ ] Nginx 已配置安全响应头。
  • [ ] 已限制上传文件大小。
  • [ ] 已配置接口访问频率限制。
  • [ ] MongoDB 未暴露公网。
  • [ ] PostgreSQL 未暴露公网。
  • [ ] Redis 或其他缓存服务未暴露公网。
  • [ ] .env 未提交到 Git 仓库。
  • [ ] 所有默认密码已修改。
  • [ ] 管理员账号使用强密码。
  • [ ] 模型 API Key 设置了额度限制。
  • [ ] 对象存储 Bucket 非公开读写。
  • [ ] Docker 只暴露必要端口。
  • [ ] 防火墙和云安全组仅开放 80443 和受限 22
  • [ ] 日志已设置保留策略。
  • [ ] 已配置备份任务。
  • [ ] 已验证备份恢复流程。
  • [ ] 已建立异常调用与费用告警。
  • [ ] 已记录应急联系人和密钥轮换流程。

十四、应急处理建议

如果怀疑 FastGPT 遭到入侵或密钥泄露,应优先止损:

  1. 立即关闭公网入口:临时下线 Nginx 或安全组阻断访问。
  2. 轮换所有密钥:包括模型 Key、数据库密码、JWT Secret、对象存储密钥。
  3. 检查管理员账号:禁用可疑账号,重置管理员密码。
  4. 导出并保存日志:避免容器重启或日志轮转导致证据丢失。
  5. 检查模型调用账单:确认是否存在异常消耗。
  6. 检查数据库数据完整性:确认是否被删除、篡改或批量导出。
  7. 从干净备份恢复:必要时重建环境,而不是在可疑环境上继续运行。
  8. 复盘攻击路径:修复根因后再恢复服务。

应急时不要只重启服务。重启可能会破坏现场,也不能解决密钥泄露、弱口令、端口暴露等根因问题。


结语

FastGPT 的价值在于让企业更高效地构建 AI 应用和知识库问答系统,但它同时也连接了大量敏感资源:企业文档、用户数据、模型额度、内部接口和业务流程。因此,生产环境部署 FastGPT 时,必须从一开始就把安全作为基础能力,而不是等到出现问题后再补救。

一套可靠的 FastGPT 安全方案,应至少做到:公网只暴露 HTTPS 入口,数据库不裸奔,密钥不硬编码,账号权限最小化,文件上传有限制,模型调用有额度,日志可审计,备份可恢复。本文提供的 Nginx、Docker Compose、环境变量、防火墙和备份配置,可以作为生产加固的起点。最终落地时,还需要结合企业自身的网络架构、合规要求、用户规模和运维能力持续优化。

安全不是一次性配置,而是一套持续运营机制。只有把访问控制、密钥管理、日志审计、备份恢复和应急响应都纳入日常运维,FastGPT 才能真正稳定、安全地支撑企业级 AI 应用。

目录结构
全文