

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

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

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

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

本教程中提供了一个用于快速设置所需资源的 Amazon 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 步：清除 Amazon 资源](#cbac-clean-up)

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

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


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

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

在开始学习本教程之前，您必须拥有 Amazon Web Services 账户，以便能够以具有正确权限的管理用户身份登录。有关更多信息，请参阅 [完成初始 Amazon 配置任务](getting-started-setup.md#initial-aws-signup)。

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

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

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

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

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

1.  选择**保存**。

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

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

**创建您的资源**

要使用 Amazon CloudFormation 模板创建这些资源，请按照以下步骤操作。

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

1. 选择[启动堆栈](https://console.amazonaws.cn/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. 对于 **DatabaseName** 和 **TableName**，保留默认值。

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

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

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

1. 选择**创建**。

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

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

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

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

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

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

   以下屏幕截图显示了查询结果。此表只有一个分区 `product_category=Video`，因此每条记录都是对视频产品的评论。  
![\[Query results showing 10 rows of Amazon product reviews for VHS tapes with various ratings.\]](http://docs.amazonaws.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` 列设置基于行的筛选条件。  
![\[Query results showing marketplace data with total counts for FR, UK, JP, DE, and US.\]](http://docs.amazonaws.cn/lake-formation/latest/dg/images/cbac-tut-query-results2.jpg)

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

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

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

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

   1. 在美国东部（弗吉尼亚州北部）区域通过 [https://console.aws.amazon.com/lakeformation/](https://console.amazonaws.cn/lakeformation/) 以 `DatalakeAdmin` 用户身份登录 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. 通过 [https://console.aws.amazon.com/athena/](https://console.amazonaws.cn/athena/home) 以 `DataAnalystUS` 用户身份登录 Athena 控制台。

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

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

   以下屏幕截图显示了查询结果。  
![\[Query results showing 10 rows of Amazon product reviews data, including marketplace, ratings, and product titles.\]](http://docs.amazonaws.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 步：清除 Amazon 资源
<a name="cbac-clean-up"></a>

**清理资源**

为帮助避免您的 Amazon Web Services 账户产生不必要的费用，您可以删除您在本教程中使用的 Amazon 资源。
+ [删除 Cloud Formation 堆栈](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)。