使用 Lake Formation 基于标签的访问控制管理数据湖 - AWS Lake Formation

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 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:

  1. 数据管家使用以下两个 LF 标签定义标签本体:ConfidentialSensitive。带有 Confidential=True 的数据具有更严格的访问控制。带有 Sensitive=True 的数据需要分析师进行具体分析。

  2. 数据管家为数据工程师分配不同级别的权限,以便他们使用不同 LF 标签构建表。

  3. 数据工程师构建了两个数据库:tag_databasecol_tag_databasetag_database 中的所有表都配有 Confidential=Truecol_tag_database 中的所有表都配有 Confidential=Falsecol_tag_database 中表的一些列带有 Sensitive=True 标签,以满足特定的分析需求。

  4. 数据工程师使用特定表达式条件 Confidential=True 以及 Confidential=FalseSensitive=True 向分析人员授予对表的读取权限。

  5. 通过这种配置,数据分析师可以专注于使用正确的数据执行分析。

目标受众

本教程适用于数据管家、数据工程师和数据分析师。在 Lake Formation 中 AWS Glue Data Catalog 管理和管理权限时,生产账户中的数据管理员根据其支持的职能拥有功能所有权,并且可以向各种消费者、外部组织和账户授予访问权限。

下表列出了本教程中使用的角色:

角色 描述
数据管家(管理员) lf-data-steward 用户拥有以下访问权限:
  • 对数据目录中所有资源的读取权限

  • 可以创建 LF 标签并将其关联到数据工程师角色,以便向其他主体授予可授予权限

数据工程师

lf-data-engineer 用户具有以下访问权限:

  • 对数据目录中所有资源的完整读取、写入和更新权限

  • 数据湖中的数据位置权限

  • 可以关联 LF 标签并将其关联到数据目录

  • 可以将 LF 标签附加到资源,从而根据数据管家创建的所有策略为主体提供访问权限

数据分析人员 lf-data-analyst 用户拥有以下访问权限:
  • 对通过 Lake Formation 基于标签的访问策略共享的资源的精细访问权限

先决条件

在开始本教程之前,你必须有一个 AWS 账户 可以用来以具有正确权限的管理用户身份登录的。有关更多信息,请参阅 完成初始 AWS 配置任务

本教程假设你熟悉IAM。有关的信息IAM,请参阅《IAM用户指南》

第 1 步:调配资源

本教程包括一个用于快速设置的 AWS CloudFormation 模板。您可以查看和自定义该模板来满足自己的需求。该模板创建了三个不同的角色(列在中目标受众)来执行本练习,并将 nyc-taxi-data 数据集复制到您的本地 Amazon S3 存储桶。

  • 一个 Amazon S3 存储桶

  • 适当的 Lake Formation 设置

  • 相应的 Amazon EC2 资源

  • 三个带有凭证的IAM角色

创建您的资源
  1. 在美国东部(弗吉尼亚北部)区域的 https://console.aws.amazon.com/cloudformation 登录 AWS CloudFormation 控制台。

  2. 选择启动堆栈

  3. 选择下一步

  4. 用户配置部分,为以下三个角色输入密码:DataStewardUserPasswordDataEngineerUserPasswordDataAnalystUserPassword

  5. 查看最后一页上的详细信息,然后选择我确认这 AWS CloudFormation 可能会创建IAM资源

  6. 选择创建

    堆栈创建可能最多需要五分钟时间才能完成。

注意

完成本教程后,您可能需要删除中的堆栈 AWS CloudFormation ,以免继续产生费用。根据堆栈的事件状态验证是否已成功删除资源。

第 2 步:注册您的数据位置、创建 LF-Tag 本体并授予权限

在此步骤中,数据管家用户使用两个 LF 标签定义标签本体:ConfidentialSensitive,并允许特定IAM委托人将新创建的 LF 标签附加到资源。

