对 Amazon Redshift 使用基于身份的策略(IAM 策略) - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

对 Amazon Redshift 使用基于身份的策略(IAM 策略)

本主题提供了基于身份的策略的示例,在这些策略中,账户管理员可以向 IAM 身份(即:用户、组和角色)附加权限策略。

重要

我们建议您首先阅读以下介绍性主题,这些主题讲解了管理 Amazon Redshift 资源访问的基本概念和选项。有关更多信息,请参阅 有关管理对 Amazon Redshift 资源的访问权限的概述

下面介绍权限策略示例。该权限允许用户创建、删除、修改和重启所有集群,但拒绝删除或修改集群标识符以 production 开头的任何集群的权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid":"AllowClusterManagement", "Action": [ "redshift:CreateCluster", "redshift:DeleteCluster", "redshift:ModifyCluster", "redshift:RebootCluster" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid":"DenyDeleteModifyProtected", "Action": [ "redshift:DeleteCluster", "redshift:ModifyCluster" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:cluster:production*" ], "Effect": "Deny" } ] }

该策略包含两条语句:

  • 第一条语句授予用户创建、删除、修改和重启集群的权限。该语句指定通配符 (*) 作为Resource值,以使策略适用于归根所有的一切 Amazon Redshift 资源Amazonaccount.

  • 第二条语句拒绝删除或修改集群的权限。该语句指定包含通配符 (*) 的集群 Amazon 资源名称 (ARN) 作为 Resource 的值。因此,此语句适用于由根集群所有的所有 Amazon Redshift 集群Amazon帐户,其中集群标识符以production

Amazon适用于 Amazon Redshift 的托管(预定义)策略

Amazon通过提供由Amazon创建和管理的独立 IAM 策略来满足许多常用案例的要求。托管策略可授予常用案例的必要权限,因此,您可以免去调查都需要哪些权限的工作。有关更多信息,请参阅 。Amazon托管策略中的IAM 用户指南

以下Amazon托管策略(您可以将它们附加到自己账户中的用户)是特定于 Amazon Redshift 的:

  • AmazonRedshiftReadOnlyAccess— 授予对所有 Amazon Redshift 资源的只读访问权限。Amazonaccount.

  • AmazonRedshiftFullAccess— 授予对所有 Amazon Redshift 资源的完整访问权限。Amazonaccount.

  • AmazonRedshiftQueryEditor— 授予对 Amazon Redshift 控制台上查询编辑器的完全访问权限。

  • 亚马逊转移数据库访问— 授予对 Amazon Redshift 数据 API 操作和资源的完全访问权限Amazonaccount.

此外,您还可以创建您自己的自定义 IAM 策略,以授予 Amazon Redshift API 操作和资源的相关权限。您可以将这些自定义策略附加到需要这些权限的 IAM 用户或组。

使用 Redshift 频谱所需的权限

Amazon Redshift Spectrum 需要其他Amazon服务访问资源。有关 Redshift 频谱 IAM 策略中权限的详细信息,请参阅适用于 Amazon Redshift Spectrum 的 IAM 策略中的Amazon Redshift 数据库开发人员指南。

使用 Amazon Redshift 控制台所需的权限

用户若要能够使用 Amazon Redshift 控制台,则必须拥有一组最低的权限来允许其描述Amazonaccount. 这些权限还必须允许用户描述其他相关信息(包括 Amazon EC2 安全、Amazon CloudWatch、Amazon SNS 和网络信息)。

如果创建比必需的最低权限更为严格的 IAM 策略,对于附加了该 IAM 策略的用户,控制台无法按预期正常运行。要确保这些用户仍可使用 Amazon Redshift 控制台,还请将AmazonRedshiftReadOnlyAccess托管策略添加给用户。如何做到这一点,请参阅Amazon适用于 Amazon Redshift 的托管(预定义)策略

有关向用户授予在 Amazon Redshift 控制台上访问查询编辑器的信息,请参阅使用 Amazon Redshift 控制台查询编辑器所需的权限

对于只需要调用Amazon CLI或 Amazon Redshift API。

使用 Amazon Redshift 控制台查询编辑器所需的权限

要使用 Amazon Redshift 查询编辑器的用户,该用户必须具有亚马逊 Redshift 和亚马逊 Redshift 数据 API 操作的最低权限集。要使用密钥连接到数据库,您还必须具有 Secrets Manager 权限。

要授予用户对 Amazon Redshift 控制台上查询编辑器的访问权限,请将AmazonRedshiftQueryEditorAmazonRedshiftReadOnlyAccess Amazon托管策略。这些区域有:AmazonRedshiftQueryEditor策略允许用户仅检索自己的 SQL 语句的结果。也就是说,提交的声明相同aws:userid,如AmazonRedshiftQueryEditor Amazon托管策略。

{ "Sid": "DataAPIIAMSessionPermissionsRestriction", "Action": [ "redshift-data:GetStatementResult", "redshift-data:CancelStatement", "redshift-data:DescribeStatement", "redshift-data:ListStatements" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "redshift-data:statement-owner-iam-userid": "${aws:userid}" } } }

