配置 IAM 权限 - Amazon Redshift

配置 IAM 权限

Amazon Redshift 提供 AmazonRedshiftDataFullAccess 托管式策略。此策略提供了对 Amazon Redshift 数据 API 操作的完全访问。此策略还允许将访问权限限定为特定 Amazon Redshift、AWS Secrets Manager 以及对 Amazon Redshift 集群或 Redshift Serverless 进行身份验证和访问所需的 IAM API 操作。

此外,您还可以创建自己的 IAM 策略,以允许对特定资源的访问。要创建策略,请使用 AmazonRedshiftDataFullAccess 策略作为起始模板。在创建策略后,将该策略添加到需要访问数据 API 的每个用户。

考虑与用户关联的 IAM 策略的以下要求:

  • 如果您使用 AWS Secrets Manager 进行身份验证,请确认策略允许使用 secretsmanager:GetSecretValue 操作来检索使用键 RedshiftDataFullAccess 标记的密钥。

  • 如果您使用临时凭证对集群进行身份验证,请确认该策略允许将 redshift:GetClusterCredentials 操作用于集群中任何数据库的数据库用户名 redshift_data_api_user。此用户名必须已在数据库中创建。

  • 如果您使用临时凭证对无服务器工作组进行身份验证,请确认该策略允许使用 redshift-serverless:GetCredentials 操作来检索使用键 RedshiftDataFullAccess 标记的工作组。数据库用户按 1:1 的比例映射到源 AWS Identity and Access Management (IAM) 身份。例如,用户 sample_user 映射到数据库用户 IAM:sample_user,而 IAM 角色 sample_role 映射到 IAMR:sample_role。有关 IAM 身份的更多信息,请参阅《IAM 用户指南》中的 IAM 身份(用户、组和角色)

以下链接提供了《IAM 用户指南》中有关 AWS Identity and Access Management 的更多信息。

在其它账户拥有的集群上运行查询

要对其他账户拥有的集群运行查询,拥有账户必须提供一个 IAM 角色,数据 API 可以在调用账户时代入该角色。例如,假设账户 B 拥有账户 A 需要访问的集群。账户 B 可以将 AWS 托管式策略 AmazonRedshiftDataFullAccess 附加到账户 B 的 IAM 角色。然后,账户 B 使用信任策略信任账户 A,如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::accountID-of-account-A:role/someRoleA" ] }, "Action": "sts:AssumeRole" } ] }

最后,账户 A 的 IAM 角色需要能够代入账户 B 的 IAM 角色。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::accountID-of-account-B:role/someRoleB" } }

指定一个 IAM 角色,该角色将资源限制为 AWS 账户中的 Redshift Serverless 工作组和 Amazon Redshift 集群

可以在基于身份的策略中指定资源 ARN,以便控制对 AWS 账户中 Redshift Serverless 工作组和 Amazon Redshift 集群的访问权限。此示例显示如何创建一个策略,该策略只支持针对指定 AWS 账户中的工作组和集群访问数据 API。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "redshift-data:CancelStatement", "redshift-data:DescribeStatement", "redshift-data:GetStatementResult", "redshift-data:ListStatements" ], "Resource": "*" }, { "Effect": "Allow", "Action": "redshift-data:*", "Resource": [ "arn:arn-partition:redshift-serverless:*:AWS 账户:workgroup/*", "arn:arn-partition:redshift:*:AWS 账户:cluster:*" ] } ] }

配置 IAM 策略,来限制只有语句所有者才能访问 SQL 语句信息

默认情况下,Amazon Redshift 数据 API 将调用 ExecuteStatemetBatchExecuteStatement 时使用的 IAM 角色视为 SQL 语句的所有者。任何获准代入该角色的人都可以访问有关 SQL 语句的信息,包括其结果。要将 SQL 语句信息访问权限限制为与特定所有者之间的 IAM 角色会话,请添加条件 redshift-data:statement-owner-iam-userid: "${aws:userid}"。以下 IAM 策略会限制访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "redshift-data:CancelStatement", "redshift-data:DescribeStatement", "redshift-data:GetStatementResult", "redshift-data:ListStatements" ], "Resource": "*", "Condition": { "StringEquals": { "redshift-data:statement-owner-iam-userid": "${aws:userid}" } } } ] }

可以将条件 statement-owner-iam-useridCancelStatementDescribeStatementGetStatementResultListStatements 结合使用。有关更多信息,请参阅 Amazon Redshift Data API 定义的操作

配置 IAM 策略,来限制只有会话所有者才能访问 SQL 结果

默认情况下,Amazon Redshift 数据 API 将调用 ExecuteStatementBatchExecuteStatement 时使用的 IAM 角色视为运行 SQL 语句的数据库会话的所有者。任何获准代入该角色的人都可以提交对数据库会话的查询。要将会话访问权限限制为与特定所有者之间的 IAM 角色会话,请添加条件 redshift-data:session-owner-iam-userid: "${aws:userid}"。以下 IAM 策略会限制访问权限。

以下 IAM 策略仅支持会话所有者获取语句结果。条件 session-owner-iam-userid 用于将资源访问权限限制为指定的 userid

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "redshift-data:ExecuteStatement", "redshift-data:BatchExecuteStatement" ], "Resource": "*", "Condition": { "StringEquals": { "redshift-data:session-owner-iam-userid": "${aws:userid}" } } } ] }

可以将条件 session-owner-iam-useridExecuteStatementBatchExecuteStatement 结合使用。有关更多信息,请参阅 Amazon Redshift Data API 定义的操作