Amazon Redshift
集群管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

本主题提供了基于身份的策略的示例,在这些策略中,账户管理员可以向 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 的值,因此,该策略适用于归根 AWS 账户所有的一切 Amazon Redshift 资源。

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

使用 Redshift Spectrum 所需的权限

Redshift Spectrum 需要其他 AWS 服务的权限才能访问资源。有关 Redshift Spectrum 的 IAM 策略中权限的详细信息,请参阅《Amazon Redshift Database Developer Guide》中的 Amazon Redshift Spectrum 的 IAM 策略

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

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

如果创建比必需的最低权限更为严格的 IAM 策略,对于附加了该 IAM 策略的用户,控制台无法按预期正常运行。为确保这些用户仍可使用 Amazon Redshift 控制台,也可向用户附加 AmazonRedshiftReadOnlyAccess 托管策略,如适用于 Amazon Redshift 的 AWS 托管(预定义)策略中所述。

要授予用户对 Amazon Redshift 控制台上查询编辑器的访问权限,请附加 AmazonRedshiftQueryEditor 托管策略。

对于只需要调用 AWS CLI 或 Amazon Redshift API 的用户,您无需为其提供最低控制台权限。

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 的 AWS 托管(预定义)策略

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

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

  • AmazonRedshiftReadOnlyAccess – 授予对 AWS 账户的所有 Amazon Redshift 资源的只读访问权。

  • AmazonRedshiftFullAccess – 授予对 AWS 账户的所有 Amazon Redshift 资源的完全访问权。

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

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

客户托管策略示例

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

注意

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

示例 1:向用户授予所有 Amazon Redshift 操作和资源的完全访问权限

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

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

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

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

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

{ "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 Notification Service (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": [ "*" ] } ] }

使用 GetClusterCredentials 的示例策略

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

  • 区域: us-west-2

  • AWS 账户: 123456789012

  • 集群名称: examplecluster

以下策略启用 GetCredentialsCreateClusterUserJoinGroup 操作。仅在 AWS 用户 ID 与 GetClusterCredentials 匹配时,该策略才使用条件密钥以允许 CreateClusterUser"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" ] } ] } } }