要允许用户检索同一 IAM 角色中其他用户的 SQL 语句的结果,请创建您自己的策略,而不需要限制对当前用户的访问权限的条件。同时限制管理员更改策略的访问权限。

使用 Amazon Redshift 计划程序所需的权限

使用 Amazon Redshift 计划程序时,您应设置与 Amazon Redshift 计划程序具有信任关系的 IAM 角色 (scheduler.redshift.amazonaws.com),以允许调度程序代表您承担权限。此外,您还可以为要计划的 Amazon Redshift API 操作将策略(权限)附加到角色。

以下示例演示 JSON 格式的策略文档,该策略用于在 Amazon Redshift 计划程序和 Amazon Redshift 之间设置信任关系。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "scheduler.redshift.amazonaws.com", "redshift.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

有关信任实体的更多信息,请参阅创建向的角色委派权限的角色Amazon服务中的IAM 用户指南

您还必须为要计划的 Amazon Redshift 操作添加权限。

为使计划程序使用 ResizeCluster 操作,请为 IAM 策略添加如下权限。根据您的环境,您可能希望使策略限制更严格。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "redshift:ResizeCluster", "Resource": "*" } ] }

有关为 Amazon Redshift 计划程序创建角色的步骤,请参阅为创建角色Amazon服务(控制台)中的IAM 用户指南。在 IAM 控制台中创建角色时,请选择以下选项:

  • 适用于选择将使用此角色的服务:选择Redshift

  • 适用于选择您的使用案例:选择Redshift-调度程序

  • 创建或附加策略,以允许计划 Amazon Redshift 操作的角色。选择 Create policy (创建策略) 或修改角色以便附加策略。输入计划操作的 JSON 策略。

  • 在创建角色后,编辑 IAM 角色的 Trust Relationship (信任关系) 以便包含服务 redshift.amazonaws.com

您创建的 IAM 角色具有信任实体 scheduler.redshift.amazonaws.comredshift.amazonaws.com。它还具有附加策略,该策略允许支持的 Amazon Redshift API 操作,例如,"redshift:ResizeCluster"

使用 Amazon EventBridge 计划程序所需的权限

使用 Amazon EventBridge 计划程序时,您应设置与 EventBridge 计划程序具有信任关系的 IAM 角色 (events.amazonaws.com),以允许调度程序代表您承担权限。您还可以为要计划的 Amazon Redshift Data API 操作将策略(权限)附加到角色,并为 Amazon EventBridge 操作附加策略。

在控制台上使用 Amazon Redshift 查询编辑器创建计划查询时,您可以使用 EventBridge 调度程序。

您可以创建 IAM 角色以在 IAM 控制台上运行计划查询。在此 IAM 角色中,将AmazonEventBridgeFullAccessAmazonRedshiftDataFullAccess

以下示例演示 JSON 格式的策略文档,该策略用于与 EventBridge 计划程序建立信任关系。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com", ] }, "Action": "sts:AssumeRole" } ] }

有关信任实体的更多信息,请参阅创建向的角色委派权限的角色Amazon服务中的IAM 用户指南

有关为 EventBridge 计划程序创建角色的步骤,请参阅为创建角色Amazon服务(控制台)中的IAM 用户指南。在 IAM 控制台中创建角色时,请选择以下选项:

  • 适用于选择将使用此角色的服务:选择CloudWatch Events

  • 适用于选择您的使用案例:选择CloudWatch Events

  • 附加以下权限策略:AmazonEventBridgeFullAccessAmazonRedshiftDataFullAccess

您创建的 IAM 角色具有events.amazonaws.com。它还具有附加策略,该策略允许支持的 Amazon Redshift 数据 API 操作,例如,"redshift-data:*"

