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

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

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

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

重要

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

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

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

本节内容

限制

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

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

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

  • AWS Glue 数据目录包含以下资源:CATALOGDATABASETABLEFUNCTION

    注意

    对于此列表,各个账户的在 Athena 与 AWS Glue 数据目录 之间公用的资源包括 TABLEDATABASECATALOGFunction 特定于 AWS Glue。对于 Athena 中的删除操作,您必须包含对 AWS Glue 操作的权限。请参阅精细策略示例

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

  • 对于资源上的任何非删除 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 访问 us-east-1(弗吉尼亚北部)区域中的 example_db,另请在策略中针对以下两个操作,包含 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" ] }

必需:针对每个 AWS 区域的 Default 数据库和目录的访问策略

要让 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 操作上的权限信息,请参阅 AWS Glue 开发人员指南 中的 AWS Glue API 权限:操作和资源参考

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

下表列出了 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" ] }