Amazon Redshift
管理指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

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

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

重要

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

本主题的各个部分涵盖以下内容:

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

Copy
{ "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 开头)。

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

要使用户能够使用 Amazon Redshift 控制台,该用户必须拥有一组最低的权限:使该用户能够描述其 AWS 账户的 Amazon Redshift 资源及其他相关信息,如 Amazon EC2 安全和网络信息等。

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

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

GetClusterCredentials 的资源策略

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

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

如果您使用可选参数 Autocreate、DbGroups 和 DbName 调用 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 资源的完全访问权。

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

客户托管策略示例

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

注意

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

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

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

Copy
{ "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 资源。

Copy
{ "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 开头的任何群集的权限。

Copy
{ "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 的群集中创建的任何快照的访问权限。

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

Copy
{ "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 开头。

Copy
{ "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 开头的任何快照。

Copy
{ "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 操作不支持资源级权限。

Copy
{ "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

  • 数据库用户名:temp_creds_user

以下示例显示的策略允许 IAM 用户或角色使用数据库用户名 temp_creds_user 调用 GetClusterCredentials 操作。数据库中必须存在指定的 dbuser

Copy
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "redshift:GetClusterCredentials", "Resource": "arn:aws:redshift:us-west-2:123456789012:dbuser:examplecluster/temp_creds_user" } }

以下示例将添加 redshift:CreateClusterUser 操作的权限,创建新用户时需要该权限。该策略允许任何用户名,但仅允许数据库组名为 temp_creds_group 的数据库组参数。

Copy
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "redshift:GetClusterCredentials", "redshift:CreateClusterUser" ], "Resource": "*" }, { "Effect": "Allow", "Action": "redshift:JoinGroup", "Resource": "arn:aws:redshift:us-west-2:123456789012:dbgroup:*/temp_creds_group" } }

以下示例添加这些条件:

  • 持续时间必须少于 1200 秒。

  • 数据库名称必须为“dev”。

  • 数据库用户名必须为“developer”。

Copy
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "redshift:GetClusterCredentials", "redshift:CreateClusterUser" ], "Resource": "*", "Condition": { "NumericLessThan": { "redshift:DurationSeconds": 1200 }, "StringEquals": { "redshift:DbName": "dev", "redshift:DbUser": "developer" }, { "Effect": "Allow", "Action": "redshift:JoinGroup", "Resource": "arn:aws:redshift:us-west-2:123456789012:dbgroup:*/temp_creds_group" } }

以下策略允许 GetCredentials 操作,以及 CreateClusterUserJoinGroup 操作。仅在 AWS 用户 ID 与“AIDIODR4TAW7CSEXAMPLE:${redshift:DbUser}@yourdomain.com”匹配时,该策略才使用条件密钥以允许 GetClusterCredentialsCreateClusterUser 操作。

Copy
{ "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/*", "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" ] } ] }