Skip to content

权限控制

Croupier 实现零信任安全模型,提供 RBAC/ABAC 混合权限控制、操作审批和完整审计链。

目录

权限模型

整体架构

RBAC 模型

RBAC (Role-Based Access Control) 基于角色的访问控制。

用户 (User)
  ↓ 拥有
角色 (Role)
  ↓ 分配
权限 (Permission)
  ↓ 保护
函数 (Function)

ABAC 模型

ABAC (Attribute-Based Access Control) 基于属性的访问控制。

javascript
// 评估表达式
user.roles.includes('admin') || (game_id === 'my-game' && env === 'dev')

用户和角色

用户定义

json
{
  "user_id": "user_123",
  "username": "admin",
  "email": "admin@example.com",
  "roles": ["admin", "operator"],
  "attributes": {
    "department": "operations",
    "level": 5
  }
}

角色定义

json
{
  "role_id": "admin",
  "name": "管理员",
  "permissions": [
    "*.*"  // 所有权限
  ]
}

{
  "role_id": "gm",
  "name": "游戏管理员",
  "permissions": [
    "player.*",
    "item.*",
    "guild.*"
  ]
}

{
  "role_id": "viewer",
  "name": "查看者",
  "permissions": [
    "player.view",
    "item.view"
  ]
}

权限定义

权限格式

{entity}.{operation}

示例:
- player.ban      # 封禁玩家
- player.view     # 查看玩家
- item.create     # 创建物品
- item.delete     # 删除物品
- *.*             # 所有权限(谨慎使用)

游戏作用域

权限可以限定到特定游戏:

game:{game_id}:{permission}

示例:
- game:my-game:player.ban    # 仅 my-game 的封禁权限
- game:test-game:*.*         # test-game 的所有权限

函数权限配置

基础权限

json
{
  "id": "player.ban",
  "auth": {
    "permission": "player.ban"
  }
}

ABAC 表达式

json
{
  "id": "player.ban",
  "auth": {
    "permission": "player.ban",
    "allow_if": "has_role('admin') || has_role('senior_gm')"
  }
}

可用表达式

函数说明示例
has_role(role)检查角色has_role('admin')
has_permission(perm)检查权限has_permission('player.view')
==等于env == 'prod'
!=不等于env != 'dev'
&&逻辑与has_role('admin') && env == 'prod'
||逻辑或has_role('admin') || has_role('gm')
()分组(a || b) && c

可用变量

变量类型说明
userobject当前用户信息
user.rolesarray用户角色列表
game_idstring目标游戏 ID
envstring环境 (dev/staging/prod)
function_idstring被调用的函数 ID

审批流程

双人规则

高风险操作需要双人审批:

json
{
  "id": "player.ban",
  "auth": {
    "permission": "player.ban",
    "two_person_rule": true,
    "approval": {
      "enabled": true,
      "threshold": 2  // 需要两人审批
    }
  }
}

审批流程

审批 API

bash
# 创建审批请求
POST /api/approvals
{
  "function_id": "player.ban",
  "payload": {...},
  "reason": "玩家使用外挂"
}

# 获取待审批列表
GET /api/approvals?state=pending

# 审批通过
POST /api/approvals/{id}/approve

# 审批拒绝
POST /api/approvals/{id}/reject
{
  "reason": "证据不足"
}

审计日志

审计事件

所有操作都会记录审计日志:

json
{
  "audit_id": "audit_20241201_001",
  "timestamp": "2024-12-01T10:30:00Z",
  "user": {
    "user_id": "user_123",
    "username": "admin"
  },
  "action": "function.invoke",
  "game_id": "my-game",
  "env": "prod",
  "function_id": "player.ban",
  "payload_preview": {
    "player_id": "***",
    "duration": 24
  },
  "result": "success",
  "approval_id": "approval_123",
  "ip": "192.168.1.100",
  "ip_region": "中国 上海"
}

敏感字段脱敏

yaml
# 配置脱敏字段
server:
  audit:
    sensitive_fields:
      - "password"
      - "token"
      - "secret"
      - "api_key"

审计链防篡改

每条审计记录包含哈希值:

