所有文章

实用指南

1 分钟阅读

Supabase RLS:手动审计与自动扫描对比

Supabase RLS 安全检查的工作原理、手动审核发现和遗漏的内容,以及自动扫描如何通过证据和修复指南发现政策差距。

作者:Luca Deguin

带锁和放大镜的图示 Supabase 访问策略表。

行级安全性是保护其数据的 Supabase 项目与悄悄暴露数据的项目之间的界限。当 RLS 配置正确时,您的数据库会在行级别强制执行受 RLS 约束的角色的访问规则。特权角色(包括服务角色)可以绕过这些规则。如果配置不当,表看起来会受到保护,而策略会允许更多内容通过。

本文比较了运行 Supabase RLS 安全检查的两种方法:手动验证策略和运行自动 RLS 审核。两者都有一席之地。了解每个问题的出处是验证数据库访问策略是否按预期工作的方法。

行级安全性如何工作以及策略悄然出错的地方

RLS 是 Supabase 按表公开的 Postgres 功能。一旦启用,表将拒绝受 RLS 约束的角色的行访问,除非策略允许;具有旁路权限的表所有者和角色是例外。策略根据当前用户、他们的声明以及正在运行的查询进行评估。的 auth.uid() 功能通常是锚点:类似的策略 using (auth.uid() = user_id) 限制对登录用户自己的数据库行的访问。

模型很干净。失败则不然,因为它们很少看起来像失败。

一些模式可以解释大多数 RLS 问题:

  • RLS 在某些表上启用,但并非全部。 启动后添加的新表或通过迁移创建的表可以在 RLS 关闭的情况下发货。然后,具有表访问权限的任何角色都可以读取每一行。

  • 一项比其字面上更广泛的政策。 using (true) 在选择策略上意味着每一行都是可见的。很容易在开发过程中为了调试而添加而忘记删除。

  • 服务角色无处不在。 使用服务角色密钥的服务器端代码完全绕过 RLS。如果面向用户的请求通过该密钥运行,则策略永远不会适用。

  • 检查错误列的策略。 auth.uid() = id 在桌子上 id 是行的主键,而不是所有者,永远不会匹配意图。该策略存在,它返回错误或空集,并且表面仍然有效。

  • 没有适当的访问控制的数据库更新和删除。 开发人员通常会彻底保护选择并宽松地保留写入策略。通过读取检查并没有说明谁可以接下来修改该行。

这些都没有自行宣布。每个人都保持应用程序正常运行,这正是他们能够生存到生产环境的原因。

进行手动 RLS 审核:要检查的内容以及漏掉的错误

手动审核是直接的,不需要新工具。您可以逐个表地研究策略本身。

首先列出每个表并确认每个表上都启用了 RLS。然后,对于每个表,枚举策略并将它们映射到预期的访问:谁应该读取,谁应该写入,以及谁不应该触摸它。根据其比较的列读取每个策略表达式。确认选择、插入、更新和删除均具有与预期角色匹配的策略。

接下来,检查代码路径。确定您的应用程序实际使用哪个密钥来处理面向用户的请求,以及其中是否有任何密钥通过服务角色运行。然后以不同的用户身份编写测试查询并确认结果符合预期:用户应该读取自己的行而不是其他人的行,并且不应该能够更新他们不拥有的行。

人工审核是值得做的,而且能收获很多。它还具有可预测的盲点。

  • 它测试您记得要测试的内容。 如果您不想以第二个用户身份尝试删除,则可能会错过过于宽泛的删除策略。启用 RLS 后,没有适用的删除策略意味着删除被拒绝。

  • 它老化了。 随着功能的添加,策略也会发生变化。上个季度进行的彻底审查没有提及您上周添加的表格。

  • 这取决于配置策略的同一个人。 制定政策的建筑商最不可能发现自己的假设。

  • 它需要有记录的证据。 “我检查了它,它看起来不错”没有留下任何东西:没有证据,没有范围,没有您可以稍后重新扫描的工件。

手动审核回答了“这符合我的系统思维模型吗?”的问题。它本身并不能证明数据库实际返回的内容。

运行自动 RLS 检查并根据结果采取行动

自动 Supabase RLS 安全检查从另一个方向进行。它以攻击者或配置错误的客户端的方式执行项目,并报告数据层实际允许的内容。

这种转变很重要,原因有三个。首先,它扩展了过去的内存:扫描重复检查其配置范围内可用的表和端点。如果没有适当的访问权限,外部扫描无法检查每个策略。其次,它会生成您可以采取行动的证据:结果命名了表、策略状态以及使其可访问的条件,以便您知道要更改什么以及为什么要更改。第三,它是可重复的。您可以再次运行的检查将一次性审核转变为持续验证。

VICE 扫描 Web 应用程序和 Supabase/RLS 配置,然后报告结果及其背后的证据和纠正指导。您可以标记修复并请求重新检查,但只有类似的重新扫描才能确认问题已解决:修复是针对相同范围进行验证的,而不是从编辑中假设的。计划扫描和警报支持持续监控,因此下个月添加的表不会悄悄地重新引入差距。

分工很简单。运行自动检查以查找手动审核遗漏的内容,然后使用手动传递来确认扫描标记的每个策略背后的意图。自动化告诉您数据库允许什么;您可以决定该许可是否是故意的。

任何扫描的分数描述了测试范围,但不能保证项目完全安全。将其视为查看位置的信号,而不是证书。

您应该使用哪种方法?

如果您正在部署使用 Supabase 构建的产品并且从未审核过您的策略,那么诚实的答案是,按顺序两者都是。从自动 RLS 检查开始,以便您对表所允许的内容有一个最新的、有证据支持的图片。然后手动检查发现的结果,确认每项政策的意图,并修复那些偏离的政策。将自动检查安排在计划中,以便新表和新策略得到与原始表和新策略相同的审查。

跳过任何一种方法都可能导致数据库访问策略看似保护数据,但仍然允许未经授权的访问。

开始免费扫描 注册前请访问vice-platform.com,查看您的公共网站。专门的 Supabase 扫描需要经过验证的域名和付费订阅或购买的积分;其覆盖范围取决于配置的访问。

开始检查
您网站的安全。

查找问题、准备修复并验证更改。
将您的结果放在一起以供下次部署使用。

+10,000 个已扫描网站
VICE 平台概述