GetClusterCredentials 的资源策略

要使用 IAM 数据库凭证连接使用 JDBC 或 ODBC 连接的集群数据库,或者以编程方式调用 GetClusterCredentials 操作,您需要拥有最少的权限。至少,您需要具有访问 dbuser 资源的 redshift:GetClusterCredentials 操作的权限。

如果使用 JDBC 或 ODBC 连接,您可以指定 serverport 来代替 cluster_idregion,为此,您的策略必须允许能够访问 redshift:DescribeClusters 资源的 cluster 操作。

如果您使用可选参数 AutocreateDbGroupsDbName 调用 GetClusterCredentials 操作,则还需要允许这些操作并允许访问下表中列出的资源。

GetClusterCredentials 参数

操作

资源

Autocreate

redshift:CreateClusterUser

dbuser

DbGroups

redshift:JoinGroup

dbgroup

DbName

NA dbname

有关资源的更多信息,请参阅 Amazon Redshift 资源和运营

您还可以在策略中包括以下条件:

  • redshift:DurationSeconds

  • redshift:DbName

  • redshift:DbUser

有关条件的更多信息,请参阅“在策略中指定条件”。

客户管理的策略示例

本节的用户策略示例介绍如何授予各 Amazon Redshift 操作的权限。当您使用 Amazon Redshift API 时,可以使用这些策略。Amazon软件开发工具包或Amazon CLI。

注意

所有示例都使用美国西部 (俄勒冈) 区域 (us-west-2) 并且包含虚构的账户 ID。

示例 1:允许用户完全访问所有的 Amazon Redshift 操作和资源

以下策略允许访问针对所有资源的所有 Amazon Redshift 操作。

{ "Version": "2012-10-17", "Statement": [ { "Sid":"AllowRedshift", "Action": [ "redshift:*" ], "Effect": "Allow", "Resource": "*" } ] }

redshift:*中的Action元素指示 Amazon Redshift 中的所有操作。

示例 2:拒绝用户访问一组 Amazon Redshift 操作

默认情况下,所有权限都将被拒绝。不过,有时您需要明确拒绝对某个或某组操作的访问。以下策略允许访问所有 Amazon Redshift 操作,并明确拒绝对名称以开头的任何 Amazon Redshift 操作的访问权限。Delete。该政策适用于us-west-2

{ "Version": "2012-10-17", "Statement": [ { "Sid":"AllowUSWest2Region", "Action": [ "redshift:*" ], "Effect": "Allow", "Resource": "arn:aws:redshift:us-west-2:*" }, { "Sid":"DenyDeleteUSWest2Region", "Action": [ "redshift:Delete*" ], "Effect": "Deny", "Resource": "arn:aws:redshift:us-west-2:*" } ] }

示例 3:允许用户管理集群

