针对 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 结合使用,您可以为 Athena 中使用的以下 Data Catalog 对象定义资源级策略:数据库和表。

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

重要

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

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

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

本节内容

限制

在对 Amazon Glue Data Catalog 和 Athena 使用精细访问控制时,需要考虑以下限制:

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

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

    注意

    对于此列表,各个账户的在 Athena 与 Amazon Glue Data Catalog 之间公用的资源包括 TABLEDATABASECATALOG,而 Function 特定于 Amazon Glue。对于 Athena 中的删除操作,您必须包含对 Amazon Glue 操作的权限。请参阅针对表和数据库的精细权限的示例

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

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

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

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

    例如,要允许 GetDatabase 访问 us-east-1(弗吉尼亚州北部)区域中的 example_db,则还需要在该区域的策略中包含针对 GetDatabaseGetDatabasesCreateDatabase 操作的 default 数据库和目录:

    { "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", "arn:aws:glue:us-east-1:123456789012:database/example_db" ] }

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

要将 Athena 与 Amazon Glue Data Catalog 结合使用,则对于 default 数据库和每个 Amazon Web Services 区域的 Amazon Glue Data Catalog,必须具有针对 GetDatabaseGetDatabasesCreateDatabase 的以下访问策略:

{ "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" ] }

Amazon Glue 中的表分区和版本

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

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

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

    重要

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

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

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

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

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

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

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

DDL 语句 授予对资源的访问权限的 IAM 访问策略的示例
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" ] }
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" ] }
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" ] }
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/*" ] }
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" ] }
MSCK REPAIR TABLE 将 Hive 兼容分区添加到名为 test 的表之后,允许更新目录元数据中的 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:GetTable", "glue:GetPartitions", "glue:GetPartition", "glue:BatchCreatePartition" ], "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 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/*" ] }
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/*" ] }