针对 AWS Glue 数据目录 中数据库和表的精细访问权限 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

针对 AWS Glue 数据目录 中数据库和表的精细访问权限

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

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

重要

本部分介绍 IAM 基于身份的策略中的资源级权限。这些权限与基于资源的策略不同。有关差异的更多信息,请参阅 基于身份的策略和基于资源的策略AWS身份和访问管理用户指南.

对于这些任务,请参阅以下主题:

执行此任务 请参阅以下主题:
创建定义针对资源的精细访问权限的 IAM 策略 创建IAM政策AWS身份和访问管理用户指南.
了解 AWS Glue 中使用的 IAM 基于身份的策略 基于身份的政策(IAM政策)AWS Glue 开发人员指南.

本节内容:

Limitations

在对 AWS Glue 数据目录 和 Athena 使用精细访问控制时,需要考虑以下限制:

  • 您只能限制对数据库和表的访问。精细访问控制在表级别上应用,并且您无法限制对表中单独分区的访问。有关更多信息,请参阅 AWS Glue 中的表分区和版本

  • Athena 不支持对 AWS Glue 数据目录 的跨账户访问。

  • TheThethe AWS Glue 数据目录 包含以下资源: CATALOGDATABASETABLE,和 FUNCTION.

    注意

    在此列表中, Athena 和 AWS Glue 数据目录 是 TABLEDATABASE,和 CATALOG 对于每个帐户。Function 特定于 AWS Glue. 对于 Athena 中的删除操作,您必须包含对 AWS Glue 操作的权限。请参阅精细策略示例

    层次结构如下: CATALOG 是一个祖先 DATABASES 每个账户中,每个帐户都有 DATABASE 是一个针对其所有人的 TABLESFUNCTIONS。例如,对于名为 table_test 属于数据库 db 在您账户中的目录中,其祖先是 db 以及帐户中的目录。对于 db 数据库,其原级是您的账户中的目录,其后代是表和函数。有关资源层级结构的更多信息,请参阅 数据目录中的ARNS列表AWS Glue 开发人员指南.

  • 对于资源上的任何非删除 Athena 操作,例如 CREATE DATABASECREATE TABLESHOW DATABASESHOW TABLEALTER TABLE,您需要在资源(表或数据库)上以及该资源在 Data Catalog 中的所有原级上调用该操作的权限。例如,对于表来说,其原级是所属的数据库以及账户的目录。对于数据库来说,其原级是账户的目录。请参阅精细策略示例

  • 对于 Athena 中的删除操作,例如 DROP DATABASEDROP TABLE,您还需要在 Data Catalog 中资源的所有原级和子代上调用删除操作的权限。例如,要删除数据库,您需要数据库、目录(作为数据库的原级)以及所有表和用户定义的函数(作为数据库的子代)的权限。表没有子代。要运行 DROP TABLE,您需要对该表、该表所属的数据库以及目录执行该操作的权限。请参阅精细策略示例

  • 限制对 Data Catalog 中特定数据库的访问时,对于 GetDatabaseCreateDatabase 操作,您还必须为每个 AWS 区域指定对 default 数据库和目录的访问策略。如果您在多个区域中使用 Athena,请针对每个区域中每个 default 数据库和目录的资源 ARN,为策略添加一行。

    例如 GetDatabase 访问 example_dbus-east-1 (n.virginia)地区,还包括 default 该区域策略中的数据库和目录,用于两个操作: GetDatabaseCreateDatabase:

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

必需。访问政策 Default PERAWS区域的数据库和目录

要让 Athena 与 AWS Glue 数据目录 配合使用,对于 GetDatabaseCreateDatabase,必须有针对各个 AWS 区域的 default 数据库和 AWS Glue 数据目录 的以下访问策略:

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

AWS Glue 中的表分区和版本

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

出于精细访问控制的目的,以下访问权限适用:

  • 精细访问控制在表级别应用。您只能限制对数据库和表的访问。例如,如果您允许访问某个分区表,此访问权限应用到该表的所有分区。您无法限制对表内各个分区的访问。

    重要

    如果您需要在 AWS Glue 中对该分区运行操作,则具有表中所有分区的访问权限并不足够。要在分区上运行操作,您需要这些操作的权限。例如,要在数据库 myDB 的表 myTable 上运行 GetPartitions,您需要在 Data Catalog、myDB 数据库和 myTable 中执行操作 glue:GetPartitions 的权限。

  • 精细访问控制不适用于表版本。对于分区,对表以前版本的访问权限通过在 AWS Glue 中,在表上对表版本 API 的访问权限以及表原级的访问权限来授予。

有关权限的信息 AWS Glue 操作,请参阅 AWSGLUEAPI权限: 操作和资源参考AWS Glue 开发人员指南.

针对表和数据库的精细权限的示例

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

这些示例包括对 default 数据库和目录,针对 GetDatabaseCreateDatabase 操作的权限。Athena 与 AWS Glue 数据目录 协同工作需要此策略。对于多个 AWS 区域,请为每个 default 数据库及其目录包括此策略,每个区域一行。

此外,将 example_db 数据库名称和 test 表名称替换为您的数据库名称和表名称。

DDL 语句 授予对资源的访问权限的 IAM 访问策略的示例
CREATE DATABASE 允许创建名为 example_db 的数据库。
{ "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/default", "arn:aws:glue:us-east-1:123456789012:database/example_db" ] }
ALTER DATABASE 允许修改 example_db 数据库的属性。
{ "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/default" ] }, { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:UpdateDatabase" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/example_db" ] }
DROP DATABASE 允许删除 example_db 数据库(包括其中的所有表)。
{ "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/default" ] }, { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:DeleteDatabase", "glue:GetTables", "glue:GetTable", "glue:DeleteTable" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/example_db", "arn:aws:glue:us-east-1:123456789012:table/example_db/*", "arn:aws:glue:us-east-1:123456789012:userDefinedFunction/example_db/*" ] }
SHOW DATABASES 允许列出 AWS Glue 数据目录 中的所有数据库。
{ "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/default" ] }, { "Effect": "Allow", "Action": [ "glue:GetDatabases" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/*" ] }
CREATE TABLE 允许在 example_db 数据库中创建名为 test 的表。
{ "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/default" ] }, { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:GetTable", "glue:CreateTable" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/example_db", "arn:aws:glue:us-east-1:123456789012:table/example_db/test" ] }
SHOW TABLES 允许列出 example_db 数据库中的所有表。
{ "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/default" ] }, { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/example_db", "arn:aws:glue:us-east-1:123456789012:table/example_db/*" ] }
DROP TABLE 允许删除 example_db 数据库中名为 test 的分区表。如果您的表没有分区,请勿包含分区操作。
{ "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/default" ] }, { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:GetTable", "glue:DeleteTable", "glue:GetPartitions", "glue:GetPartition", "glue:DeletePartition" ], "Resource": [ "arn:aws:glue:us-east-1:123456789012:catalog", "arn:aws:glue:us-east-1:123456789012:database/example_db", "arn:aws:glue:us-east-1:123456789012:table/example_db/test" ] }