Files
CyberStrikeAI/docs/zh-CN/rbac.md
T
2026-07-10 21:35:49 +08:00

387 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CyberStrikeAI RBAC 使用与管理指南
[English](../en-US/rbac.md)
CyberStrikeAI 是可执行 Agent、MCP、WebShell、C2 和批量任务的安全自动化平台。RBAC 不仅控制页面是否可见,还会贯穿 HTTP API、资源查询、Agent 上下文、内置/外部 MCP 工具、后台任务和机器人执行链路。
---
## 一、先区分两种“角色”
| 概念 | 管理入口 | 作用 |
|------|----------|------|
| **平台角色(RBAC Role** | 左侧 **平台权限** | 决定用户能调用哪些功能、能访问哪些资源 |
| **AI 测试角色(Agent Role** | 左侧 **角色** / `roles/*.yaml` | 决定 Agent 的提示词、测试方法和可选工具集合 |
AI 测试角色不是安全授权边界。即使选择了“渗透测试”角色,用户仍必须拥有对应的平台权限;反过来,RBAC 有权限也不会自动改变 Agent 提示词。
---
## 二、授权模型
一次访问同时满足以下条件才会放行:
```text
有效账号
+ 路由/工具所需 permission
+ 该 permission 对应的 scope
+ 目标资源 owner / 显式授权 / 父资源继承
+ 全局操作的额外限制
```
处理链路:
1. 登录后签发 Bearer Token,会话包含用户、角色、权限和逐权限 Scope。
2. HTTP 中间件把路由映射为权限,例如 `GET /api/projects``project:read`
3. 对带资源 ID 的请求继续校验 owner、显式资源授权或父资源继承。
4. Agent 启动时把不可变 Principal 写入 `context.Context`
5. 内置 MCP 工具根据工具和参数再次检查权限与资源;外部 MCP 也有独立限制。
6. 拒绝事件写入 RBAC/审计日志。
前端隐藏按钮只用于改善体验,不构成安全边界;真正的拒绝发生在服务端。
---
## 三、内置平台角色
| 角色 | Scope | 默认能力 |
|------|-------|----------|
| **管理员 `admin`** | `all` | 所有已知权限,包括 RBAC、配置、终端、审计删除和全局定义管理 |
| **操作员 `operator`** | `assigned` | 日常读写与执行能力;不含 RBAC、核心配置、终端、审计管理、外部 MCP 执行和部分全局定义写权限 |
| **审计员 `auditor`** | `all` | 各模块只读权限和 `audit:read`,不执行写操作 |
| **只读用户 `viewer`** | `assigned` | 各模块只读权限,仅查看被授权范围 |
系统角色不可修改或删除,升级时会按当前版本的权限目录重新构建授权,避免旧版本残留权限。需要不同组合时创建自定义角色。
没有分配任何角色的账号仍可登录,但基本没有业务权限;不要依赖“无角色”作为完整岗位配置。
---
## 四、权限命名与目录
权限使用 `模块:动作` 命名。常见动作:
- `read`:查看、列表、查询、导出。
- `write`:创建、更新、执行或管理。
- `delete`:删除。
- `execute`:执行 Agent、终端、工作流或特定能力。
当前权限按模块分组如下;运行版本的权威目录以“平台权限”页面或 `GET /api/rbac/metadata` 为准。
| 模块 | 权限 |
|------|------|
| 账号 | `auth:self` |
| 仪表盘 | `dashboard:read` |
| 对话 | `chat:read``chat:write``chat:delete` |
| Agent | `agent:execute``agent:local-execute` |
| HITL | `hitl:read``hitl:write` |
| 任务 | `tasks:read``tasks:write``tasks:delete` |
| 项目 | `project:read``project:write``project:delete` |
| 漏洞 | `vulnerability:read``vulnerability:write``vulnerability:delete` |
| WebShell | `webshell:read``webshell:write``webshell:delete` |
| C2 | `c2:read``c2:write``c2:delete` |
| MCP | `mcp:read``mcp:execute``mcp:write``mcp:external:execute` |
| 知识库 | `knowledge:read``knowledge:write``knowledge:delete` |
| Skills | `skills:read``skills:write``skills:delete` |
| Markdown Agents | `agents:read``agents:write``agents:delete` |
| AI 测试角色 | `roles:read``roles:write``roles:delete` |
| 工作流 | `workflow:read``workflow:execute``workflow:write``workflow:delete` |
| 系统配置 | `config:read``config:write` |
| 终端 | `terminal:execute` |
| 审计 | `audit:read``audit:delete` |
| RBAC | `rbac:read``rbac:write` |
| 通知 | `notification:read``notification:write` |
| 机器人 | `robot:read``robot:write` |
| 文件 | `files:read``files:write``files:delete` |
| 攻击链 | `attackchain:read``attackchain:write` |
| FOFA | `fofa:execute` |
| OpenAPI | `openapi:read` |
| 对话分组 | `group:read``group:write``group:delete` |
| 执行监控 | `monitor:read``monitor:write``monitor:delete` |
特殊权限说明:
- `agent:execute` 允许运行 Agent,但不自动允许本地文件系统、Shell 或任意配置命令。
- `agent:local-execute` 是本地执行兜底权限,应仅授予可信操作员。
- `mcp:execute` 用于访问认证后的 MCP HTTP 入口。
- `mcp:external:execute` 用于 Agent 调用外部 MCP 工具,当前还要求该权限的 Scope 为 `all`
- 管理外部 MCP 配置使用 `mcp:write`,与执行外部工具是两项权限。
- `robot:write` 管理机器人配置和测试入口;机器人聊天本身使用绑定用户或服务账号的业务权限。
---
## 五、资源 Scope
每个角色包含一个 Scope
| Scope | 含义 | 适合场景 |
|-------|------|----------|
| `all` | 访问该权限覆盖的所有资源 | 管理员、全局审计员 |
| `assigned` | 访问管理员指定的资源及系统支持的父资源继承范围 | 项目成员、指定资产操作员 |
| `own` | 以本人创建/归属资源为主;部分资源仍可通过显式授权或父资源关系访问 | 个人工作区、机器人独立身份 |
权限和 Scope 是绑定在一起计算的。一个用户可拥有多个角色,权限取并集;**同一个权限**的 Scope 取最宽值:
```text
all > assigned > own
```
示例:
- “全局审计”角色:`project:read` + `all`
- “个人项目编辑”角色:`project:write` + `own`
最终结果是:
```text
project:read → all
project:write → own
```
全局读取不会把无关的写权限扩大为全局写入。服务端授权必须使用 `ScopeFor(permission)`,不能使用用户的最宽总 Scope。
### 全局对象限制
部分对象是进程级共享定义,没有 owner。即使用户拥有 `write`,若该权限 Scope 不是 `all`,服务端仍拒绝修改。例如:
- AI 测试角色、Skills、Markdown Agents。
- 外部 MCP 配置。
- 机器人配置。
- 工作流定义。
- 知识库写操作(搜索除外)。
- HITL 全局白名单、默认审核方和审计策略。
- C2 Profile 写操作。
- 部分全局监控统计。
---
## 六、资源归属、显式授权与继承
可在“平台权限 → 成员详情 → 资源授权”中给用户分配资源。当前可直接选择的主要类型:
- 项目 `project`
- 对话 `conversation`
- 漏洞 `vulnerability`
- WebShell `webshell`
- 批量任务队列 `batch_task`
- C2 Listener `c2_listener`
一次批量授权最多 100 个资源。重复授权会跳过,不会创建重复记录。
部分子资源会继承父资源访问能力:
| 子资源 | 可继承的父资源 |
|--------|----------------|
| 对话 | 所属项目 |
| 漏洞 | 所属项目或关联对话 |
| 消息、过程详情、攻击链 | 所属对话 |
| C2 Session | Listener |
| C2 Task / 文件 /事件 | Session、Task 或 Listener 链路 |
因此,给用户授权一个项目,通常不需要再逐个授权该项目中的每条对话和漏洞。仍应以具体页面/API 的服务端检查结果为准。
---
## 七、Web 管理流程
### 7.1 创建用户
1. 使用管理员进入左侧 **平台权限**
2. 创建平台用户,设置用户名、显示名称、至少 8 位密码和启用状态。
3. 分配一个或多个平台角色。
4. 若角色 Scope 为 `assigned`,继续配置资源授权。
5. 让用户重新登录并在右上角用户菜单确认角色、权限数量和 Scope。
### 7.2 创建自定义角色
1. 新建平台角色并填写清晰的岗位名称与说明。
2. 选择 `all``assigned``own`
3. 只勾选岗位实际需要的权限。
4. 先用测试账号验证列表、详情、写操作、删除和 Agent 工具调用。
5. 再批量分配给正式用户。
系统角色不可编辑;复制其思路创建自定义角色即可。
### 7.3 权限变更何时生效
- 更新用户、密码、启用状态或角色后,该用户现有会话会被撤销,需要重新登录。
- 更新或删除自定义角色后,平台会撤销全部现有会话,所有用户需重新登录。
- 机器人每条消息实时解析绑定用户/服务账号权限;用户禁用或角色调整会立即影响下一条消息。
- 后台批量任务会根据任务 owner 重新解析 Principal,不应依赖创建任务时的前端状态。
---
## 八、推荐角色模板
以下是起点,不是固定策略。
### 只读项目成员
```text
Scope: assigned
dashboard:read
chat:read
project:read
vulnerability:read
files:read
attackchain:read
```
### 日常安全操作员
```text
Scope: assigned
agent:execute
chat:read / chat:write
project:read / project:write
vulnerability:read / vulnerability:write
tasks:read / tasks:write
files:read / files:write
hitl:read / hitl:write
```
只有确实需要本机命令时才增加 `agent:local-execute``terminal:execute`;需要删除时再增加对应 `:delete`
### 机器人专用账号
```text
Scope: own(独立工作区)或 assigned(指定项目)
agent:execute
chat:read / chat:write
按需增加 project、vulnerability、knowledge 等权限
```
也可使用 `admin` 作为机器人服务账号,但发送者仍需精确白名单;白名单内每个人都会获得完整权限并共享 admin 数据。详见[机器人指南](robot.md)。
---
## 九、Agent、MCP 与机器人边界
### Agent
HTTP 登录用户会被转换为不可变 Principal,传入单 Agent、多 Agent、工作流和工具执行上下文。长任务脱离 SSE 连接后仍保留身份,但不会因为前端按钮可见而绕过服务端权限。
### 内置 MCP
每个内置工具必须有显式授权策略。例如 WebShell 工具会同时检查 `webshell:read/write/delete``connection_id` 的资源访问;漏洞、项目、任务与 C2 工具也会检查参数指向的资源。
未登记授权策略的内置工具默认拒绝。普通本地/配置工具需要 `agent:local-execute`
### 外部 MCP
Agent 调用外部 MCP 工具需要 `mcp:external:execute`,且当前要求 Scope 为 `all`。这是因为外部服务的资源模型通常不受本地 owner/assignment 约束。
### 机器人
- `user_binding`:平台发送者绑定自己的 RBAC 用户。
- `service_account`:精确白名单发送者统一使用一个 RBAC 用户。
- 平台验签只做来源认证,不代替业务授权。
- 发送 `身份` / `whoami` 可检查实际 Principal。
---
## 十、RBAC API
所有接口使用:
```http
Authorization: Bearer <token>
```
管理接口需要 `rbac:read``rbac:write`,资源选择器需要 `rbac:write`
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/rbac/me` | 当前用户、角色、权限、总 Scope 与逐权限 Scope |
| GET | `/api/rbac/metadata` | 权限目录、角色、角色权限和 Scope 列表 |
| GET/POST | `/api/rbac/users` | 列出/创建用户 |
| PUT/DELETE | `/api/rbac/users/:id` | 更新/删除用户 |
| GET/POST | `/api/rbac/roles` | 列出/创建角色 |
| PUT/DELETE | `/api/rbac/roles/:id` | 更新/删除自定义角色 |
| GET | `/api/rbac/resources?type=project&q=...` | 分页搜索可授权资源 |
| GET/POST | `/api/rbac/resource-assignments` | 列出/创建资源授权 |
| DELETE | `/api/rbac/resource-assignments/:id` | 撤销资源授权 |
创建用户示例:
```bash
curl -X POST http://localhost:8080/api/rbac/users \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"username": "operator01",
"display_name": "安全操作员 01",
"password": "change-me-123",
"enabled": true,
"roles": ["operator"]
}'
```
创建自定义角色示例:
```bash
curl -X POST http://localhost:8080/api/rbac/roles \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "项目审计员",
"description": "只读查看指定项目",
"scope": "assigned",
"permissions": ["chat:read", "project:read", "vulnerability:read"]
}'
```
批量授权项目示例:
```bash
curl -X POST http://localhost:8080/api/rbac/resource-assignments \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"user_id": "USER_ID",
"resource_type": "project",
"resource_ids": ["PROJECT_ID_1", "PROJECT_ID_2"]
}'
```
---
## 十一、审计与运维建议
- 使用个人账号管理平台,避免多人共享管理员密码。
- 自定义角色按岗位命名,描述中写明用途和负责人。
- 高风险权限单独审批:`terminal:execute``agent:local-execute``c2:write/delete``webshell:write/delete``rbac:write``config:write`
- 定期检查 `all` Scope 角色、服务账号、机器人白名单和长期未使用用户。
- 用户离职时先禁用账号,再撤销机器人绑定、资源授权和会话。
- 在日志审计中关注 `rbac/access_denied`、角色/用户变更、资源授权、机器人服务账号执行。
- 配合 HITL 控制高风险工具;RBAC 允许调用不等于可以跳过审批。
---
## 十二、常见问题
### 页面按钮看不到
检查用户是否有对应权限;前端会根据 `/api/rbac/me` 隐藏无权操作。直接调用 API 仍会由服务端拒绝。
### 有权限但返回“无权访问该资源”
检查该权限的 Scope,而不是只看用户总 Scope;再检查资源 owner、显式授权和父资源授权。
### 角色改了但用户仍是旧权限
角色变更会撤销会话。让用户重新登录;机器人下一条消息会重新解析权限。
### `write` 权限存在但全局配置仍被拒绝
全局对象写操作要求对应权限的 Scope 为 `all`。创建一个 `all` Scope 的专用管理角色,而不是扩大无关权限。
### Agent 能对话但不能运行命令
`agent:execute``agent:local-execute` 分离。按需授予本地执行权限,并结合 HITL、工具白名单和审计。
### 外部 MCP 提示需要 global scope
`mcp:external:execute` 外,该权限的 Scope 还必须为 `all`。外部 MCP 的数据边界不由本地资源授权自动保护。