2、核心概念:租户、命名空间、日志流、日志隔离边界
在构建多租户容器运行时日志隔离体系之前,必须统一四个核心概念的定义与边界。这四个概念构成了从业务模型到基础设施的映射链路,也是后续所有策略配置、审计追溯和合规判定的基础。
2.1 概念定义与职责边界
| 概念 | 定义 | 职责边界 | 示例 |
|---|---|---|---|
| 租户 | 拥有独立资源配额、访问权限和计费单元的逻辑组织 | 业务隔离的顶层单元,决定日志归属权 | 部门 A、项目组 B、外部客户 C |
| 命名空间 | Kubernetes 原生的资源隔离域 | 工作负载的部署边界,日志采集的物理范围 | tenant-a-prod、tenant-b-staging |
| 日志流 | 从同一 Pod/容器组输出的、具有相同元数据标签的日志序列 | 日志传输的最小可路由单元 | app=nginx, env=prod 的 stdout 流 |
| 日志隔离边界 | 日志数据在采集、传输、存储、查询全链路中不可跨越的安全域 | 防止跨租户日志泄露的规则集合 | 租户 A 的日志只能被租户 A 的 IAM 角色读取 |
关键认知: 租户是业务概念,命名空间是 Kubernetes 实现概念。一个租户可以拥有一个或多个命名空间,但一个命名空间只能属于一个租户。日志隔离边界必须同时覆盖这两个层次。
2.2 四层映射关系
从租户到日志隔离边界的完整映射链路如下:
- 租户 → 命名空间组:通过
namespace-owner标签或 CRD 将命名空间绑定到租户。 - 命名空间 → 工作负载:命名空间内的 Deployment、DaemonSet、Job 等资源自动继承租户归属。
- 工作负载 → 日志流:每个 Pod 的 stdout/stderr 以及 Sidecar 容器输出的日志文件构成独立日志流。
- 日志流 → 隔离边界:日志流携带租户 ID、命名空间、Pod 标签等元数据,由日志代理根据隔离策略路由到对应的存储桶或索引。
实践要点: 在 Fluent Bit 或 Vector 的配置中,使用
record_modifier 或 add_fields 处理器为每条日志记录注入 tenant_id 和 namespace 字段,这是实现隔离边界的第一道防线。
2.3 日志隔离边界模型
日志隔离边界在四个阶段分别施加约束,任何阶段出现跨域访问都构成安全事件:
| 阶段 | 隔离机制 | 违反后果 |
|---|---|---|
| 采集 | DaemonSet 日志代理只采集本节点上属于授权租户的 Pod 日志 | 日志泄露到非授权代理进程 |
| 传输 | TLS 双向认证 + 租户级 API | 日志被中间人截获或注入 |
| 存储 | 每个租户独立索引/存储桶,IAM 策略限制跨租户读取 | 租户 B 通过 API 查询到租户 A 的日志 |
| 查询 | 查询接口强制校验 tenant_id 过滤器,拒绝空过滤请求 |
仪表盘展示多租户混合数据 |
2.4 概念关系图
下图展示了租户、命名空间、日志流与隔离边界之间的层级关系:
2.5 日志流标识与路由规则
每条日志流在采集时必须携带以下元数据标签,用于后续隔离路由:
# 日志流元数据规范(Fluent Bit record_modifier 示例)
{
"tenant_id": "tenant-a",
"namespace": "tenant-a-prod",
"pod_name": "nginx-7d8f9c6b4c-abcde",
"container_name": "nginx",
"log_stream_id": "ls-20250321-001",
"environment": "production",
"compliance_level": "pci-dss"
}
合规警告: 如果日志流中缺少
tenant_id 或 namespace 字段,日志代理必须拒绝写入并触发告警。空字段日志流可能被错误路由到公共存储桶,造成跨租户数据污染,这在 SOC2 和 PCI-DSS 审计中属于严重不合规项。
2.6 隔离边界验证清单
在部署日志隔离策略前,逐项验证以下边界是否已建立:
- 采集边界:日志 DaemonSet 是否只挂载了授权命名空间的
/var/log/pods路径? - 传输边界:日志代理到后端存储之间是否启用了 mTLS 且证书绑定租户 ID?
- 存储边界:存储桶/索引是否设置了租户级 IAM 策略,拒绝
s3:ListBucket跨租户操作? - 查询边界:日志查询 API 是否强制校验
tenant_id参数,拒绝空值或通配符? - 审计边界:是否有独立的审计日志记录所有跨租户访问尝试?
自动化建议: 使用 OPA (Open Policy Agent) 或 Kyverno 编写准入控制策略,在命名空间创建时自动注入
tenant-id 标签,并在日志代理配置中动态生成隔离规则。这可以避免人工配置导致的边界遗漏。