FastGPT 生产环境安全部署与加固实战手册
FastGPT 安全加固方案|附完整命令
FastGPT 作为一套面向企业知识库、智能问答与 AI 应用编排的系统,通常会连接大模型 API、向量数据库、文件存储、用户账号体系以及内部业务数据。一旦部署到公网或企业内网生产环境,它就不再只是一个“AI 工具”,而是承载敏感知识资产、访问凭证和业务入口的关键系统。
因此,FastGPT 的安全加固不能只停留在“能跑起来”层面,而应从服务器、Docker、数据库、反向代理、访问控制、密钥管理、备份恢复、日志审计等多个维度进行系统化治理。本文将给出一套适合生产环境的 FastGPT 安全加固方案,并附上可直接参考的完整命令。
说明:以下命令以 Ubuntu 22.04 / 24.04、Docker Compose 部署方式为例。不同系统或部署架构可按实际情况调整。
一、安全加固总体思路
FastGPT 常见部署架构通常包含以下组件:
- FastGPT Web / API 服务
- MongoDB
- PostgreSQL / pgvector 或其他向量数据库
- Redis
- OneAPI / OpenAI API 代理服务
- Nginx / Caddy 反向代理
- Docker / Docker Compose
- 文件上传目录、日志目录、配置文件和环境变量文件
安全加固的核心目标包括:
- 减少暴露面:不必要的端口不对公网开放。
- 强化认证:避免弱密码、默认密码、匿名访问。
- 保护密钥:API Key、数据库密码、JWT Secret 等不得泄露。
- 限制权限:容器、系统用户、数据库用户均应最小权限运行。
- 加密传输:公网访问必须启用 HTTPS。
- 日志审计:保留关键访问与异常行为日志。
- 备份恢复:确保数据损坏或被攻击后可恢复。
- 持续更新:及时升级系统、镜像和依赖。
二、服务器基础安全加固
1. 更新系统软件包
部署前应先更新系统,修复已知漏洞。
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y
安装常用安全工具:
sudo apt install -y curl wget vim git ufw fail2ban unattended-upgrades ca-certificates gnupg lsb-release
2. 创建普通运维用户
不要长期使用 root 用户进行日常运维。建议创建普通用户,并授予 sudo 权限。
sudo adduser fastgptops
sudo usermod -aG sudo fastgptops
切换到新用户:
su - fastgptops
3. 配置 SSH 密钥登录
在本地生成 SSH 密钥:
ssh-keygen -t ed25519 -C "fastgpt-prod"
将公钥复制到服务器:
ssh-copy-id fastgptops@服务器IP
如果没有 ssh-copy-id,也可以手动追加:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
4. 禁止 root 远程登录和密码登录
编辑 SSH 配置文件:
sudo vim /etc/ssh/sshd_config
建议修改或确认以下配置:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
重启 SSH 服务:
sudo systemctl restart ssh
注意:修改前务必保留一个已登录的 SSH 会话,确认新会话可以正常登录后再关闭旧会话,避免把自己锁在服务器外。
三、防火墙与端口暴露控制
FastGPT 相关服务中,真正需要对公网开放的通常只有:
80:HTTP,用于证书申请或跳转 HTTPS443:HTTPS,正式访问入口22:SSH,仅建议限制为固定管理 IP
MongoDB、PostgreSQL、Redis、FastGPT 内部端口都不应直接暴露到公网。
1. 配置 UFW 防火墙
先设置默认策略:
sudo ufw default deny incoming
sudo ufw default allow outgoing
允许 SSH。如果有固定办公 IP,建议只允许固定 IP:
sudo ufw allow from 管理端公网IP to any port 22 proto tcp
如果暂时没有固定 IP,可先开放 22,但不推荐长期使用:
sudo ufw allow 22/tcp
开放 Web 端口:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
启用防火墙:
sudo ufw enable
sudo ufw status verbose
2. 检查公网监听端口
查看当前监听端口:
sudo ss -tulnp
重点检查是否存在以下端口对公网监听:
27017 # MongoDB
5432 # PostgreSQL
6379 # Redis
3000 # FastGPT Web/API
如果这些端口出现在 0.0.0.0 或公网网卡上,应立即调整 Docker Compose 或防火墙策略。
四、Docker 安全加固
FastGPT 常见部署方式是 Docker Compose。Docker 的便利性很高,但如果配置不当,也容易造成横向移动、容器逃逸风险扩大或敏感目录泄露。
1. 安装 Docker 官方版本
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证安装:
docker version
docker compose version
2. 避免容器使用特权模式
检查 docker-compose.yml 中是否存在:
privileged: true
如果不是必须,应删除该配置。FastGPT 正常运行通常不需要特权容器。
3. 避免宿主机敏感目录挂载
避免出现类似配置:
volumes:
- /:/host
- /etc:/etc
- /var/run/docker.sock:/var/run/docker.sock
尤其是挂载 Docker Socket:
- /var/run/docker.sock:/var/run/docker.sock
这几乎等同于给容器宿主机 root 权限,应避免在 FastGPT 业务容器中使用。
4. 为 Docker 配置日志大小限制
防止容器日志无限增长导致磁盘写满:
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
写入:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
},
"live-restore": true
}
重启 Docker:
sudo systemctl restart docker
五、FastGPT 配置文件安全
FastGPT 部署通常会包含 .env、config.json、docker-compose.yml 等配置文件,其中可能存放数据库密码、API Key、Token Secret 等敏感信息。
1. 限制配置文件权限
假设 FastGPT 部署目录为 /opt/fastgpt:
sudo mkdir -p /opt/fastgpt
sudo chown -R fastgptops:fastgptops /opt/fastgpt
cd /opt/fastgpt
限制 .env 权限:
chmod 600 .env
chmod 600 config.json 2>/dev/null || true
chmod 600 docker-compose.yml
查看权限:
ls -lah
2. 使用强随机密钥
不要使用示例配置中的默认密码。可以用以下命令生成强随机字符串:
openssl rand -base64 32
生成多个密钥:
for i in {1..5}; do openssl rand -base64 32; done
建议至少替换以下内容:
- MongoDB 密码
- PostgreSQL 密码
- Redis 密码
- JWT Secret
- FastGPT 管理员密码
- OneAPI Token / OpenAI API Key
- 文件存储 AccessKey / SecretKey
3. 避免提交敏感配置到 Git
如果部署目录是 Git 仓库,务必添加 .gitignore:
cat > .gitignore <<'EOF'
.env
*.env
config.json
*.key
*.pem
*.crt
data/
logs/
backup/
EOF
检查是否已被 Git 跟踪:
git status
git ls-files | grep -E '(\.env|config\.json|\.key|\.pem)'
如果敏感文件已经被提交过,应立即从 Git 中移除并更换密钥:
git rm --cached .env config.json
git commit -m "remove sensitive config files"
六、数据库安全加固
FastGPT 的知识库、用户数据、应用配置和向量数据通常存储在数据库中。数据库一旦暴露,后果远比 Web 被扫描更严重。
1. MongoDB 不暴露公网
Docker Compose 中 MongoDB 不应映射公网端口。避免如下配置:
ports:
- "27017:27017"
如果只需要容器内部访问,应改为内部网络,不写 ports,或只绑定本机:
ports:
- "127.0.0.1:27017:27017"
更推荐完全不暴露:
expose:
- "27017"
2. PostgreSQL 不暴露公网
避免:
ports:
- "5432:5432"
如需本机维护访问:
ports:
- "127.0.0.1:5432:5432"
否则使用:
expose:
- "5432"
3. Redis 设置密码并禁止公网访问
Redis 一定不要裸露到公网。若使用 Redis,应设置强密码:
requirepass 替换为强密码
bind 127.0.0.1
protected-mode yes
Docker 环境中可通过启动命令设置:
command: redis-server --requirepass 替换为强密码 --appendonly yes
4. 手动验证端口未公网暴露
在服务器上查看:
sudo ss -tulnp | grep -E '27017|5432|6379'
在外部机器扫描:
nmap -Pn -p 22,80,443,27017,5432,6379 服务器IP
期望结果是只有 22、80、443 根据策略开放,数据库端口均不可访问。
七、Nginx HTTPS 反向代理加固
生产环境不建议直接通过 http://IP:3000 访问 FastGPT,而应通过 Nginx 或 Caddy 反代,并启用 HTTPS。
1. 安装 Nginx 和 Certbot
sudo apt install -y nginx certbot python3-certbot-nginx
启动 Nginx:
sudo systemctl enable nginx
sudo systemctl start nginx
2. 配置域名反向代理
假设域名为 fastgpt.example.com,FastGPT 服务监听在本机 127.0.0.1:3000。
创建配置:
sudo vim /etc/nginx/sites-available/fastgpt.conf
写入:
server {
listen 80;
server_name fastgpt.example.com;
client_max_body_size 100m;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/fastgpt.conf /etc/nginx/sites-enabled/fastgpt.conf
sudo nginx -t
sudo systemctl reload nginx
3. 申请 HTTPS 证书
sudo certbot --nginx -d fastgpt.example.com
检查自动续期:
sudo certbot renew --dry-run
4. 增加安全响应头
编辑 Nginx 配置:
sudo vim /etc/nginx/sites-available/fastgpt.conf
在 server 块内添加:
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 "geolocation=(), microphone=(), camera=()" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
测试并重载:
sudo nginx -t
sudo systemctl reload nginx
八、登录与访问控制加固
FastGPT 如果开放给企业员工或客户使用,账号体系必须重点加固。
1. 禁用默认管理员密码
如果部署初期使用了默认管理员账号或示例密码,应立即修改。建议使用不少于 16 位的随机密码,包含大小写字母、数字和符号。
生成密码:
openssl rand -base64 24
2. 限制后台访问来源
如果 FastGPT 管理端只给公司内部使用,可以通过 Nginx 限制 IP。
示例:只允许指定办公网 IP 访问 /admin:
location /admin {
allow 办公网公网IP;
deny all;
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;
}
重载配置:
sudo nginx -t
sudo systemctl reload nginx
3. 增加基础认证保护
如果需要额外保护某些路径,可以使用 Nginx Basic Auth。
安装工具:
sudo apt install -y apache2-utils
创建账号:
sudo htpasswd -c /etc/nginx/.fastgpt_htpasswd admin
在 Nginx location 中加入:
auth_basic "FastGPT Restricted";
auth_basic_user_file /etc/nginx/.fastgpt_htpasswd;
重载:
sudo nginx -t
sudo systemctl reload nginx
九、Fail2ban 防暴力破解
Fail2ban 可以根据日志自动封禁恶意 IP,适合保护 SSH 和 Nginx。
1. 启用 SSH 防护
创建本地配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
确认或添加:
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 1h
重启:
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
查看状态:
sudo fail2ban-client status
sudo fail2ban-client status sshd
2. 为 Nginx 添加基础防护
创建 Nginx 404 扫描防护规则:
sudo vim /etc/fail2ban/filter.d/nginx-fastgpt-scan.conf
写入:
[Definition]
failregex = ^ -.*"(GET|POST).*(/\.env|/wp-admin|/phpmyadmin|/adminer|/server-status).*" (403|404|444)
ignoreregex =
创建 jail:
sudo vim /etc/fail2ban/jail.d/nginx-fastgpt.conf
写入:
[nginx-fastgpt-scan]
enabled = true
port = http,https
filter = nginx-fastgpt-scan
logpath = /var/log/nginx/access.log
maxretry = 3
findtime = 10m
bantime = 6h
重启:
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-fastgpt-scan
十、备份与恢复策略
安全加固不仅是防攻击,也包括被误删、磁盘损坏、升级失败后的快速恢复能力。
1. 创建备份目录
sudo mkdir -p /opt/fastgpt-backup
sudo chown -R fastgptops:fastgptops /opt/fastgpt-backup
chmod 700 /opt/fastgpt-backup
2. 备份 MongoDB
假设 MongoDB 容器名为 mongo:
docker exec mongo mongodump \
--username 用户名 \
--password 密码 \
--authenticationDatabase admin \
--archive=/tmp/fastgpt-mongo.archive
复制到宿主机:
docker cp mongo:/tmp/fastgpt-mongo.archive /opt/fastgpt-backup/fastgpt-mongo-$(date +%F).archive
3. 备份 PostgreSQL
假设 PostgreSQL 容器名为 pg,数据库名为 postgres:
docker exec pg pg_dump \
-U 用户名 \
-d postgres \
-F c \
-f /tmp/fastgpt-pg.dump
复制到宿主机:
docker cp pg:/tmp/fastgpt-pg.dump /opt/fastgpt-backup/fastgpt-pg-$(date +%F).dump
4. 备份配置文件
tar -czf /opt/fastgpt-backup/fastgpt-config-$(date +%F).tar.gz \
/opt/fastgpt/.env \
/opt/fastgpt/docker-compose.yml \
/opt/fastgpt/config.json
5. 设置备份保留周期
只保留最近 14 天备份:
find /opt/fastgpt-backup -type f -mtime +14 -delete
可以写入定时任务:
crontab -e
添加:
0 3 * * * /usr/local/bin/fastgpt-backup.sh >> /var/log/fastgpt-backup.log 2>&1
十一、日志审计与异常监控
FastGPT 生产环境至少应关注以下日志:
- Nginx access/error 日志
- Docker 容器日志
- FastGPT 应用日志
- MongoDB / PostgreSQL / Redis 日志
- SSH 登录日志
- Fail2ban 封禁日志
1. 查看 Docker 日志
docker ps
docker logs --tail=200 fastgpt
docker logs -f fastgpt
查看最近异常:
docker logs fastgpt 2>&1 | grep -Ei "error|fail|exception|unauthorized|forbidden"
2. 查看系统登录日志
sudo journalctl -u ssh --since "24 hours ago"
sudo last
sudo lastb
3. 查看 Nginx 异常访问
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
统计访问最多的 IP:
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
查找敏感路径扫描:
sudo grep -Ei "wp-admin|phpmyadmin|\.env|adminer|server-status" /var/log/nginx/access.log
十二、系统自动安全更新
开启 unattended-upgrades 可以自动安装安全补丁。
sudo dpkg-reconfigure --priority=low unattended-upgrades
确认配置:
sudo vim /etc/apt/apt.conf.d/20auto-upgrades
建议内容:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
手动测试:
sudo unattended-upgrades --dry-run --debug
十三、FastGPT 升级安全建议
升级前不要直接 docker compose pull && docker compose up -d,生产环境建议按以下流程执行:
- 阅读 FastGPT 官方更新说明。
- 备份数据库和配置文件。
- 在测试环境验证升级。
- 固定镜像版本,不使用不确定的
latest。 - 升级后检查日志、核心功能和知识库检索效果。
示例升级命令:
cd /opt/fastgpt
docker compose ps
docker compose pull
docker compose down
docker compose up -d
docker compose logs -f --tail=200
如果需要回滚,应提前记录旧版本镜像:
docker images | grep fastgpt
十四、生产环境安全检查清单
上线前建议逐项检查:
- [ ] SSH 已禁用 root 登录
- [ ] SSH 已禁用密码登录
- [ ] 防火墙只开放必要端口
- [ ] MongoDB 未暴露公网
- [ ] PostgreSQL 未暴露公网
- [ ] Redis 未暴露公网且设置密码
- [ ] FastGPT 未直接暴露内部端口
- [ ] 已启用 HTTPS
- [ ] Nginx 已配置安全响应头
- [ ]
.env和配置文件权限已限制 - [ ] 所有默认密码已更换
- [ ] API Key 未提交到 Git
- [ ] Docker 未使用特权容器
- [ ] 容器日志已设置大小限制
- [ ] 已配置数据库备份
- [ ] 已测试恢复流程
- [ ] 已启用 Fail2ban
- [ ] 已开启系统安全更新
- [ ] 已建立升级前备份流程
十五、常用一键检查命令汇总
查看开放端口:
sudo ss -tulnp
查看防火墙状态:
sudo ufw status verbose
查看 Docker 容器:
docker ps
查看容器端口映射:
docker ps --format "table {{.Names}}\t{{.Ports}}"
检查配置文件权限:
ls -lah /opt/fastgpt
查找敏感信息:
grep -RniE "password|secret|apikey|api_key|token" /opt/fastgpt
查看 Nginx 配置是否正确:
sudo nginx -t
查看证书状态:
sudo certbot certificates
查看 Fail2ban 状态:
sudo fail2ban-client status
查看最近 SSH 登录:
sudo last -a | head
查看失败登录:
sudo lastb | head
结语
FastGPT 的安全加固不是一次性动作,而是一套持续运行的安全机制。对于生产环境而言,最重要的原则是:只暴露必要入口、所有默认密码必须替换、数据库绝不裸露公网、敏感配置严格保护、备份必须可恢复、日志必须可追踪。
如果是个人测试环境,可以根据实际情况简化部分步骤;但只要 FastGPT 承载企业知识库、客户数据、内部文档或商业应用,就应按生产级标准部署和维护。相比事后补救,提前做好安全加固、访问控制和备份恢复,成本更低,也更可靠。