

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

# Lake Formation 基于标签的访问控制
<a name="tag-based-access-control"></a>

Lake Formation 基于标签的访问控制 (LF-TBAC) 是一种基于属性定义权限的授权策略。在 Lake Formation 中，这些属性被称为“LF 标签”。**您可以将 LF 标签附加到数据目录资源，并使用这些 LF 标签向 Lake Formation 主体授予对这些资源的权限。当主体已获授权，可以访问与资源标签值匹配的标签值时，Lake Formation 允许对这些资源执行操作。

LF-TBAC 在快速增长的环境中非常有用，并在策略管理变得繁琐的情况下可以提供帮助。

当有大量 Data Catalog 对象（包括联合目录、数据库、表和视图）时，建议使用 LF-TBAC 方法来授予 Lake Formation 权限。Lake Formation 支持对亚马逊 S3 表、 Amazon Redshift 数据仓库和联合数据源（例如 SQL Server 和 Snowflake）的联合目录进行基于标签的访问控制。 Amazon DynamoDB

**注意**  
IAM 标签与 LF 标签不同。这些标签不可互换。LF 标签用于授予 Lake Formation 权限，而 IAM 标签用于定义 IAM 策略。

## Lake Formation 基于标签的访问控制的工作原理
<a name="how-TBAC-works"></a>

每个 LF 标签都是一个键值对，例如 `department=sales` 或 `classification=restricted`。一个键可以有多个定义的值，例如 `department=sales,marketing,engineering,finance`。

要使用 LF-TBAC 方法，数据湖管理员和数据工程师需要执行以下任务。


| Task | 任务详细信息 | 
| --- | --- | 
|  1. 定义 LF 标签的属性和关系。  | - | 
|  2. 在 Lake Formation 中创建 LF 标签创建者。  | [添加 LF 标签创建者](TBAC-adding-tag-creator.md) | 
|  3. 在 Lake Formation 中创建 LF 标签。  | [创建 LF 标签](TBAC-creating-tags.md) | 
|  4. 将 LF 标签分配给数据目录资源。  | [将 LF 标签分配给数据目录资源](TBAC-assigning-tags.md) | 
|  5. 向其他主体授予权限以将 LF 标签分配给资源，也可以使用授予选项。  | [管理 LF 标签值权限](TBAC-granting-tags.md) | 
|  6. 向主体授予 LF 标签表达式，也可以使用授予选项。  | [使用 LF-TBAC 方法授予数据湖权限](granting-catalog-perms-TBAC.md) | 
|  7. （推荐）通过 LF-TBAC 方法验证主体是否有权访问正确的资源后，撤销使用命名资源方法授予的权限。  | - | 

请考虑以下情况：您必须向三个主体授予对三个数据库和七个表的权限。

