Files
postgresql-tenant-operator/docs/security.md
T
panxiao81 953878ac47
E2E Tests / Run on Ubuntu (pull_request) Failing after 1m21s
Tests / Run on Ubuntu (pull_request) Successful in 4m12s
Lint / Run on Ubuntu (pull_request) Successful in 4m37s
docs: define Instance domain model and admin Secret boundary
2026-09-13 12:17:03 +00:00

4.0 KiB
Raw Blame History

安全模型

项目 内容
状态 Review
最后更新 2026-09-10

保护目标

  • 应用密码只存在于 OpenBao、ESO 投射的目标 Secret 和需要使用它的进程内存中。
  • controller 只能修改其 registry 能证明归属当前 Tenant UID 的资源。
  • namespace 租户不能越权管理 Instance、其他 namespace 或 controller 配置。
  • PostgreSQL 和 OpenBao 的网络身份使用受信 CA 验证,不因 DNS 不可用而降级 TLS。

信任边界

Kubernetes 管理员、OpenBao 管理员和 PostgreSQL 管理员是平台信任主体。能读取 Tenant 目标 Secret 或对应 OpenBao path 的主体等同于持有数据库账号。database owner 可以 改变自己 database 内的对象,因此 COMMENT 不能作为 controller 所有权依据。

VM/磁盘备份会包含 PostgreSQL registry 和租户数据,但不应包含 OpenBao 中的密码;完整 灾难恢复必须同时保护 PostgreSQL 与 OpenBao,并控制两份备份的访问权限。

凭据处理

  • controller 使用 Kubernetes auth 获取短期 OpenBao token,不配置长期静态 token。
  • 管理凭据只从 Instance 引用的 controller namespace Secret 读取,不复制到 CR/status/Event/metric/trace;管理员维护 ExternalSecret,由 ESO 同步该 Secret。
  • 租户密码使用密码学安全随机源生成一次;中断恢复必须复用 OpenBao 现值。
  • controller 创建 ExternalSecret,不直接创建含 data/stringData 的 Secret。
  • 日志字段允许 namespace/name、UID、generation、阶段和错误类别;禁止记录请求/响应体、 DSN、Authorization header、密码或完整 OpenBao URL path 作为 metric label。
  • panic、错误包装和测试失败输出必须经过凭据泄漏测试。

TLS

  • homelab 默认 verify-fulldisable 只允许显式开发配置。
  • server 证书同时覆盖 DNS host 和 IP hostaddr;消费者自行选择连接目标。
  • OpenBao PKI 保管 CA 私钥并负责签发/续期。controller Deployment 只挂载公开 CA bundle,挂载只读且使用最小文件权限。
  • 证书轮换必须先发布同时信任新旧 CA 的 bundle,再轮换服务端证书,最后移除旧 CA。

最小权限

OpenBao controller identity 只管理固定 tenant base path,不读取管理凭据。管理凭据 ESO 身份只读管理路径,租户 ESO 身份只读 tenant base path,二者隔离,Tenant 不得 使用管理凭据 Store。controller 对管理 Secret 的读取限于自身 namespaceInstance 不能指定其他 namespacecontroller 不创建或修改管理 SecretExternalSecret。

PostgreSQL 管理 role 不应是 superuser。若平台选择 SECURITY DEFINER 函数承载创建或 删除操作,函数必须固定 search_path、严格校验 identifier、拒绝任意 SQL,并仅向 controller role 授予 EXECUTE。controller 不调用 shell 或 psql 拼接用户输入。

Kubernetes RBAC 应把 cluster-scoped Instance 管理限制给平台管理员。Tenant editor 不自动获得 Secret read;是否读取目标 Secret 由 namespace 内独立 RBAC 决定。

删除保护

Delete 是明确的数据销毁授权,但仍必须在每一步校验 Instance UID、Tenant UID、名称和 OpenBao metadata。禁止对未知对象使用 CASCADE。删除 finalizer 卡住时只能按 operations.md 核实外部状态后人工移除;该操作可能遗留资源。

发布前安全验收

  • 使用错误 CA、错误 DNS 名和错误 IP 时连接失败;正确 DNS/IP SAN 均成功。
  • namespace 用户不能修改 Instance 或跨 namespace Tenant/ExternalSecret。
  • controller/ESO 的 OpenBao policy 互相隔离,越权请求被拒绝。
  • 应用 login 不能创建 role/database,也不能连接其他租户 database。
  • 日志、Event、Condition、metrics、CR 导出和测试 artifact 不含 canary password/token。
  • 伪造 COMMENT、同名 database/role 或错误 UID metadata 均不能绕过 Conflict。
  • Delete 只销毁 registry 可证明归属当前 Tenant 的资源。