注册数据位置并定义 LF-Tag 本体
  1. 以数据管家用户 (lf-data-steward) 的身份执行第一步,验证 Amazon S3 及 Lake Formation 中数据目录中的数据。

    1. 使用部署 AWS CloudFormation 堆栈时使用的密码登录 L https://console.aws.amazon.com/lakeformation/ak lf-data-steward e Formation 控制台。

    2. 在导航窗格中的权限下,选择管理角色和任务

    3. 在 “数据湖管理员” 部分选择添加

    4. 添加管理员页面上,为IAM用户和角色选择用户lf-data-steward

    5. 选择保存以添加 lf-data-steward 作为 Lake Formation 管理员。

  2. 接下来,更新数据目录设置以使用 Lake Formation 权限来控制目录资源,而不是IAM基于基础的访问控制。

    1. 在导航窗格中的管理下,选择数据目录设置

    2. 取消选中仅对新数据库使用IAM访问控制

    3. 取消选中仅对新数据库中的新表使用IAM访问控制

    4. 单击保存

  3. 接下来,注册数据湖的数据位置。

    1. 在导航窗格的管理下,选择数据湖位置

    2. 选择注册位置

    3. 注册位置页面上,在 Amazon S3 路径中输入s3://lf-tagbased-demo-Account-ID

    4. 对于IAM角色,请保持默认值AWSServiceRoleForLakeFormationDataAccess不变。

    5. 选择 Lake Formation 作为权限模式。

    6. 选择注册位置

  4. 接下来,通过定义 LF 标签来创建本体。

    1. 在导航窗格的 “权限” 下,选择 LF 标签和权限。 。

    2. 选择添加 LF 标签

    3. 对于,输入 Confidential

    4. 对于,添加 TrueFalse

    5. 选择添加 LF 标签

    6. 重复上述步骤,使用该值创建 LF-T Sensitive agTrue

    您已经为本练习创建了所有必需的 LF 标签。

