Cloud SQL 中的参数化安全视图概览

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

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

参数化安全视图示例

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

CREATE VIEW user_specific_items WITH (security_barrier) AS
       SELECT item_id, item_name, description
       FROM items t
       WHERE owner_id = $@app_user_id;

您可以使用 execute_parameterized_query 函数或运行 EXECUTE .. WITH VIEW PARAMETERS 语句来查询视图。

使用场景

大语言模型 (LLM) 可能会生成泄露敏感数据的 SQL 查询。

参数化安全视图可在数据库级别管理数据安全,尤其是在处理来自不可信来源的临时查询(例如从自然语言转换而来的查询)时。例如,您可以使用参数化安全视图为用户可以使用自然语言(例如“显示我的订单”)发出查询的应用提供数据安全保障。

您可以使用参数化安全视图,对 Cloud SQL for PostgreSQL 执行此查询的方式应用以下要求:

  • 查询只能读取您在数据库参数化安全视图中列出的数据库对象和列。
  • 查询只能读取与提交查询的用户相关联的数据库行。返回的行与用户表行具有数据关系。

如需详细了解如何配置安全性和访问权限控制,请参阅使用参数化安全视图

参数化安全视图有助于缓解当允许最终用户在数据库表上运行不可信查询(例如自然语言查询)时可能会出现的安全风险。安全风险包括以下方面:

  • 用户可以提交提示注入攻击,并尝试操纵底层模型来显示应用有权访问的所有数据。
  • 自然语言到 SQL (NL2SQL) 模型可能会生成范围过于宽泛的 SQL 查询,出于数据安全考虑,这是不合适的。这种安全风险可能会导致在响应用户查询(即使是出于好意的查询)时泄露敏感数据。

借助参数化安全视图,您可以定义不可信查询可以从中提取数据的表和列。借助这些视图,您可以限制特定应用用户可访问的行范围。通过这些限制,您可以严格控制应用用户可以通过自然语言查询查看的数据,无论用户如何措辞。

例如,您可能有一个用于跟踪客户订单的应用。支持代理在应用中询问:“客户 12345 的订单状态是什么?” 在此场景中,应用可以使用基于客户 ID 的会话变量来使用参数化安全视图。参数化安全视图使用一个查询,该查询仅返回与客户 ID 12345 关联且可供客户 ID 12345 访问的行。

通过使用参数化安全视图,您可以限制特定应用用户可访问的行范围。无论用户如何措辞,此控制措施都能确保数据安全。

数据安全

参数化安全视图可让应用开发者通过以下方法实现数据安全和行级访问权限控制:

  • 使用 WITH (security barrier) 子句创建的视图可防止恶意选择的函数和运算符在视图完成其工作之前从行中传递值,从而提供行级安全性。如需详细了解 WITH (security barrier) 子句,请参阅规则和权限
  • 使用已命名视图参数可实现数据库的受限视图,该视图由值进行参数化。这些值由应用根据应用级安全性(例如最终用户身份验证)提供。

  • 对访问参数化视图的查询强制执行额外限制,以防止基于给定参数值对视图中的检查进行逃逸攻击。如需了解详情,请参阅查询限制

限制

  • 如需使用带形参的安全视图,您必须为 Cloud SQL 实例启用 cloudsql.enable_parameterized_views 数据库标志,这需要重启数据库。

  • 您必须在打算创建参数化安全视图的每个数据库中创建 parameterized_views 扩展程序。

  • 如果参数化视图在用户定义的函数中被引用,而该函数是通过参数化安全视图中使用的任何 API 调用的,则会发生错误。您必须在父查询中直接引用参数化视图。

  • 查询参数化安全视图时存在一些限制。如需了解详情,请参阅查询限制

后续步骤