参数化安全视图概览

本页面介绍了 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 语句来查询参数化安全视图。如需了解详情,请参阅使用 AlloyDB 参数化安全视图管理应用数据安全

参数化安全视图的优势

参数化安全视图非常适合在数据库级别管理数据安全,尤其是在处理来自不可信来源的临时查询(例如从自然语言转换而来的查询)时。这些视图提供了一种灵活的方式来实现精细的访问权限控制。

例如,假设某个应用用于跟踪客户的托运行李。用户 ID 为 12345 的客户询问:“我的行李在哪里?”在此场景中,参数化安全视图可确保以下事项:

查询仅返回提交查询的用户可访问的行,例如与用户 ID 12345 关联的行。

安全风险缓解

当最终用户在数据库上运行不可信查询(例如自然语言查询)时,参数化安全视图有助于缓解安全风险。这些风险包括:

  • 恶意提示:用户可能会尝试操纵底层模型来访问所有应用数据。
  • 范围较广的 SQL 查询:即使是出于善意的用户查询,大语言模型 (LLM) 也可能会生成泄露敏感数据的 SQL 查询。

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

数据访问权限管理

参数化安全视图可解决在管理大量且不断增长的用户的数据访问权限时遇到的常见难题。

  • 简化的用户管理:借助参数化安全视图,您可以使用单个数据库角色为所有最终用户提供服务,而无需使用可能需要您为每个最终用户创建单独的数据库用户或角色的方法。对于每个最终用户仅需访问其自身数据的应用,参数化安全视图有助于简化用户和连接管理。

    例如,在航空公司应用中,客户应只能查看自己的预订,您可以定义一个由最终用户标识符进行参数化的参数化安全视图。此视图允许单个数据库角色(具有对视图的访问权限,但没有对基础表的访问权限)为所有用户提供服务,从而简化用户管理和数据库连接。

  • 简化的安全性强制执行:参数化安全视图本身就包含访问权限控制。查询视图时,系统会始终强制执行已定义的安全参数,无论访问视图的用户是谁。这种方法与以下情况形成对比:在这些情况下,基表上的底层安全政策可能不会自动应用于视图,除非进行额外配置。

如需详细了解 PostgreSQL 中现有的安全机制(例如行级安全性 [RLS] 政策),请参阅行级安全性政策

安全机制

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

  • 使用 WITH (security barrier) 选项创建的视图可防止恶意选择的函数和运算符在视图完成其工作之前从行中传递值,从而提供行级安全性。如需详细了解 WITH (security barrier) 子句,请参阅规则和权限
  • 使用已命名视图参数进行参数化可实现数据库的受限视图,该视图由应用根据应用级安全性(例如最终用户身份验证)提供的参数值进行参数化。
  • 对于执行来自最终用户的不受信任查询的应用(例如由 AI 自然语言到 SQL 生成器生成的查询),对访问参数化视图的查询强制执行额外限制非常有用。这样可以防止逃脱参数化安全视图提供的安全范围,并管理资源使用情况。如需了解详情,请参阅强制执行的查询限制

限制

  • 您必须在每个 AlloyDB 实例上单独启用参数化视图标志。在主实例上创建的参数化视图对象会传播到读取池实例和跨区域副本。不过,parameterized_views.enabled 标志设置不会自动应用,必须在每个实例上手动设置。如需了解详情,请参阅准备工作

    您必须先在读取池实例或跨区域副本上启用 parameterized_views.enabled 标志,然后才能在这些实例上查询参数化视图。

后续步骤