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

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

针对 Amazon Glue Data Catalog 中数据库和表的精细访问权限

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

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

重要

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

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

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

本节内容

Limitations

将精细访问控制与Amazon Glue Data Catalog和 Athena:

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

  • Amazon Glue Data Catalog包含以下资源:CATALOGDATABASETABLEFUNCTION

    注意

    从这个列表中,Athena 和Amazon Glue Data Catalog是TABLEDATABASE, 和CATALOG针对每个账户。Function特定于Amazon Glue。对于 Athena 中的删除操作,您必须包含对Amazon Glue操作。请参阅精细策略示例

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

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

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

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

    例如,要允许 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" ] }

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

对于 Athena 与Amazon Glue Data Catalog,以下访问策略访问default数据库和Amazon Glue Data Catalog/Amazon的区域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" ] }

Amazon Glue 中的表分区和版本

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

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

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

    重要

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

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

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

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

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

这些示例包括对 default 数据库和目录,针对 GetDatabaseCreateDatabase 操作的权限。此策略是 Athena 和 Athena 所必需的Amazon Glue Data Catalog一起工作。对于多个Amazon区域,请为每个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 允许列出 Amazon Glue Data Catalog 中的所有数据库。
{ "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" ] }