

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

# 使用基于属性的访问控制来授予权限
<a name="abac-granting-permissions"></a>

本主题介绍对 Data Catalog 资源授予基于属性的访问权限所需遵循的步骤。你可以使用 Lake Formation 控制台或 AWS 命令行界面 (AWS CLI)。

## 使用 ABAC 授予权限（AWS 管理控制台）
<a name="w2aac15b9c31c19b5b1"></a>

1. 在上打开 Lake Formation 控制台 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)，然后以数据湖管理员、资源创建者或对资源拥有**可授予权限**的 IAM 用户身份登录。

1. 请执行以下操作之一：
   + 在导航窗格的**权限**下，选择**数据湖权限**。然后选择**授予**。
   + 在导航窗格的 **Data Catalog** 下，选择**目录**。然后，选择一个目录对象（目录、数据库、表和数据筛选条件），然后从**权限**下的**操作**菜单中选择**授予**。

1. 在**授予权限**页面上，选择**按属性划分的主体**。

1. 指定属性键和值。如果选择多个值，则将使用 `OR` 运算符来创建属性表达式。这意味着，如果分配给 IAM 角色或用户的任何属性标签值匹配，则该角色或用户将 role/user 获得对资源的访问权限。

   如果指定多个属性标签，则将使用 `AND` 运算符来创建属性表达式。只有在属性表达式中的每个属性标签为 IAM 分配了匹配的标签 role/user 时，才会向委托人授予对数据目录资源的权限。

   查看控制台中显示的生成 Cedar 策略表达式。  
![\[在“授予权限”对话框中，创建了一个属性表达式。\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/abac-grant-permissions.png)

1. 选择权限范围。如果被授权者属于外部账户，请选择**外部账户**并输入 AWS 账户 ID。

1. 接下来，在外部账户中选择 Data Catalog 账户。您必须对资源拥有相应的可授予权限才能成功完成权限授予。

1. 指定要允许具有匹配属性的主体（用户或角色）执行哪些操作。如果为 IAM 实体分配的标签和值至少与您指定的其中一个属性表达式相匹配，则向 IAM 实体授予访问权限。在控制台中查看 Cedar 策略表达式。有关 Cedar 的更多信息，请参阅 [What is Cedar? \$1 Cedar 政策语言参考 GuideLink](https://docs.cedarpolicy.com/)。

1. 接下来，选择要授予访问权限的 Data Catalog 资源。您可以为各种 Data Catalog 资源（包括目录、数据库、表和数据筛选条件）定义这些权限。

1. 选择**授权**。

   通过这种方法，您可以根据属性控制访问权限，确保只有具有相应标签的用户或角色才能对指定资源执行特定操作。

## 使用 ABAC 授予权限（AWS CLI）
<a name="abac-granting-permissions-cli"></a>

 以下示例显示了一个属性表达式，必须满足该表达式条件才能获得资源的所有可用权限。您也可以指定单个权限，例如 `Select`、`Describe` 或 `Drop`。该表达式使用 Cedar 策略表达式。有关 Cedar 的更多信息，请参阅 [What is Cedar? \$1 Cedar 政策语言参考 GuideLink](https://docs.cedarpolicy.com/)。

 此条件检查 IAM 主体是否有 `department` 标签，且 `department` 标签的值是否等于 `sales`。

```
aws lakeformation grant-permissions 
--principal '{"DataLakePrincipalIdentifier": "111122223333:IAMPrincipals"}' \
--resource '{"Database": {"CatalogId": 111122223333, "Name": "abac-db"}}' \
--permissions ALL \
--condition '{"Expression": "context.iam.principalTags.hasTag(\"department\") \
   && context.iam.principalTags.getTag(\"department\") == \"sales\""}'
```