本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
成千上万的客户在 AWS 上构建 PB 级数据湖。这些客户中有许多使用 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 标签本体并授予权限
在这一步,数据管家用户使用 Confidential
和 Sensitive
这两个 LF 标签定义标签本体,并授权特定的 IAM 主体将新创建的 LF 标签附加到资源。
注册数据位置并创建 LF 标签本体
以数据管家用户 (
lf-data-steward
) 的身份执行第一步,验证 Amazon S3 及 Lake Formation 中数据目录中的数据。通过 https://console.aws.amazon.com/lakeformation/
使用部署 AWS CloudFormation 堆栈时使用的密码以 lf-data-steward
身份登录 Lake 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 标签。
-
重复上述步骤,使用值
True
创建 LF 标签Sensitive
。
您已经为本练习创建了所有必需的 LF 标签。
向 IAM 用户授予权限
-
接下来,授权特定的 IAM 主体将新创建的 LF 标签附加到资源。
在导航窗格的权限下,选择 LF 标签和权限。
在 LF 标签权限部分,选择授予权限。
对于权限类型,选择 LF 标签键值对权限。
选择 IAM 用户和角色。
对于 IAM 用户和角色,搜索并选择
lf-data-engineer
角色。在 LF 标签部分,添加值为
True
和False
的键Confidential
,以及值为True
的key
Sensitive
。在权限下,为权限和可授予的权限选择描述和关联。
选择授权。
-
接下来,授予
lf-data-engineer
在我们的数据目录和由 AWS CloudFormation 创建的底层 Amazon S3 存储桶上创建数据库的权限。在导航窗格的管理下,选择管理角色和任务。
在数据库创建者部分,选择授权。
对于 IAM 用户和角色,选择
lf-data-engineer
角色。对于目录权限,选择创建数据库。
选择授权。
-
接下来,向
lf-data-engineer
用户授予对 Amazon S3 存储桶(s3://lf-tagbased-demo-
的权限。Account-ID
)在导航窗格中的权限下,选择数据位置。
选择授权。
选择我的账户。
对于 IAM 用户和角色,选择
lf-data-engineer
角色。对于存储位置,输入通过 AWS CloudFormation 模板
(s3://lf-tagbased-demo-
创建的 Amazon S3 存储桶。Account-ID
)选择授权。
-
接下来,授予对与 LF 标签表达式
Confidential=True
关联的资源的可授予权限lf-data-engineer
。在导航窗格的权限下,选择数据湖权限。
选择授权。
选择 IAM 用户和角色。
选择角色
lf-data-engineer
。在 LF 标签或目录资源部分,选择通过 LF 标签匹配的资源。
选择添加 LF 标签键值对。
添加值为
True
的键Confidential
。在数据库权限部分,为数据库权限和可授予的权限选择描述。
在表权限部分,为表权限和可授予的权限选择描述、选择和更改。
选择授权。
-
接下来,授予对与 LF 标签表达式
Confidential=False
关联的资源的可授予权限lf-data-engineer
。在导航窗格的权限下,选择数据湖权限。
选择授权。
选择 IAM 用户和角色。
选择角色
lf-data-engineer
。选择通过 LF 标签匹配的资源。
选择添加 LF 标签。
添加值为
False
的键Confidential
。在数据库权限部分,为数据库权限和可授予的权限选择描述。
在表和列权限 部分,请勿选择任何内容。
选择授权。
-
接下来,授予对与 LF 标签键值对
Confidential=False
和Sensitive=True
关联的资源的可授予权限lf-data-engineer
。在导航窗格的权限下,选择数据权限。
选择授权。
选择 IAM 用户和角色。
选择角色
lf-data-engineer
。在 LF 标签或目录资源部分下,选择通过 LF 标签匹配的资源。
选择添加 LF 标签。
添加值为
False
的键Confidential
。选择添加 LF 标签键值对。
添加值为
True
的键Sensitive
。在数据库权限部分,为数据库权限和可授予的权限选择描述。
在表权限部分,为表权限和可授予的权限选择描述、选择和更改。
选择授权。
第 3 步:创建 Lake Formation 数据库
在这一步,您将创建两个数据库,并将 LF 标签附加到数据库和特定列以进行测试。
创建用于数据库级别访问的数据库和表
-
首先,创建数据库
tag_database
、表source_data
,并附加适当的 LF 标签。在 Lake Formation 控制台(https://console.aws.amazon.com/lakeformation/
)上,在数据目录下选择数据库。 选择创建数据库。
对于名称,请输入
tag_database
。对于位置,输入通过 AWS CloudFormation 模板
(s3://lf-tagbased-demo-
创建的 Amazon S3 位置。Account-ID
/tag_database/)取消选中仅对此数据库中的新表使用 IAM 访问控制。
选择创建数据库。
-
接下来,在
tag_database
中创建一个新表。在数据库页面上,选择数据库
tag_database
。选择查看表,然后单击创建表。
对于名称,请输入
source_data
。对于 Database (数据库),选择
tag_database
数据库。对于表格格式,选择标准 AWS Glue 表格。
对于数据位置,选择我的账户中的指定路径。
在“包含路径”中,输入要通过 AWS CloudFormation 模板
(s3://lf-tagbased-demo
创建的Account-ID
/tag_database/)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 标签。对于值,选择
True
。选择保存。
这样就完成了为 tag_database 数据库进行的 LF 标签分配。
创建用于列级别访问的数据库和表
重复以下步骤创建数据库 col_tag_database
和表 source_data_col_lvl
,并在列级别附加 LF 标签。
在数据库页面上,选择创建数据库。
-
对于名称,请输入
col_tag_database
。 -
对于位置,输入通过 AWS CloudFormation 模板
(s3://lf-tagbased-demo-
创建的 Amazon S3 位置。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 标签关联到列vendorid
和fare_amount
。在表页面上,选择您创建的表
(source_data_col_lvl)
。在操作菜单上,选择架构。
选择列
vendorid
并选择编辑 LF 标签。对于已分配的键,选择区分大小写。
对于值,选择 True。
选择保存。
-
接下来,将
Confidential=False
LF 标签关联到col_tag_database
。这是确保lf-data-analyst
从 Amazon Athena 登录时能够描述数据库col_tag_database
所必需的。在数据库页面上,找到并选择
col_tag_database
。在操作菜单上,选择编辑 LF 标签。
选择分配新的 LF 标签。
对于已分配的键,选择您之前创建的
Confidential
LF 标签。对于值,选择
False
。选择保存。
第 4 步:授予表权限
使用 LF 标签 Confidential
和 Sensitive
向数据分析师授予使用数据库 tag_database
和表 col_tag_database
的权限。
-
按照以下步骤向
lf-data-analyst
用户授予对与 LF 标签Confidential=True
(Database:tag_database)关联的对象的权限,使其拥有对数据库的Describe
权限和对表的Select
权限。通过 https://console.aws.amazon.com/lakeformation/
以 lf-data-engineer
身份登录 Lake Formation 控制台。在权限下,选择数据湖权限。
选择授权。
在主体下,选择 IAM 用户和角色。
对于 IAM 用户和角色,选择
lf-data-analyst
。在 LF 标签或目录资源下,选择通过 LF 标签匹配的资源。
选择添加 LF 标签。
对于键,选择
Confidential
。对于值,选择
True
。对于数据库权限,选择
Describe
。对于表权限,选择选择和描述。
选择授权。
-
接下来,重复这些步骤,向数据分析师授予对
Confidential=False
的 LF 标签表达式的权限。当以lf-data-analyst
身份从 Amazon Athena 登录时,使用此 LF 标签描述col_tag_database
和表source_data_col_lvl
。通过 https://console.aws.amazon.com/lakeformation/
以 lf-data-engineer
身份登录 Lake Formation 控制台。在数据库页面上,选择数据库
col_tag_database
。选择操作和授权。
在主体下,选择 IAM 用户和角色。
对于 IAM 用户和角色,选择
lf-data-analyst
。选择通过 LF 标签匹配的资源。
选择添加 LF 标签。
对于键,选择
Confidential
。对于值,选择
False
。对于数据库权限,选择
Describe
。对于表权限,请勿选择任何内容。
选择授权。
-
接下来,重复这些步骤,向数据分析师授予对
Confidential=False
和Sensitive=True
的 LF 标签表达式的权限。当以lf-data-analyst
身份从 Amazon Athena 登录时,使用此 LF 标签描述col_tag_database
和表source_data_col_lvl
(列级别)。通过 https://console.aws.amazon.com/lakeformation/
以 lf-data-engineer
身份登录 Lake Formation 控制台。在“数据库”页面上,选择数据库
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/)
-
通过 https://console.aws.amazon.com/athena/
以 lf-data-analyst
用户身份登录 Athena 控制台。 在 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
。