安全与权限
工具系统的安全控制机制。
安全层级
┌─────────────────────────────────────────────────┐
│ 1. 全局配置过滤 │
│ 启用/禁用工具类别和具体工具 │
├─────────────────────────────────────────────────┤
│ 2. 预设过滤 │
│ 预设级别的工具白名单/黑名单 │
├─────────────────────────────────────────────────┤
│ 3. 危险工具控制 │
│ 危险工具需要特殊授权 │
├─────────────────────────────────────────────────┤
│ 4. 用户权限检查 │
│ 管理员专属工具 │
└─────────────────────────────────────────────────┘全局配置
启用/禁用类别
yaml
builtinTools:
enabledCategories:
- basic
- user
- web
# 未列出的类别将被禁用禁用特定工具
yaml
builtinTools:
disabledTools:
- execute_command
- delete_file预设级过滤
白名单模式
yaml
# 预设文件
tools:
mode: whitelist
allowedTools:
- get_time
- get_weather
- search_web黑名单模式
yaml
tools:
mode: blacklist
excludedTools:
- send_message
- kick_member危险工具
标记危险工具
javascript
// 工具定义中
{
name: 'execute_command',
description: '执行系统命令',
dangerous: true, // 标记为危险
async execute(args) {
// ...
}
}危险工具配置
yaml
mcp:
security:
# 是否允许危险工具
allowDangerous: false
# 危险工具列表
dangerousTools:
- execute_command
- delete_file
- write_file
- format_disk临时授权
某些场景需要临时允许危险工具:
javascript
const agent = await createSkillsAgent({
event: e,
allowDangerous: true // 临时授权
})管理员工具
标记管理员专属
javascript
{
name: 'kick_member',
description: '踢出群成员',
adminOnly: true, // 需要管理员权限
async execute(args, context) {
if (!context.isAdmin) {
throw new Error('需要管理员权限')
}
// ...
}
}配置管理员工具
yaml
mcp:
security:
adminOnlyTools:
- kick_member
- ban_member
- set_group_admin参数验证
工具执行前自动验证参数:
javascript
{
parameters: {
type: 'object',
properties: {
userId: {
type: 'string',
pattern: '^[0-9]+$' // 只允许数字
},
count: {
type: 'integer',
minimum: 1,
maximum: 100
}
},
required: ['userId']
}
}速率限制
工具级限制
javascript
{
name: 'expensive_tool',
rateLimit: {
maxCalls: 10,
windowMs: 60000 // 每分钟最多 10 次
}
}用户级限制
yaml
mcp:
rateLimit:
perUser:
maxCalls: 100
windowMs: 3600000 # 每小时 100 次日志审计
记录工具调用
yaml
mcp:
logging:
enabled: true
level: info
retention: 30 # 保留 30 天日志内容
json
{
"id": "uuid",
"toolName": "send_message",
"args": {"target": "123", "content": "..."},
"result": "success",
"userId": "456",
"timestamp": "2024-12-15T06:30:00.000Z",
"duration": 150
}查看日志
bash
# 命令
#工具日志
# API
GET /api/tools/logs?limit=100&toolName=send_message最佳实践
1. 最小权限原则
只启用必需的工具,禁用不需要的功能。
2. 使用白名单
预设中使用白名单模式,明确列出允许的工具。
3. 禁用危险工具
生产环境务必设置 allowDangerous: false。
4. 定期审计
定期检查工具调用日志,发现异常行为。
5. 参数校验
严格定义参数 Schema,防止注入攻击。
安全检查清单
- [ ] 已禁用不需要的工具类别
- [ ] 危险工具已禁用或受控
- [ ] 管理员工具已正确配置
- [ ] 预设使用白名单模式
- [ ] 日志审计已启用
- [ ] 速率限制已配置