以下策略允许用户创建、删除、修改和重启所有集群,但拒绝删除名称以 protected 开头的任何集群的权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid":"AllowClusterManagement", "Action": [ "redshift:CreateCluster", "redshift:DeleteCluster", "redshift:ModifyCluster", "redshift:RebootCluster" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid":"DenyDeleteProtected", "Action": [ "redshift:DeleteCluster" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:cluster:protected*" ], "Effect": "Deny" } ] }

示例 4:允许用户授予和撤销快照访问权限

以下策略允许用户(如用户 A)执行以下操作:

  • 授予对从名为 shared 的集群中创建的任何快照的访问权限。

  • 撤消对从快照名称以 shared 开头的 revokable 集群中创建的任何快照的访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid":"AllowSharedSnapshots", "Action": [ "redshift:AuthorizeSnapshotAccess" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:shared/*" ], "Effect": "Allow" }, { "Sid":"AllowRevokableSnapshot", "Action": [ "redshift:RevokeSnapshotAccess" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:snapshot:*/revokable*" ], "Effect": "Allow" } ] }

如果用户 A 允许用户 B 访问快照,则用户 B 必须拥有以下某项策略才能从该快照还原集群。以下策略允许用户 B 描述集群、从快照还原集群以及创建集群。这些集群的名称必须以 from-other-account 开头。

{ "Version": "2012-10-17", "Statement": [ { "Sid":"AllowDescribeSnapshots", "Action": [ "redshift:DescribeClusterSnapshots" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid":"AllowUserRestoreFromSnapshot", "Action": [ "redshift:RestoreFromClusterSnapshot" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:snapshot:*/*", "arn:aws:redshift:us-west-2:444455556666:cluster:from-other-account*" ], "Effect": "Allow" } ] }

示例 5:允许用户复制集群快照并从快照中还原集群

以下策略允许用户复制从名为 big-cluster-1 的集群中创建的任何快照,以及还原名称以 snapshot-for-restore 开头的任何快照。

{ "Version": "2012-10-17", "Statement": [ { "Sid":"AllowCopyClusterSnapshot", "Action": [ "redshift:CopyClusterSnapshot" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:snapshot:big-cluster-1/*" ], "Effect": "Allow" }, { "Sid":"AllowRestoreFromClusterSnapshot", "Action": [ "redshift:RestoreFromClusterSnapshot" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:snapshot:*/snapshot-for-restore*", "arn:aws:redshift:us-west-2:123456789012:cluster:*" ], "Effect": "Allow" } ] }

以下示例策略允许访问 Amazon Redshift、Amazon Simple NoService (Amazon SNS) 和 Amazon CloudWatch 的所有操作和资源。它还允许对账户下的所有相关 Amazon EC2 资源执行指定的操作。

注意

此示例策略中指定的 Amazon EC2 操作不支持资源级权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid":"AllowRedshift", "Effect": "Allow", "Action": [ "redshift:*" ], "Resource": [ "*" ] }, { "Sid":"AllowSNS", "Effect": "Allow", "Action": [ "sns:*" ], "Resource": [ "*" ] }, { "Sid":"AllowCloudWatch", "Effect": "Allow", "Action": [ "cloudwatch:*" ], "Resource": [ "*" ] }, { "Sid":"AllowEC2Actions", "Effect": "Allow", "Action": [ "ec2:AllocateAddress", "ec2:AssociateAddress", "ec2:AttachNetworkInterface", "ec2:DescribeAccountAttributes", "ec2:DescribeAddresses", "ec2:DescribeAvailabilityZones", "ec2:DescribeInternetGateways", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcs" ], "Resource": [ "*" ] } ] }

示例 7:允许用户使用 Amazon Redshift 控制台标记资源

以下示例策略允许用户使用 Amazon Redshift 控制台标记资源,使用Amazon Resource Groups。此策略可以附加到调用新的或原始的 Amazon Redshift 控制台的用户角色。有关标记的更多信息,请参阅在 Amazon Redshift 中标记资源

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Tagging permissions", "Effect": "Allow", "Action": [ "redshift:DeleteTags", "redshift:CreateTags", "redshift:DescribeTags", "tag:UntagResources", "tag:TagResources" ], "Resource": "*" } ] }

使用 GetClusterCredentials 的示例策略

以下策略使用这些示例参数值:

  • 区域: us-west-2

  • Amazon账户:123456789012

  • 集群名称: examplecluster

以下策略启用 GetCredentialsCreateClusterUserJoinGroup 操作。该策略使用条件密钥以允许GetClusterCredentialsCreateClusterUser操作仅当Amazon匹配的用户 ID"AIDIODR4TAW7CSEXAMPLE:${redshift:DbUser}@yourdomain.com"。IAM 访问权限仅对 "testdb" 数据库是必需的。该策略还允许用户参与名为 "common_group" 的组。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetClusterCredsStatement", "Effect": "Allow", "Action": [ "redshift:GetClusterCredentials" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:dbuser:examplecluster/${redshift:DbUser}", "arn:aws:redshift:us-west-2:123456789012:dbname:examplecluster/testdb", "arn:aws:redshift:us-west-2:123456789012:dbgroup:examplecluster/common_group" ], "Condition": { "StringEquals": { "aws:userid":"AIDIODR4TAW7CSEXAMPLE:${redshift:DbUser}@yourdomain.com" } } }, { "Sid": "CreateClusterUserStatement", "Effect": "Allow", "Action": [ "redshift:CreateClusterUser" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:dbuser:examplecluster/${redshift:DbUser}" ], "Condition": { "StringEquals": { "aws:userid":"AIDIODR4TAW7CSEXAMPLE:${redshift:DbUser}@yourdomain.com" } } }, { "Sid": "RedshiftJoinGroupStatement", "Effect": "Allow", "Action": [ "redshift:JoinGroup" ], "Resource": [ "arn:aws:redshift:us-west-2:123456789012:dbgroup:examplecluster/common_group" ] } ] } } }