json
{
  "audit_id": "audit_001",
  "hash": "sha256(prev_hash + content)",
  "prev_hash": "sha256(...)"
}

风险等级

风险分级

等级说明审批要求审计要求允许角色
low低风险无需审批无需审计user, operator
medium中风险无需审批需要审计operator
high高风险单管理员审批需要审计admin
danger危险双人审批需要审计super_admin
unknown未知(默认)同 medium同 mediumoperator

双层政策架构

Croupier 采用双层政策架构,结合配置文件默认策略和数据库覆盖策略:

┌─────────────────────────────────────────────────────────────┐
│                    函数调用请求                               │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│  1. 检查数据库覆盖政策 (FunctionPolicy)                       │
│     ├─ 存在覆盖?使用覆盖政策                                │
│     └─ 不存在?使用默认风险等级政策                          │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│  2. 应用政策检查                                              │
│     ├─ 角色权限检查 (AllowedRoles)                           │
│     ├─ 审批要求检查 (RequireApproval)                        │
│     └─ 审计要求检查 (RequireAudit)                           │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│  3. 执行后续操作                                              │
│     ├─ 需要审批?创建审批请求                                 │
│     ├─ 需要审计?记录审计日志                                 │
│     └─ 满足条件?执行函数调用                                 │
└─────────────────────────────────────────────────────────────┘

政策来源:

来源说明优先级修改方式
default来自 configs/default-policies.yaml 的默认政策修改配置文件
manual数据库中的覆盖政策API 设置/删除

默认政策配置 (configs/default-policies.yaml):

yaml
low:
  require_approval: false
  require_audit: false
  allowed_roles: [user, operator]

medium:
  require_approval: false
  require_audit: true
  allowed_roles: [operator]

high:
  require_approval: true
  approval_workflow: single_admin
  require_audit: true
  allowed_roles: [admin]

danger:
  require_approval: true
  approval_workflow: two_person
  require_audit: true
  allowed_roles: [super_admin]

风险配置

json
{
  "id": "player.ban",
  "ui": {
    "risk_level": "high",
    "risk_warning": "高风险操作,封禁后玩家无法登录",
    "confirm_message": "确认封禁玩家?"
  }
}

政策管理 API

bash
# 获取函数有效政策
GET /api/v1/functions/:function_id/policy?risk_level=high

# 设置函数覆盖政策
PUT /api/v1/functions/:function_id/policy
{
  "require_approval": true,
  "approval_workflow": "single_admin",
  "require_audit": true,
  "allowed_roles": ["admin"]
}

# 删除函数覆盖政策(恢复默认)
DELETE /api/v1/functions/:function_id/policy

# 获取所有覆盖政策
GET /api/v1/policies/overrides

# 获取默认政策配置
GET /api/v1/policies/defaults

# 重新加载默认政策配置
POST /api/v1/policies/reload

自动政策创建

函数注册时,系统会自动根据函数的风险等级创建默认政策:

函数注册 → 读取 risk_level 字段 → 创建 FunctionPolicy 记录

如果函数未指定风险等级,默认使用 medium 级别。

限流保护

函数级限流

json
{
  "id": "player.ban",
  "semantics": {
    "rate_limit": "10rps",
    "concurrency": 5
  }
}

用户级限流

json
{
  "semantics": {
    "user_rate_limit": "5rps",
    "user_burst": 10
  }
}

最佳实践

1. 最小权限原则

json
// ❌ 不推荐:过度授权
{
  "roles": ["admin"]  // 拥有所有权限
}

// ✅ 推荐:按需授权
{
  "roles": ["gm"],  // 仅游戏管理权限
  "permissions": ["player.ban", "player.view"]
}

2. 环境隔离

json
{
  "auth": {
    "allow_if": "env == 'dev' || has_role('admin')"
  }
}

3. 审批配置

json
{
  "auth": {
    "approval": {
      "enabled": true,
      "threshold": "has_role('admin') ? 1 : 2",
      "approvers": ["admin", "senior_gm"],
      "timeout": "24h"
    }
  }
}

4. 审计保留

yaml
server:
  audit:
    enabled: true
    retention_days: 365
    backup_enabled: true

相关文档