企业级AI系统安全模块设计与实现
2026/7/22 3:31:00 网站建设 项目流程

企业级AI系统安全模块设计与实现

引言

在构建企业级AI应用时,安全性是重中之重。本文将详细介绍我们为Golllm RAG知识库系统设计和实现的安全模块,涵盖用户认证、权限管控、数据隔离、内容安全、成本控制和审计日志等核心功能。


一、安全架构设计

1.1 整体架构

安全模块采用分层设计,确保职责清晰、易于维护:

┌─────────────────────────────────────────────────────────────┐ │ API 网关层 │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 认证中间件 │ │ 权限中间件 │ │ 限流中间件 │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ └─────────┼────────────────┼────────────────┼──────────────────┘ │ │ │ ┌─────────▼────────────────▼────────────────▼──────────────────┐ │ 业务服务层 │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 租户服务 │ │ 用户服务 │ │ 审计服务 │ │ │ └──────┬──────┘ └──────┬──────┘ └─────────────┘ │ │ │ │ │ │ ┌──────▼──────┐ ┌──────▼──────┐ ┌─────────────┐ │ │ │ 内容过滤 │ │ 成本控制 │ │ JWT认证 │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────────┐ │ 数据存储层 │ │ security.db (SQLite) │ └─────────────────────────────────────────────────────────────┘

1.2 核心设计原则

  • 最小权限原则:用户只拥有完成工作所需的最小权限
  • 数据隔离:租户之间数据完全隔离,越权访问100%被拦截
  • 审计追溯:所有操作可追溯,支持合规审计
  • 防御纵深:多层安全机制,单点失效不影响整体安全

二、用户认证与权限体系

2.1 JWT认证机制

系统采用JWT(JSON Web Token)实现无状态认证:

// 生成Tokenfunc(m*JWTMiddleware)generateToken(user*User)(string,int64){expiresAt:=time.Now().Add(m.config.Expire).Unix()claims:=Claims{UserID:user.ID,TenantID:user.TenantID,Role:string(user.Role),StandardClaims:jwt.StandardClaims{ExpiresAt:expiresAt,IssuedAt:time.Now().Unix(),Issuer:"golllm",},}token:=jwt.NewWithClaims(jwt.SigningMethodHS256,claims)returntoken.SignedString([]byte(m.config.SecretKey)),expiresAt}

认证流程

  1. 用户提交用户名密码登录
  2. 系统验证凭证并生成JWT Token
  3. 后续请求携带Authorization: Bearer <token>
  4. 中间件解析Token并验证权限

2.2 RBAC权限模型

实现用户-角色-权限三级权限模型:

typeRolestringconst(RoleSuperAdmin Role="super_admin"RoleAdmin Role="admin"RoleUser Role="user")

角色权限矩阵

权限超级管理员管理员普通用户
文档管理部分
聊天提问
租户管理
用户管理
审计日志
账单查看

2.3 权限中间件

func(m*JWTMiddleware)PermissionMiddleware(permissions...Permission)gin.HandlerFunc{returnfunc(c*gin.Context){role:=c.GetString("role")ifrole==RoleSuperAdmin{c.Next()return}for_,perm:=rangepermissions{if!hasPermission(role,perm){c.JSON(http.StatusForbidden,gin.H{"error":"insufficient permissions"})c.Abort()return}}c.Next()}}

使用示例

admin.GET("/tenants",jwtMiddleware.PermissionMiddleware(PermTenantManage),tenantHandler.List)

三、租户数据隔离

3.1 隔离策略

采用行级数据隔离方案,所有业务表均包含tenant_id字段:

CREATETABLEusers(idTEXTPRIMARYKEY,tenant_idTEXTNOTNULL,usernameTEXTNOTNULLUNIQUE,...FOREIGNKEY(tenant_id)REFERENCEStenants(id)ONDELETECASCADE);

3.2 隔离实现

  1. 查询过滤:所有查询自动添加tenant_id条件
  2. 写入验证:创建记录时强制校验tenant_id归属
  3. 跨租户拦截:检测到跨租户访问立即拒绝
