在 postgres 中创建策略 (CREATE POLICY) 时,可以指定表达式以在发出 SELECT 查询时过滤掉一些行:
CREATE POLICY ... USING ( using_expression ) ...
也可以指定一个单独的表达式,该表达式在评估为 false 时触发错误,但仅适用于 INSERT/UPDATE - WITH CHECK ( check_expression )
。
我希望选择具有相同的行为 - 如果选择查询尝试访问根据某些表达式应该无法访问的行,是否有办法触发错误?
我问的原因是我正在考虑使用 RLS 作为访问控制的附加和冗余层,而第一个将在应用程序逻辑中。这样做的问题是很难在应用程序逻辑中找到问题,这在某种程度上违背了目的:
- 如果 RLS 配置错误并且错误地允许某些记录通过它,应用程序层将捕获它并触发错误 - 该问题很容易检测到。
- 但是,如果应用程序层存在错误并且错误地授予对记录的访问权限,则它根本不可见 - RLS 会神奇地将它们过滤掉,直到有人错误配置 RLS 并且数据泄漏。
有没有办法配置 postgres,如果查询尝试读取它不应该读取的行,它会出错?特别是,它可能是一种确保所有代码路径实际上都实施了适当的访问控制检查的方法。
RLS 无法对不可访问内容的访问做出反应。抛出错误会暴露不可访问对象的存在,这是一个容易受到猜测攻击的信息泄露漏洞。日志记录稍微少一些,尽管如果日志文件元数据是可见的,那么类似的攻击是可能的。
对于出于开发目的审计访问,触发器是最灵活的。pgaudit扩展可以在这里提供帮助。