用途
postgres-rls 是一个强制性技能,当代码涉及认证表、租户隔离、RLS 策略或多租户数据库代码时触发。其核心目标是验证并强制执行 PostgreSQL 行级安全(RLS)的最佳实践,防止数据在租户之间泄漏。RLS 是数据隔离的最后一道防线,而非唯一防线;实现错误会导致虚假的安全感,甚至数据泄露。
主要能力
该技能覆盖以下关键漏洞与检查点:
-
超级用户绕过(严重):超级用户或具有 BYPASSRLS 属性的角色会忽略所有策略。技能要求应用以非超级用户角色连接,且没有角色具有 BYPASSRLS 属性,测试必须以应用角色运行。
-
表所有者绕过(严重):表所有者默认绕过 RLS,除非设置 FORCE ROW LEVEL SECURITY。技能要求所有 RLS 表同时包含 ENABLE 和 FORCE 语句。
-
视图绕过(严重):视图默认以创建者权限运行,超级用户拥有的视图会完全绕过 RLS。技能要求所有基于 RLS 表的视图使用 security_invoker = true(PostgreSQL 15+),且视图不由超级用户角色拥有。
-
USING 与 WITH CHECK 不匹配(高):USING 过滤读取,WITH CHECK 验证写入。缺少 WITH CHECK 允许插入不可见的数据。技能要求所有策略同时包含 USING 和 WITH CHECK。
-
线程本地上下文泄漏(高):连接池可能在请求之间泄漏租户上下文。技能要求始终使用 SET LOCAL 而非 SET,在事务内设置上下文,并在请求后重置。
-
策略函数中的 SQL 注入(高):策略中使用的函数可能成为注入向量。技能要求函数本身必须防注入,例如使用类型转换而非字符串拼接。
-
物化视图与数据导出(中):物化视图不遵循源表的 RLS,数据导出可能绕过策略。技能要求将物化视图标记为安全敏感,导出任务以应用角色运行,并审计批量数据访问。
此外,技能还提供性能优化建议:为策略列建立索引、将函数包装在子查询中以避免逐行调用、使用 SECURITY DEFINER 函数绕过 RLS 链、为性能反规范化存储 tenant_id。
使用方式
该技能在以下情况触发:
- 迁移文件包含 tenant、rls、policy 模式
- 认证相关的数据库代码变更
- 多租户架构变更
可通过以下命令检查:
git diff --name-only HEAD~1 | grep -iE '(tenant|rls|policy|auth.*sql|multi.?tenant)'
技能开始时需声明:"I'm applying postgres-rls to verify Row Level Security implementation."
技能提供安全的 RLS 迁移模式,包括添加列、回填数据、添加 NOT NULL 约束、创建索引、启用 RLS(ENABLE 和 FORCE)、创建策略、授予权限等步骤。
技能还提供测试要求,包括跨租户隔离测试、插入其他租户数据测试、确认应用不使用超级用户角色等。测试必须以非超级用户角色运行。
实现 RLS 后,需发布 RLS 实现工件到 issue,包含表清单、策略详情、安全验证清单和应用角色信息。
适用场景
- 多租户 SaaS 应用的数据库设计与迁移
- 涉及认证、租户隔离的代码审查
- RLS 策略的编写、测试与验证
- 数据库架构安全评估
限制
该技能为强制性检查工具,不替代完整的安全审查。部分功能(如 security_invoker)需要 PostgreSQL 15+。物化视图的 RLS 绕过行为需要额外文档记录和审计。技能本身不提供自动化修复,需开发者根据检查清单手动调整。