跳到主要内容

安全设计文档

概述

本文档描述了井云服务中心后端系统的安全架构、安全机制和安全策略,确保系统在数据保护、访问控制、安全审计等方面符合企业级安全要求。

安全架构概览

安全层级

安全目标

  • 机密性:确保数据只能被授权用户访问
  • 完整性:确保数据不被未授权修改
  • 可用性:确保系统持续可用服务
  • 可审计性:确保所有操作可追溯
  • 可控性:确保系统安全状态可控

鉴权与授权模型

认证机制

1. JWT Token 认证

type JWTClaims struct {
UserID int64 `json:"user_id"`
TenantID int64 `json:"tenant_id,omitempty"`
Role string `json:"role"`
Scope []string `json:"scope"`
jwt.StandardClaims
}

Token 结构:

  • Header:算法和类型信息
  • Payload:用户身份和权限信息
  • Signature:数字签名验证

Token 生命周期:

  • Access Token:2小时有效期
  • Refresh Token:7天有效期
  • Token 刷新:在过期前1小时内自动刷新

2. 多因素认证(MFA)

  • 短信验证码认证
  • 微信扫码认证
  • 邮箱验证码认证(预留)

3. 第三方认证

  • 微信登录认证
  • 企业微信认证(预留)
  • OAuth 2.0 认证(预留)

授权模型

1. RBAC(基于角色的访问控制)