向IAM用户授予权限
  1. 接下来,让特定的IAM委托人能够将新创建的 LF 标签附加到资源。

    1. 在导航窗格的 “权限” 下,选择 LF 标签和权限。

    2. LF-tag 权限部分,选择授予权限。

    3. 对于权限类型,选择 LF-tag 键值对权限。

    4. 选择IAM用户和角色

    5. 对于IAM用户和角色,搜索并选择lf-data-engineer角色。

    6. LF-Tags 部分中,添加Confidential带有值True和的密钥和 False with key Sensitive 值。True

    7. 在 “权限” 下,为 “权限” 和 “可授予权限” 选择 “描述关联

    8. 选择授权

  2. 接下来,授lf-data-engineer予在我们的数据目录和由创建的底层 Amazon S3 存储桶上创建数据库的权限 AWS CloudFormation。

    1. 在导航窗格的管理下,选择管理角色和任务

    2. 数据库创建者部分,选择授权

    3. 对于IAM用户和角色,请选择lf-data-engineer角色。

    4. 对于目录权限,选择创建数据库

    5. 选择授权

  3. 接下来,向 lf-data-engineer 用户授予对 Amazon S3 存储桶 (s3://lf-tagbased-demo-Account-ID) 的权限。

    1. 在导航窗格中的权限下,选择数据位置

    2. 选择授权

    3. 选择我的账户

    4. 对于IAM用户和角色,请选择lf-data-engineer角色。

    5. 对于存储位置,请输入由 AWS CloudFormation 模板创建的 Amazon S3 存储桶(s3://lf-tagbased-demo-Account-ID)

    6. 选择授权

  4. 接下来,对与 LF- Tag 表达lf-data-engineer式关联的资源授予可授予权限。Confidential=True

    1. 在导航窗格的权限下,选择数据湖权限

    2. 选择授权

    3. 选择IAM用户和角色

    4. 选择角色 lf-data-engineer

    5. LF 标签或目录资源部分中,选择与 LF 标签匹配的资源

    6. 选择添加 LF-Tag 键值对

    7. 添加值为 True 的键 Confidential

    8. 数据库权限部分,为数据库权限可授予的权限选择描述

    9. 表权限部分中,为权限和可授予权限选择描述、选择更改

    10. 选择授权

  5. 接下来,对与 LF-Tag 表达lf-data-engineer式关联的资源授予可授予权限。Confidential=False

    1. 在导航窗格的权限下,选择数据湖权限

    2. 选择授权

    3. 选择IAM用户和角色

    4. 选择角色 lf-data-engineer

    5. 选择通过 LF 标签匹配的资源

    6. 选择添加 LF 标签

    7. 添加值为 False 的键 Confidential

    8. 数据库权限部分,为数据库权限可授予的权限选择描述

    9. 表和列权限 部分,请勿选择任何内容。

    10. 选择授权

  6. 接下来,我们为与 LF-Tag 键值对关联的资源授lf-data-engineer予可授予的权限,以及。Confidential=False Sensitive=True

    1. 在导航窗格的权限下,选择数据权限

    2. 选择授权

    3. 选择IAM用户和角色

    4. 选择角色 lf-data-engineer

    5. LF 标签或目录资源部分下,选择与 LF 标签匹配的资源

    6. 选择添加 LF 标签

    7. 添加值为 False 的键 Confidential

    8. 选择添加 LF-Tag 键值对

    9. 添加值为 True 的键 Sensitive

    10. 数据库权限部分,为数据库权限可授予的权限选择描述

    11. 表权限部分中,为权限和可授予权限选择描述、选择更改

    12. 选择授权

第 3 步:创建 Lake Formation 数据库

在此步骤中,您将创建两个数据库,并将 LF-Tag 附加到数据库和特定列以进行测试。

创建用于数据库级别访问的数据库和表
  1. 首先,创建数据库tag_database、表source_data,并附加相应的 LF 标签。

    1. 在 Lake Formation 控制台 (https://console.aws.amazon.com/lakeformation/) 上的 “数据目录” 下,选择 “数据库”。

    2. 选择创建数据库

    3. 对于名称,请输入 tag_database

    4. 位置栏中,输入由 AWS CloudFormation 模板创建的 Amazon S3 地点(s3://lf-tagbased-demo-Account-ID/tag_database/)

    5. 取消选择 “仅对该数据库中的新表使用IAM访问控制”。

    6. 选择创建数据库

  2. 接下来,在 tag_database 中创建一个新表。

    1. 数据库页面上,选择数据库 tag_database

    2. 选择查看表,然后单击创建表

    3. 对于名称,请输入 source_data

    4. 对于 Database (数据库),选择 tag_database 数据库。

    5. 对于表格格式,选择标准 AWS Glue 表格

    6. 对于数据位置,选择我的账户中的指定路径

    7. 在包含路径中,输入 AWS CloudFormation 模板要tag_database创建的路径(s3://lf-tagbased-demoAccount-ID/tag_database/)

    8. 对于数据格式,选择 CSV

    9. 在 “上传架构” 下,输入以下列结构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" } ]
    10. 选择上传。上传架构后,表架构看上去应如以下屏幕截图所示:

      Table schema with 18 columns showing column names and data types, all set to string.
    11. 选择提交

  3. 接下来,在数据库级别附加 LF 标签。

    1. 数据库页面上,找到并选择 tag_database

    2. 在 “操作” 菜单上,选择 “编辑 LF 标签”

    3. 选择分配新的 LF 标签

    4. 对于分配的密钥,请选择您之前创建的 Confidential LF-Tag。

    5. 对于,选择 True

    6. 选择保存

    这样就完成了对 tag_database 数据库的 LF-Tag 赋值。

创建用于列级别访问的数据库和表

重复以下步骤创建数据库col_tag_database和表source_data_col_lvl,并在列级别附加 LF-Tag。

  1. 数据库页面上,选择创建数据库

  2. 对于名称,请输入 col_tag_database

  3. 位置栏中,输入由 AWS CloudFormation 模板创建的 Amazon S3 地点(s3://lf-tagbased-demo-Account-ID/col_tag_database/)

  4. 取消选择 “仅对该数据库中的新表使用IAM访问控制”。

  5. 选择创建数据库

  6. 数据库页面上,选择您的新数据库 (col_tag_database)

  7. 选择 “查看表”,然后单击 “创建表”。

  8. 对于名称,请输入 source_data_col_lvl

  9. 对于数据库,选择您的新数据库 (col_tag_database)

  10. 对于表格格式,选择标准 AWS Glue 表格

  11. 对于数据位置,选择我的账户中的指定路径

  12. 输入 col_tag_database (s3://lf-tagbased-demo-Account-ID/col_tag_database/) 的 Amazon S3 路径。

  13. 对于数据格式,选择 CSV

  14. 在下方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" } ]
  15. 选择Upload。上传架构后,表架构看上去应如以下屏幕截图所示:

    Table schema with 18 columns showing column names and data types, all set to string.
  16. 选择提交以完成表的创建。

  17. 现在,将 Sensitive=True LF-Tag 关联到列和vendoridfare_amount

    1. 页面上,选择您创建的表 (source_data_col_lvl)

    2. 在 “操作” 菜单上,选择 “架构”。

    3. 选择该列vendorid并选择 “编辑 LF 标签”

    4. 对于已分配的键,选择区分大小写

    5. 对于,选择 True

    6. 选择保存

  18. 接下来,将 Confidential=False LF-Tag 关联到。col_tag_database这是在登录col_tag_databaself-data-analyst能够描述数据库所必需的 Amazon Athena。

    1. 数据库页面上,找到并选择 col_tag_database

    2. 在 “操作” 菜单上,选择 “编辑 LF 标签”

    3. 选择分配新的 LF 标签

    4. 对于分配的密钥,请选择您之前创建的 Confidential LF-Tag。

    5. 对于,选择 False

    6. 选择保存

第 4 步:授予表权限

使用 LF 标签 ConfidentialSensitive 向数据分析师授予使用数据库 tag_database 和表 col_tag_database 的权限。

  1. 按照以下步骤向lf-data-analyst用户授予对与 LF-Tag Confidential=True (database: tag_Database) 关联的对象的权限,使其拥有Describe数据库和对表的权限。Select

    1. 登录 Lake Formation 控制台,网址https://console.aws.amazon.com/lakeformation/lf-data-engineer

    2. 在 “权限” 下,选择 “数据湖权限”。

    3. 选择授权

    4. 在 “委托人” 下,选择IAM用户和角色。

    5. 对于IAM用户和角色,选择lf-data-analyst

    6. LF 标签或目录资源下,选择与 LF 标签匹配的资源

    7. 选择添加 LF 标签

    8. 对于,选择 Confidential

    9. 对于,选择 True

    10. 对于数据库权限,选择 Describe

    11. 对于表权限,选择选择描述

    12. 选择授权

  2. 接下来,重复这些步骤,向数据分析师授予使用 LF-Tag 表达式的权限。Confidential=False当以 lf-data-analyst 身份从 Amazon Athena 登录时,使用此 LF 标签描述 col_tag_database 和表 source_data_col_lvl

    1. 登录 Lake Formation 控制台,网址https://console.aws.amazon.com/lakeformation/lf-data-engineer

    2. 数据库页面上,选择数据库 col_tag_database

    3. 选择操作授权

    4. 在 “委托人” 下,选择IAM用户和角色。

    5. 对于IAM用户和角色,选择lf-data-analyst

    6. 选择与 LF 标签匹配的资源

    7. 选择添加 LF 标签

    8. 对于,选择 Confidential

    9. 对于,选择 False

    10. 对于数据库权限,选择 Describe

    11. 对于表权限,请勿选择任何内容。

    12. 选择授权

  3. 接下来,重复上述步骤,向数据分析师授予和的 LF-Tag 表达式的Confidential=False权限。Sensitive=True当以 lf-data-analyst 身份从 Amazon Athena 登录时,使用此 LF 标签描述 col_tag_database 和表 source_data_col_lvl(列级别)。

    1. 登录 Lake Formation 控制台 https://console.aws.amazon.com/lakeformation/,网址为 lf-data-engineer

    2. 在“数据库”页面上,选择数据库 col_tag_database

    3. 选择操作授权

    4. 在 “委托人” 下,选择IAM用户和角色。

    5. 对于IAM用户和角色,选择lf-data-analyst

    6. 选择与 LF 标签匹配的资源

    7. 选择添加 LF 标签

    8. 对于,选择 Confidential

    9. 对于,选择 False

    10. 选择添加 LF 标签

    11. 对于,选择 Sensitive

    12. 对于,选择 True

    13. 对于数据库权限,选择 Describe

    14. 对于表权限,选择 SelectDescribe

    15. 选择授权

第 5 步:在 Amazon Athena 中运行查询以验证权限

在这一步,使用 Amazon Athena 对两个表 (source_data and source_data_col_lvl) 运行 SELECT 查询。使用 Amazon S3 路径作为查询结果位置 (s3://lf-tagbased-demo-Account-ID/athena-results/)

  1. 登录Athena控制台,网址为. https://console.aws.amazon.com/athena/lf-data-analyst

  2. 在 Athena 查询编辑器中,在左侧面板中选择 tag_database

  3. 选择 source_data 旁边的其他菜单选项图标(三个竖点),然后选择预览表

  4. 选择运行查询

    查询可能需要几分钟时间才能运行。查询显示了输出中的所有列,因为 LF 标签是在数据库级别关联的,并且 source_data 表会自动从数据库 tag_database 继承 LF-tag

  5. 使用col_tag_databasesource_data_col_lvl 运行另一个查询。

    第二个查询返回标记为 Non-ConfidentialSensitive 的两个列。

  6. 您还可以查看您未获得策略授权的列上的 Lake Formation 基于标签的访问策略行为。当从表 source_data_col_lvl 中选择未标记的列时,Athena 会返回错误。例如,您可以运行以下查询来选择未标记的列 geolocationid

    SELECT geolocationid FROM "col_tag_database"."source_data_col_lvl" limit 10;

步骤 6:清理 AWS 资源

为了防止向你收取不必要的费用 AWS 账户,你可以删除用于本教程的 AWS 资源。

  1. lf-data-engineer 身份登录 Lake Formation 控制台并删除数据库 tag_databasecol_tag_database

  2. 接下来,以 lf-data-steward 身份登录并清除上面授予 lf-data-engineerlf-data-analyst. 的所有 LF 标签权限数据权限数据位置权限

  3. 使用您用于部署 AWS CloudFormation 堆栈的IAM证书,以账户所有者的身份登录 Amazon S3 控制台。

  4. 删除以下存储桶:

    • lf-tagbased-demo-accesslogs-acct-id

    • lf-tagbased-demo-acct-id

  5. 通过 https://console.aws.amazon.com/cloudformation 登录 AWS CloudFormation 控制台,然后删除您创建的堆栈。等待堆栈状态变为 DELETE_COMPLETE