Coze 私有化部署上线前,这些安全配置必须先做好
Coze 安全加固方案|附配置文件
本文面向已经完成 Coze 私有化部署、企业内部部署或基于 Docker / Kubernetes 运行 Coze 服务的团队,提供一套较为完整的安全加固方案。内容涵盖网络访问控制、反向代理、HTTPS、身份认证、密钥管理、容器安全、数据库安全、日志审计、备份恢复以及常用配置文件示例。
说明:不同版本的 Coze 部署方式可能存在差异,本文提供的是通用安全加固思路和可落地配置模板,实际使用时应结合你的部署架构、官方文档和企业安全规范进行调整。
一、为什么 Coze 需要安全加固?
Coze 作为智能体 / AI 应用开发平台,通常会涉及以下敏感资源:
- 用户账号与组织数据
- 智能体配置、Prompt、插件配置
- 知识库文件与向量化数据
- 大模型 API Key
- 第三方插件凭证
- 企业内部接口地址
- 对话记录与业务数据
如果安全配置不当,可能产生以下风险:
- 管理后台暴露在公网,被暴力破解;
- API Key 泄露,导致模型费用被恶意消耗;
- 知识库文档被越权访问;
- 数据库、Redis、对象存储被直接连接;
- 容器权限过高,被利用后横向移动;
- 反向代理未限制上传大小,导致资源耗尽;
- 日志中泄露 Token、Cookie、密钥;
- 未开启 HTTPS,传输过程被监听或篡改;
- 无备份机制,误删或勒索攻击后无法恢复。
因此,Coze 部署完成后,建议立即进行安全加固,而不是等到上线后再补救。
二、整体安全架构建议
推荐采用如下架构:
公网用户
|
| HTTPS
v
WAF / CDN / SLB
|
v
Nginx 反向代理
|
v
Coze Web / API 服务
|
+---- PostgreSQL / MySQL
|
+---- Redis
|
+---- 对象存储 / MinIO
|
+---- 向量数据库
安全原则如下:
| 层级 | 加固目标 |
|---|---|
| 网络层 | 最小开放端口,仅暴露 80/443 |
| 代理层 | HTTPS、限流、安全头、上传限制 |
| 应用层 | 强密码、MFA、权限隔离、禁用默认账号 |
| 数据层 | 数据库不暴露公网,启用认证与备份 |
| 容器层 | 最小权限、只读文件系统、限制资源 |
| 日志层 | 审计访问、脱敏敏感字段 |
| 运维层 | 密钥轮换、漏洞扫描、应急预案 |
三、服务器基础加固
1. 创建普通运维用户
不要长期使用 root 用户登录服务器。
adduser deploy
usermod -aG sudo deploy
配置 SSH 免密登录后,禁止 root 远程登录。
编辑 SSH 配置:
sudo vim /etc/ssh/sshd_config
推荐配置如下:
Port 22
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
重启 SSH:
sudo systemctl restart sshd
注意:修改 SSH 前请保持一个已登录会话,避免配置错误导致无法登录。
2. 配置防火墙
如果是单机部署,建议只开放 SSH、HTTP、HTTPS。
Ubuntu 可使用 UFW:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
如果 SSH 使用了非默认端口,例如 22222:
sudo ufw allow 22222/tcp
sudo ufw delete allow 22/tcp
数据库、Redis、MinIO、向量数据库等端口不应直接暴露公网。
3. 安装 Fail2ban 防暴力破解
sudo apt update
sudo apt install fail2ban -y
创建配置文件:
sudo vim /etc/fail2ban/jail.local
配置示例:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
backend = systemd
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
启动服务:
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
查看状态:
sudo fail2ban-client status
sudo fail2ban-client status sshd
四、Nginx 反向代理安全配置
Coze 服务建议不要直接暴露端口,而是放在 Nginx 后面,通过 HTTPS 访问。
假设:
- Coze Web/API 服务监听:
127.0.0.1:8888 - 域名:
coze.example.com - SSL 证书路径:
/etc/nginx/ssl/coze.example.com.pem/etc/nginx/ssl/coze.example.com.key
Nginx 配置文件示例
文件路径:
/etc/nginx/conf.d/coze.conf
配置如下:
server {
listen 80;
server_name coze.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name coze.example.com;
ssl_certificate /etc/nginx/ssl/coze.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/coze.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 安全响应头
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;
# 如果确认全站 HTTPS,可开启 HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 上传大小限制,根据知识库文件上传需求调整
client_max_body_size 100m;
# 连接与超时限制
keepalive_timeout 65;
proxy_connect_timeout 30s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
# 访问日志
access_log /var/log/nginx/coze_access.log;
error_log /var/log/nginx/coze_error.log;
# 基础限流
limit_req_zone $binary_remote_addr zone=coze_req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=coze_conn_limit:10m;
location / {
limit_req zone=coze_req_limit burst=30 nodelay;
limit_conn coze_conn_limit 30;
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Real-IP $remote_addr;
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 https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
# 禁止访问备份文件
location ~* \.(bak|old|orig|save|swp|sql|tar|gz|zip)$ {
deny all;
}
}
注意:
limit_req_zone和limit_conn_zone通常建议放在http块中,如果你的 Nginx 不允许在server块定义,需要移动到/etc/nginx/nginx.conf的http {}内。
测试配置并重载:
sudo nginx -t
sudo systemctl reload nginx
五、后台访问控制
如果 Coze 管理后台不需要全公网开放,建议增加 IP 白名单或基础认证。
方案一:IP 白名单
location /admin {
allow 10.0.0.0/8;
allow 192.168.0.0/16;
allow 203.0.113.10;
deny all;
proxy_pass http://127.0.0.1:8888;
}
这种方式适用于:
- 企业办公网固定出口 IP;
- VPN 接入;
- 堡垒机访问。
方案二:Nginx Basic Auth
安装工具:
sudo apt install apache2-utils -y
创建账号:
sudo htpasswd -c /etc/nginx/.coze_htpasswd admin
Nginx 配置:
location /admin {
auth_basic "Coze Admin";
auth_basic_user_file /etc/nginx/.coze_htpasswd;
proxy_pass http://127.0.0.1:8888;
}
Basic Auth 不能替代应用本身的身份认证,只适合作为额外防护层。
六、Docker Compose 安全加固配置
如果使用 Docker Compose 部署 Coze,建议重点关注:
- 不使用
latest镜像; - 容器不使用特权模式;
- 不挂载 Docker Socket;
- 数据卷权限最小化;
- 仅 Nginx 暴露公网端口;
- 数据库、Redis 使用内部网络;
- 通过
.env管理变量,避免硬编码密钥。
.env 配置示例
文件路径:
/path/to/coze/.env
示例内容:
# 基础配置
COZE_ENV=production
COZE_PUBLIC_URL=https://coze.example.com
# 应用安全
JWT_SECRET=please_change_to_a_very_long_random_string
SESSION_SECRET=please_change_to_another_long_random_string
COOKIE_SECURE=true
COOKIE_HTTPONLY=true
COOKIE_SAMESITE=Lax
# 数据库
POSTGRES_DB=coze
POSTGRES_USER=coze_user
POSTGRES_PASSWORD=please_change_postgres_password
# Redis
REDIS_PASSWORD=please_change_redis_password
# 对象存储
MINIO_ROOT_USER=coze_minio_admin
MINIO_ROOT_PASSWORD=please_change_minio_root_password
# 大模型供应商 Key
OPENAI_API_KEY=sk-xxxx
ARK_API_KEY=xxxx
# 日志级别
LOG_LEVEL=info
密钥生成建议:
openssl rand -base64 48
.env 文件权限:
chmod 600 .env
chown deploy:deploy .env
docker-compose.yml 安全示例
以下为通用示例,服务名和镜像名请根据你的实际 Coze 部署文件调整:
version: "3.9"
services:
coze:
image: your-registry/coze:stable-version
container_name: coze_app
restart: unless-stopped
env_file:
- .env
ports:
- "127.0.0.1:8888:8888"
depends_on:
- postgres
- redis
networks:
- coze_internal
volumes:
- ./data/coze:/app/data
- ./logs/coze:/app/logs
read_only: false
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
tmpfs:
- /tmp:size=512m,mode=1777
mem_limit: 4g
cpus: "2.0"
logging:
driver: json-file
options:
max-size: "100m"
max-file: "7"
postgres:
image: postgres:15
container_name: coze_postgres
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
networks:
- coze_internal
volumes:
- ./data/postgres:/var/lib/postgresql/data
ports:
- "127.0.0.1:5432:5432"
security_opt:
- no-new-privileges:true
logging:
driver: json-file
options:
max-size: "100m"
max-file: "7"
redis:
image: redis:7
container_name: coze_redis
restart: unless-stopped
command:
- redis-server
- --requirepass
- ${REDIS_PASSWORD}
- --appendonly
- "yes"
- --protected-mode
- "yes"
networks:
- coze_internal
volumes:
- ./data/redis:/data
ports:
- "127.0.0.1:6379:6379"
security_opt:
- no-new-privileges:true
logging:
driver: json-file
options:
max-size: "50m"
max-file: "7"
networks:
coze_internal:
driver: bridge
这里有几个关键点:
coze服务只绑定到127.0.0.1:8888,避免直接公网访问;- PostgreSQL 和 Redis 也只绑定本机地址;
- 所有服务放在内部网络
coze_internal; - 容器开启
no-new-privileges; - 丢弃 Linux capabilities;
- 限制日志大小,避免日志打满磁盘;
- 避免使用
privileged: true。
七、Redis 安全配置
Redis 是攻击者非常喜欢扫描的目标。如果 Redis 暴露公网且没有密码,风险极高。
建议:
- 不暴露公网;
- 开启密码;
- 使用 protected mode;
- 禁用高危命令;
- 开启持久化;
- 限制绑定地址。
如果你使用独立 Redis 配置文件,可参考:
bind 127.0.0.1
protected-mode yes
port 6379
requirepass please_change_redis_password
appendonly yes
appendfilename "appendonly.aof"
timeout 300
tcp-keepalive 60
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command SHUTDOWN ""
rename-command KEYS ""
注意:禁用命令前要确认 Coze 或相关组件是否依赖这些命令,避免影响业务。
八、数据库安全配置
以 PostgreSQL 为例,建议:
- 不开放公网端口;
- 使用强密码;
- 为 Coze 单独创建数据库账号;
- 不使用超级管理员账号连接业务;
- 定期备份;
- 限制连接来源;
- 开启日志审计。
postgresql.conf 示例
listen_addresses = '127.0.0.1'
port = 5432
max_connections = 200
shared_buffers = 1GB
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_connections = on
log_disconnections = on
log_statement = 'ddl'
log_min_duration_statement = 1000
password_encryption = scram-sha-256
pg_hba.conf 示例
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host coze coze_user 127.0.0.1/32 scram-sha-256
host coze coze_user 172.16.0.0/12 scram-sha-256
重启数据库:
sudo systemctl restart postgresql
如果数据库运行在 Docker 内,请根据容器网络地址调整 pg_hba.conf。
九、MinIO / 对象存储安全建议
如果 Coze 使用 MinIO 或其他对象存储保存文件,建议:
- 不使用默认账号密码;
- 不将 Console 暴露公网;
- Bucket 不设置 public;
- 文件访问使用签名 URL;
- 定期清理无效文件;
- 配置服务端加密;
- 开启访问日志。
MinIO 环境变量示例:
MINIO_ROOT_USER=coze_minio_admin
MINIO_ROOT_PASSWORD=please_change_strong_minio_password
MINIO_BROWSER=off
如果必须暴露 MinIO API,建议通过 Nginx 加 IP 白名单、HTTPS 和限流。
十、应用账号与权限加固
Coze 应用层安全同样重要。
1. 禁用默认账号
部署完成后应立即检查:
- 是否存在默认管理员账号;
- 是否使用默认密码;
- 是否有测试账号;
- 是否有公开注册入口;
- 是否允许匿名访问。
建议:
默认账号:禁用或改名
默认密码:立即修改
测试账号:上线前删除
注册入口:按需关闭
管理员数量:最小化
2. 强密码策略
建议密码策略:
| 项目 | 建议 |
|---|---|
| 最小长度 | 12 位以上 |
| 复杂度 | 大小写字母、数字、特殊字符 |
| 历史密码 | 不允许重复最近 5 次 |
| 登录失败 | 连续失败 5 次锁定 |
| 会话有效期 | 8 到 24 小时 |
| 管理员 MFA | 强制开启 |
如果 Coze 支持 SSO,建议接入企业统一身份认证,例如:
- LDAP
- OAuth2
- OIDC
- SAML
- 企业微信 / 飞书 / 钉钉身份源
统一身份源可以降低账号管理成本,并提升离职账号回收效率。
十一、API Key 与密钥管理
Coze 通常需要调用大模型供应商或第三方工具,因此密钥管理非常关键。
建议:
- 不要将 API Key 写入代码仓库;
- 不要将 API Key 写入前端页面;
.env文件不提交 Git;- 为不同环境使用不同 Key;
- 为不同业务使用不同 Key;
- 设置供应商侧消费额度;
- 定期轮换密钥;
- 离职人员立即回收权限;
- 日志中不要打印完整 Key。
建议在项目根目录添加 .gitignore:
.env
.env.*
!.env.example
data/
logs/
backup/
*.key
*.pem
*.crt
*.sql
*.dump
可以提供一个 .env.example 作为模板,但不要包含真实密钥:
COZE_ENV=production
COZE_PUBLIC_URL=https://coze.example.com
JWT_SECRET=change_me
SESSION_SECRET=change_me
POSTGRES_DB=coze
POSTGRES_USER=coze_user
POSTGRES_PASSWORD=change_me
REDIS_PASSWORD=change_me
OPENAI_API_KEY=change_me
十二、日志审计与脱敏
日志是安全排查的重要依据,但日志本身也可能泄露敏感信息。
建议记录:
- 登录成功 / 失败;
- 管理员操作;
- 权限变更;
- 插件创建与修改;
- API Key 添加、删除、轮换;
- 知识库上传、删除;
- 异常请求;
- 高并发调用;
- 模型调用异常。
不建议记录:
- 完整 API Key;
- 用户密码;
- Cookie;
- Authorization Header;
- 完整身份证、手机号、银行卡;
- 敏感业务 Prompt。
Nginx 脱敏日志示例
在 nginx.conf 的 http 块中配置:
log_format coze_safe
'$remote_addr - $remote_user [$time_local] '
'"$request_method $uri $server_protocol" '
'$status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time';
access_log /var/log/nginx/coze_access.log coze_safe;
这里使用 $uri 而不是 $request_uri,可以减少 query 参数泄露风险。
十三、备份与恢复方案
安全不仅是防攻击,也包括事故后的恢复能力。
建议备份内容:
| 类型 | 内容 |
|---|---|
| 数据库 | Coze 主数据库 |
| Redis | 持久化数据 |
| 文件 | 知识库文件、上传附件 |
| 配置 | .env、Nginx 配置、Compose 文件 |
| 证书 | SSL 证书 |
| 日志 | 安全审计日志 |
PostgreSQL 备份脚本
文件路径:
/scripts/backup_coze_pg.sh
脚本内容:
#!/bin/bash
set -e
BACKUP_DIR="/backup/coze/postgres"
DATE=$(date +"%Y%m%d_%H%M%S")
POSTGRES_CONTAINER="coze_postgres"
POSTGRES_DB="coze"
POSTGRES_USER="coze_user"
mkdir -p ${BACKUP_DIR}
docker exec ${POSTGRES_CONTAINER} pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} \
> ${BACKUP_DIR}/coze_${DATE}.sql
gzip ${BACKUP_DIR}/coze_${DATE}.sql
# 删除 30 天前备份
find ${BACKUP_DIR} -type f -name "*.gz" -mtime +30 -delete
echo "Backup completed: ${BACKUP_DIR}/coze_${DATE}.sql.gz"
赋予执行权限:
chmod +x /scripts/backup_coze_pg.sh
添加定时任务:
crontab -e
每天凌晨 2 点备份:
0 2 * * * /scripts/backup_coze_pg.sh >> /var/log/coze_backup.log 2>&1
恢复示例
gunzip coze_20250101_020000.sql.gz
cat coze_20250101_020000.sql | docker exec -i coze_postgres \
psql -U coze_user -d coze
备份必须定期演练恢复。没有验证过的备份,在关键时刻可能不可用。
十四、更新与漏洞管理
建议建立固定更新机制:
- 每月检查 Coze 版本更新;
- 每月检查基础镜像漏洞;
- 定期更新系统补丁;
- 生产环境更新前先在测试环境验证;
- 保留回滚版本;
- 升级前先备份数据库和配置。
Docker 镜像漏洞扫描
可以使用 Trivy:
sudo apt install wget apt-transport-https gnupg lsb-release -y
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key \
| sudo gpg --dearmor -o /usr/share/keyrings/trivy.gpg
echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" \
| sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt update
sudo apt install trivy -y
扫描镜像:
trivy image your-registry/coze:stable-version
扫描文件系统:
trivy fs /path/to/coze
十五、生产环境安全检查清单
上线前建议逐项检查:
[ ] 已开启 HTTPS
[ ] HTTP 已自动跳转 HTTPS
[ ] Nginx 已配置安全响应头
[ ] 已配置访问限流
[ ] 管理后台已限制访问来源
[ ] 已禁用默认账号或修改默认密码
[ ] 管理员已开启 MFA
[ ] Coze 服务未直接暴露公网端口
[ ] 数据库未暴露公网
[ ] Redis 未暴露公网
[ ] Redis 已开启密码
[ ] API Key 未提交到代码仓库
[ ] .env 文件权限为 600
[ ] 日志中不打印敏感信息
[ ] 已配置数据库备份
[ ] 已测试备份恢复
[ ] 已配置防火墙
[ ] 已安装 Fail2ban
[ ] 容器未使用 privileged 模式
[ ] Docker 日志已限制大小
[ ] 已设置资源限制
[ ] 已建立补丁更新机制
[ ] 已准备应急联系人和回滚方案
十六、常见错误配置与风险
1. 将 Coze 服务端口直接暴露公网
错误示例:
ports:
- "8888:8888"
如果没有额外认证和限流,攻击者可以直接访问服务。建议改为:
ports:
- "127.0.0.1:8888:8888"
再通过 Nginx 代理访问。
2. Redis 暴露公网
错误示例:
ports:
- "6379:6379"
建议:
ports:
- "127.0.0.1:6379:6379"
或者完全不映射端口,只允许容器内部网络访问。
3. 使用弱密钥
错误示例:
JWT_SECRET=123456
POSTGRES_PASSWORD=password
REDIS_PASSWORD=redis
建议使用随机强密钥:
openssl rand -base64 48
4. 日志记录完整 Authorization
错误示例:
Authorization: Bearer sk-xxxxxxxxxxxxxxxx
这会导致密钥通过日志系统二次泄露。应在应用或代理层进行脱敏。
十七、应急响应建议
一旦发现 Coze 环境可能被入侵,建议按以下顺序处理:
- 隔离主机:临时下线公网入口或限制 IP;
- 保留现场:不要立即删除日志和容器;
- 轮换密钥:包括模型 API Key、JWT Secret、数据库密码、Redis 密码;
- 检查账号:删除异常管理员、异常 Token;
- 审计日志:检查异常登录、异常文件下载、异常接口调用;
- 检查容器:确认是否存在异常进程、异常挂载、异常镜像;
- 恢复服务:从可信备份恢复;
- 复盘加固:补齐漏洞、限流、告警、权限控制。
常用排查命令:
docker ps -a
docker logs coze_app --tail=200
docker exec -it coze_app ps aux
last
lastb
sudo journalctl -u ssh --since "24 hours ago"
sudo tail -n 200 /var/log/nginx/coze_access.log
十八、总结
Coze 的安全加固不能只依赖某一个配置,而应采用多层防护策略:服务器层面减少暴露面,Nginx 层面开启 HTTPS、限流和安全头,应用层面强化认证和权限,数据层面保证数据库、Redis、对象存储不裸露,运维层面做好备份、审计、升级和应急响应。
对于生产环境,建议至少完成以下核心动作:
- Coze 只通过 HTTPS 域名访问;
- 应用端口只监听本机或内网;
- 数据库、Redis 不暴露公网;
- 所有密钥使用强随机值;
- 管理后台限制 IP 或开启额外认证;
- 日志脱敏并保留审计记录;
- 定期备份并验证恢复;
- 定期更新镜像和依赖。
安全加固不是一次性工作,而是持续运营过程。只有将安全配置、日志审计、备份恢复和漏洞管理纳入日常运维流程,才能让 Coze 在企业环境中长期、稳定、可靠地运行。