行级安全
AiHummer 是多租户的,其最强的隔离边界存在于数据库本身: **PostgreSQL 行级安全 (RLS)**启用 RLS 后,数据库——而不仅仅是应用程序代码——会强制确保查询只能看到属于当前租户的行。
等级: 行级安全性受付费限制 企业 层级 — 它不是免费/社区平台的一部分。
为什么是RLS
应用级过滤(WHERE tenant_id = ...)是必要的,但很脆弱:一个被遗忘的子句可能会泄露跨租户的数据。RLS 将这一保证转移到 PostgreSQL 中,因此即使是未过滤的查询也只返回当前租户的行。它是在应用程序自身作用域之下的一层纵深防御。关于更广泛的多租户模型——以及它如何与幂等副作用配合——请参见 多租户与幂等性.
受限角色(自愿加入)
RLS是 选择加入 并且通过为网关提供第二个使用受限角色而非所有者的数据库连接来激活:
# /home/.aihummer/etc/gateway.env
# Owner pool — runs migrations, used for system/bypass operations
AIHUMMER_DATABASE_URL=postgres://owner:...@localhost/aihummer
# Restricted application pool — RLS policies apply (aihummer_app role)
AIHUMMER_DB_APP_URL=postgres://aihummer_app:...@localhost/aihummer
这 aihummer_app 角色是 不 表的所有者,因此 PostgreSQL 对其应用 RLS 策略。应用程序查询通过这个受限池流动。启用 RLS 是设置的问题 AIHUMMER_DB_APP_URL —— 和 本地/标准(主机本地)安装会自动设置该变量,所以 RLS 开箱即用处于活动状态。只有在自定义或手动部署必须设置时,它才是“选择加入”的。 AIHUMMER_DB_APP_URL 它自己。
[!NOTE] 没有
AIHUMMER_DB_APP_URL网关为所有操作使用所有者池 而且RLS实际上没有被强制执行。设置受限制的池(即 标准安装程序为您所做的) 以开启数据库级别的隔离。
[!IMPORTANT] RLS 与套餐无关。 它在所有套餐上表现一致,包括 Community。如果许可证页面 把「行级安全」显示为不可用,那是该页面的不准确之处,而不是数据库的真实状态。
哪些安装方式下 RLS 已经生效,哪些需要你手动开启
| 你的安装方式 | 安装后的 RLS 状态 |
|---|---|
| 标准安装,由安装程序部署 PostgreSQL | 已生效。 受限角色与 AIHUMMER_DB_APP_URL 自动创建 |
| 自备或托管的 PostgreSQL(事先给定数据库地址) | 未生效。 角色与 AIHUMMER_DB_APP_URL 由运维自行创建 |
| 无管理员权限的安装(rootless) | 未生效。 同上 |
[!WARNING] 两个让 RLS「已开启」却毫无保护的错误。 其一:
AIHUMMER_DB_APP_URL指向了表的属主或超级用户——PostgreSQL 对这类 角色不施加策略,而网关仍会报告 RLS 处于活动状态。请使用独立的受限角色。 其二: 在自备的 PostgreSQL 上,受限角色可能被自动创建并带有可预测的密码—— 请在数据库可通过网络访问之前为它设置你自己的密码。
每租户范围
在一次请求中,应用程序在运行租户范围查询之前,在连接上建立当前租户——概念上 db.WithTenant. 一旦设置了作用域,受限角色上的 RLS 策略会将每次读取和写入限制在该租户的行上。作用域与工作单元绑定,因此不会在并发请求之间泄露。
request ─▶ resolve tenant ─▶ db.WithTenant(tenant) ─▶ queries see only that tenant
工作人员系统/绕过模式
有些工作确实是跨租户或与租户无关的——后台工作者、调度程序、交付恢复及类似的维护工作。对于这些,网关使用一个 系统(绕过)模式 它在所有者池上运行,位于每租户 RLS 策略之外,因此基础设施任务可以在整个数据集上运行。
[!WARNING] 旁路模式仅适用于受信任的内部员工。请求处理代码路径 代表用户执行的操作必须始终通过受限的途径运行, 租户范围池——绝不是绕过路径。
迁移在所有者池上运行
模式更改需要受限角色没有的权限,所以 迁移始终在所有者池上运行 (AIHUMMER_DATABASE_URL在启动时,在建议锁下。受限 aihummer_app 角色仅用于普通应用程序流量。这保持了权限分离的清晰:模式更改操作使用所有者;租户数据访问使用应用了行级安全(RLS)的受限制角色。
接下来去哪儿
- 多租户与幂等性 — 完整的租户模型以及副作用在恢复过程中如何保持安全。
- 秘密金库 ——每个租户的 DEK 加强了相同的内容 在秘密层的隔离。
- 基于角色的访问控制(RBAC)和范围 API 密钥 ——以上授权 数据层