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 四层映射关系

从租户到日志隔离边界的完整映射链路如下:

  1. 租户 → 命名空间组:通过 namespace-owner 标签或 CRD 将命名空间绑定到租户。
  2. 命名空间 → 工作负载:命名空间内的 Deployment、DaemonSet、Job 等资源自动继承租户归属。
  3. 工作负载 → 日志流:每个 Pod 的 stdout/stderr 以及 Sidecar 容器输出的日志文件构成独立日志流。
  4. 日志流 → 隔离边界:日志流携带租户 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 概念关系图

下图展示了租户、命名空间、日志流与隔离边界之间的层级关系:

租户-命名空间-日志流-隔离边界关系图 租户 → 命名空间 → 日志流 → 隔离边界 租户 A 业务隔离单元 租户 B 业务隔离单元 租户 C 业务隔离单元 ns: tenant-a-prod K8s 资源隔离域 ns: tenant-b-staging K8s 资源隔离域 ns: tenant-c-dev K8s 资源隔离域 日志流 A-1 Pod: nginx-xxx 日志流 B-1 Pod: api-xxx 日志流 C-1 Pod: worker-xxx 存储桶: logs-tenant-a IAM 策略限制跨租户 存储桶: logs-tenant-b IAM 策略限制跨租户 存储桶: logs-tenant-c IAM 策略限制跨租户

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 标签,并在日志代理配置中动态生成隔离规则。这可以避免人工配置导致的边界遗漏。