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

Coze 私有化部署上线前,这些安全配置必须先做好

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

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

本文面向已经完成 Coze 私有化部署、企业内部部署或基于 Docker / Kubernetes 运行 Coze 服务的团队,提供一套较为完整的安全加固方案。内容涵盖网络访问控制、反向代理、HTTPS、身份认证、密钥管理、容器安全、数据库安全、日志审计、备份恢复以及常用配置文件示例。

说明:不同版本的 Coze 部署方式可能存在差异,本文提供的是通用安全加固思路和可落地配置模板,实际使用时应结合你的部署架构、官方文档和企业安全规范进行调整。


一、为什么 Coze 需要安全加固?

Coze 作为智能体 / AI 应用开发平台,通常会涉及以下敏感资源:

  1. 用户账号与组织数据
  2. 智能体配置、Prompt、插件配置
  3. 知识库文件与向量化数据
  4. 大模型 API Key
  5. 第三方插件凭证
  6. 企业内部接口地址
  7. 对话记录与业务数据

如果安全配置不当,可能产生以下风险:

  • 管理后台暴露在公网,被暴力破解;
  • 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_zonelimit_conn_zone 通常建议放在 http 块中,如果你的 Nginx 不允许在 server 块定义,需要移动到 /etc/nginx/nginx.confhttp {} 内。

测试配置并重载:

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

这里有几个关键点:

  1. coze 服务只绑定到 127.0.0.1:8888,避免直接公网访问;
  2. PostgreSQL 和 Redis 也只绑定本机地址;
  3. 所有服务放在内部网络 coze_internal
  4. 容器开启 no-new-privileges
  5. 丢弃 Linux capabilities;
  6. 限制日志大小,避免日志打满磁盘;
  7. 避免使用 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 为例,建议:

  1. 不开放公网端口;
  2. 使用强密码;
  3. 为 Coze 单独创建数据库账号;
  4. 不使用超级管理员账号连接业务;
  5. 定期备份;
  6. 限制连接来源;
  7. 开启日志审计。

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 通常需要调用大模型供应商或第三方工具,因此密钥管理非常关键。

建议:

  1. 不要将 API Key 写入代码仓库;
  2. 不要将 API Key 写入前端页面;
  3. .env 文件不提交 Git;
  4. 为不同环境使用不同 Key;
  5. 为不同业务使用不同 Key;
  6. 设置供应商侧消费额度;
  7. 定期轮换密钥;
  8. 离职人员立即回收权限;
  9. 日志中不要打印完整 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.confhttp 块中配置:

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

备份必须定期演练恢复。没有验证过的备份,在关键时刻可能不可用。


十四、更新与漏洞管理

建议建立固定更新机制:

  1. 每月检查 Coze 版本更新;
  2. 每月检查基础镜像漏洞;
  3. 定期更新系统补丁;
  4. 生产环境更新前先在测试环境验证;
  5. 保留回滚版本;
  6. 升级前先备份数据库和配置。

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 环境可能被入侵,建议按以下顺序处理:

  1. 隔离主机:临时下线公网入口或限制 IP;
  2. 保留现场:不要立即删除日志和容器;
  3. 轮换密钥:包括模型 API Key、JWT Secret、数据库密码、Redis 密码;
  4. 检查账号:删除异常管理员、异常 Token;
  5. 审计日志:检查异常登录、异常文件下载、异常接口调用;
  6. 检查容器:确认是否存在异常进程、异常挂载、异常镜像;
  7. 恢复服务:从可信备份恢复;
  8. 复盘加固:补齐漏洞、限流、告警、权限控制。

常用排查命令:

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、对象存储不裸露,运维层面做好备份、审计、升级和应急响应。

对于生产环境,建议至少完成以下核心动作:

  1. Coze 只通过 HTTPS 域名访问;
  2. 应用端口只监听本机或内网;
  3. 数据库、Redis 不暴露公网;
  4. 所有密钥使用强随机值;
  5. 管理后台限制 IP 或开启额外认证;
  6. 日志脱敏并保留审计记录;
  7. 定期备份并验证恢复;
  8. 定期更新镜像和依赖。

安全加固不是一次性工作,而是持续运营过程。只有将安全配置、日志审计、备份恢复和漏洞管理纳入日常运维流程,才能让 Coze 在企业环境中长期、稳定、可靠地运行。

目录结构
全文