type Role struct {
ID int64 `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Permissions []string `json:"permissions"`
IsSystem bool `json:"is_system"`
}

type Permission struct {
ID int64 `json:"id"`
Resource string `json:"resource"`
Action string `json:"action"`
Description string `json:"description"`
}

2. 权限模型

  • 资源:系统中的各种资源(智能体、用户、租户等)
  • 操作:对资源的操作(创建、读取、更新、删除)
  • 角色:权限的集合(管理员、普通用户、访客)
  • 用户:分配角色的主体

3. 权限检查流程

租户隔离

1. 数据隔离

  • 每个租户的数据完全隔离
  • 数据库查询自动添加租户过滤条件
  • 防止跨租户数据访问

2. 权限隔离

  • 租户管理员只能管理本租户用户
  • 平台管理员可以管理所有租户
  • 租户间权限不可继承

3. 资源隔离

  • 智能体、素材等资源按租户隔离
  • 文件存储按租户分目录
  • 缓存键包含租户标识

Token 生命周期管理

Token 生成

func GenerateToken(user *User) (*TokenPair, error) {
// 生成 Access Token
accessToken := jwt.NewWithClaims(jwt.SigningMethodHS256, JWTClaims{
UserID: user.ID,
TenantID: user.TenantID,
Role: user.Role,
Scope: user.Permissions,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(2 * time.Hour).Unix(),
IssuedAt: time.Now().Unix(),
Issuer: "jingyun-backend",
},
})

// 生成 Refresh Token
refreshToken := jwt.NewWithClaims(jwt.SigningMethodHS256, JWTClaims{
UserID: user.ID,
TenantID: user.TenantID,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(7 * 24 * time.Hour).Unix(),
IssuedAt: time.Now().Unix(),
Issuer: "jingyun-backend",
},
})

return &TokenPair{
AccessToken: accessToken.SignedString(secretKey),
RefreshToken: refreshToken.SignedString(secretKey),
ExpiresIn: 7200, // 2 hours
}, nil
}

Token 验证

func ValidateToken(tokenString string) (*JWTClaims, error) {
token, err := jwt.ParseWithClaims(tokenString, &JWTClaims{}, func(token *jwt.Token) (interface{}, error) {
return secretKey, nil
})

if claims, ok := token.Claims.(*JWTClaims); ok && token.Valid {
return claims, nil
}

return nil, err
}

Token 刷新

  • Access Token 在过期前1小时内可自动刷新
  • Refresh Token 只能使用一次
  • Token 刷新后旧 Token 立即失效
  • 异常登录时强制所有 Token 失效

Token 黑名单

  • 使用 Redis 存储 Token 黑名单
  • 用户主动登出时加入黑名单
  • 管理员可强制用户 Token 失效
  • 黑名单 Token 自动过期清理

敏感数据处理

数据分类

1. 公开数据

  • 用户昵称
  • 智能体名称和描述
  • 公开的配置信息

2. 内部数据

  • 用户 ID
  • 租户 ID
  • 业务统计数据

3. 敏感数据

  • 手机号
  • 身份证号
  • 银行账号
  • 支付信息

4. 机密数据

  • 密码
  • 私钥
  • 第三方 API 密钥
  • 数据库连接信息

数据加密

1. 传输加密

  • 所有 HTTP/HTTPS 通信使用 TLS 1.3
  • 内部服务间通信使用 mTLS
  • 数据库连接使用 SSL/TLS

2. 存储加密

  • 敏感字段使用 AES-256 加密
  • 密码使用 bcrypt 哈希
  • 配置文件敏感信息加密存储

3. 密钥管理

type KeyManager struct {
masterKey []byte
keyCache map[string][]byte
mutex sync.RWMutex
}

func (km *KeyManager) EncryptData(data []byte) ([]byte, error) {
// 使用 AES-256-GCM 加密
key := km.deriveKey()
nonce := make([]byte, 12)
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
return nil, err
}

block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}

aesgcm, err := cipher.NewGCM(block)
if err != nil {
return nil, err
}

ciphertext := aesgcm.Seal(nil, nonce, data, nil)
return append(nonce, ciphertext...), nil
}

数据脱敏

1. 日志脱敏

func MaskSensitiveData(data string) string {
// 手机号脱敏:138****1234
phoneRegex := regexp.MustCompile(`(\d{3})\d{4}(\d{4})`)
data = phoneRegex.ReplaceAllString(data, `$1****$2`)

// 邮箱脱敏:u***@example.com
emailRegex := regexp.MustCompile(`(\w{1})\w*(@\w+\.\w+)`)
data = emailRegex.ReplaceAllString(data, `$1***$2`)

// 身份证脱敏:110101********1234
idCardRegex := regexp.MustCompile(`(\d{6})\d{8}(\d{4})`)
data = idCardRegex.ReplaceAllString(data, `$1********$2`)

return data
}

2. 接口响应脱敏

  • 敏感字段不在响应中返回
  • 部分敏感字段返回脱敏值
  • 根据用户权限决定脱敏级别

3. 数据库查询脱敏

  • 查询结果中敏感字段自动脱敏
  • 导出数据时强制脱敏
  • 数据分析时使用脱敏数据

审计日志

日志分类

1. 用户操作日志

{
"timestamp": "2025-12-27T10:30:00Z",
"user_id": 12345,
"tenant_id": 1,
"action": "create_agent",
"resource": "agent",
"resource_id": 67890,
"ip_address": "192.168.1.100",
"user_agent": "Mozilla/5.0...",
"request_id": "req_123456789",
"result": "success",
"details": {
"agent_name": "测试智能体",
"agent_type": "bot"
}
}

2. 系统操作日志

{
"timestamp": "2025-12-27T10:30:00Z",
"service": "user-service",
"action": "database_backup",
"operator": "system",
"request_id": "sys_123456789",
"result": "success",
"details": {
"backup_size": "1.2GB",
"backup_path": "/backup/2025-12-27/"
}
}

3. 安全事件日志

{
"timestamp": "2025-12-27T10:30:00Z",
"event_type": "login_failure",
"severity": "high",
"user_id": 12345,
"ip_address": "192.168.1.100",
"details": {
"failure_reason": "invalid_password",
"attempt_count": 5,
"locked": true
}
}

日志收集和存储

1. 日志收集

  • 使用 ELK Stack 收集日志
  • 结构化 JSON 日志格式
  • 实时日志流处理

2. 日志存储

  • 热数据:Elasticsearch 存储 30 天
  • 温数据:对象存储存储 1 年
  • 冷数据:归档存储存储 7 年

3. 日志查询

  • 支持 Kibana 可视化查询
  • 支持关键字搜索
  • 支持时间范围过滤
  • 支持多维度分析

审计要求

1. 必须审计的操作

  • 用户登录和登出
  • 权限变更
  • 敏感数据访问
  • 系统配置变更
  • 数据导出操作

2. 审计数据保留

  • 用户操作日志:保留 7 年
  • 系统操作日志:保留 3 年
  • 安全事件日志:永久保留

3. 审计报告

  • 每日安全事件报告
  • 每周异常操作报告
  • 每月合规审计报告
  • 年度安全评估报告

防重放与防刷

防重放攻击

1. 请求签名验证

type RequestSign struct {
Timestamp int64 `json:"timestamp"`
Nonce string `json:"nonce"`
Sign string `json:"sign"`
}

func VerifyRequestSign(req *http.Request) error {
// 检查时间戳,防止重放
timestamp := req.Header.Get("X-Timestamp")
if time.Since(time.Unix(timestamp, 0)) > 5*time.Minute {
return errors.New("request expired")
}

// 检查随机数,防止重复
nonce := req.Header.Get("X-Nonce")
if isNonceUsed(nonce) {
return errors.New("duplicate request")
}

// 验证签名
sign := req.Header.Get("X-Sign")
expectedSign := generateSign(req)
if sign != expectedSign {
return errors.New("invalid signature")
}

return nil
}

2. 时间戳验证

  • 请求时间戳必须在 5 分钟内
  • 服务器时间同步校准
  • 异常时间戳请求拒绝

3. 随机数管理

  • 使用 Redis 存储已使用随机数
  • 随机数 5 分钟后自动过期
  • 随机数冲突时拒绝请求

防刷机制

1. 接口限流

type RateLimiter struct {
redis *redis.Client
limits map[string]*Limit
}

type Limit struct {
Requests int // 请求数
Window time.Duration // 时间窗口
}

func (rl *RateLimiter) IsAllowed(key string) bool {
limit := rl.limits[key]
if limit == nil {
return true
}

count, err := rl.redis.Incr(key).Result()
if err != nil {
return false
}

if count == 1 {
rl.redis.Expire(key, limit.Window)
}

return count <= int64(limit.Requests)
}

2. 用户级限流

  • 普通用户:100 次/分钟
  • VIP 用户:500 次/分钟
  • 管理员:1000 次/分钟

3. IP 级限流

  • 单 IP:1000 次/分钟
  • 异常 IP:自动降级
  • 恶意 IP:自动封禁

4. 接口级限流

  • 登录接口:10 次/分钟
  • 短信接口:5 次/分钟
  • 支付接口:20 次/分钟

恶意行为检测

1. 异常登录检测

  • 短时间内多次失败登录
  • 异地登录行为
  • 非正常时间登录

2. 暴力破解检测

  • 密码猜测行为
  • 验证码暴力破解
  • 接口参数枚举

3. 自动化攻击检测

  • 机器人流量识别
  • 脚本化操作检测
  • 异常访问模式

网络安全

网络隔离

1. 网络分段

  • DMZ 区:网关和负载均衡
  • 应用区:业务服务
  • 数据区:数据库和缓存
  • 管理区:监控和管理

2. 防火墙规则

  • 只开放必要的端口
  • 限制访问源 IP
  • 禁止不必要的协议

3. 网络监控

  • 实时流量监控
  • 异常流量检测
  • 网络攻击防护

DDoS 防护

1. 流量清洗

  • 接入层流量清洗
  • 恶意流量过滤
  • 正常流量放行

2. 弹性扩容

  • 自动检测流量突增
  • 快速扩容服务实例
  • 负载均衡动态调整

3. 应急响应

  • 流量切换到备用线路
  • 启用 CDN 加速
  • 临时限制非核心服务

安全通信

1. HTTPS 配置

  • 使用 TLS 1.3 协议
  • 强制 HTTPS 重定向
  • HSTS 头部配置

2. 证书管理

  • 自动证书续期
  • 证书安全配置
  • 证书监控告警

3. 内部通信加密

  • 服务间 mTLS 认证
  • 内部 API 加密
  • 数据库连接加密

安全监控与告警

监控指标

1. 安全事件指标

  • 登录失败率
  • 异常访问次数
  • 权限拒绝次数
  • 数据访问异常

2. 系统安全指标

  • 漏洞扫描结果
  • 安全配置检查
  • 密钥轮换状态
  • 证书有效期

3. 网络安全指标

  • 异常流量比例
  • 攻击类型分布
  • 防护效果统计
  • 网络延迟变化

告警规则

1. 实时告警

  • 暴力破解攻击
  • 权限提升异常
  • 数据泄露风险
  • 系统入侵检测

2. 趋势告警

  • 安全事件增长趋势
  • 异常访问模式
  • 资源使用异常
  • 性能下降趋势

3. 定期告警

  • 安全配置检查
  • 证书过期提醒
  • 漏洞扫描结果
  • 合规性检查

应急响应

1. 响应流程

安全事件应急响应流程:

  1. 安全事件发生:检测到安全异常
  2. 事件检测:系统自动检测或人工发现
  3. 事件分析:分析事件性质和影响范围
  4. 响应决策:制定应急处置方案
  5. 应急处置:执行应急处理措施
  6. 事件恢复:恢复系统正常运行
  7. 事后总结:总结经验教训

紧急响应路径: 事件分析 → 事件上报 → 启动预案 → 应急处置

2. 应急预案

  • 数据泄露应急预案
  • 系统入侵应急预案
  • DDoS 攻击应急预案
  • 服务不可用应急预案

3. 恢复策略

  • 数据备份恢复
  • 系统服务恢复
  • 安全配置恢复
  • 用户通知和补偿

合规性要求

数据保护合规

1. 个人信息保护

  • 遵循《个人信息保护法》
  • 用户授权和同意机制
  • 数据最小化原则
  • 用户权利保障

2. 数据跨境传输

  • 数据出境安全评估
  • 跨境传输合规性
  • 数据本地化存储
  • 国际标准遵循

3. 数据保留策略

  • 个人数据保留期限
  • 业务数据保留策略
  • 日志数据保留要求
  • 数据销毁流程

安全认证

1. 等级保护

  • 等保三级要求
  • 安全技术要求
  • 安全管理要求
  • 定期测评要求

2. 行业认证

  • ISO 27001 信息安全认证
  • SOC 2 安全审计
  • 隐私保护认证
  • 云安全认证

3. 第三方审计

  • 定期安全审计
  • 渗透测试
  • 代码安全审计
  • 配置安全审计

安全最佳实践

开发安全

1. 安全编码规范

  • 输入验证和过滤
  • 输出编码和转义
  • SQL 注入防护
  • XSS 攻击防护

2. 依赖安全管理

  • 第三方库安全扫描
  • 漏洞及时修复
  • 供应链安全
  • 许可证合规

3. 代码安全审查

  • 安全代码审查
  • 自动化安全测试
  • 静态代码分析
  • 动态应用测试

运维安全

1. 访问控制

  • 最小权限原则
  • 职责分离
  • 访问审批流程
  • 定期权限审查

2. 配置管理

  • 安全配置基线
  • 配置变更管理
  • 配置备份恢复
  • 配置合规检查

3. 变更管理

  • 变更风险评估
  • 变更审批流程
  • 变更测试验证
  • 变更回滚机制

安全培训

1. 开发人员培训

  • 安全编码培训
  • 安全意识培训
  • 安全工具使用
  • 安全事件响应

2. 运维人员培训

  • 安全运维培训
  • 应急响应培训
  • 安全工具使用
  • 合规要求培训

3. 全员安全意识

  • 安全政策宣传
  • 安全案例分享
  • 安全技能竞赛
  • 安全文化建设