本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Lake Formation 中的数据筛选和单元格级别安全性
当您授予对数据目录表的 Lake Formation 权限时,可以包括数据筛选规范,以限制对查询结果中以及与 Lake Formation 集成的引擎中某些数据的访问。Lake Formation 使用数据筛选来实现列级别安全性、行级别安全性以及单元格级别安全性。如果源数据包含嵌套结构,则可以对嵌套列定义和应用数据筛选条件。
借助 Lake Formation 的数据筛选功能,您可以实现以下级别的数据安全性。
列级别安全性
授予对具有列级别安全性(列筛选)的数据目录表的权限将仅允许用户查看表中他们有权访问的特定列和嵌套列。以一家大型多区域通信公司在多个应用程序中使用的 persons
表为例。通过列筛选授予对数据目录表的权限可以限制不在人力资源部门工作的用户查看个人身份信息 (PII),例如社会保险号或出生日期。您还可以定义安全策略并仅授予对嵌套列的部分子结构的访问权限。
行级别安全性
授予对具有行级别安全性(行筛选)的数据目录表的权限将仅允许用户查看表中他们有权访问的特定行。筛选基于一列或多列值。定义行筛选条件表达式时,可以包含嵌套列结构。例如,如果通信公司的不同地区办事处都有自己的人力资源部门,则可以限制人力资源部员工可以查看的人员记录,只允许他们查看他们所在区域的员工的记录。
单元格级别安全性
单元格级别安全功能将行筛选和列筛选相结合,打造出了高度灵活的权限模型。如果您以网格形式查看表的行和列,则通过使用单元格级别安全功能,可以从两个方面限制从任意位置对网格中各个元素(单元格)的访问。也就是说,您可以根据行来限制对不同列的访问。下图阐明了这一点,其中受限制的列是带阴影的。
继续来看 Persons 表示例,您可以在单元格级别创建数据筛选条件,如果行的国家/地区列设置为“英国”,则限制对街道地址列的访问,但如果行的国家/地区列设置为“美国”,则允许访问街道地址列。
筛选条件仅适用于读取操作。因此,您只能通过筛选条件授予 SELECT
Lake Formation 权限。
嵌套列的单元格级别安全性
Lake Formation 允许您对嵌套列定义和应用具有单元格级别安全性的数据筛选条件。但是,亚马逊 Athena、Amazon 和 Amazon Redshift Spectrum 等集成分析引擎支持使用行级和列级安全功能对 Lake Formation 托管的嵌套表执行查询。EMR
有关限制,请参阅数据筛选限制。
Lake Formation 中的数据筛选条件
您可以通过创建数据筛选条件来实现列级别、行级别和单元格级别安全性。在授予对表的 SELECT
Lake Formation 权限时,您可以选择数据筛选条件。如果您的表包含嵌套列结构,则可以通过包含或排除子列来定义数据筛选条件,并针对嵌套属性定义行级别筛选表达式。
每个数据筛选条件属于数据目录中的一个特定表。数据筛选条件包含以下信息。
-
筛选条件名称
-
与筛选器关联IDs的表的目录
-
表名称
-
包含表的数据库的名称
-
列规范 – 要在查询结果中包含或排除的列和嵌套列的列表(使用
struct
数据类型)。 -
行筛选表达式 – 用于指定要包含在查询结果中的行的表达式。由于实施一些限制,该表达式的语法与 PartiQL 语言中
WHERE
子句的语法相同。要指定所有行,请在控制台的 “行级访问权限” 下选择 “访问所有行” 或 “在呼叫AllRowsWildcard
中API使用”。有关行筛选表达式支持哪些内容的更多信息,请参阅行筛选表达式支持 PartiQL。
您获得的筛选级别取决于填充数据筛选器的方式。
-
如果指定“所有列”通配符并提供行筛选条件表达式,则仅建立行级安全性(行筛选)。
-
如果包含或排除特定列和嵌套列并使用“所有行”通配符指定所有行,则仅会建立列级别安全性(列筛选)。
-
如果包含或排除特定列,同时提供行筛选条件表达式,则建立单元格级别的安全性(单元格筛选)。
以下来自 Lake Formation 控制台的屏幕截图显示了执行单元格级别筛选的数据筛选条件。对于针对 orders
表的查询,它会限制对 customer_name
列的访问,并且查询结果仅返回 product_type
列包含“pharma”的行。
请注意使用单引号将字符串 'pharma'
引起来。
您可以使用 Lake Formation 控制台创建此数据过滤器,也可以为CreateDataCellsFilter
API操作提供以下请求对象。
{ "Name": "restrict-pharma", "DatabaseName": "sales", "TableName": "orders", "TableCatalogId": "111122223333", "RowFilter": {"FilterExpression": "product_type='pharma'"}, "ColumnWildcard": { "ExcludedColumnNames": ["customer_name"] } }
您可以根据需要为表创建许多数据筛选条件。为此,您需要使用授权选项授予对表的 SELECT
权限。默认情况下,数据湖管理员有权在该账户中的所有表上创建数据筛选条件。在向主体授予对表的权限时,通常只使用一部分可能的数据筛选条件。例如,您可以为orders
表创建第二个数据筛选器,即 row-security-only 数据筛选器。根据前面的屏幕截图,您可以选择访问所有列选项,并包括行筛选表达式 product_type<>pharma
。此数据筛选条件的名称可能是 no-pharma
。它限制对 product_type
列设置为“pharma”的所有行的访问。
此数据筛选器CreateDataCellsFilter
API操作的请求对象如下。
{ "Name": "no-pharma", "DatabaseName": "sales", "TableName": "orders", "TableCatalogId": "111122223333", "RowFilter": {"FilterExpression": "product_type<>'pharma'"}, "ColumnNames": ["customer_id", "customer_name", "order_num" "product_id", "purchase_date", "product_type", "product_manufacturer", "quantity", "price"] }
然后,您可以使用 restrict-pharma
数据筛选条件向管理用户授予对 orders
表的 SELECT
,并使用 no-pharma
数据筛选条件向非管理用户授予对 orders
表的 SELECT
。对于医疗保健业的用户,您可以授予对 orders
表的 SELECT
以及对所有行和列的完整访问权限(没有数据筛选条件),或者还可以使用数据筛选条件来限制对定价信息的访问。
在数据筛选条件中指定列级别和行级别安全性时,可以包含或排除嵌套列。在以下示例中,使用限定列名称(用双引号括起来)指定对该 product.offer
字段的访问权限。这对于嵌套字段很重要,这样可以避免在列名称包含特殊字符时发生错误,并保持与顶级列级别安全性定义的向后兼容性。
{ "Name": "example_dcf", "DatabaseName": "example_db", "TableName": "example_table", "TableCatalogId": "111122223333", "RowFilter": { "FilterExpression": "customer.customerName <> 'John'" }, "ColumnNames": ["customer", "\"product\".\"offer\""] }