3. 平台门户架构:门户前端、后端API、Kubernetes API代理、用户身份与权限模型
平台门户是用户与 Kubernetes 集群及 Kyverno 策略引擎交互的统一入口。在审计日志链路中,门户架构决定了日志的生成点、流转路径以及身份信息的附着方式。本章从四层架构出发,解析每一层在审计日志体系中的角色与设计要点。
3.1 四层架构总览
平台门户采用经典的前后端分离 + 代理转发模式,整体分为四层:
| 层级 | 组件 | 审计日志职责 |
|---|---|---|
| L1 | 门户前端 | 采集用户操作事件(点击、表单提交、页面导航) |
| L2 | 后端 API | 生成业务审计日志,注入用户身份与上下文 |
| L3 | Kubernetes API 代理 | 代理转发请求,记录 API 调用明细与响应状态 |
| L4 | 用户身份与权限模型 | 提供可追溯的用户标识与权限断言 |
设计原则:每一层生成的审计日志必须携带全局唯一的
request_id,以便在日志分析时串联全链路操作轨迹。
3.2 门户前端:操作事件采集
前端层负责捕获用户在界面上的关键操作,生成客户端审计事件。这些事件包含操作类型、目标资源、时间戳和前端会话标识。
- 采集方式:通过 Axios 拦截器或自定义事件总线,在每次 API 调用前后触发日志上报。
- 关键字段:
event_type(click/submit/navigate)、target_resource(如 Deployment/Policy)、session_id。 - 上报策略:批量上报 + 离线缓存,避免因网络抖动丢失日志。
前端日志示例:
{
"request_id": "req-20250321-abc123",
"event_type": "submit",
"target_resource": "Kyverno ClusterPolicy",
"resource_name": "require-labels",
"session_id": "sess-xyz789",
"timestamp": "2025-03-21T10:30:00Z"
}
3.3 后端 API:业务审计日志
后端 API 是审计日志的核心生成层。它接收前端请求,完成业务逻辑处理后,将操作结果与用户身份一并写入审计日志。
| 审计日志字段 | 说明 | 示例值 |
|---|---|---|
request_id |
全链路唯一标识 | req-20250321-abc123 |
user_id |
操作者唯一标识 | user-001 |
action |
操作类型 | CREATE / UPDATE / DELETE |
resource_type |
资源类型 | ClusterPolicy |
resource_name |
资源名称 | require-labels |
result |
操作结果 | SUCCESS / FAILURE / PENDING |
policy_evaluation |
Kyverno 策略评估结果 | pass / fail / warn |
注意:后端 API 必须对审计日志进行签名或完整性校验,防止日志被篡改。推荐使用 HMAC-SHA256 对关键字段计算摘要。
3.4 Kubernetes API 代理:请求转发与记录
Kubernetes API 代理层位于后端 API 与 Kubernetes API Server 之间,负责转发请求并记录详细的 API 调用日志。该层是审计日志中技术细节最丰富的部分。
- 代理模式:反向代理 + 请求拦截,支持 WebSocket 和长连接。
- 日志内容:HTTP 方法、请求路径、请求体摘要、响应状态码、响应耗时。
- 安全增强:在代理层注入
X-Audit-Id头,与后端 API 的request_id关联。
# 代理层审计日志示例(JSON 格式)
{
"request_id": "req-20250321-abc123",
"proxy_timestamp": "2025-03-21T10:30:01Z",
"method": "POST",
"path": "/apis/kyverno.io/v1/clusterpolicies",
"status_code": 201,
"duration_ms": 245,
"user_agent": "portal-backend/1.0",
"client_ip": "10.0.1.100"
}
3.5 用户身份与权限模型
用户身份与权限模型是审计日志可追溯性的基础。平台门户采用 RBAC(基于角色的访问控制)模型,并扩展了多租户隔离能力。
3.6 身份信息在审计日志中的传递
为确保审计日志的完整性,用户身份信息必须在各层之间可靠传递:
- 前端 → 后端:通过 JWT 携带用户身份,后端解析 提取
user_id和tenant_id。 - 后端 → API 代理:在 HTTP Header 中注入
X-User-Id和X-Tenant-Id,代理层记录这些字段。 - API 代理 → Kubernetes:使用 ServiceAccount 或 Impersonation 机制,将用户身份映射为 Kubernetes 用户。
最佳实践:在 Kyverno 策略评估日志中,通过
userInfo 字段记录原始用户身份,避免因代理转发导致身份丢失。配置 Kyverno 的 --audit-user-info 参数可启用此功能。