func(r*SQLiteRepository)ListUsersByTenant(tenantIDstring,page,pageSizeint)([]*User,int64,error){query:="SELECT COUNT(*) FROM users WHERE tenant_id = ?"// 仅查询指定租户的数据...}

3.3 配额管理

每个租户拥有独立的Token配额:

typeTenantQuotastruct{TenantIDstring// 租户IDDailyTokenLimitint// 每日Token限额MonthlyTokenLimitint// 每月Token限额DailyUsedTokensint// 每日已用TokenMonthlyUsedTokensint// 每月已用TokenLastResetDate time.Time// 最后重置日期}

四、内容安全过滤

4.1 敏感词检测

实现敏感词黑白名单机制:

func(s*ContentFilterServiceImpl)Filter(c*gin.Context,contentstring,contentTypestring)*ContentFilterResponse{tenantID:=c.GetString("tenant_id")// 检查租户自定义敏感词foundWords,hasSensitive:=s.repo.CheckSensitiveContent(content,tenantID)// 检查系统默认敏感词if!hasSensitive{for_,word:=rangedefaultSensitiveWords{ifstrings.Contains(content,word){foundWords=append(foundWords,&SensitiveWord{Word:word,Level:ViolationLevelHigh})}}hasSensitive=len(foundWords)>0}// 根据违规等级决定处理方式...}

4.2 违规处理策略

违规等级处理方式
高(3)直接阻断 + 记录 + 告警
中(2)记录 + 告警
低(1)仅记录

4.3 违规记录

所有违规行为记录到数据库,支持合规审计:

typeViolationRecordstruct{IDstring// 记录IDTenantIDstring// 租户IDUserIDstring// 用户IDTypestring// 违规类型(question/answer)Contentstring// 违规内容Levelint// 违规等级Actionstring// 处理动作(block/log/alert)CreatedAt time.Time// 创建时间}

五、成本管控

5.1 Token用量统计

精确统计Token使用量,区分输入和输出:

func(s*CostControlServiceImpl)RecordTokenUsage(c*gin.Context,tenantID,userID,modelstring,promptTokens,completionTokens,totalTokensint)error{// 更新租户配额quota,_:=s.repo.GetTenantQuota(tenantID)ifquota!=nil{quota.DailyUsedTokens+=totalTokens quota.MonthlyUsedTokens+=totalTokens s.repo.UpdateTenantQuota(quota)}// 记录Token使用明细returns.repo.RecordTokenUsage(tenantID,userID,model,promptTokens,completionTokens,totalTokens)}

5.2 多维度统计

支持按多种维度统计Token使用:

维度说明
租户维度按租户统计Token使用量
用户维度按用户统计Token使用量
模型维度按模型统计Token使用量
时间维度按日/月统计Token使用量

5.3 账单生成

按月自动生成账单:

func(r*SQLiteRepository)GenerateBill(tenantID,monthstring)error{// 统计当月Token使用vartotalTokens,promptTokens,completionTokensintr.db.QueryRow(` SELECT COALESCE(SUM(total_tokens), 0), COALESCE(SUM(prompt_tokens), 0), COALESCE(SUM(completion_tokens), 0) FROM token_usage WHERE tenant_id = ? AND strftime('%Y-%m', created_at) = ? `,tenantID,month).Scan(&totalTokens,&promptTokens,&completionTokens)// 生成账单记录bill:=&BillRecord{TenantID:tenantID,Month:month,TotalTokens:totalTokens,PromptTokens:promptTokens,CompletionTokens:completionTokens,TotalCost:float64(totalTokens)*0.00002,// 按0.00002元/Token计算CreatedAt:time.Now(),}returnr.CreateBill(bill)}

六、审计日志

6.1 日志记录范围

所有管理操作和安全事件均记录审计日志:

typeAuditServiceinterface{Log(c*gin.Context,action,resource,resourceID,result,detailstring)error}

日志字段

字段说明
tenant_id租户ID
user_id操作用户ID
username操作用户名
action操作类型
resource操作资源类型
resource_id操作资源ID
result操作结果
detail操作详情

6.2 日志查询

支持多维度组合查询和分页:

func(r*SQLiteRepository)ListAuditLogs(filter*AuditLogQueryRequest,page,pageSizeint)([]*AuditLog,int64,error){query:="SELECT id, tenant_id, user_id, username, action, resource, resource_id, result, detail, created_at FROM audit_logs WHERE 1=1"params:=[]interface{}{}iffilter.TenantID!=""{query+=" AND tenant_id = ?"params=append(params,filter.TenantID)}iffilter.UserID!=""{query+=" AND user_id = ?"params=append(params,filter.UserID)}iffilter.Action!=""{query+=" AND action = ?"params=append(params,filter.Action)}...}

七、API接口设计

7.1 认证接口

方法路径说明
POST/api/v1/auth/login用户登录
POST/api/v1/auth/refresh刷新Token

7.2 管理后台接口

模块路径所需权限
租户管理/api/v1/admin/tenantstenant:manage
用户管理/api/v1/admin/usersuser:manage
内容过滤/api/v1/admin/content-filtercontent:filter
成本控制/api/v1/admin/cost-controlbill:view
审计日志/api/v1/admin/audit-logsaudit:view

八、安全最佳实践

8.1 密码安全

  • 使用SHA256哈希存储密码
  • 密码字段在JSON序列化时自动忽略(json:"-"
  • 登录失败记录审计日志

8.2 Token安全

  • 使用HTTPS传输Token
  • 设置合理的Token过期时间(建议24小时)
  • 支持Token刷新,避免频繁登录

8.3 数据安全

  • 敏感字段加密存储
  • 数据库文件权限限制
  • 定期备份数据

8.4 运维安全

  • 生产环境必须修改默认密钥
  • 定期轮换JWT密钥
  • 定期审查审计日志
  • 配置配额告警

九、测试验证

9.1 单元测试覆盖

编写了12个单元测试用例,覆盖核心功能:

TestHashPassword - 密码哈希验证 TestGenerateID - ID生成唯一性 TestContains - 敏感词匹配 TestGetPermissionsForRole - 权限获取 TestSQLiteRepository_Init - 仓库初始化 TestTenantCRUD - 租户CRUD TestUserCRUD - 用户CRUD TestTenantQuota - 配额管理 TestContentFilter - 内容过滤 TestAuditLog - 审计日志 TestTokenUsage - Token统计 TestBillGeneration - 账单生成

9.2 测试结果

=== RUN TestHashPassword --- PASS: TestHashPassword (0.00s) === RUN TestGenerateID --- PASS: TestGenerateID (0.01s) ... === RUN TestBillGeneration --- PASS: TestBillGeneration (0.01s) PASS ok github.com/golllm/cmd/rag/security 0.427s

所有测试全部通过!


十、总结

安全模块的实现使Golllm RAG系统达到了企业级安全标准:

  • 认证安全:JWT认证 + Token刷新 + 密码哈希
  • 权限管控:三级RBAC + 细粒度权限控制
  • 数据隔离:租户级行隔离 + 配额管理
  • 内容安全:敏感词检测 + 违规拦截 + 合规记录
  • 成本控制:精确Token统计 + 多维度报表 + 自动账单
  • 审计追溯:全面审计日志 + 多维度查询

该模块已通过完整的单元测试验证,可以直接投入生产使用。


附录

A. 默认账户

用户名密码角色
adminadmin123super_admin

B. 配置项

配置项默认值说明
security.jwt_secretgolllm-secret-key-2024JWT签名密钥
security.jwt_expire86400Token过期时间(秒)
security.db_pathsecurity.db安全数据库路径

C. 相关文档

  • 安全设计文档
  • 权限说明文档
  • github

作者:Golllm Team
日期:2026年7月
版本:v1.0


本文介绍的安全模块已集成到Golllm RAG知识库系统中,所有代码均已开源。如有疑问或建议,欢迎交流讨论!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询