fischer-agentkit/docs/compliance/dengbao-level3/04-application.md

258 lines
13 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.

# 04 — 应用安全
> GB/T 22239-2019 第三级「应用和数据安全 — 应用部分」控制点映射。
## 1. 维度说明
应用安全是 AgentKit **自身核心责任范围**,全部 8 个控制点已实现。
本维度文档引用 U4 SSO 多 IDP / SCIM、U1 OTel 审计、R7a 终端安全 6 层、
RBAC 3 级权限、JWT 会话等既有实现,不重复代码细节。
## 2. GB/T 22239-2019 三级要求(简要)
| 控制点 ID | 要求摘要 |
|-----------|----------|
| APP-01 | 身份鉴别:用户身份标识与鉴别,口令复杂度,登录失败处理 |
| APP-02 | 访问控制:基于角色的访问控制,最小权限,默认拒绝 |
| APP-03 | 安全审计:应用审计日志,覆盖用户操作关键事件 |
| APP-04 | 通信完整性:传输完整性保护,防篡改 |
| APP-05 | 软件容错:错误处理,故障隔离,降级机制 |
| APP-06 | 资源控制:会话并发控制,超时自动断开 |
| APP-07 | 应用账户生命周期:开户/变更/销户审计SCIM 自动化 |
| APP-08 | 代码安全:输入验证,输出编码,依赖漏洞管理 |
## 3. AgentKit 实现映射
### 3.1 身份鉴别APP-01— 已实现
#### 多 IDP 单点登录U4 SSO
AgentKit 支持 OIDC + SAML 双协议并存的多 IDP 信任边界:
- **OIDC 适配器**authlib redirect flow + JIT 用户创建):
[src/agentkit/server/auth/providers/oidc.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/providers/oidc.py)
- **SAML 2.0 适配器**python3-saml / OneLogin ACS
[src/agentkit/server/auth/providers/saml.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/providers/saml.py)
- **多 IDP 注册表**(热证书轮换 + 单 IDP 故障隔离R1a 按 sub 关联
禁止邮箱合并):
[src/agentkit/server/auth/idp_registry.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/idp_registry.py)
支持的 IDP 类型:飞书 / Azure AD / 阿里云 IDaaS 等任意 OIDC/SAML 合规 IDP。
#### 本地密码认证
- **bcrypt 哈希**rounds=12OWASP 推荐值)
[src/agentkit/server/auth/password.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/password.py)
- **JWT 会话**HS256 签名access 15min + refresh 7d30d 记住我)
[src/agentkit/server/auth/jwt_utils.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/jwt_utils.py)
- V2 claims 含 `sid`session id+ `jti`per-token unique id
支持服务端 session 撤销。
- **Refresh token 轮换 + reuse 检测**:旧 token 进入 denylist 30s 窗口,
reuse 触发撤销该用户全部 session
[src/agentkit/server/auth/denylist.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/denylist.py)
- **登录失败处理**JWT 验证失败返回 401refresh token reuse 触发
全 session 撤销(强制重新登录)。
- **OAuth state CSRF 防护**OIDC state 缓存 TTL 5min一次性消费
[oidc.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/providers/oidc.py) `_StateCache`)。
### 3.2 访问控制 / RBAC 3 级APP-02— 已实现
#### 3 级 RBAC + 9 权限位
[src/agentkit/server/auth/permissions.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/permissions.py)
| 角色 | 权限 |
|------|------|
| `member` | CHAT / KB_QUERY / WORKFLOW_EXECUTE |
| `operator` | member 全部 + KB_WRITE + TERMINAL_LOCAL_USE + TERMINAL_WHITELIST_MANAGE |
| `admin` | operator 全部 + TERMINAL_SERVER_USE + USER_MANAGE + SYSTEM_CONFIG |
权限位作为稳定字符串标识符用于 JWT payload + 前端 store + 审计日志,
不重命名既有值(向前兼容)。
#### 终端安全 6 层白名单R7a
[src/agentkit/server/auth/terminal_security.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/terminal_security.py)
评估优先级(最高→最低):
1. **Blocklist**admin 管理,永远拒绝)
2. **Built-in safe whitelist**`_SAFE_COMMAND_PREFIXES`
3. **Global whitelist**admin 管理DB 持久化)
4. **User whitelist**per-userDB 持久化 + 内存缓存)
5. **Session whitelist**per-session仅内存
6. **Danger detection**`_is_dangerous`,需确认)
**关键安全特性**shell 操作符(`&&`、`;`、`|`、`$()`、backticks、`>`、`<`、
换行)**永远绕过所有 whitelist 层**,强制走 danger detection —
即使 `git push` 在白名单中,`git push && rm -rf /` 仍需确认。
#### 终端双层授权
终端端点要求 RBAC 角色 + 个人授权标志双重校验:
- `is_terminal_authorized` — 本地终端client sidecar
- `is_server_terminal_authorized` — 服务端终端server PTY
允许 admin 按用户授权终端而不改变其角色。
#### SCIM token 恒定时间比较
SCIM bearer token 使用 `hmac.compare_digest` 恒定时间比较防时序攻击:
[src/agentkit/server/auth/scim/router.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/scim/router.py)
`_verify_scim_token`)。
### 3.3 安全审计APP-03— 已实现
#### OTel 审计通道U1 强制依赖)
[src/agentkit/server/auth/audit.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/audit.py)
审计事件类型:
- `role_change` — RBAC 角色变更actor/target/role_before/role_after
- `deprovision` — 手动 deprovisioning`break_glass` 标记)
每条记录含 actor/target/reason/source/timestamp写入 `auth_audit_log`
+ 发 OTel span eventOTel 不可用时降级为 SQLite + 日志)。
审计来源(`source` 字段):
- `manual` — 手动操作
- `scim` — SCIM 自动化
- `cron_reconciliation` — 定时对账
- `break_glass` — 应急通道(高权限账户)
#### SCIM 推送失败告警
SCIM push 失败实时告警:日志 error + OTel span event `scim.push.failure`
[scim/router.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/scim/router.py)
`_alert_scim_failure`)。
#### 终端命令审计
每条终端命令 + 决策结果executed/confirmed/rejected/blocked/denied
+ cwd + exit_code 写入 `terminal_audit_logs`
[terminal_security.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/terminal_security.py)
`write_audit_log`)。
#### OTel 指标
U1 OTel 暴露以下审计相关指标
[src/agentkit/telemetry/metrics.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/telemetry/metrics.py)
- `agent.request.total` / `agent.execution.duration`
- `gen_ai.usage.tokens` / `tool.call.duration`
- `prompt_cache.hit` / `prompt_cache.miss`
- `pii_filter.coverage` / `pii_filter.redacted`U2 PII 脱敏覆盖率)
### 3.4 通信完整性APP-04— 已实现
- **传输层 TLS**Ingress TLS 终止(详见 `02-network.md` §3.2
客户端→Ingress 全程 HTTPS。
- **JWT 签名完整性**HS256 签名,任何 payload 字段篡改导致签名校验失败
[jwt_utils.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/jwt_utils.py)
`verify_token`)。
- **mTLS 客户端证书**下游服务Helm Chart 预留 `secrets.mtlsClientCert`
slot用于与 KMS/HSM、内部 API 双向 TLS详见 `06-management.md`)。
- **Webhook 签名校验**:入站 Webhook fail-closed签名校验失败返回 401
[channels.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/channels.py))。
### 3.5 软件容错APP-05— 已实现
- **LLM 网关 fallback**:多 provider fallback 链
[src/agentkit/llm/gateway.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/llm/gateway.py))。
- **OTel 运行时容错**OTel exporter 连接失败时降级为 NoOpTracer
应用启动不崩溃([tracer.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/telemetry/tracer.py)
`init_telemetry`)。
- **PII 脱敏 fail-closed**:脱敏异常时拒绝发送至 LLM不降级到原文
[pii_filter.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/llm/pii_filter.py)
`fail_closed=True` 默认)。
- **专家团队失败回退**:所有阶段失败时回退到单 agent 模式
(详见 AGENTS.md「专家团队模式」
- **DR-fixesU3**bitable 字段校验DR-1、LastViewDeletionErrorDR-4
工具调用容错DR-5
- [src/agentkit/bitable/repository.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/bitable/repository.py)
- [src/agentkit/bitable/service.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/bitable/service.py)
- [src/agentkit/tools/bitable_tool.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/tools/bitable_tool.py)
### 3.6 资源控制APP-06— 已实现
- **IP 限流**[RateLimiter](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/middleware.py)
滑动窗口(`max_requests` / `window_seconds` 可配置)。
- **Webhook 独立限流**[channels.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/channels.py)
入站端点单独限流 + nonce dedup。
- **会话超时**
- 终端 session 闲置 1800s 自动断开
[terminal_server.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/terminal_server.py))。
- JWT access token 15min 过期强制重新认证。
- **专家名称正则校验**`_EXPERT_NAME_RE = re.compile(r"^[a-zA-Z0-9_-]{1,64}$")`
防止注入(项目规则)。
- **HandoffTransport 有界队列**`maxsize=1024`,关闭使用 sentinel 模式
防止无界内存增长(项目规则)。
### 3.7 应用账户生命周期 / SCIMAPP-07— 已实现
#### SCIM 2.0 自动化
[src/agentkit/server/auth/scim/router.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/scim/router.py)
端点:
- `POST /scim/v2/Users` — 创建用户(随机密码,不可本地登录)
- `PATCH /scim/v2/Users/{id}` — 禁用active=false/ 更新字段
- `GET /scim/v2/Users` — 列表 / 过滤(`userName eq` / `active eq`
Bearer token 认证(独立于 JWT恒定时间比较
#### Deprovisioning账户销户
管理员通过 `/admin/users/{id}/deprovision` 强制销户:
1. 禁用本地用户账户(`is_active = 0`
2. 撤销该用户所有活跃 session
3. 记录审计actor/target/reason/source/timestamp+ OTel
4. `break_glass=True` 时记录 `source=break_glass`(应急通道标记)
详见 `06-management.md` §2 break-glass 告警流程。
#### JIT 用户创建R1a
OIDC/SAML 首次登录 JIT 创建本地用户 + `user_idp_links` 行,
`(idp_name, sub)` 严格关联,**禁止邮箱合并**已存在账户
[oidc.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/providers/oidc.py)
`_find_or_create_user`)。
### 3.8 代码安全APP-08— 已实现
- **输入验证**:所有 API 入口使用 Pydantic v2 模型校验
`model_config = ConfigDict(extra="forbid")` 拒绝额外字段)。
- SCIM 模型:[src/agentkit/server/auth/scim/models.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/scim/models.py)
- IDP 配置:[src/agentkit/server/auth/idp_registry.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/idp_registry.py)
`OIDCConfig` / `SAMLConfig``extra="forbid"`
- **禁止 `any` 类型**:项目规则强制使用 Pydantic 模型或 `Unknown`
AGENTS.md
- **专家名称正则校验**`_EXPERT_NAME_RE` 防 SQL/命令注入。
- **API Key 恒定时间比较**`hmac.compare_digest`(项目规则)。
- **Ruff lint + format**`ruff check src/ && ruff format src/`(目标 py311
作为代码质量基线。
- **依赖管理**`pyproject.toml` 锁定精确版本,`pip install -e ".[dev]"`
可复现环境。
- **终端命令安全**6 层白名单 + shell 操作符检测
(详见 §3.2),防止命令注入链。
## 4. 测评建议
应用安全维度全部控制点已实现,测评时直接展示对应代码文件即可:
1. **APP-01**:展示 oidc.py / saml.py / jwt_utils.py / password.py。
2. **APP-02**:展示 permissions.py / terminal_security.py + RBAC 矩阵表。
3. **APP-03**:展示 audit.py + 终端审计日志 + OTel 指标清单。
4. **APP-04**:展示 ingress.yaml TLS + jwt_utils.py 签名校验 + channels.py
Webhook 签名。
5. **APP-05**:展示 gateway.py fallback + pii_filter.py fail-closed +
DR-fixes 引用。
6. **APP-06**:展示 middleware.py 限流 + terminal_server.py 超时。
7. **APP-07**:展示 scim/router.py + deprovision 端点 + JIT 创建逻辑。
8. **APP-08**:展示 Pydantic 模型校验 + Ruff 配置 + 终端命令安全。