本文档介绍了 AlloyDB for PostgreSQL 中的参数化安全视图,这些视图可提供应用数据安全性和行访问控制,同时支持 SQL。这些视图支持数据值提取(从列中检索特定数据片段的过程),并有助于防范提示注入攻击。参数化安全视图有助于确保最终用户只能查看他们应访问的数据。
参数化视图是 PostgreSQL 视图的扩展,可让您在视图定义中使用特定于应用的命名视图参数。此 capability 提供了一个接口,用于接受查询和命名参数的值。视图会使用这些值执行查询,这些值会在查询执行期间使用。
以下是参数化安全视图的示例:
CREATE VIEW secure_checked_items WITH (security_barrier) AS
SELECT bag_id, timestamp, location
FROM checked_items t
WHERE customer_id = $@app_end_userid;
您可以使用 execute_parameterized_query
存储过程或运行 EXECUTE .. WITH VIEW PARAMETERS
语句来查询视图。
使用场景
参数化安全视图非常适合在数据库级别针对来自不可信来源的临时查询(例如从自然语言查询转换的查询)进行数据安全管理。例如,假设某个应用的数据库会跟踪旅客的托运行李。这些客户可以向应用发出查询。例如,客户的应用用户 ID 为 12345,可以向应用输入查询,例如“我的包在哪里?”
您可以使用参数化安全视图,将以下要求应用于 AlloyDB 执行此查询的方式:
- 该查询只能读取您在数据库参数化安全视图中列出的数据库对象和列。
- 该查询只能读取与提交查询的用户关联的数据库行。返回的行与用户的表格行(ID 列值为
12345
)具有数据关联。
如需详细了解如何配置安全性和访问权限控制,请参阅使用参数化安全视图保护应用数据并控制对其的访问权限。
参数化安全视图有助于降低允许最终用户对数据库表运行不可信查询(例如自然语言查询)时发生的安全风险。安全风险包括:
- 用户可以提交提示注入攻击,并尝试操纵底层模型以揭示应用有权访问的所有数据。
- 出于数据安全方面的原因,LLM 生成的 SQL 查询的范围可能会过于广泛。这种安全风险可能会在响应用户查询(即使是出于善意)时泄露敏感数据。
使用参数化安全视图,您可以定义不可信查询可以从中提取数据的表和列。借助这些视图,您可以限制单个应用用户可用的行范围。借助这些限制,您还可以严格控制应用用户可以通过自然语言查询查看的数据,无论用户如何表述这些查询。
安全机制
通过参数化安全视图,应用开发者可以使用以下方法实现数据安全和行访问权限控制:
- 使用
WITH (security barrier)
选项创建的视图可提供行级安全性,方法是阻止恶意选择的函数和运算符在视图完成工作之前传递行中的值。如需详细了解WITH (security barrier)
子句,请参阅规则和权限。 - 使用命名视图参数进行参数化可实现对数据库的受限视图,该视图由应用根据应用级安全(例如最终用户身份验证)提供的值进行参数化。如需了解详情,请参阅
- 对访问参数化视图的查询强制执行额外限制,以防止攻击者根据给定参数值逃避视图中的检查。如需了解详情,请参阅对查询强制执行的限制。
限制
如果在使用参数化安全视图中使用的任何 API 调用的用户定义函数中引用了参数化视图,则会发生错误。您必须在父级查询中直接引用带参数的视图。
您必须在每个 AlloyDB 实例上单独启用参数化视图标志。在主实例上创建的参数化视图对象会传播到只读副本和跨区域副本。不过,
parameterized_views.enabled
标志设置不会自动复制,必须在每个实例上手动复制。如需了解详情,请参阅准备工作。在每个副本实例上启用parameterized_views.enabled
标志之前,您无法在副本上查询参数化视图。此限制不适用于备用实例。