198 lines
9.2 KiB
Markdown
198 lines
9.2 KiB
Markdown
# 02 — 网络安全
|
||
|
||
> GB/T 22239-2019 第三级「网络和通信安全」控制点映射。
|
||
|
||
## 1. 维度说明
|
||
|
||
AgentKit 部署在客户内网 K8s 集群,网络安全的边界由 Ingress 控制,
|
||
内部东西向流量由 K8s 网络模型与(待补齐的)NetworkPolicy 控制。
|
||
AgentKit 自身实现:
|
||
|
||
- **已实现**:Ingress TLS 终止、OTel 安全审计(日志/trace)、
|
||
Redis/PG 密码鉴权(基础设施层)、API 限流。
|
||
- **P0 补齐项**:NetworkPolicy 模板(东西向流量隔离)、
|
||
审计日志保留策略(180 天,KTD-9)。
|
||
- **P1 参考**:OTel exporter mTLS、网络入侵检测接入。
|
||
|
||
## 2. GB/T 22239-2019 三级要求(简要)
|
||
|
||
| 控制点 ID | 要求摘要 |
|
||
|-----------|----------|
|
||
| NET-01 | 网络架构:划分网络区域,避免单点故障 |
|
||
| NET-02 | 边界防护:边界实施访问控制和安全过滤 |
|
||
| NET-03 | 访问控制:网络层访问控制策略,最小权限 |
|
||
| NET-04 | 入侵防范:网络入侵检测,恶意流量检测 |
|
||
| NET-05 | 安全审计:网络审计日志,覆盖关键网络活动 |
|
||
| NET-06 | 恶意代码防范:网络边界恶意代码检测 |
|
||
| NET-07 | 安全审计日志保留:日志保留期满足合规要求 |
|
||
| NET-08 | 资源控制:会话与带宽限制,防止资源耗尽 |
|
||
|
||
## 3. AgentKit 实现映射
|
||
|
||
### 3.1 网络架构(NET-01)— 已实现
|
||
|
||
AgentKit K8s 部署采用单 Ingress 入口 + 内部 Service 架构:
|
||
|
||
```
|
||
外网/办公网 ── HTTPS ──> Ingress (nginx, TLS 终止)
|
||
│
|
||
▼
|
||
AgentKit Service (ClusterIP)
|
||
│
|
||
▼
|
||
AgentKit Pod (:8001 API, :8002 GUI)
|
||
│
|
||
┌─────────────┼─────────────┐
|
||
▼ ▼ ▼
|
||
Redis PostgreSQL OTel Collector
|
||
(ClusterIP) (ClusterIP) (ClusterIP)
|
||
```
|
||
|
||
- **Ingress 是唯一对外入口**:[deploy/helm/agentkit/templates/ingress.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/templates/ingress.yaml)
|
||
- **Service 类型为 ClusterIP**(不直接对外暴露):
|
||
[deploy/helm/agentkit/values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml)
|
||
(`service.type: ClusterIP`)
|
||
- **API 与 GUI 走分离路径**:`/api` → API Service,`/` → GUI Service
|
||
|
||
### 3.2 边界防护(NET-02)— 已实现
|
||
|
||
Ingress 启用 TLS 终止,所有外网流量强制 HTTPS:
|
||
|
||
```yaml
|
||
ingress:
|
||
enabled: true
|
||
className: nginx
|
||
tls:
|
||
enabled: true
|
||
secretName: agentkit-tls # 引用 secrets.tlsServerCert
|
||
```
|
||
|
||
- TLS 证书通过 cert-manager 自动续期或手动签发(365 天轮换)。
|
||
- HTTP→HTTPS 跳转由 nginx ingress controller 默认配置提供
|
||
(客户侧 ingress controller 责任)。
|
||
- 证书私钥通过 Sealed Secret / External Secret 注入(KTD-4 / R2a)。
|
||
|
||
**参考文件**:
|
||
[deploy/helm/agentkit/templates/ingress.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/templates/ingress.yaml)
|
||
[deploy/helm/agentkit/values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml)(`ingress` 段、`secrets.tlsServerCert` slot)
|
||
|
||
### 3.3 访问控制 / NetworkPolicy(NET-03)— P0 补齐项
|
||
|
||
**当前状态:P0**。Helm Chart 暂无 NetworkPolicy 模板,
|
||
Pod 间东西向流量默认全通(K8s 默认网络模型)。
|
||
|
||
**P0 补齐计划**:
|
||
|
||
1. 新增 `deploy/helm/agentkit/templates/networkpolicy.yaml`。
|
||
2. 默认 deny-all,按白名单放行:
|
||
- Ingress → AgentKit Pod(8001/8002)
|
||
- AgentKit Pod → Redis(6379)
|
||
- AgentKit Pod → PostgreSQL(5432)
|
||
- AgentKit Pod → OTel Collector(4317)
|
||
3. 命名空间隔离:AgentKit 独立 namespace,跨 namespace 流量显式声明。
|
||
|
||
**当前缓解**:Service 全部 ClusterIP(不对外),Redis/PG 由客户 K8s 集群
|
||
内部网络策略保护(客户侧责任)。
|
||
|
||
### 3.4 入侵防范(NET-04)— P1 参考
|
||
|
||
**当前状态:P1**。AgentKit 自身不部署网络 IDS,
|
||
依赖客户侧网络骨干的 IDS / IPS。
|
||
|
||
- API 层面:[RateLimitMiddleware](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/middleware.py)
|
||
实现单进程滑动窗口限流,Webhook 入站端点单独限流
|
||
([src/agentkit/server/routes/channels.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/channels.py))。
|
||
- 异常登录:JWT 验证失败、SCIM token 校验失败返回 401
|
||
([scim/router.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/scim/router.py)
|
||
使用 `hmac.compare_digest` 恒定时间比较)。
|
||
|
||
**P1 补齐计划**:接入客户 SIEM,将 AgentKit OTel 日志投递到客户
|
||
入侵检测平台,由 SIEM 做 abnormal pattern 检测。
|
||
|
||
### 3.5 安全审计(NET-05)— 已实现
|
||
|
||
AgentKit 通过 OpenTelemetry(U1,强制依赖)实现网络活动审计:
|
||
|
||
- **HTTP 请求 trace**:FastAPI Instrumentor 自动埋点,每个请求生成 span,
|
||
含 HTTP method/path/status/duration。
|
||
[src/agentkit/telemetry/setup.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/telemetry/setup.py)
|
||
(`FastAPIInstrumentor`)
|
||
- **审计事件 span**:RBAC 角色变更、deprovisioning 写入 OTel span event
|
||
([src/agentkit/server/auth/audit.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/audit.py))。
|
||
- **SCIM 推送失败告警**:span event `scim.push.failure`
|
||
([scim/router.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/scim/router.py))。
|
||
- **终端命令审计**:每条终端命令写入 `terminal_audit_logs` 表
|
||
([terminal_security.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/terminal_security.py))。
|
||
|
||
OTLP gRPC 导出到内部 collector
|
||
([values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml)
|
||
`otel.endpoint: http://otel-collector:4317`)。
|
||
|
||
### 3.6 恶意代码防范(NET-06)— 待评估
|
||
|
||
**当前状态:待评估**。网络边界恶意代码检测由客户网络骨干的
|
||
防病毒网关 / 沙箱负责。AgentKit 不在网络边界位置。
|
||
|
||
AgentKit 侧的缓解:
|
||
|
||
- 容器镜像来自可信构建(CI/CD),不在运行时下载可执行文件。
|
||
- 终端命令执行受 6 层白名单 + 危险检测约束(R7a),
|
||
限制任意命令执行能力(详见 `04-application.md` §2)。
|
||
|
||
### 3.7 安全审计日志保留(NET-07)— P0 补齐项
|
||
|
||
**当前状态:P0**。审计日志保留策略未在代码中强制实施:
|
||
|
||
- `auth_audit_log` 表(SQLite)和 `terminal_audit_logs` 表无自动清理 /
|
||
归档策略,依赖运维手动管理。
|
||
- OTel collector 侧的日志保留由客户可观测性平台配置,AgentKit 不控制。
|
||
|
||
**P0 补齐计划**:
|
||
|
||
1. 在 Helm values 增加 `audit.retentionDays: 180` 配置(KTD-9)。
|
||
2. 实现审计日志归档 CronJob:超过 180 天的记录导出到对象存储(客户侧)
|
||
并从主表清理。
|
||
3. OTel collector 配置 180 天保留策略(与客户可观测性团队协同)。
|
||
|
||
### 3.8 资源控制(NET-08)— 已实现
|
||
|
||
AgentKit 在应用层与容器层均实现资源控制:
|
||
|
||
- **容器层**:Pod resources requests/limits
|
||
([values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml)
|
||
`resources` 段,CPU 250m~1000m / Memory 512Mi~2Gi)。
|
||
- **应用层**:[RateLimiter](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/middleware.py)
|
||
实现 IP 维度滑动窗口限流,Webhook 入站端点独立限流
|
||
([channels.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/channels.py))。
|
||
- **会话超时**:终端 session 闲置 1800s 自动断开
|
||
([terminal_server.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/terminal_server.py)
|
||
`SESSION_IDLE_TIMEOUT = 1800`)。
|
||
- **JWT 短时效**:access token 15min
|
||
([jwt_utils.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/jwt_utils.py)
|
||
`ACCESS_TOKEN_TTL`)。
|
||
|
||
## 4. OTel exporter mTLS(P1 参考)
|
||
|
||
**当前状态:P1**。OTel exporter 通过 bearer token 鉴权
|
||
([values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml)
|
||
`secrets.otelExporterToken` slot),未启用 mTLS。
|
||
|
||
Helm Chart 已预留 `secrets.mtlsClientCert` slot(用于下游服务 mTLS),
|
||
但 OTel exporter 侧的 mTLS 配置待补齐。
|
||
|
||
**P1 补齐计划**:
|
||
|
||
1. 在 OTel SDK 初始化时配置 `OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE` /
|
||
`OTEL_EXPORTER_OTLP_CLIENT_KEY` / `OTEL_EXPORTER_OTLP_CA_CERT` 环境变量。
|
||
2. OTel collector 侧启用 mTLS 服务端证书验证。
|
||
3. 复用 `secrets.mtlsClientCert` slot 注入客户端证书。
|
||
|
||
## 5. 测评建议
|
||
|
||
1. **NET-01 / NET-02 / NET-05 / NET-08**:直接展示 Helm Ingress + OTel +
|
||
限流配置即可。
|
||
2. **NET-03 / NET-07**:P0 补齐项,需在测评前完成 NetworkPolicy 模板和
|
||
审计日志保留 CronJob。
|
||
3. **NET-04 / NET-06**:依赖客户侧网络骨干,由客户网络团队提供 IDS /
|
||
恶意代码检测证据。
|