

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

# 使用行级别访问控制保护数据湖
<a name="cbac-tutorial"></a>

AWS Lake Formation 行级权限允许您根据数据合规性和治理策略提供对表中特定行的访问权限。如果您有一些存储着数十亿条记录的大型表，则需要一种方法来使不同的用户和团队仅能访问允许他们查看的数据。行级别访问控制是一种简单而高效的数据保护方法，同时允许用户访问他们执行工作所需的数据。Lake Formation 通过识别哪些主体访问了哪些数据、何时以及通过哪些服务访问的，从而提供集中式审计与合规性报告。

在本教程中，您将了解行级别访问控制在 Lake Formation 中的工作原理，以及如何设置这种访问控制。

本教程包含一个用于快速设置所需资源的 AWS CloudFormation 模板。您可以查看和自定义该模板来满足自己的需求。

**Topics**
+ [目标受众](#tut-cbac-roles-tutorial)
+ [先决条件](#tut-cbac-prereqs)
+ [第 1 步：调配资源](#set-up-cbac-resources)
+ [第 2 步：在不使用数据筛选条件的情况下进行查询](#query-without-filters)
+ [第 3 步：设置数据筛选条件并授予权限](#setup-data-filters)
+ [第 4 步：使用数据筛选条件进行查询](#query-with-filters)
+ [步骤 5：清理 AWS 资源](#cbac-clean-up)

## 目标受众
<a name="tut-cbac-roles-tutorial"></a>

本教程适用于数据管家、数据工程师和数据分析师。下表列出了数据所有者和数据使用者的角色和责任。


|  角色 | 说明 | 
| --- | --- | 
| IAM 管理员 | 可以创建用户和角色以及 Amazon Simple Storage Service (Amazon S3) 存储桶的用户。有AdministratorAccess AWS 托管策略。 | 
| 数据湖管理员 | 负责设置数据湖、创建数据筛选条件以及向数据分析师授予权限的用户。 | 
| 数据分析人员 | 可以对数据湖运行查询的用户。居住在不同国家/地区（在我们的使用案例中，为美国和日本）的数据分析师只能为位于自己国家/地区的客户分析商品评论，并且，出于合规性原因，他们应该无法看到其他国家/地区的客户的数据。 | 

## 先决条件
<a name="tut-cbac-prereqs"></a>

在开始本教程之前，你必须有一个 AWS 账户 可以用来以具有正确权限的管理用户身份登录的。有关更多信息，请参阅 [完成初始 AWS 配置任务](getting-started-setup.md#initial-aws-signup)。

本教程假定您熟悉 IAM。有关 IAM 的信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)。

**更改 Lake Formation 设置**
**重要**  
在启动 CloudFormation 模板之前，请按照以下步骤禁用 “**仅对 Lake Formation 中的新数据库/表使用 IAM 访问控制**” 选项：

1. 在美国东部（弗吉尼亚北部）地区或美国西部（俄勒冈）地区登录 Lake Formation 控制台。[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)

1. 在数据目录下，选择**设置**。

1. 取消选择**仅对新数据库使用 IAM 访问控制**和**仅对新数据库中的新表使用 IAM 访问控制**。

1.  选择**保存**。

## 第 1 步：调配资源
<a name="set-up-cbac-resources"></a>

本教程包括一个用于快速设置的 CloudFormation 模板。您可以查看和自定义该模板来满足自己的需求。该 CloudFormation 模板生成以下资源：
+ 以下用户及其策略：
  + DataLakeAdmin
  + DataAnalyst美国
  + DataAnalystJP
+ Lake Formation 数据湖设置和权限
+ 一个 Lambda 函数（用于 Lambda 支持的 CloudFormation 自定义资源），用于将示例数据文件从公共 Amazon S3 存储桶复制到您的 Amazon S3 存储桶
+ 用作数据湖的 Amazon S3 存储桶
+  AWS Glue Data Catalog 数据库、表和分区

**创建您的资源**

按照以下步骤使用 CloudFormation 模板创建您的资源。

1. 在美国东部（弗吉尼亚北部）区域的 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 登录 CloudFormation 控制台。

1. 选择[启动堆栈](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/create?templateURL=https://aws-bigdata-blog.s3.amazonaws.com/artifacts/lakeformation_row_security/lakeformation_tutorial_row_security.yaml)。

1. 在**创建堆栈**屏幕上，选择**下一步**。

1. 输入**堆栈名称**。

1. 对于**DatalakeAdminUserName**和 **DatalakeAdminUserPassword**，请为数据湖管理员用户输入您的 IAM 用户名和密码。

1. 对于**DataAnalystUsUserName**和 **DataAnalystUsUserPassword**，为负责美国市场的数据分析师用户输入您想要的用户名和密码。

1. 对于**DataAnalystJpUserName**和 **DataAnalystJpUserPassword**，为负责日本市场的数据分析师用户输入所需的用户名和密码。

1. 对于 **DataLakeBucketName**，请输入您的数据存储桶的名称。

1. fo **DatabaseName**r，然后**TableName**保留为默认值。

1. 选择**下一步**。

1. 在下一页上，选择**下一步**。

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

1. 选择**创建**。

   堆栈创建可能需要一分钟才能完成。

## 第 2 步：在不使用数据筛选条件的情况下进行查询
<a name="query-without-filters"></a>

设置环境后，您可以查询商品评论表。首先在没有行级别访问控制的情况下查询表，以确保您可以看到数据。如果您是首次在 Amazon Athena 中运行查询，则需要配置查询结果位置。

**在没有行级别访问控制的情况下查询表**

1. 以`DatalakeAdmin`用户[https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)身份登录Athena控制台，然后运行以下查询：

   ```
   SELECT * 
   FROM lakeformation_tutorial_row_security.amazon_reviews
   LIMIT 10
   ```

   以下屏幕截图显示了查询结果。此表只有一个分区 `product_category=Video`，因此每条记录都是对视频产品的评论。  
![显示亚马逊商品评论的查询结果表，其中包含商城、买家编号、评论编号、商品详情、评分和投票等列。](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/cbac-tut-query-results1.jpg)

1. 接下来，运行聚合查询以检索每个 `marketplace` 的记录总数。

   ```
   SELECT marketplace, count(*) as total_count
   FROM lakeformation_tutorial_row_security.amazon_reviews
   GROUP BY marketplace
   ```

   以下屏幕截图显示了查询结果。`marketplace` 列中有五个不同的值。在后续步骤中，您将使用 `marketplace` 列设置基于行的筛选条件。  
![查询结果显示了包含五个值的商城列：法国、英国、日本、德国和美国（含计数）。](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/cbac-tut-query-results2.jpg)

## 第 3 步：设置数据筛选条件并授予权限
<a name="setup-data-filters"></a>

本教程使用了两位数据分析师：一位负责分析美国市场，另一位负责分析日本市场。每位分析师仅使用 Athena 分析其特定市场的客户评价。创建两个不同的数据筛选条件，一个供负责分析美国市场的分析师使用，另一个供负责分析日本市场的分析师使用。然后，授予分析师相应的权限。

**创建数据筛选条件并授予权限**

1. 创建筛选条件以限制对 `US``marketplace` 数据的访问。

   1. 以`DatalakeAdmin`用户身份登录位于[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)美国东部（弗吉尼亚北部）地区的 Lake Formation 控制台。

   1. 选择**数据筛选条件**。

   1. 选择**创建新筛选条件**。

   1. 对于**数据筛选条件名称**，输入 `amazon_reviews_US`。

   1. 对于**目标数据库**，选择数据库 `lakeformation_tutorial_row_security`。

   1. 对于**目标表**，选择表 `amazon_reviews`。

   1.  对于**列级别访问权限**，保留默认值。

   1. 对于**行筛选表达式**，输入 `marketplace='US'`。

   1.  选择**创建筛选条件**。

1. 创建筛选条件以限制对日本 `marketplace` 数据的访问。

   1. 在**数据筛选条件**页面上，选择**创建新筛选条件**。

   1. 对于**数据筛选条件名称**，输入 `amazon_reviews_JP`。

   1. 对于**目标数据库**，选择数据库 `lakeformation_tutorial_row_security`。

   1.  对于**目标表**，选择 `table amazon_reviews`。

   1. 对于**列级别访问权限**，保留默认值。

   1. 对于“行筛选表达式”，输入 `marketplace='JP'`。

   1.  选择**创建筛选条件**。

1. 接下来，使用这些数据筛选条件向数据分析师授予权限。按照以下步骤向美国数据分析师 (`DataAnalystUS`) 授予权限：

   1. 在**权限**下，选择**数据湖权限**。

   1. 在**数据权限**下，选择**授权**。

   1. 对于**主体**，选择 **IAM 用户和角色**，然后选择角色 `DataAnalystUS`。

   1.  对于 **LF 标签或目录资源**，选择**命名数据目录资源**。

   1. 对于 **Database (数据库)**，请选择 `lakeformation_tutorial_row_security`。

   1.  对于**可选表**，选择 `amazon_reviews`。

   1. 对于**数据筛选条件 — 可选**，选择 `amazon_reviews_US`。

   1. 对于**数据筛选条件权限**，选择**选择**。

   1. 选择**授权**。

1. 按照以下步骤向日本数据分析师 (`DataAnalystJP`) 授予权限：

   1. 在**权限**下，选择**数据湖权限**。

   1. 在**数据权限**下，选择**授权**。

   1. 对于**主体**，选择 **IAM 用户和角色**，然后选择角色 `DataAnalystJP`。

   1.  对于 **LF 标签或目录资源**，选择**命名数据目录资源**。

   1. 对于 **Database (数据库)**，请选择 `lakeformation_tutorial_row_security`。

   1.  对于**可选表**，选择 `amazon_reviews`。

   1. 对于**数据筛选条件 — 可选**，选择 `amazon_reviews_JP`。

   1. 对于**数据筛选条件权限**，选择**选择**。

   1. 选择**授权**。

## 第 4 步：使用数据筛选条件进行查询
<a name="query-with-filters"></a>

将数据筛选条件附加到商品评论表后，运行一些查询，看一看 Lake Formation 是如何强制实施权限的。

1. 以用户身份登录 Athena 控制台[https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)。`DataAnalystUS`

1. 运行以下查询以检索一些记录，对于这些记录，是根据我们定义的行级别权限进行筛选的：

   ```
   SELECT * 
   FROM lakeformation_tutorial_row_security.amazon_reviews
   LIMIT 10
   ```

   以下屏幕截图显示了查询结果。  
![显示亚马逊商品评论的查询结果表，其中包含商城、买家编号、评论编号、商品详情和评分列。](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/cbac-tut-query-results3.png)

1. 同样，运行查询以统计每个市场的记录总数。

   ```
   SELECT marketplace , count ( * ) as total_count
   FROM lakeformation_tutorial_row_security .amazon_reviews
   GROUP BY marketplace
   ```

   查询结果中仅显示 `marketplace` `US`。这是因为只允许用户查看 `marketplace` 列值等于 `US` 的行。

1. 切换到 `DataAnalystJP` 用户并运行相同的查询。

   ```
   SELECT * 
   FROM lakeformation_tutorial_row_security.amazon_reviews
   LIMIT 10
   ```

   查询结果仅显示属于 `JP``marketplace` 的记录。

1. 运行查询来统计每个 `marketplace` 的记录总数。

   ```
   SELECT marketplace, count(*) as total_count
   FROM lakeformation_tutorial_row_security.amazon_reviews
   GROUP BY marketplace
   ```

   查询结果仅显示属于 `JP``marketplace` 的行。

## 步骤 5：清理 AWS 资源
<a name="cbac-clean-up"></a>

**清理资源**

为了防止向你收取不必要的费用 AWS 账户，你可以删除用于本教程的 AWS 资源。
+ [删除 Cloud Formation 堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)。