本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Lake Formation 基于标签的访问控制管理数据湖
成千上万的客户正在构建 PB 级的数据湖。 AWS这些客户中有许多人习 AWS Lake Formation 惯于在整个组织中轻松构建和共享他们的数据湖。随着表和用户数量的增加,数据管家和管理员正在寻找方法来轻松地大规模管理对数据湖的权限。基于 Lake Formation 标签的访问控制 (LF-TBAC) 允许数据管理员创建 LF 标签(基于他们的数据分类和本体),然后将其附加到资源上,从而解决了这个问题。
LF-TBAC 是一种基于属性定义权限的授权策略。在 Lake Formation 中,这些属性被称为“LF 标签”。您可以将 LF 标签附加到数据目录资源和 Lake Formation 主体。数据湖管理员可以使用 LF 标签分配和撤销对 Lake Formation 资源的权限。有关更多信息,请参阅Lake Formation 基于标签的访问控制。
本教程演示如何使用 AWS 公共数据集创建基于 Lake Formation 标签的访问控制策略。此外,它还展示了如何查询具有相关的 Lake Formation 基于标签的访问策略的表、数据库和列。
您可以将 LF-TBAC 用于以下用例:
您有大量表和主体,数据湖管理员必须授予对它们的访问权限
您想基于本体对数据进行分类并基于分类授予权限
数据湖管理员想要以松耦合的方式动态分配权限
以下是使用 LF-配置权限的高级步骤TBAC:
-
数据管家使用以下两个 LF 标签定义标签本体:
Confidential
和Sensitive
。带有Confidential=True
的数据具有更严格的访问控制。带有Sensitive=True
的数据需要分析师进行具体分析。 -
数据管家为数据工程师分配不同级别的权限,以便他们使用不同 LF 标签构建表。
-
数据工程师构建了两个数据库:
tag_database
和col_tag_database
。tag_database
中的所有表都配有Confidential=True
。col_tag_database
中的所有表都配有Confidential=False
。col_tag_database
中表的一些列带有Sensitive=True
标签,以满足特定的分析需求。 数据工程师使用特定表达式条件
Confidential=True
以及Confidential=False
、Sensitive=True
向分析人员授予对表的读取权限。-
通过这种配置,数据分析师可以专注于使用正确的数据执行分析。
主题
目标受众
本教程适用于数据管家、数据工程师和数据分析师。在 Lake Formation 中 AWS Glue Data Catalog 管理和管理权限时,生产账户中的数据管理员根据其支持的职能拥有功能所有权,并且可以向各种消费者、外部组织和账户授予访问权限。
下表列出了本教程中使用的角色:
角色 | 描述 |
---|---|
数据管家(管理员) | lf-data-steward 用户拥有以下访问权限:
|
数据工程师 |
|
数据分析人员 | lf-data-analyst 用户拥有以下访问权限:
|
先决条件
在开始本教程之前,你必须有一个 AWS 账户 可以用来以具有正确权限的管理用户身份登录的。有关更多信息,请参阅 完成初始 AWS 配置任务。
本教程假设你熟悉IAM。有关的信息IAM,请参阅《IAM用户指南》。
第 1 步:调配资源
本教程包括一个用于快速设置的 AWS CloudFormation 模板。您可以查看和自定义该模板来满足自己的需求。该模板创建了三个不同的角色(列在中目标受众)来执行本练习,并将 nyc-taxi-data 数据集复制到您的本地 Amazon S3 存储桶。
一个 Amazon S3 存储桶
适当的 Lake Formation 设置
相应的 Amazon EC2 资源
三个带有凭证的IAM角色
创建您的资源
在美国东部(弗吉尼亚北部)区域的 https://console.aws.amazon.com/cloudformation
登录 AWS CloudFormation 控制台。 选择启动堆栈
。 -
选择下一步。
-
在用户配置部分,为以下三个角色输入密码:
DataStewardUserPassword
、DataEngineerUserPassword
和DataAnalystUserPassword
。 查看最后一页上的详细信息,然后选择我确认这 AWS CloudFormation 可能会创建IAM资源。
选择创建。
堆栈创建可能最多需要五分钟时间才能完成。
注意
完成本教程后,您可能需要删除中的堆栈 AWS CloudFormation ,以免继续产生费用。根据堆栈的事件状态验证是否已成功删除资源。
第 2 步:注册您的数据位置、创建 LF-Tag 本体并授予权限
在此步骤中,数据管家用户使用两个 LF 标签定义标签本体:Confidential
和Sensitive
,并允许特定IAM委托人将新创建的 LF 标签附加到资源。
注册数据位置并定义 LF-Tag 本体
以数据管家用户 (
lf-data-steward
) 的身份执行第一步,验证 Amazon S3 及 Lake Formation 中数据目录中的数据。使用部署 AWS CloudFormation 堆栈时使用的密码登录 L https://console.aws.amazon.com/lakeformation/
ak lf-data-steward
e Formation 控制台。在导航窗格中的权限下,选择管理角色和任务。
在 “数据湖管理员” 部分选择添加。
在添加管理员页面上,为IAM用户和角色选择用户
lf-data-steward
。选择保存以添加
lf-data-steward
作为 Lake Formation 管理员。
-
接下来,更新数据目录设置以使用 Lake Formation 权限来控制目录资源,而不是IAM基于基础的访问控制。
在导航窗格中的管理下,选择数据目录设置。
取消选中仅对新数据库使用IAM访问控制。
取消选中仅对新数据库中的新表使用IAM访问控制。
单击保存。
接下来,注册数据湖的数据位置。
在导航窗格的管理下,选择数据湖位置。
选择注册位置。
在注册位置页面上,在 Amazon S3 路径中输入
s3://lf-tagbased-demo-
。Account-ID
对于IAM角色,请保持默认值
AWSServiceRoleForLakeFormationDataAccess
不变。选择 Lake Formation 作为权限模式。
选择注册位置。
-
接下来,通过定义 LF 标签来创建本体。
在导航窗格的 “权限” 下,选择 LF 标签和权限。 。
选择添加 LF 标签。
对于键,输入
Confidential
。对于值,添加
True
和False
。选择添加 LF 标签。
-
重复上述步骤,使用该值创建 LF-T
Sensitive
ag。True
您已经为本练习创建了所有必需的 LF 标签。
向IAM用户授予权限
-
接下来,让特定的IAM委托人能够将新创建的 LF 标签附加到资源。
在导航窗格的 “权限” 下,选择 LF 标签和权限。
在 LF-tag 权限部分,选择授予权限。
对于权限类型,选择 LF-tag 键值对权限。
选择IAM用户和角色。
对于IAM用户和角色,搜索并选择
lf-data-engineer
角色。在 LF-Tags 部分中,添加
Confidential
带有值True
和的密钥和False
withkey
Sensitive
值。True
在 “权限” 下,为 “权限” 和 “可授予权限” 选择 “描述并关联”。
选择授权。
-
接下来,授
lf-data-engineer
予在我们的数据目录和由创建的底层 Amazon S3 存储桶上创建数据库的权限 AWS CloudFormation。在导航窗格的管理下,选择管理角色和任务。
在数据库创建者部分,选择授权。
对于IAM用户和角色,请选择
lf-data-engineer
角色。对于目录权限,选择创建数据库。
选择授权。
-
接下来,向
lf-data-engineer
用户授予对 Amazon S3 存储桶(s3://lf-tagbased-demo-
的权限。Account-ID
)在导航窗格中的权限下,选择数据位置。
选择授权。
选择我的账户。
对于IAM用户和角色,请选择
lf-data-engineer
角色。对于存储位置,请输入由 AWS CloudFormation 模板创建的 Amazon S3 存储桶
(s3://lf-tagbased-demo-
。Account-ID
)选择授权。
-
接下来,对与 LF- Tag 表达
lf-data-engineer
式关联的资源授予可授予权限。Confidential=True
在导航窗格的权限下,选择数据湖权限。
选择授权。
选择IAM用户和角色。
选择角色
lf-data-engineer
。在 LF 标签或目录资源部分中,选择与 LF 标签匹配的资源。
选择添加 LF-Tag 键值对。
添加值为
True
的键Confidential
。在数据库权限部分,为数据库权限和可授予的权限选择描述。
在表权限部分中,为表权限和可授予权限选择描述、选择和更改。
选择授权。
-
接下来,对与 LF-Tag 表达
lf-data-engineer
式关联的资源授予可授予权限。Confidential=False
在导航窗格的权限下,选择数据湖权限。
选择授权。
选择IAM用户和角色。
选择角色
lf-data-engineer
。选择通过 LF 标签匹配的资源。
选择添加 LF 标签。
添加值为
False
的键Confidential
。在数据库权限部分,为数据库权限和可授予的权限选择描述。
在表和列权限 部分,请勿选择任何内容。
选择授权。
-
接下来,我们为与 LF-Tag 键值对关联的资源授
lf-data-engineer
予可授予的权限,以及。Confidential=False
Sensitive=True
在导航窗格的权限下,选择数据权限。
选择授权。
选择IAM用户和角色。
选择角色
lf-data-engineer
。在 LF 标签或目录资源部分下,选择与 LF 标签匹配的资源。
选择添加 LF 标签。
添加值为
False
的键Confidential
。选择添加 LF-Tag 键值对。
添加值为
True
的键Sensitive
。在数据库权限部分,为数据库权限和可授予的权限选择描述。
在表权限部分中,为表权限和可授予权限选择描述、选择和更改。
选择授权。
第 3 步:创建 Lake Formation 数据库
在此步骤中,您将创建两个数据库,并将 LF-Tag 附加到数据库和特定列以进行测试。
创建用于数据库级别访问的数据库和表
-
首先,创建数据库
tag_database
、表source_data
,并附加相应的 LF 标签。在 Lake Formation 控制台 (https://console.aws.amazon.com/lakeformation/
) 上的 “数据目录” 下,选择 “数据库”。 选择创建数据库。
对于名称,请输入
tag_database
。在位置栏中,输入由 AWS CloudFormation 模板创建的 Amazon S3 地点
(s3://lf-tagbased-demo-
。Account-ID
/tag_database/)取消选择 “仅对该数据库中的新表使用IAM访问控制”。
选择创建数据库。
-
接下来,在
tag_database
中创建一个新表。在数据库页面上,选择数据库
tag_database
。选择查看表,然后单击创建表。
对于名称,请输入
source_data
。对于 Database (数据库),选择
tag_database
数据库。对于表格格式,选择标准 AWS Glue 表格。
对于数据位置,选择我的账户中的指定路径。
在包含路径中,输入 AWS CloudFormation 模板要
tag_database
创建的路径(s3://lf-tagbased-demo
。Account-ID
/tag_database/)对于数据格式,选择 CSV。
在 “上传架构” 下,输入以下列结构JSON数组以创建架构:
[ { "Name": "vendorid", "Type": "string" }, { "Name": "lpep_pickup_datetime", "Type": "string" }, { "Name": "lpep_dropoff_datetime", "Type": "string" }, { "Name": "store_and_fwd_flag", "Type": "string" }, { "Name": "ratecodeid", "Type": "string" }, { "Name": "pulocationid", "Type": "string" }, { "Name": "dolocationid", "Type": "string" }, { "Name": "passenger_count", "Type": "string" }, { "Name": "trip_distance", "Type": "string" }, { "Name": "fare_amount", "Type": "string" }, { "Name": "extra", "Type": "string" }, { "Name": "mta_tax", "Type": "string" }, { "Name": "tip_amount", "Type": "string" }, { "Name": "tolls_amount", "Type": "string" }, { "Name": "ehail_fee", "Type": "string" }, { "Name": "improvement_surcharge", "Type": "string" }, { "Name": "total_amount", "Type": "string" }, { "Name": "payment_type", "Type": "string" } ]
选择上传。上传架构后,表架构看上去应如以下屏幕截图所示:
选择提交。
-
接下来,在数据库级别附加 LF 标签。
在数据库页面上,找到并选择
tag_database
。在 “操作” 菜单上,选择 “编辑 LF 标签”。
选择分配新的 LF 标签。
对于分配的密钥,请选择您之前创建的
Confidential
LF-Tag。对于值,选择
True
。选择保存。
这样就完成了对 tag_database 数据库的 LF-Tag 赋值。
创建用于列级别访问的数据库和表
重复以下步骤创建数据库col_tag_database
和表source_data_col_lvl
,并在列级别附加 LF-Tag。
在数据库页面上,选择创建数据库。
-
对于名称,请输入
col_tag_database
。 -
在位置栏中,输入由 AWS CloudFormation 模板创建的 Amazon S3 地点
(s3://lf-tagbased-demo-
。Account-ID
/col_tag_database/) -
取消选择 “仅对该数据库中的新表使用IAM访问控制”。
-
选择创建数据库。
在数据库页面上,选择您的新数据库
(col_tag_database)
。选择 “查看表”,然后单击 “创建表”。
对于名称,请输入
source_data_col_lvl
。对于数据库,选择您的新数据库
(col_tag_database)
。对于表格格式,选择标准 AWS Glue 表格。
对于数据位置,选择我的账户中的指定路径。
输入
col_tag_database
(s3://lf-tagbased-demo-
的 Amazon S3 路径。Account-ID
/col_tag_database/)对于数据格式,选择
CSV
。在下方
Upload schema
,输入以下架构JSON:[ { "Name": "vendorid", "Type": "string" }, { "Name": "lpep_pickup_datetime", "Type": "string" }, { "Name": "lpep_dropoff_datetime", "Type": "string" }, { "Name": "store_and_fwd_flag", "Type": "string" }, { "Name": "ratecodeid", "Type": "string" }, { "Name": "pulocationid", "Type": "string" }, { "Name": "dolocationid", "Type": "string" }, { "Name": "passenger_count", "Type": "string" }, { "Name": "trip_distance", "Type": "string" }, { "Name": "fare_amount", "Type": "string" }, { "Name": "extra", "Type": "string" }, { "Name": "mta_tax", "Type": "string" }, { "Name": "tip_amount", "Type": "string" }, { "Name": "tolls_amount", "Type": "string" }, { "Name": "ehail_fee", "Type": "string" }, { "Name": "improvement_surcharge", "Type": "string" }, { "Name": "total_amount", "Type": "string" }, { "Name": "payment_type", "Type": "string" } ]
选择
Upload
。上传架构后,表架构看上去应如以下屏幕截图所示:选择提交以完成表的创建。
-
现在,将
Sensitive=True
LF-Tag 关联到列和vendorid
。fare_amount
在表页面上,选择您创建的表
(source_data_col_lvl)
。在 “操作” 菜单上,选择 “架构”。
选择该列
vendorid
并选择 “编辑 LF 标签”。对于已分配的键,选择区分大小写。
对于值,选择 True。
选择保存。
-
接下来,将
Confidential=False
LF-Tag 关联到。col_tag_database
这是在登录col_tag_database
时lf-data-analyst
能够描述数据库所必需的 Amazon Athena。在数据库页面上,找到并选择
col_tag_database
。在 “操作” 菜单上,选择 “编辑 LF 标签”。
选择分配新的 LF 标签。
对于分配的密钥,请选择您之前创建的
Confidential
LF-Tag。对于值,选择
False
。选择保存。
第 4 步:授予表权限
使用 LF 标签 Confidential
和 Sensitive
向数据分析师授予使用数据库 tag_database
和表 col_tag_database
的权限。
-
按照以下步骤向
lf-data-analyst
用户授予对与 LF-TagConfidential=True
(database: tag_Database) 关联的对象的权限,使其拥有Describe
数据库和对表的权限。Select
登录 Lake Formation 控制台,网址https://console.aws.amazon.com/lakeformation/
为 lf-data-engineer
。在 “权限” 下,选择 “数据湖权限”。
选择授权。
在 “委托人” 下,选择IAM用户和角色。
对于IAM用户和角色,选择
lf-data-analyst
。在 LF 标签或目录资源下,选择与 LF 标签匹配的资源。
选择添加 LF 标签。
对于键,选择
Confidential
。对于值,选择
True
。对于数据库权限,选择
Describe
。对于表权限,选择选择和描述。
选择授权。
-
接下来,重复这些步骤,向数据分析师授予使用 LF-Tag 表达式的权限。
Confidential=False
当以lf-data-analyst
身份从 Amazon Athena 登录时,使用此 LF 标签描述col_tag_database
和表source_data_col_lvl
。登录 Lake Formation 控制台,网址https://console.aws.amazon.com/lakeformation/
为 lf-data-engineer
。在数据库页面上,选择数据库
col_tag_database
。选择操作和授权。
在 “委托人” 下,选择IAM用户和角色。
对于IAM用户和角色,选择
lf-data-analyst
。选择与 LF 标签匹配的资源。
选择添加 LF 标签。
对于键,选择
Confidential
。对于值,选择
False
。对于数据库权限,选择
Describe
。对于表权限,请勿选择任何内容。
选择授权。
-
接下来,重复上述步骤,向数据分析师授予和的 LF-Tag 表达式的
Confidential=False
权限。Sensitive=True
当以lf-data-analyst
身份从 Amazon Athena 登录时,使用此 LF 标签描述col_tag_database
和表source_data_col_lvl
(列级别)。登录 Lake Formation 控制台 https://console.aws.amazon.com/lakeformation/
,网址为 lf-data-engineer
在“数据库”页面上,选择数据库
col_tag_database
。选择操作和授权。
在 “委托人” 下,选择IAM用户和角色。
对于IAM用户和角色,选择
lf-data-analyst
。选择与 LF 标签匹配的资源。
选择添加 LF 标签。
对于键,选择
Confidential
。对于值,选择
False
。选择添加 LF 标签。
对于键,选择
Sensitive
。对于值,选择
True
。对于数据库权限,选择
Describe
。对于表权限,选择
Select
和Describe
。选择授权。
第 5 步:在 Amazon Athena 中运行查询以验证权限
在这一步,使用 Amazon Athena 对两个表 (source_data and source_data_col_lvl)
运行 SELECT
查询。使用 Amazon S3 路径作为查询结果位置 (s3://lf-tagbased-demo-
。Account-ID
/athena-results/)
-
登录Athena控制台,网址为. https://console.aws.amazon.com/athena/
lf-data-analyst
在 Athena 查询编辑器中,在左侧面板中选择
tag_database
。选择
source_data
旁边的其他菜单选项图标(三个竖点),然后选择预览表。选择运行查询。
查询可能需要几分钟时间才能运行。查询显示了输出中的所有列,因为 LF 标签是在数据库级别关联的,并且
source_data
表会自动从数据库tag_database
继承LF-tag
。使用
col_tag_database
和source_data_col_lvl
运行另一个查询。第二个查询返回标记为
Non-Confidential
和Sensitive
的两个列。您还可以查看您未获得策略授权的列上的 Lake Formation 基于标签的访问策略行为。当从表
source_data_col_lvl
中选择未标记的列时,Athena 会返回错误。例如,您可以运行以下查询来选择未标记的列geolocationid
:SELECT geolocationid FROM "col_tag_database"."source_data_col_lvl" limit 10;
步骤 6:清理 AWS 资源
为了防止向你收取不必要的费用 AWS 账户,你可以删除用于本教程的 AWS 资源。
-
以
lf-data-engineer
身份登录 Lake Formation 控制台并删除数据库tag_database
和col_tag_database
。 -
接下来,以
lf-data-steward
身份登录并清除上面授予lf-data-engineer
和lf-data-analyst.
的所有 LF 标签权限、数据权限和数据位置权限。 -
使用您用于部署 AWS CloudFormation 堆栈的IAM证书,以账户所有者的身份登录 Amazon S3 控制台。
-
删除以下存储桶:
lf-tagbased-demo-accesslogs-
acct-id
lf-tagbased-demo-
acct-id
-
通过 https://console.aws.amazon.com/cloudformation
登录 AWS CloudFormation 控制台,然后删除您创建的堆栈。等待堆栈状态变为 DELETE_COMPLETE
。