![\[左侧是三个用户的图形，垂直排列。右侧是三个标为 A、B 和 C 的数据库，垂直排列。数据库 A 有两个标为 A.1 和 A.2 的表，数据库 B 有两个标为 B.1 和 B.2 的表，数据库 C 有三个标为 C.1、C.2 和 C.3 的表。17 个箭头将用户与数据库和表连接起来，表示向用户授予对数据库和表的权限。\]](http://docs.amazonaws.cn/lake-formation/latest/dg/images/TBAC_example_discreet.png)


要使用命名资源方法实现上图中指示的权限，您必须进行 17 次授予，如下所示（使用伪代码）。

```
GRANT CREATE_TABLE ON Database A TO PRINCIPAL 1
GRANT SELECT, INSERT ON Table A.1 TO PRINCIPAL 1
GRANT SELECT, INSERT ON Table A.2 TO PRINCIPAL 1
GRANT SELECT, INSERT ON Table B.2 TO PRINCIPAL 1
...
GRANT SELECT, INSERT ON Table A.2 TO PRINCIPAL 2
GRANT CREATE_TABLE ON Database B TO PRINCIPAL 2
...
GRANT SELECT, INSERT ON Table C.3 TO PRINCIPAL 3
```

现在考虑如何使用 LF-TBAC 授予权限。下图表明您已将 LF 标签分配给数据库和表，并已向主体授予对 LF 标签的权限。

在此示例中，LF 标签表示数据湖中包含企业资源规划 (ERP) 应用程序套件不同模块的分析的区域。您可以通过访问控制来控制对各个模块的分析数据的访问。所有 LF 标签均具有键 `module` 和可能的值 `Sales`、`Orders` 和 `Customers`。LF 标签示例如下所示：

```
module=Sales
```

该图仅显示 LF 标签值。

![\[与上图一样，左侧是垂直排列的三个用户的图形，右侧是垂直排列的三个标为 A、B 和 C 的数据库。数据库 A 有两个标为 A.1 和 A.2 的表，数据库 B 有两个标为 B.1 和 B.2 的表，数据库 C 有三个标为 C.1、C.2 和 C.3 的表。用户与数据库和表之间没有箭头。取而代之的是，用户旁边标有“标志”表示用户 1 已被授予 LF 标签 Sales 和 Customers，用户 2 已被授予 LF 标签 Orders，用户 3 已被授予 LF 标签“Customers”。数据库和表旁边的标志表示对数据库和表的以下 LF 标签分配：数据库 A：Sales。表 A1：灰显标志表示 Sales 继承自数据库 A。表 A2：Orders，但灰显标志表示 Sales 继承自数据库 A。数据库 B：Orders。表 B.1 和 B.2 继承 Orders，表 B.2 具有 Customers。数据库 C 具有 Customers，表 C.1、C.2 和 C.3 继承 Customers。C 表没有任何其他分配。\]](http://docs.amazonaws.cn/lake-formation/latest/dg/images/TBAC_example_tags.png)


**对数据目录资源和继承的标签分配**  
表从数据库继承 LF 标签，列从表继承 LF 标签。继承的值可以被覆盖。在上图中，继承了灰显 LF 标签。

由于继承，数据湖管理员只需对资源进行以下五个 LF 标签分配（使用伪代码）。

```
ASSIGN TAGS module=Sales TO database A
ASSIGN TAGS module=Orders TO table A.2
ASSIGN TAGS module=Orders TO database B
ASSIGN TAGS module=Customers TO table B.2
ASSIGN TAGS module=Customers TO database C
```

**标记向主体的授予**  
将 LF 标签分配给数据库和表后，数据湖管理员必须仅向主体授予 4 个 LF 标签，如下所示（使用伪代码）。

```
GRANT TAGS module=Sales TO Principal 1
GRANT TAGS module=Customers TO Principal 1
GRANT TAGS module=Orders TO Principal 2
GRANT TAGS module=Customers TO Principal 3
```

现在，具有 `module=Sales` LF 标签的主体可以访问带有 `module=Sales` LF 标签的数据目录资源（例如，数据库 A），具有 `module=Customers` LF 标签的主体可以访问带有 `module=Customers` LF 标签的资源，依此类推。

上述授予命令不完整。这是因为，尽管它们通过 LF 标签指示主体对其具有权限的数据目录资源，但它们并未准确指示主体对这些资源具有哪些 Lake Formation 权限（例如 `SELECT`、`ALTER`）。因此，以下伪代码命令更准确地表示了如何通过 LF 标签授予对数据目录资源的 Lake Formation 权限。

```
GRANT (CREATE_TABLE ON DATABASES) ON TAGS module=Sales TO Principal 1
GRANT (SELECT, INSERT ON TABLES)  ON TAGS module=Sales TO Principal 1
GRANT (CREATE_TABLE ON DATABASES) ON TAGS module=Customers TO Principal 1
GRANT (SELECT, INSERT ON TABLES)  ON TAGS module=Customers TO Principal 1
GRANT (CREATE_TABLE ON DATABASES) ON TAGS module=Orders TO Principal 2
GRANT (SELECT, INSERT ON TABLES)  ON TAGS module=Orders TO Principal 2
GRANT (CREATE_TABLE ON DATABASES) ON TAGS module=Customers TO Principal 3
GRANT (SELECT, INSERT ON TABLES)  ON TAGS module=Customers TO Principal 3
```

**综上所述，由此授予对资源的权限**  
根据上图中分配给数据库和表的 LF 标签以及图中向主体授予的 LF 标签，下表列出了主体对数据库和表具有的 Lake Formation 权限。


| Principal | 通过 LF 标签授予的权限 | 
| --- | --- | 
| 主体 1 |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/lake-formation/latest/dg/tag-based-access-control.html)  | 
| 主体 2 |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/lake-formation/latest/dg/tag-based-access-control.html)  | 
| 主体 3 |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/lake-formation/latest/dg/tag-based-access-control.html)  | 

**总结**  
在这个简单的示例中，使用 5 项分配操作和 8 项授予操作，数据湖管理员能够指定 17 项权限。当有数十个数据库和数百个表时，LF-TBAC 方法相对于命名资源方法的优势就显而易见了。假设需要向每个主体授予对每种资源的访问权限，其中 `n(P)` 是主体的数量，`n(R)` 是资源的数量：
+ 使用命名资源方法时，所需的授予数为 `n(P)` ✕ `n(R)`。
+ 通过 LF-TBAC 方法，使用单个 LF 标签，向主体的授予和对资源的分配总数为 `n(P)` \$1 `n(R)`。

**另请参阅**  
[管理 LF 标签以实现元数据访问控制](managing-tags.md)
[使用 LF-TBAC 方法授予数据湖权限](granting-catalog-perms-TBAC.md)

**Topics**
+ [Lake Formation 基于标签的访问控制的工作原理](#how-TBAC-works)
+ [管理 LF 标签以实现元数据访问控制](managing-tags.md)
+ [管理 LF 标签表达式以实现元数据访问控制](managing-tag-expressions.md)
+ [管理 LF 标签值权限](TBAC-granting-tags.md)