

# 在 AWS Glue Data Catalog 中配置对数据库和表的访问
<a name="fine-grained-access-to-glue-resources"></a>

如果您将 AWS Glue Data Catalog 与 Amazon Athena 结合使用，则可以为 Athena 中使用的数据库和表 Data Catalog 对象定义资源级策略。

**注意**  
本主题将讨论数据库和表级别的安全性。有关配置列级别、行级别和单元格级别安全性的信息，请参阅 [Data filtering and cell-level security in Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/data-filtering.html)。

在 IAM 基于身份的策略中定义资源级别权限。

**重要**  
本部分介绍 IAM 基于身份的策略中的资源级权限。这些权限与基于资源的策略不同。有关差异的更多信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html) 中的 *基于身份的策略与基于资源的策略*。

对于这些任务，请参阅以下主题：


| 执行此任务 | 请参阅以下主题 | 
| --- | --- | 
| 创建定义针对资源访问的 IAM 策略 | 《IAM 用户指南》中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。 | 
| 了解 AWS Glue 中使用 IAM 基于身份的策略 | 《AWS Glue 开发人员指南》中的[基于身份的策略（IAM 策略）](https://docs.aws.amazon.com/glue/latest/dg/using-identity-based-policies.html)。 | 

 **本节内容** 
+  [限制](#access-to-glue-resources-limitations) 
+  [针对每个 AWS 区域 配置对目录和数据库的 AWS Glue 访问](#full-access-to-default-db-per-region) 
+  [关于 AWS Glue 中表分区和版本的访问控制](#access-to-glue-resources-table-partitions-and-versions) 
+  [数据库和表级别权限示例](#examples-fine-grained-table-database-policies) 

## 限制
<a name="access-to-glue-resources-limitations"></a>

当您针对 AWS Glue Data Catalog 和 Athena 使用数据库和表级别的访问控制时，请考虑以下限制：
+ 启用了 IAM Identity Center 的 Athena 工作组要求将 Lake Formation 配置为使用 IAM Identity Center 身份。有关更多信息，请参阅《AWS Lake Formation 用户指南》**中的 [Integrating IAM Identity Center](https://docs.aws.amazon.com/lake-formation/latest/dg/identity-center-integration.html)。
+ 您只能限制对数据库和表的访问。这些控件适用于表级别。您无法限制对表内各个分区的访问。有关更多信息，请参阅 [关于 AWS Glue 中表分区和版本的访问控制](#access-to-glue-resources-table-partitions-and-versions)。
+ AWS Glue Data Catalog包含以下资源：`CATALOG`、`DATABASE`、`TABLE` 和 `FUNCTION`。
**注意**  
对于此列表，各个账户的在 Athena 与 AWS Glue Data Catalog 之间公用的资源包括 `TABLE`、`DATABASE` 和 `CATALOG`，而 `Function` 特定于 AWS Glue。对于 Athena 中的删除操作，您必须包含对 AWS Glue 操作的权限。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。

  层次结构如下所示：`CATALOG` 是每个账户中所有 `DATABASES` 的原级，`DATABASE` 是其所有 `TABLES` 和 `FUNCTIONS` 的原级。例如，在您账户的目录中，对于属于 `db` 数据库的名为 `table_test` 的表，其原级为您账户中的 `db` 和目录。对于 `db` 数据库，其原级是您的账户中的目录，其后代是表和函数。有关资源的层次结构的更多信息，请参阅《AWS Glue 开发人员指南》**中的 [Data Catalog 中的 ARN 列表](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。
+ 对于资源上的任何非删除 Athena 操作，例如 `CREATE DATABASE`、`CREATE TABLE`、`SHOW DATABASE`、`SHOW TABLE` 或 `ALTER TABLE`，您需要在资源（表或数据库）上以及该资源在 Data Catalog 中的所有原级上调用该操作的权限。例如，对于表来说，其原级是所属的数据库以及账户的目录。对于数据库来说，其原级是账户的目录。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。
+ 对于 Athena 中的删除操作（例如 `DROP DATABASE` 或 `DROP TABLE`），您还需要拥有在该数据目录中资源的所有祖先级和子孙级上调用删除操作的权限。例如，要删除数据库，您需要数据库、目录（作为数据库的原级）以及所有表和用户定义的函数（作为数据库的子代）的权限。表没有子代。要运行 `DROP TABLE`，您需要对该表、该表所属的数据库以及目录执行该操作的权限。请参阅[数据库和表级别权限示例](#examples-fine-grained-table-database-policies)。

## 针对每个 AWS 区域 配置对目录和数据库的 AWS Glue 访问
<a name="full-access-to-default-db-per-region"></a>

为了让 Athena 使用 AWS Glue，需要制定一项策略，授予访问您的数据库和您账户中每个 AWS 区域 的 AWS Glue Data Catalog 的相应权限。要创建数据库，还需要 `CreateDatabase` 权限。在以下示例策略中，将 AWS 区域、AWS 账户 ID 和数据库名称替换为您自己的名称。

```
{
   "Sid": "DatabasePermissions",
   "Effect": "Allow",
   "Action": [
      "glue:GetDatabase", 
      "glue:GetDatabases",
      "glue:CreateDatabase"
   ],
   "Resource": [
     "arn:aws:glue:us-east-1:123456789012:catalog",
     "arn:aws:glue:us-east-1:123456789012:database/default"
   ]
}
```

## 关于 AWS Glue 中表分区和版本的访问控制
<a name="access-to-glue-resources-table-partitions-and-versions"></a>

在 AWS Glue 中，表可以具有分区和版本。表版本和分区在 AWS Glue 中不视为独立的资源。通过授予对表及表的原级资源的访问权限，授予对该表版本和分区的访问权限。

出于访问控制的目的，以下访问权限适用：
+ 控件适用于表级别。您只能限制对数据库和表的访问。例如，如果您允许访问某个分区表，此访问权限应用到该表的所有分区。您无法限制对表内各个分区的访问。
**重要**  
要在分区的 AWS Glue 上运行操作，需要目录、数据库和表级别的分区操作权限。仅仅访问表中的分区是不够的。例如，要在数据库 `myDB` 中的表 `myTable` 上运行 `GetPartitions`，必须授予 `glue:GetPartitions` 对目录、`myDB` 数据库和 `myTable` 资源的权限。
+ 访问控制不适用于表版本。对于分区，对表以前版本的访问权限通过在 AWS Glue 中，在表上对表版本 API 的访问权限以及表原级的访问权限来授予。

有关对 AWS Glue 操作的权限信息，请参阅《AWS Glue 开发人员指南**》中的 [AWS Glue API 权限：操作和资源参考](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)。

## 数据库和表级别权限示例
<a name="examples-fine-grained-table-database-policies"></a>

下表列出了 IAM 基于身份的策略的示例，这些策略允许访问 Athena 中的数据库和表。建议您从这些示例开始，根据您的需求，调整它们以允许或拒绝对特定数据库和表的特定操作。

这些示例包括访问数据库和目录，以便 Athena 和 AWS Glue 可以协同工作。对于多个 AWS 区域，请为每个数据库和目录包括类似策略，每个区域一行。

在示例中，将 `example_db` 数据库名称和 `test` 表名称替换为您的数据库名称和表名称。


| DDL 语句 | 授予对资源的访问权限的 IAM 访问策略的示例 | 
| --- | --- | 
| ALTER DATABASE | 允许修改 example\$1db 数据库的属性。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:UpdateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}</pre> | 
| CREATE DATABASE | 允许创建名为 example\$1db 的数据库。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:CreateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}<br /></pre> | 
| CREATE TABLE | 允许在 example\$1db 数据库中创建名为 test 的表。<pre>{<br />   "Sid": "DatabasePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:GetDatabases"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />},<br />{<br />   "Sid": "TablePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetTables",<br />      "glue:GetTable",<br />      "glue:GetPartitions",<br />      "glue:CreateTable"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",<br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br />}</pre> | 
| DROP DATABASE | 允许删除 example\$1db 数据库（包括其中的所有表）。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:DeleteDatabase",<br />      "glue:GetTables", <br />      "glue:GetTable", <br />      "glue:DeleteTable" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*", <br />     "arn:aws:glue:us-east-1:123456789012:userDefinedFunction/example_db/*"<br />   ]<br /> }</pre> | 
| DROP TABLE | 允许删除 example\$1db 数据库中名为 test 的分区表。如果您的表没有分区，请勿包含分区操作。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTable",<br />      "glue:DeleteTable", <br />      "glue:GetPartitions",<br />      "glue:GetPartition",<br />      "glue:DeletePartition" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br /> }</pre> | 
| MSCK REPAIR TABLE | 将 Hive 兼容分区添加到名为 test 的表之后，允许更新目录元数据中的 example\$1db 数据库。<pre>{<br />    "Effect": "Allow",<br />    "Action": [<br />        "glue:GetDatabase",<br />        "glue:CreateDatabase",<br />        "glue:GetTable",<br />        "glue:GetPartitions",<br />        "glue:GetPartition",<br />        "glue:BatchCreatePartition"<br />    ],<br />    "Resource": [<br />      "arn:aws:glue:us-east-1:123456789012:catalog",<br />      "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />      "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />    ]<br />}</pre> | 
| SHOW DATABASES | 允许列出 AWS Glue Data Catalog 中的所有数据库。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetDatabases" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/*"<br />   ]<br /> }</pre> | 
| SHOW TABLES | 允许列出 example\$1db 数据库中的所有表。<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTables"    <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",  <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*"<br />   ]<br />}</pre> | 