参数化安全视图概览

本文档介绍了 AlloyDB for PostgreSQL 中的参数化安全视图,该视图可在支持 SQL 的同时提供应用数据安全性和行级访问权限控制。这些视图支持数据值提取(从列中检索特定数据的过程),并有助于防范提示注入攻击。参数化安全视图有助于确保最终用户只能查看他们应该访问的数据。

形参化视图是 PostgreSQL 视图的扩展,可让您在视图定义中使用应用特定的命名视图形参。此功能提供了一个接口,该接口接受查询和命名参数的值。视图使用这些值执行查询,这些值在整个查询执行过程中都会使用。

以下是一个参数化安全视图的示例:

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 标志,然后才能在副本上查询参数化视图。此限制不适用于备用实例。

后续步骤