

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# Amazon Redshift 中的 Identity and Access Management
<a name="redshift-iam-authentication-access-control"></a>

访问 Amazon Redshift 时需要可供 AWS 用来验证您的请求的凭证。这些凭证必须有权访问 AWS 资源，如 Amazon Redshift 集群。下面几节提供详细信息来说明如何使用 [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 和 Amazon Redshift 控制谁能访问您的资源，从而对这些资源进行保护：
+ [使用身份进行身份验证](#security_iam_authentication)
+ [访问控制](#redshift-iam-accesscontrol)

**重要**  
本主题包含有关管理权限、身份和安全访问的一系列最佳实践。我们建议您熟悉掌握将 IAM 与 Amazon Redshift 结合使用的最佳实践。这些最佳实践包括使用 IAM 角色应用权限。充分了解这些部分有助于您维护更安全的 Amazon Redshift 数据仓库。

## 使用身份进行身份验证
<a name="security_iam_authentication"></a>

身份验证是您使用身份凭证登录 AWS 的方法。您必须作为 AWS 账户根用户、IAM 用户或通过担任 IAM 角色进行身份验证。

您可以使用来自 AWS IAM Identity Center（IAM Identity Center）等身份源的凭证、单点登录身份验证或 Google/Facebook 凭证，以联合身份进行登录。有关登录的更多信息，请参阅《AWS 登录 用户指南》**中的[如何登录您的 AWS 账户](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

对于编程访问，AWS 提供了 SDK 和 CLI 来对请求进行加密签名。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的 AWS 签名版本 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

### AWS 账户 根用户
<a name="security_iam_authentication-rootuser"></a>

 当您创建 AWS 账户 时，最初使用的是一个对所有 AWS 服务和资源拥有完全访问权限的登录身份（称为 AWS 账户*根用户*）。我们强烈建议不要使用根用户进行日常任务。有关要求根用户凭证的任务，请参阅*《IAM 用户指南》*中的[需要根用户凭证的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### IAM 用户和群组
<a name="security_iam_authentication-iamuser"></a>

*[IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*是对某个人员或应用程序具有特定权限的一个身份。建议使用临时凭证，而非具有长期凭证的 IAM 用户。有关更多信息，请参阅*《IAM 用户指南》*中的[要求人类用户使用带有身份提供商的联合身份验证才能使用临时凭证访问 AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)指定一组 IAM 用户，便于更轻松地对大量用户进行权限管理。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 用户使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*[IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*是具有特定权限的身份，可提供临时凭证。您可以通过[从用户切换到 IAM 角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或调用 AWS CLI 或 AWS API 操作来担任角色。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色对于联合用户访问、临时 IAM 用户权限、跨账户访问、跨服务访问以及在 Amazon EC2 上运行的应用程序非常有用。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

**注意**  
Redshift 中的转发访问会话（FAS，Forward Access Session）的有效期仅为 12 小时。在此期限之后，使用 FAS 与其他服务集成的任何连接会话都必须重建。

# 防止跨服务混淆座席
<a name="cross-service-confused-deputy-prevention"></a>

混淆代理问题是一个安全性问题，即不具有操作执行权限的实体可能会迫使具有更高权限的实体执行该操作。在 AWS 中，跨服务模拟可能会导致混淆代理问题。一个服务（*呼叫服务*）调用另一项服务（*所谓的服务*）时，可能会发生跨服务模拟。可以操纵调用服务，使用其权限以在其他情况下该服务不应有访问权限的方式对另一个客户的资源进行操作。为防止这种情况，AWS 提供可帮助您保护所有服务的数据的工具，而这些服务中的服务主体有权限访问账户中的资源。有关更多信息，请参阅《IAM 用户指南》**中的[防止跨服务混淆代理](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html#cross-service-confused-deputy-prevention)。

我们建议在基于资源的策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以限制 Amazon Redshift 为其它服务提供的资源访问权限。如果 `aws:SourceArn` 值不包含账户 ID，例如 Amazon S3 存储桶 ARN，您必须使用两个全局条件上下文密钥来限制权限。如果同时使用全局条件上下文密钥和包含账户 ID 的 `aws:SourceArn` 值，则 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户在同一策略语句中使用时，必须使用相同的账户 ID。

以下示例显示了一个策略，您可以应用该策略来限制 Amazon Redshift 出现混淆代理问题。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": {
    "Sid": "ConfusedDeputyPreventionForRedshift",
    "Effect": "Allow",
    "Principal": {
      "Service": "redshift.amazonaws.com"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "ArnLike": {
        "aws:SourceArn": "arn:aws:redshift:us-east-1:123456789012:cluster:my-cluster"
      },
      "StringEquals": {
        "aws:SourceAccount": "123456789012"
      }
    }
  }
}
```

## 访问控制
<a name="redshift-iam-accesscontrol"></a>

您可以使用有效的凭证来对自己的请求进行身份验证，但您还必须拥有权限才能创建或访问 Amazon Redshift 资源。例如，您必须拥有权限才能创建 Amazon Redshift 集群、创建快照、添加事件订阅等。

下面几节介绍如何管理 Amazon Redshift 的权限。我们建议您先阅读概述。
+ [管理 Amazon Redshift 资源的访问权限的概览](redshift-iam-access-control-overview.md)
+  [将基于身份的策略（IAM 策略）用于 Amazon Redshift](redshift-iam-access-control-identity-based.md) 

# 管理 Amazon Redshift 资源的访问权限的概览
<a name="redshift-iam-access-control-overview"></a>

每个 AWS 资源都归某个 AWS 账户所有，创建或访问这些资源的权限由权限策略控制。账户管理员可以向 IAM 身份（即：用户、组和角色）附加权限策略，某些服务（如 AWS Lambda）也支持向资源附加权限策略。

**注意**  
*账户管理员*（或管理员用户）是具有管理员权限的用户。有关更多信息，请参阅 *IAM 用户指南*中的 [IAM 最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

在授予权限时，您要决定谁获得权限，获得对哪些资源的权限，以及您允许对这些资源执行的具体操作。

## Amazon Redshift 资源和操作
<a name="redshift-iam-accesscontrol.actions-and-resources"></a>

Amazon Redshift 提供服务特定的资源、操作和条件上下文键以在 IAM 权限策略中使用。

### Amazon Redshift、Amazon Redshift Serverless、Amazon Redshift 数据 API 和Amazon Redshift 查询编辑器 v2 访问权限
<a name="redshift-policy-resources.resource-permissions"></a>

在设置 [访问控制](redshift-iam-authentication-access-control.md#redshift-iam-accesscontrol) 时，您编写可附加到 IAM 身份的权限策略（基于身份的策略）。有关详细参考信息，请参阅《服务授权参考》**中的以下主题：
+ 对于 Amazon Redshift，请参阅 [Amazon Redshift 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonredshift.html)，它们使用 `redshift:` 前缀。
+ 对于 Amazon Redshift Serverless，请参阅 [Amazon Redshift Serverless 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonredshiftserverless.html)，它们使用 `redshift-serverless:` 前缀。
+ 对于 Amazon Redshift 数据 API，请参阅 [Amazon Redshift 数据 API 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonredshiftdataapi.html)，它们使用 `redshift-data:` 前缀。
+ 对于 Amazon Redshift 查询编辑器 v2，请参阅 [AWS SQL Workbench（Amazon Redshift 查询编辑器 v2）的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awssqlworkbench.html)，它们使用 `sqlworkbench:` 前缀。

  查询编辑器 v2 包括仅限权限操作，这些操作不会直接响应 API 操作。《Service Authorization Reference》**中用 `[permission only]` 指明了这些操作。

《服务授权参考》**包含有关可在 IAM 策略中使用的 API 操作的信息。它还包括您可以授予权限的 AWS 资源以及您可以针对细粒度访问控制包含的条件键。有关条件的更多信息，请参阅“[使用 IAM 策略条件进行精细访问控制](#redshift-policy-resources.conditions)”。

您需要在策略的 `Action` 字段中指定操作、在策略的 `Resource` 字段中指定资源值、在策略的 `Condition` 字段中指定条件。要为 Amazon Redshift 指定操作，请在 API 操作名称之前使用 `redshift:` 前缀（例如 `redshift:CreateCluster`）。

## 了解资源所有权
<a name="redshift-iam-access-control-resource-ownership"></a>

*资源所有者*是创建资源的 AWS 账户。也就是说，资源拥有者是 *主体实体*（根账户、IAM 用户或 IAM 角色）的 AWS 账户，该账户会对创建资源的请求进行身份验证。以下示例说明了它的工作原理：
+ 如果您使用 AWS 账户的根账户凭证创建数据库集群，则您的 AWS 账户即为该 Amazon Redshift 资源的拥有者。
+ 如果您在您的 AWS 账户中创建具有创建 Amazon Redshift 资源的权限的 IAM 角色，则能够担任该角色的任何人都可以创建 Amazon Redshift 资源。该角色所属的您的 AWS 账户拥有这些 Amazon Redshift 资源。
+ 如果您在 AWS 账户中创建 IAM 用户并对该用户授予创建 Amazon Redshift 资源的权限，则该用户也可以创建 Amazon Redshift 资源。但是，该用户所属的 AWS 账户拥有这些 Amazon Redshift 资源。在大多数情况下，不建议使用此方法。我们建议创建 IAM 角色并向该角色附加权限，然后将该角色分配给用户。

## 管理对资源的访问
<a name="redshift-iam-accesscontrol-managingaccess"></a>

*权限策略*规定谁可以访问哪些内容。下一节介绍创建权限策略时的可用选项。

**注意**  
本节讨论如何在 Amazon Redshift 范围内使用 IAM。这里不提供有关 IAM 服务的详细信息。有关完整的 IAM 文档，请参阅 *IAM 用户指南*中的[什么是 IAM？](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)。有关 IAM 策略语法和说明的信息，请参阅 *IAM 用户指南*中的 [AWS IAM 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

附加到 IAM 身份的策略称作*基于身份* 的策略（IAM 策略），附加到资源的策略称作*基于资源* 的策略。Amazon Redshift 只支持基于身份的策略（IAM 策略）。

### 基于身份的策略（IAM 策略）
<a name="redshift-iam-manage-access-identity-based"></a>

您可以通过将策略附加到 IAM 角色，然后将该角色分配给用户或组来分配权限。下面的示例策略包含为您的 AWS 账户创建、删除、修改和重启 Amazon Redshift 集群的权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid":"AllowManageClusters",
      "Effect":"Allow",
      "Action": [
        "redshift:CreateCluster",
        "redshift:DeleteCluster",
        "redshift:ModifyCluster",
        "redshift:RebootCluster"
      ],
      "Resource":"*"
    }
  ]
}
```

------

有关将基于身份的策略与 Amazon Redshift 结合使用的更多信息，请参阅[将基于身份的策略（IAM 策略）用于 Amazon Redshift](redshift-iam-access-control-identity-based.md)。有关用户、组、角色和权限的更多信息，请参阅 *IAM 用户指南*中的[身份（用户、组和角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。

### 基于资源的策略
<a name="redshift-iam-access-control-resource-based"></a>

其他服务（如 Amazon S3）还支持基于资源的权限策略。例如，您可以将策略附加到 S3 桶以管理对该桶的访问权限。Amazon Redshift 不支持基于资源的策略。

## 指定策略元素：操作、效果、资源和主体
<a name="redshift-iam-access-control-specify-actions"></a>

对于每个 Amazon Redshift 资源（请参阅 [Amazon Redshift 资源和操作](#redshift-iam-accesscontrol.actions-and-resources)），该服务都定义了一组 API 操作（请参阅[操作](https://docs.aws.amazon.com/redshift/latest/APIReference/API_Operations.html)）。为授予这些 API 操作的权限，Amazon Redshift 定义了一组您可以在策略中指定的操作。执行一个 API 操作可能需要多个操作的权限。

以下是基本的策略元素：
+ **资源** - 在策略中，您可以使用 Amazon 资源名称（ARN）标识策略应用到的资源。有关更多信息，请参阅 [Amazon Redshift 资源和操作](#redshift-iam-accesscontrol.actions-and-resources)。
+ **操作** – 您可以使用操作关键字标识要允许或拒绝的资源操作。例如，`redshift:DescribeClusters` 权限允许执行 Amazon Redshift `DescribeClusters` 操作的用户权限。
+ **效果** — 您可以指定当用户请求特定操作（可以是允许或拒绝）时的效果。如果没有显式授予（允许）对资源的访问权限，则隐式拒绝访问。您也可显式拒绝对资源的访问，这样可确保用户无法访问该资源，即使有其他策略授予了访问权限的情况下也是如此。
+ **主体**：在基于身份的策略（IAM 策略）中，附加了策略的用户是隐式主体。对于基于资源的策略，您可以指定要接收权限的用户、账户、服务或其他实体 (仅适用于基于资源的策略)。Amazon Redshift 不支持基于资源的策略。

有关 IAM 策略语法和描述的更多信息，请参阅 *IAM 用户指南*中的 [AWS IAM 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

有关显示所有 Amazon Redshift API 操作及其适用的资源的表，请参阅[Amazon Redshift、Amazon Redshift Serverless、Amazon Redshift 数据 API 和Amazon Redshift 查询编辑器 v2 访问权限](#redshift-policy-resources.resource-permissions)。



## 在策略中指定条件
<a name="redshift-policy-resources.specifying-conditions"></a>

当您授予权限时，可使用访问策略语言来指定规定策略何时生效的条件。例如，您可能希望策略仅在特定日期后应用。有关使用访问策略语言指定条件的更多信息，请参阅 *IAM 用户指南*中的 [IAM JSON 策略元素：条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。

要确定权限策略适用的条件，请在 IAM 权限策略中包含元素 `Condition`。例如，您可以创建一个策略，允许用户使用 `redshift:CreateCluster` 操作来创建集群，也可以添加 `Condition` 元素来限制用户只能在特定的区域中创建集群。有关详细信息，请参阅[使用 IAM 策略条件进行精细访问控制](#redshift-policy-resources.conditions)。有关所有条件键值及其适用的 Amazon Redshift 操作和资源的列表，请参阅[Amazon Redshift、Amazon Redshift Serverless、Amazon Redshift 数据 API 和Amazon Redshift 查询编辑器 v2 访问权限](#redshift-policy-resources.resource-permissions)。

### 使用 IAM 策略条件进行精细访问控制
<a name="redshift-policy-resources.conditions"></a>

在 Amazon Redshift 中，您可以根据资源的标签使用条件键来限制对资源的访问。以下是常见的 Amazon Redshift 条件键。


| 条件键 | 描述 | 
| --- | --- | 
| `aws:RequestTag` | 要求用户在创建资源时添加标签密钥（名称）和值。有关更多信息，请参阅 *IAM 用户指南*中的 [aws:RequestTag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)。 | 
| `aws:ResourceTag` | 根据特定标签密钥和值限制用户对资源的访问。有关更多信息，请参阅 *IAM 用户指南*中的 [aws:ResourceTag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag)。 | 
| `aws:TagKeys` | 使用此键可将请求中的标签键与您在策略中指定的键进行比较。有关更多信息，请参阅 *IAM 用户指南*中的 [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys)。 | 

有关标签的信息，请参阅[在 Amazon Redshift 中为资源添加标签](amazon-redshift-tagging.md)。

有关支持 `redshift:RequestTag` 和 `redshift:ResourceTag` 条件键的 API 操作的列表，请参阅 [Amazon Redshift、Amazon Redshift Serverless、Amazon Redshift 数据 API 和Amazon Redshift 查询编辑器 v2 访问权限](#redshift-policy-resources.resource-permissions)。

以下条件键可用于 Amazon Redshift GetClusterCredentials 操作。


| 条件键 | 描述 | 
| --- | --- | 
| `redshift:DurationSeconds` | 限制可为持续时间指定的秒数。 | 
| `redshift:DbName` | 限制可指定的数据库名称。 | 
| `redshift:DbUser` | 限制可指定的数据库用户名。 | 

#### 示例 1：使用 aws:ResourceTag 条件键限制访问
<a name="redshift-policy-resources.resource-permissions-example1"></a>

使用以下 IAM 策略，仅允许用户针对位于 `us-west-2` 区域的特定 AWS 账户修改标签名为 `environment`、值为 `test` 的 Amazon Redshift 集群。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid":"AllowModifyTestCluster",
        "Effect": "Allow",
        "Action": "redshift:ModifyCluster",
        "Resource": "arn:aws:redshift:us-west-2:123456789012:cluster:*",
        "Condition": {
            "StringEquals": {
                "aws:ResourceTag/environment": "test"
            }
        }
    }
}
```

------

#### 示例 2：使用 aws:RequestTag 条件键限制访问
<a name="redshift-policy-resources.resource-permissions-example2"></a>

使用以下 IAM 策略，仅允许用户在创建集群的命令包含名为 `usage`、值为 `production` 的标签时创建 Amazon Redshift 集群。带有 `aws:TagKeys` 和 `ForAllValues` 修饰符的条件指定只能在请求中指定 `costcenter` 和 `usage` 键。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid":"AllowCreateProductionCluster",
        "Effect": "Allow",
        "Action": [
            "redshift:CreateCluster",
            "redshift:CreateTags"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:RequestTag/usage": "production"
            },
            "ForAllValues:StringEquals": {
                "aws:TagKeys": [
                    "costcenter",
                    "usage"
                ]
            }
        }
    }
}
```

------

# 将基于身份的策略（IAM 策略）用于 Amazon Redshift
<a name="redshift-iam-access-control-identity-based"></a>

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

**重要**  
我们建议您首先阅读以下介绍性主题，这些主题讲解了管理 Amazon Redshift 资源访问的基本概念和选项。有关更多信息，请参阅 [管理 Amazon Redshift 资源的访问权限的概览](redshift-iam-access-control-overview.md)。

下面介绍权限策略示例。该权限允许用户创建、删除、修改和重启所有集群，但拒绝删除或修改 AWS 区域 `us-west-2` 和 AWS 账户 `123456789012` 中集群标识符以 `production` 开头的任何集群的权限。

------
#### [ JSON ]

****  

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

------

该策略包含两条语句：
+ 第一条语句授予用户创建、删除、修改和重启集群的权限。该语句指定通配符 (\$1) 作为 `Resource` 的值，因此，该策略适用于归根 AWS 账户所有的一切 Amazon Redshift 资源。
+ 第二条语句拒绝删除或修改集群的权限。该语句指定包含通配符 (\$1) 的集群 Amazon 资源名称（ARN）作为 `Resource` 的值。因此，该语句适用于归根 AWS 账户所有的一切 Amazon Redshift 集群（集群标识符以 `production` 开头）。

## 适用于 Amazon Redshift 的 AWS 托管式策略
<a name="redshift-policy-resources.managed-policies"></a>

AWS通过提供由AWS创建和管理的独立 IAM 策略来满足许多常用案例的要求。托管策略可针对常见使用案例授予必要权限，因此，您无需自行调查具体需要哪些权限。有关更多信息，请参阅《IAM 用户指南》**中的 [AWS 托管式策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

此外，您还可以创建自定义 IAM 策略，以授予账户 Amazon Redshift API 操作和资源访问的权限。您可以将这些自定义策略附加到需要这些权限的 IAM 角色或组。

以下部分描述 Amazon Redshift 特有的 AWS 托管式策略（可附加至您账户中的用户）：

## AWS 托管式策略的 Amazon Redshift 更新
<a name="security-iam-awsmanpol-updates"></a>



查看有关 Amazon Redshift（自从其开始跟踪更新更改以来）的 AWS 托管式策略更新的详细信息。有关此页面更改的自动提示，请订阅 Amazon Redshift 文档历史记录页面上的 RSS 源。




| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
|  [AmazonRedshiftFederatedAuthorization](#redshift-policy-managed-policies-federated-authorization) - 新策略  |   Amazon Redshift 新增了一项易用性策略，用于通过 Amazon Redshift 联合身份验证授权功能执行查询。  | 2025 年 11 月 21 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |   托管式策略增加了 `lakeformation:GetDataAccess` 操作的权限。添加此权限可授予从 AWS Lake Formation 中获取联合目录信息的权限。 操作 `glue:GetCatalog` 和 `glue:GetCatalogs` 的其它条件将添加到托管式策略中。  | 2025 年 3 月 13 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |   操作 `glue:GetCatalog` 和 `glue:GetCatalogs` 的权限将添加到托管式策略中。添加这些权限可授予从 AWS Glue 中获取目录信息的权限。  | 2024 年 12 月 3 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |  托管式策略增加了 `servicequotas:GetServiceQuota` 操作的权限。这为访问配额或限制提供了权限。  | 2024 年 3 月 8 日 | 
|  [AmazonRedshiftQueryEditorV2FullAccess](#redshift-policy-managed-policies-query-editor-V2)：对现有策略的更新  |  操作 `redshift-serverless:ListNamespaces` 和 `redshift-serverless:ListWorkgroups` 的权限将添加到托管式策略中。添加它们可授予在 Amazon Redshift 数据仓库中列出无服务器命名空间和无服务器工作组的权限。  | 2024 年 2 月 21 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing)：对现有策略的更新  |  操作 `redshift-serverless:ListNamespaces` 和 `redshift-serverless:ListWorkgroups` 的权限将添加到托管式策略中。添加它们可授予在 Amazon Redshift 数据仓库中列出无服务器命名空间和无服务器工作组的权限。  | 2024 年 2 月 21 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  操作 `redshift-serverless:ListNamespaces` 和 `redshift-serverless:ListWorkgroups` 的权限将添加到托管式策略中。添加它们可授予在 Amazon Redshift 数据仓库中列出无服务器命名空间和无服务器工作组的权限。  | 2024 年 2 月 21 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing)：对现有策略的更新  |  操作 `redshift-serverless:ListNamespaces` 和 `redshift-serverless:ListWorkgroups` 的权限将添加到托管式策略中。添加它们可授予在 Amazon Redshift 数据仓库中列出无服务器命名空间和无服务器工作组的权限。  | 2024 年 2 月 21 日 | 
|  [AmazonRedshiftReadOnlyAccess](#redshift-policy-managed-policies-read-only)：对现有策略的更新  |  托管式策略增加了 `redshift:ListRecommendations` 操作的权限。这将授予列出 Amazon Redshift Advisor 建议的权限。  | 2024 年 2 月 7 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |  操作 `ec2:AssignIpv6Addresses` 和 `ec2:UnassignIpv6Addresses` 的权限将添加到托管式策略中。添加这些权限可授予分配和取消分配 IP 地址的权限。  | 2023 年 10 月 31 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing)：对现有策略的更新  |  操作 `sqlworkbench:GetAutocompletionMetadata` 和 `sqlworkbench:GetAutocompletionResource` 的权限将添加到托管式策略中。添加它们可授予生成和检索数据库信息的权限，以便在编辑查询时自动完成 SQL。  | 2023 年 8 月 16 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  操作 `sqlworkbench:GetAutocompletionMetadata` 和 `sqlworkbench:GetAutocompletionResource` 的权限将添加到托管式策略中。添加它们可授予生成和检索数据库信息的权限，以便在编辑查询时自动完成 SQL。  | 2023 年 8 月 16 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing)：对现有策略的更新  |  操作 `sqlworkbench:GetAutocompletionMetadata` 和 `sqlworkbench:GetAutocompletionResource` 的权限将添加到托管式策略中。添加它们可授予生成和检索数据库信息的权限，以便在编辑查询时自动完成 SQL。  | 2023 年 8 月 16 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |  在托管式策略中增加了在 AWS Secrets Manager 中执行密钥创建和管理操作的权限。添加的权限如下： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html)  | 2023 年 8 月 14 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |  现在已从托管式策略删除了在 Amazon EC2 上执行操作以创建和管理安全组和路由规则的权限。这些权限与创建子网和 VPC 有关。移除的权限如下： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html) 它们与 Purpose:RedshiftMigrateToVpc 资源标签有关联。该标签将权限范围限制为从 Amazon EC2 Classic 到 Amazon EC2 VPC 迁移任务。有关更多信息，请参阅[控制对使用标签的 AWS 资源进行访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)。 | 2023 年 5 月 8 日 | 
|  [AmazonRedshiftDataFullAccess](#redshift-policy-managed-policies-data-full-access)：对现有策略的更新  |  托管式策略增加了 `redshift:GetClusterCredentialsWithIAM` 操作的权限。增加此权限会授予获取增强型临时凭证以通过指定的 AWS 账户访问 Amazon Redshift 数据库的权限。  | 2023 年 4 月 7 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |  在托管式策略中，现在添加了在 Amazon EC2 上执行操作以创建和管理安全组规则的权限。这些安全组和规则特别关联到 Amazon Redshift `aws:RequestTag/Redshift` 资源标签。这样可以将权限的范围限制为特定 Amazon Redshift 资源。  | 2023 年 4 月 6 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing)：对现有策略的更新  |  托管式策略增加了 `sqlworkbench:GetSchemaInference` 操作的权限。添加此项会授予权限，以获取从文件推断的列和数据类型  | 2023 年 3 月 21 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  托管式策略增加了 `sqlworkbench:GetSchemaInference` 操作的权限。添加此项会授予权限，以获取从文件推断的列和数据类型  | 2023 年 3 月 21 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing)：对现有策略的更新  |  托管式策略增加了 `sqlworkbench:GetSchemaInference` 操作的权限。添加此项会授予权限，以获取从文件推断的列和数据类型  | 2023 年 3 月 21 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing)：对现有策略的更新  |  托管式策略增加了 `sqlworkbench:AssociateNotebookWithTab` 操作的权限。添加它会授予相关权限，以创建和更新链接到用户自己的笔记本的选项卡。  | 2023 年 2 月 2 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  托管式策略增加了 `sqlworkbench:AssociateNotebookWithTab` 操作的权限。添加它会授予相关权限，以创建和更新链接到用户自己的笔记本或链接到与其共享的笔记本的选项卡。  | 2023 年 2 月 2 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing)：对现有策略的更新  |  托管式策略增加了 `sqlworkbench:AssociateNotebookWithTab` 操作的权限。添加它会授予相关权限，以创建和更新链接到用户自己的笔记本或链接到与其共享的笔记本的选项卡。  | 2023 年 2 月 2 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing)：对现有策略的更新  |  为了授予使用笔记本的权限，Amazon Redshift 添加了以下操作的权限： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html)  | 2022 年 10 月 17 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  为了授予使用笔记本的权限，Amazon Redshift 添加了以下操作的权限： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html)  | 2022 年 10 月 17 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing)：对现有策略的更新  |  为了授予使用笔记本的权限，Amazon Redshift 添加了以下操作的权限： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html)  | 2022 年 10 月 17 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |  Amazon Redshift 添加了命名空间 `AWS/Redshift` 以允许向 CloudWatch 发布指标。  | 2022 年 9 月 7 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing)：对现有策略的更新  |  Amazon Redshift 添加了用于执行 `sqlworkbench:ListQueryExecutionHistory` 和 `sqlworkbench:GetQueryExecutionHistory` 操作的权限。这授予了查看查询历史记录的权限。  | 2022 年 8 月 30 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  Amazon Redshift 添加了用于执行 `sqlworkbench:ListQueryExecutionHistory` 和 `sqlworkbench:GetQueryExecutionHistory` 操作的权限。这授予了查看查询历史记录的权限。  | 2022 年 8 月 30 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing)：对现有策略的更新  |  Amazon Redshift 添加了用于执行 `sqlworkbench:ListQueryExecutionHistory` 和 `sqlworkbench:GetQueryExecutionHistory` 操作的权限。这授予了查看查询历史记录的权限。  | 2022 年 8 月 30 日 | 
|  [AmazonRedshiftFullAccess](#redshift-policy-managed-policies-full-access)：对现有策略的更新  |  Amazon Redshift Serverless 的权限已添加到现有的 AmazonRedshiftFullAccess 托管式策略中。  | 2022 年 7 月 22 日 | 
|  [AmazonRedshiftDataFullAccess](#redshift-policy-managed-policies-data-full-access)：对现有策略的更新  |  Amazon Redshift 已将标签 aws:ResourceTag/RedshiftDataFullAccess 权限的 redshift-serverless:GetCredentials 默认作用域条件从 StringEquals 更新为 StringLike，以授予对使用标签键 RedshiftDataFullAccess 和任何标签值标记的资源的访问权限。 | 2022 年 7 月 11 日 | 
|  [AmazonRedshiftDataFullAccess](#redshift-policy-managed-policies-data-full-access)：对现有策略的更新  |  Amazon Redshift 添加了新权限，以允许 redshift-serverless:GetCredentials 获得对 Amazon Redshift Serverless 的临时凭证。 | 2022 年 7 月 8 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing)：对现有策略的更新  |  Amazon Redshift 添加了用于执行 `sqlworkbench:GetAccountSettings` 操作的权限。这将授予获取账户设置的权限。  | 2022 年 6 月 15 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  Amazon Redshift 添加了用于执行 `sqlworkbench:GetAccountSettings` 操作的权限。这将授予获取账户设置的权限。  | 2022 年 6 月 15 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing)：对现有策略的更新  |  Amazon Redshift 添加了用于执行 `sqlworkbench:GetAccountSettings` 操作的权限。这将授予获取账户设置的权限。  | 2022 年 6 月 15 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy)：对现有策略的更新  |  为了允许对新的 Amazon Redshift Serverless 端点进行公有访问，Amazon Redshift 在客户账户中分配弹性 IP 地址并将其关联到 VPC 端点的弹性网络接口。它通过由服务相关角色提供的权限来完成此操作。要启用此使用案例，分配和释放弹性 IP 地址的操作将添加到 Amazon Redshift Serverless 服务相关角色中。  | 2022 年 5 月 26 日 | 
|  [AmazonRedshiftQueryEditorV2FullAccess](#redshift-policy-managed-policies-query-editor-V2)：对现有策略的更新  |  操作 `sqlworkbench:ListTaggedResources` 的权限。它专门适用于 Amazon Redshift 查询编辑器 v2 资源。此策略更新授予仅可通过查询编辑器 v2 调用 `tag:GetResources` 的权限。  | 2022 年 2 月 22 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing)：对现有策略的更新  |  操作 `sqlworkbench:ListTaggedResources` 的权限。它专门适用于 Amazon Redshift 查询编辑器 v2 资源。此策略更新授予仅可通过查询编辑器 v2 调用 `tag:GetResources` 的权限。  | 2022 年 2 月 22 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  操作 `sqlworkbench:ListTaggedResources` 的权限。它专门适用于 Amazon Redshift 查询编辑器 v2 资源。此策略更新授予仅可通过查询编辑器 v2 调用 `tag:GetResources` 的权限。  | 2022 年 2 月 22 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing)：对现有策略的更新  |  操作 `sqlworkbench:ListTaggedResources` 的权限。它专门适用于 Amazon Redshift 查询编辑器 v2 资源。此策略更新授予仅可通过查询编辑器 v2 调用 `tag:GetResources` 的权限。  | 2022 年 2 月 22 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing)：对现有策略的更新  |  托管式策略增加了 `sqlworkbench:AssociateQueryWithTab` 操作的权限。增加此权限将允许客户创建编辑器选项卡，以链接到与其共享的查询。  | 2022 年 2 月 22 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy) – 对现有策略的更新  |  Amazon Redshift 添加了新操作的权限，允许对 Amazon Redshift 网络和 VPC 资源进行管理。  | 2021 年 11 月 22 日 | 
|  [AmazonRedshiftAllCommandsFullAccess](#redshift-policy-managed-policies-service-linked-role-commands) – 新策略  |  Amazon Redshift 添加了一项新策略，允许使用从 Amazon Redshift 控制台创建的 IAM 角色，并将其设置为默认角色，以便集群从 Amazon S3 运行 COPY、UNLOAD、CREATE EXTERNAL SCHEMA、CREATE EXTERNAL FUNCTION 和 CREATE MODEL 和 CREATE LIBRARY 命令。  | 2021 年 11 月 18 日 | 
|  [AmazonRedshiftServiceLinkedRolePolicy](#redshift-policy-managed-policies-service-linked-role-policy) – 对现有策略的更新  |  Amazon Redshift 添加了新操作的权限，允许管理 Amazon Redshift CloudWatch 日志组和日志流，包括审计日志导出。  | 2021 年 11 月 15 日 | 
|  [AmazonRedshiftFullAccess](#redshift-policy-managed-policies-full-access) – 对现有策略的更新  |  Amazon Redshift 添加了新权限。以允许模型可解释性、DynamoDB、Redshift Spectrum 和 Amazon RDS 联合身份验证等功能。 | 2021 年 10 月 7 日 | 
|  [AmazonRedshiftQueryEditorV2FullAccess](#redshift-policy-managed-policies-query-editor-V2) – 新策略  |  Amazon Redshift 添加了一项新策略，允许对 Amazon Redshift 查询编辑器 v2 的完全访问。  | 2021 年 9 月 24 日 | 
|  [AmazonRedshiftQueryEditorV2NoSharing](#redshift-policy-managed-policies-query-editor-V2-no-sharing) – 新策略  |  Amazon Redshift 添加了一项新策略，允许在不共享资源的情况下使用 Amazon Redshift 查询编辑器 v2。  | 2021 年 9 月 24 日 | 
|  [AmazonRedshiftQueryEditorV2ReadSharing](#redshift-policy-managed-policies-query-editor-V2-read-sharing) – 新策略  |  Amazon Redshift 添加了一项新策略，允许在 Amazon Redshift 查询编辑器 v2 中进行读取共享。  | 2021 年 9 月 24 日 | 
|  [AmazonRedshiftQueryEditorV2ReadWriteSharing](#redshift-policy-managed-policies-query-editor-V2-write-sharing) – 新策略  |  Amazon Redshift 添加了一项新策略，允许在 Amazon Redshift 查询编辑器 v2 中进行读取和更新共享。  | 2021 年 9 月 24 日 | 
|  [AmazonRedshiftFullAccess](#redshift-policy-managed-policies-full-access) – 对现有策略的更新  |  Amazon Redshift 添加了新的权限，以允许 `sagemaker:*Job*`。  | 2021 年 8 月 18 日 | 
|  [AmazonRedshiftDataFullAccess](#redshift-policy-managed-policies-data-full-access) – 对现有策略的更新  |  Amazon Redshift 添加了新的权限，以允许 `AuthorizeDataShare`。  | 2021 年 8 月 12 日 | 
|  [AmazonRedshiftDataFullAccess](#redshift-policy-managed-policies-data-full-access) – 对现有策略的更新  |  Amazon Redshift 添加了新的权限，以允许 `BatchExecuteStatement`。  | 2021 年 7 月 27 日 | 
|  Amazon Redshift 开始跟踪更改  |  Amazon Redshift 开始跟踪其 AWS 托管式策略的更改。  | 2021 年 7 月 27 日 | 

## AmazonRedshiftReadOnlyAccess
<a name="redshift-policy-managed-policies-read-only"></a>

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

您可以在 IAM 控制台上找到 [AmazonRedshiftReadOnlyAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftReadOnlyAccess) 策略，可以在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftReadOnlyAccess.html) 相关信息。

## AmazonRedshiftFullAccess
<a name="redshift-policy-managed-policies-full-access"></a>

授予 AWS 账户对所有 Amazon Redshift 资源的完全访问权限。此外，此策略还授予对所有 Amazon Redshift Serverless 资源的完全访问权限。

您可以在 IAM 控制台上找到 [AmazonRedshiftFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftFullAccess) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftFullAccess.html)。

## AmazonRedshiftQueryEditor
<a name="redshift-policy-managed-policies-query-editor"></a>

授予账户对 Amazon Redshift 控制台查询编辑器的完全访问权限。

您可以在 IAM 控制台上找到 [AmazonRedshiftQueryEditor](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftQueryEditor) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftQueryEditor](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftQueryEditor.html)。

## AmazonRedshiftDataFullAccess
<a name="redshift-policy-managed-policies-data-full-access"></a>

授予 AWS 账户对所有 Amazon Redshift 数据 API 操作和资源的完全访问权限。

您可以在 IAM 控制台上找到 [AmazonRedshiftDataFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftDataFullAccess) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftDataFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftDataFullAccess.html)。

## AmazonRedshiftQueryEditorV2FullAccess
<a name="redshift-policy-managed-policies-query-editor-V2"></a>

授予账户对 Amazon Redshift 查询编辑器 v2 的完全访问权限。此策略还授予访问其它所需服务的权限。

您可以在 IAM 控制台上找到 [AmazonRedshiftQueryEditorV2FullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftQueryEditorV2FullAccess) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftQueryEditorV2FullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftQueryEditorV2FullAccess.html)。

## AmazonRedshiftQueryEditorV2NoSharing
<a name="redshift-policy-managed-policies-query-editor-V2-no-sharing"></a>

授予账户使用 Amazon Redshift 查询编辑器 v2 的能力（资源不共享）。此策略还授予访问其它所需服务的权限。使用此策略的主体无法标记其资源（例如查询），因此无法与同一 AWS 账户 中的其它主体共享这些资源。

您可以在 IAM 控制台上找到 [AmazonRedshiftQueryEditorV2NoSharing](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftQueryEditorV2NoSharing) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftQueryEditorV2NoSharing](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftQueryEditorV2NoSharing.html)。

## AmazonRedshiftQueryEditorV2ReadSharing
<a name="redshift-policy-managed-policies-query-editor-V2-read-sharing"></a>

授予账户使用 Amazon Redshift 查询编辑器 v2 的能力（资源共享受限）。此策略还授予访问其它所需服务的权限。使用此策略的主体可以标记其资源（例如查询），以便与同一 AWS 账户 中的其它主体共享这些资源。获得授权的主体可读取其与团队共享的资源，但无法更新。

您可以在 IAM 控制台上找到 [AmazonRedshiftQueryEditorV2ReadSharing](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftQueryEditorV2ReadSharing) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftQueryEditorV2ReadSharing](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftQueryEditorV2ReadSharing.html)。

## AmazonRedshiftQueryEditorV2ReadWriteSharing
<a name="redshift-policy-managed-policies-query-editor-V2-write-sharing"></a>

授予账户使用 Amazon Redshift 查询编辑器 v2 共享资源的能力。此策略还授予访问其它所需服务的权限。使用此策略的主体可以标记其资源（例如查询），以便与同一 AWS 账户 中的其它主体共享这些资源。获得授权的主体可以读取和更新其与团队共享的资源。

您可以在 IAM 控制台上找到 [AmazonRedshiftQueryEditorV2ReadWriteSharing](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftQueryEditorV2ReadWriteSharing) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftQueryEditorV2ReadWriteSharing](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftQueryEditorV2ReadWriteSharing.html)。

## AmazonRedshiftServiceLinkedRolePolicy
<a name="redshift-policy-managed-policies-service-linked-role-policy"></a>

您无法将 AmazonRedshiftServiceLinkedRolePolicy 策略附加至您的 IAM 实体。把此策略附加至服务相关的角色，该角色允许 Amazon Redshift 访问账户资源。有关更多信息，请参阅[使用面向 Amazon Redshift 的服务相关角色](https://docs.aws.amazon.com/redshift/latest/mgmt/using-service-linked-roles.html)。

您可以在 IAM 控制台上找到 [AmazonRedshiftServiceLinkedRolePolicy](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftServiceLinkedRolePolicy) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftServiceLinkedRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftServiceLinkedRolePolicy.html)。

## AmazonRedshiftAllCommandsFullAccess
<a name="redshift-policy-managed-policies-service-linked-role-commands"></a>

授予账户使用从 Amazon Redshift 控制台创建的 IAM 角色的能力，并将其设置为默认角色，以便集群从 Amazon S3 运行 COPY、UNLOAD、CREATE EXTERNAL SCHEMA、CREATE EXTERNAL FUNCTION 和 CREATE MODEL 命令。该策略还授予账户为相关服务运行 SELECT 语句的权限，例如 Amazon S3、CloudWatch Logs、Amazon SageMaker AI 或 AWS Glue。

您可以在 IAM 控制台上找到 [AmazonRedshiftAllCommandsFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftAllCommandsFullAccess) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftAllCommandsFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftAllCommandsFullAccess.html)。

## AmazonRedshiftFederatedAuthorization
<a name="redshift-policy-managed-policies-federated-authorization"></a>

 该策略整合了使用 Amazon Redshift 联合身份验证权限对 Glue Data Catalog 数据库运行查询所需的 IAM 操作。此类查询通过 AWS Glue 执行，因此需要对目录对象执行 Get 操作来发现这些对象，并需要对目录对象执行 Create、Update、Rename 和 Delete 操作来修改这些对象。请注意，资源由 Amazon Redshift 管理，因此主体还需获得 Redshift 权限才能完成查询。`glue:FederateAuthorization` 操作允许 AWS Glue 将目录对象的授权决策委派给 Amazon Redshift。

 该策略允许主体使用 Amazon Redshift 联合身份验证权限对目录运行查询，但禁止向 AWS Glue 注册和取消注册 Amazon Redshift 命名空间。请参阅有关介绍 Amazon Redshift 联合身份验证权限设置的 IAM 策略要求的文档。

您可以在 IAM 控制台上找到 [AmazonRedshiftFederatedAuthorization](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftFederatedAuthorization) 策略，在《AWS 托管式策略参考指南》**中找到 [AmazonRedshiftFederatedAuthorization](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRedshiftFederatedAuthorization.html)。

此外，您还可以创建自定义 IAM 策略，以授予账户 Amazon Redshift API 操作和资源访问的权限。您可以将这些自定义策略附加到需要这些权限的 IAM 角色或组。





## 使用 Redshift Spectrum 所需的权限
<a name="redshift-spectrum-policy-resources"></a>

Amazon Redshift Spectrum 需要其他 AWS 服务访问资源的权限。有关 Redshift Spectrum 的 IAM 策略中的权限的详细信息，请参阅 *Amazon Redshift 数据库开发人员指南*中的 [Amazon Redshift Spectrum 的 IAM 策略](https://docs.aws.amazon.com/redshift/latest/dg/c-spectrum-iam-policies.html)。

## 使用 Amazon Redshift 控制台所需的权限
<a name="redshift-policy-resources.required-permissions.console"></a>

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

如果创建比必需的最低权限更为严格的 IAM 策略，对于附加了该 IAM 策略的用户，控制台无法按预期正常运行。要确保这些用户仍可使用 Amazon Redshift 控制台，也可向用户附加 `AmazonRedshiftReadOnlyAccess` 托管式策略。其操作方法，请见[适用于 Amazon Redshift 的 AWS 托管式策略](#redshift-policy-resources.managed-policies)所述。

有关授予用户访问 Amazon Redshift 控制台上的查询编辑器的权限，请参阅[使用 Amazon Redshift 控制台查询编辑器所需的权限](#redshift-policy-resources.required-permissions.query-editor)。

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

## 使用 Amazon Redshift 控制台查询编辑器所需的权限
<a name="redshift-policy-resources.required-permissions.query-editor"></a>

一个用户若要使用 Amazon Redshift 查询编辑器，该用户必须具有一组 Amazon Redshift 和 Amazon Redshift 数据 API 操作的最低权限。要使用密钥连接到数据库，您还必须具有 Secrets Manager 权限。

要授予用户对 Amazon Redshift 控制台上的查询编辑器的访问权限，请附加 `AmazonRedshiftQueryEditor` 和 `AmazonRedshiftReadOnlyAccess` AWS 托管式策略。`AmazonRedshiftQueryEditor` 策略允许用户只检索其自己的 SQL 语句的结果。也就是说，相同 `aws:userid` 提交的语句，如 `AmazonRedshiftQueryEditor` AWS 托管式策略的此部分所示。

```
{
    "Sid":"DataAPIIAMStatementPermissionsRestriction",
    "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 语句的结果，请创建您自己的策略，而不需要限制对当前用户的访问权限的条件。同时限制管理员更改策略的访问权限。

## 使用查询编辑器 v2 所需的权限
<a name="redshift-policy-resources.required-permissions.query-editor-v2"></a>

需要使用 Amazon Redshift 查询编辑器 v2 的用户必须拥有一组 Amazon Redshift、查询编辑器 v2 操作和其它操作的最低权限，以及其它 AWS 服务的权限，诸如 AWS Key Management Service、AWS Secrets Manager和标记服务。

要授予用户对查询编辑器 v2 的完全访问权，请附上 `AmazonRedshiftQueryEditorV2FullAccess` AWS 托管式策略。这些 `AmazonRedshiftQueryEditorV2FullAccess` 策略授权用户与同一团队中的其它人共享查询编辑器 v2 资源（例如查询）。有关如何控制查询编辑器 v2 资源访问的详细信息，请参阅 IAM 控制台上查询编辑器 v2 的特定托管式策略的定义。

一些 Amazon Redshift 查询编辑器 v2 AWS 托管式策略在条件中使用 AWS 标签，以限定对资源的访问。在查询编辑器 v2 中，共享查询的基础是附加至主体（IAM 角色）的 IAM 策略中的标签键和值 `"aws:ResourceTag/sqlworkbench-team": "${aws:PrincipalTag/sqlworkbench-team}"`。同样 AWS 账户 的主体具有相同标记值（例如 `accounting-team`），在查询编辑器 v2 中处于同一个团队。您同时只能与一个团队关联。具有管理权限的用户可以在 IAM 控制台上设置团队，方法是为所有团队成员提供相同的 `sqlworkbench-team` 标记值。如果标记值 `sqlworkbench-team` 已为 IAM 用户或 IAM 角色更改，可能要经过延迟后，更改才会反映在共享资源中。如果资源（例如查询）的标记值发生了更改，在更改生效之前可能再次出现延迟。团队成员还必须拥有 `tag:GetResources` 权限才能分享。

**示例：添加 IAM 角色的 `accounting-team` 标签**

1. 登录AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在控制台的导航窗格中，选择**角色**，然后选择要编辑的角色的名称。

1. 选择**标签**选项卡，然后选择**添加**标签。

1. 添加标记密钥 **sqlworkbench-team** 和值 `accounting-team`。

1. 选择**保存更改**。

   现在，当 IAM 主体（附加了此 IAM 角色）与团队共享查询时，其它具有同样 `accounting-team` 标记值的主体可以查看查询。

有关如何将标签附加至主体（包括 IAM 角色和 IAM 用户）的更多信息，请参阅《IAM 用户指南》**中的[标记 IAM 资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)部分。

您还可以使用身份提供者 (IdP) 在会话级别设置团队。这允许使用同一 IAM 角色的多个用户拥有不同的团队。IAM 角色信任策略必须允许 `sts:TagSession` 操作。有关更多信息，请参阅《IAM 用户指南》**中的[添加会话标签所需的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_permissions-required)。将主标签属性添加到 IdP 提供的 SAML 断言中。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:sqlworkbench-team">
    <AttributeValue>accounting-team</AttributeValue>
</Attribute>
```

按照身份提供者 (IdP) 提供的说明使用来自目录的内容填充 SAML 属性。有关身份提供者 (IdP) 和 Amazon Redshift 的更多信息，请参阅《IAM 用户指南》* *中的[使用 IAM 身份验证生成数据库用户凭证](generating-user-credentials.md)和[身份提供者和联合身份验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)。

`sqlworkbench:CreateNotebookVersion` 授予在账户上获取笔记本单元格的当前内容和创建笔记本版本的权限。这意味着，在创建版本时，笔记本的当前内容与该版本的内容相同。稍后，在更新当前笔记本时，版本中单元格的内容保持不变。`sqlworkbench:GetNotebookVersion` 授予获取笔记本版本的权限。没有 `sqlworkbench:BatchGetNotebookCell` 权限但拥有笔记本的 `sqlworkbench:CreateNotebookVersion` 和 `sqlworkbench:GetNotebookVersion` 权限的用户可以访问该版本中的笔记本单元格。此用户没有 `sqlworkbench:BatchGetNotebookCell` 权限，但仍然能够通过先创建一个版本，然后获取这个已创建版本来检索笔记本单元格的内容。

## 使用 Amazon Redshift 调度程序所需的权限
<a name="iam-permission-scheduler"></a>

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

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

------
#### [ JSON ]

****  

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

------

有关信任实体更多信息，请参阅 *IAM 用户指南*中的[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

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

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

------
#### [ JSON ]

****  

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

------

有关为 Amazon Redshift 调度程序创建角色的步骤，请参阅《IAM 用户指南》**中的[为 AWS 服务创建角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)。在 IAM 控制台中创建角色时，请选择以下选项：
+ 对于**选择将使用此角色的服务**：选择 **Redshift**。
+ 对于**选择您的使用案例**，选择 **Redshift - 计划程序**。
+ 为允许计划的 Amazon Redshift 操作的角色创建或附加策略。选择**创建策略**或修改角色以便附加策略。输入计划操作的 JSON 策略。
+ 在创建角色后，编辑 IAM 角色的**信任关系**以便包含服务 `redshift.amazonaws.com`。

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

## 使用 Amazon EventBridge 调度程序所需的权限
<a name="iam-permission-eventbridge-scheduler"></a>

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

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

您可以创建 IAM 角色以在 IAM 控制台上运行计划查询。在此 IAM 角色中，附加 `AmazonEventBridgeFullAccess` 和 `AmazonRedshiftDataFullAccess`。

以下示例演示 JSON 格式的策略文档，该策略用于设置与EventBridge 调度程序的信任关系。

------
#### [ JSON ]

****  

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

------

有关信任实体更多信息，请参阅 *IAM 用户指南*中的[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

有关为 EventBridge 调度程序创建角色的步骤，请参阅《IAM 用户指南》**中的[为 AWS 服务创建角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)。在 IAM 控制台中创建角色时，请选择以下选项：
+ 在**选择将使用此角色的服务**下，选择 **CloudWatch Events**。
+ 对于**选择您的使用案例**：选择 **CloudWatch Events**。
+ 附加以下权限策略：`AmazonEventBridgeFullAccess` 和 `AmazonRedshiftDataFullAccess`。

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

## 使用 Amazon Redshift 机器学习 (ML) 所需的权限
<a name="iam-permission-ml"></a>

接下来，您可以找到使用 Amazon Redshift 机器学习 (ML) 所需权限的描述（针对不同的使用案例）。

为了让用户在 Amazon SageMaker AI 中使用 Amazon Redshift ML，请创建一个 IAM 角色，该角色拥有的策略比默认策略更具限制性。您可以使用以下策略。您还可以修改此策略以满足您的需求。

以下策略显示了从 Amazon Redshift 运行 SageMaker AI Autopilot（具备模型可解释性）所需的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sagemaker:CreateTrainingJob",
                "sagemaker:CreateAutoMLJob",
                "sagemaker:CreateCompilationJob",
                "sagemaker:CreateEndpoint",
                "sagemaker:DescribeAutoMLJob",
                "sagemaker:DescribeTrainingJob",
                "sagemaker:DescribeCompilationJob",
                "sagemaker:DescribeProcessingJob",
                "sagemaker:DescribeTransformJob",
                "sagemaker:ListCandidatesForAutoMLJob",
                "sagemaker:StopAutoMLJob",
                "sagemaker:StopCompilationJob",
                "sagemaker:StopTrainingJob",
                "sagemaker:DescribeEndpoint",
                "sagemaker:InvokeEndpoint",
                "sagemaker:StopProcessingJob",
                "sagemaker:CreateModel",
                "sagemaker:CreateProcessingJob"
            ],
            "Resource": [
                "arn:aws:sagemaker:*:*:model/*redshift*",
                "arn:aws:sagemaker:*:*:training-job/*redshift*",
                "arn:aws:sagemaker:*:*:automl-job/*redshift*",
                "arn:aws:sagemaker:*:*:compilation-job/*redshift*",
                "arn:aws:sagemaker:*:*:processing-job/*redshift*",
                "arn:aws:sagemaker:*:*:transform-job/*redshift*",
                "arn:aws:sagemaker:*:*:endpoint/*redshift*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:/aws/sagemaker/Endpoints/*redshift*",
                "arn:aws:logs:*:*:log-group:/aws/sagemaker/ProcessingJobs/*redshift*",
                "arn:aws:logs:*:*:log-group:/aws/sagemaker/TrainingJobs/*redshift*",
                "arn:aws:logs:*:*:log-group:/aws/sagemaker/TransformJobs/*redshift*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": [
                        "SageMaker",
                        "/aws/sagemaker/Endpoints",
                        "/aws/sagemaker/ProcessingJobs",
                        "/aws/sagemaker/TrainingJobs",
                        "/aws/sagemaker/TransformJobs"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:BatchGetImage",
                "ecr:GetAuthorizationToken",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetBucketAcl",
                "s3:GetBucketCors",
                "s3:GetEncryptionConfiguration",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:ListMultipartUploadParts",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutBucketAcl",
                "s3:PutBucketCors",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload",
                "s3:CreateBucket"
            ],
            "Resource": [
                "arn:aws:s3:::redshift-downloads",
                "arn:aws:s3:::redshift-downloads/*",
                "arn:aws:s3:::*redshift*",
                "arn:aws:s3:::*redshift*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetBucketAcl",
                "s3:GetBucketCors",
                "s3:GetEncryptionConfiguration",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:ListMultipartUploadParts",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutBucketAcl",
                "s3:PutBucketCors",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload",
                "s3:CreateBucket"
            ],
            "Resource": "*",
            "Condition": {
                "StringEqualsIgnoreCase": {
                    "s3:ExistingObjectTag/Redshift": "true"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::*:role/*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": [
                        "redshift.amazonaws.com",
                        "sagemaker.amazonaws.com"
                    ]
                }
            }
        }
    ]
}
```

------

以下策略显示了允许访问 Amazon DynamoDB、Redshift Spectrum 和 Amazon RDS 联合身份验证的完全最低权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sagemaker:CreateTrainingJob",
                "sagemaker:CreateAutoMLJob",
                "sagemaker:CreateCompilationJob",
                "sagemaker:CreateEndpoint",
                "sagemaker:DescribeAutoMLJob",
                "sagemaker:DescribeTrainingJob",
                "sagemaker:DescribeCompilationJob",
                "sagemaker:DescribeProcessingJob",
                "sagemaker:DescribeTransformJob",
                "sagemaker:ListCandidatesForAutoMLJob",
                "sagemaker:StopAutoMLJob",
                "sagemaker:StopCompilationJob",
                "sagemaker:StopTrainingJob",
                "sagemaker:DescribeEndpoint",
                "sagemaker:InvokeEndpoint",
                "sagemaker:StopProcessingJob",
                "sagemaker:CreateModel",
                "sagemaker:CreateProcessingJob"
            ],
            "Resource": [
                "arn:aws:sagemaker:*:*:model/*redshift*",
                "arn:aws:sagemaker:*:*:training-job/*redshift*",
                "arn:aws:sagemaker:*:*:automl-job/*redshift*",
                "arn:aws:sagemaker:*:*:compilation-job/*redshift*",
                "arn:aws:sagemaker:*:*:processing-job/*redshift*",
                "arn:aws:sagemaker:*:*:transform-job/*redshift*",
                "arn:aws:sagemaker:*:*:endpoint/*redshift*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:/aws/sagemaker/Endpoints/*redshift*",
                "arn:aws:logs:*:*:log-group:/aws/sagemaker/ProcessingJobs/*redshift*",
                "arn:aws:logs:*:*:log-group:/aws/sagemaker/TrainingJobs/*redshift*",
                "arn:aws:logs:*:*:log-group:/aws/sagemaker/TransformJobs/*redshift*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": [
                        "SageMaker",
                        "/aws/sagemaker/Endpoints",
                        "/aws/sagemaker/ProcessingJobs",
                        "/aws/sagemaker/TrainingJobs",
                        "/aws/sagemaker/TransformJobs"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:BatchGetImage",
                "ecr:GetAuthorizationToken",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetBucketAcl",
                "s3:GetBucketCors",
                "s3:GetEncryptionConfiguration",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:ListMultipartUploadParts",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutBucketAcl",
                "s3:PutBucketCors",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload",
                "s3:CreateBucket"
            ],
            "Resource": [
                "arn:aws:s3:::redshift-downloads",
                "arn:aws:s3:::redshift-downloads/*",
                "arn:aws:s3:::*redshift*",
                "arn:aws:s3:::*redshift*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetBucketAcl",
                "s3:GetBucketCors",
                "s3:GetEncryptionConfiguration",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:ListMultipartUploadParts",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutBucketAcl",
                "s3:PutBucketCors",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload",
                "s3:CreateBucket"
            ],
            "Resource": "*",
            "Condition": {
                "StringEqualsIgnoreCase": {
                    "s3:ExistingObjectTag/Redshift": "true"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:DescribeTable",
                "dynamodb:Getitem"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:*:table/*redshift*",
                "arn:aws:dynamodb:*:*:table/*redshift*/index/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticmapreduce:ListInstances"
            ],
            "Resource": [
                "arn:aws:elasticmapreduce:*:*:cluster/*redshift*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticmapreduce:ListInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEqualsIgnoreCase": {
                    "elasticmapreduce:ResourceTag/Redshift": "true"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": "arn:aws:lambda:*:*:function:*redshift*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "glue:CreateDatabase",
                "glue:DeleteDatabase",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:UpdateDatabase",
                "glue:CreateTable",
                "glue:DeleteTable",
                "glue:BatchDeleteTable",
                "glue:UpdateTable",
                "glue:GetTable",
                "glue:GetTables",
                "glue:BatchCreatePartition",
                "glue:CreatePartition",
                "glue:DeletePartition",
                "glue:BatchDeletePartition",
                "glue:UpdatePartition",
                "glue:GetPartition",
                "glue:GetPartitions",
                "glue:BatchGetPartition"
            ],
            "Resource": [
                "arn:aws:glue:*:*:table/*redshift*/*",
                "arn:aws:glue:*:*:catalog",
                "arn:aws:glue:*:*:database/*redshift*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": [
                "arn:aws:secretsmanager:*:*:secret:*redshift*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "secretsmanager:ResourceTag/Redshift": "true"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::*:role/*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": [
                        "redshift.amazonaws.com",
                        "glue.amazonaws.com",
                        "sagemaker.amazonaws.com",
                        "athena.amazonaws.com"
                    ]
                }
            }
        }
    ]
}
```

------

或者，要使用 AWS KMS 密钥用于加密，将以下权限添加到策略中。

```
{
    "Effect": "Allow",
    "Action": [
        "kms:CreateGrant",
        "kms:Decrypt",
        "kms:DescribeKey",
        "kms:Encrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": [
        "arn:aws:kms:<your-region>:<your-account-id>:key/<your-kms-key>"
    ]
}
```

要支持 Amazon Redshift 和 SageMaker AI 代入先前的 IAM 角色以便与其它服务交互，请将以下信任策略添加到 IAM 角色中。

------
#### [ JSON ]

****  

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

------

先前的 Amazon S3 桶 `redshift-downloads/redshift-ml/`，是存储用于其他步骤和示例的示例数据的位置。如果您不需要从 Amazon S3 加载数据，您可以将桶删除。或者，将其替换为用于将数据加载到 Amazon Redshift 的其它 Amazon S3 桶。

**your-account-id**、**your-role** 和 **your-s3-bucket** 值是您在 CREATE MODEL（创建模型）命令中指定的账户 ID、角色和桶。

（可选）如果您为使用 Amazon Redshift ML 指定了一个 AWS KMS 密钥，请使用示例策略的 AWS KMS 密钥部分。**your-kms-key** 值是作为 CREATE MODEL 命令一部分使用的键。

如果您为超参数优化任务指定了一个私有的 Virtual Private Cloud (VPC)，请添加以下权限：

```
{
            "Effect": "Allow",
            "Action": [
            "ec2:CreateNetworkInterface",
            "ec2:CreateNetworkInterfacePermission",
            "ec2:DeleteNetworkInterface",
            "ec2:DeleteNetworkInterfacePermission",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DescribeVpcs",
            "ec2:DescribeDhcpOptions",
            "ec2:DescribeSubnets",
            "ec2:DescribeSecurityGroups"
            ]
}
```

要使用模型解释，请确保您具备调用 SageMaker AI API 操作的权限。建议使用 `AmazonSageMakerFullAccess` 托管式策略。如果您要使用更具限制性的策略创建 IAM 角色，您可以使用以下策略。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sagemaker:CreateEndpoint",
        "sagemaker:CreateEndpointConfig",
        "sagemaker:DeleteEndpoint",
        "sagemaker:DeleteEndpointConfig",
        "sagemaker:DescribeEndpoint",
        "sagemaker:DescribeEndpointConfig",
        "sagemaker:DescribeModel",
        "sagemaker:InvokeEndpoint",
        "sagemaker:ListTags"
      ],
      "Resource": "*"
    }
  ]
}
```

------

有关 `AmazonSageMakerFullAccess` 托管式策略的更多信息，请参阅《Amazon SageMaker AI 开发人员指南》**中的 [AmazonSageMakerFullAccess](https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonSageMakerFullAccess)。

如果您想创建预测模型，我们建议您使用 `AmazonForecastFullAccess` 托管式策略。如果您要使用更具限制性的策略，请将以下策略添加到您的 IAM 角色中。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "forecast:CreateAutoPredictor",
                "forecast:CreateDataset",
                "forecast:CreateDatasetGroup",
                "forecast:CreateDatasetImportJob",
                "forecast:CreateForecast",
                "forecast:CreateForecastExportJob",
                "forecast:DeleteResourceTree",
                "forecast:DescribeAutoPredictor",
                "forecast:DescribeDataset",
                "forecast:DescribeDatasetGroup",
                "forecast:DescribeDatasetImportJob",
                "forecast:DescribeForecast",
                "forecast:DescribeForecastExportJob",
                "forecast:StopResource",
                "forecast:TagResource",
                "forecast:UpdateDatasetGroup"
             ],
             "Resource": "*"
         }
    ]
}
```

------

如果您想创建 Amazon Bedrock 模型，我们建议您使用 `AmazonBedrockFullAccess` 托管式策略。如果您要使用更具限制性的策略，请将以下策略添加到您的 IAM 角色中。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "bedrock:InvokeModel",
            "Resource": [
                "*",
                "arn:aws:bedrock:us-east-1::foundation-model/*"
            ]
        }
    ]
}
```

------

有关 Amazon Redshift ML 的更多信息，请参阅[在 Amazon Redshift 中使用机器学习](https://docs.aws.amazon.com/redshift/latest/dg/machine_learning.html)、[CREATE MODEL](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html) 或 [CREATE EXTERNAL MODEL](https://docs.aws.amazon.com/redshift/latest/dg/r_create_external_model.html)。

## 串流摄取的权限
<a name="iam-permission-streaming-ingestion"></a>

串流摄取适用于两项服务。这两项服务是 Kinesis Data Streams 和 Amazon MSK。

### 在 Kinesis Data Streams 中使用串流摄取所需的权限
<a name="iam-permission-streaming-ingestion-kinesis"></a>

有关托管式策略示例的过程，请参阅[开始使用 Amazon Kinesis Data Streams 串流摄取](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started.html)。

### 在 Amazon MSK 中使用串流摄取所需的权限
<a name="iam-permission-streaming-ingestion-kafka"></a>

有关托管式策略示例的过程，请参阅[开始使用 Amazon Managed Streaming for Apache Kafka 串流摄取](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started-MSK.html)。

## 使用数据共享 API 操作所需的权限
<a name="iam-permission-datasharing"></a>

要控制对数据共享 API 操作的访问，请使用基于 IAM 操作的策略。有关如何管理 IAM 策略的信息，请参阅《IAM 用户指南》**中的[管理 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)。

当创建者集群管理员需要使用 `AuthorizeDataShare` 调用来授权 AWS 账户 账户外数据共享出口的时候，更是如此。在这种情况下，您可以设置基于 IAM 操作的策略来授予此权限。使用 `DeauthorizeDataShare` 调用以撤消出口。

使用基于 IAM 操作的策略时，您还可以在策略中指定 IAM 资源，例如 `DataShareARN`。下面显示了 `DataShareARN` 的格式和示例。

```
arn:aws:redshift:region:account-id:datashare:namespace-guid/datashare-name
arn:aws:redshift:us-east-1:555555555555:datashare:86b5169f-01dc-4a6f-9fbb-e2e24359e9a8/SalesShare
```

您可以通过在 IAM 策略中指定数据更新名称来限制对特定数据共享的 `AuthorizeDataShare` 访问权限。

```
{
  "Statement": [
    {
      "Action": [
        "redshift:AuthorizeDataShare",
      ],
      "Resource": [
        "arn:aws:redshift:us-east-1:555555555555:datashare:86b5169f-01dc-4a6f-9fbb-e2e24359e9a8/SalesShare"
      ],
      "Effect": "Deny"
    }
  ]
}
```

您还可以将 IAM 策略限制为特定创建器集群拥有的所有数据共享。若要执行此操作，请将策略中的 **datashare-name** 值替换为通配符或星号。保留集群的 `namespace-guid` 值。

```
arn:aws:redshift:us-east-1:555555555555:datashare:86b5169f-01dc-4a6f-9fbb-e2e24359e9a8/*
```

以下 IAM 策略防止实体面向特定创建者集群拥有的数据共享调用 `AuthorizeDataShare`。

```
{
  "Statement": [
    {
      "Action": [
        "redshift:AuthorizeDataShare",
      ],
      "Resource": [
        "arn:aws:redshift:us-east-1:555555555555:datashare:86b5169f-01dc-4a6f-9fbb-e2e24359e9a8/*"
      ],
      "Effect": "Deny"
    }
  ]
}
```

`DataShareARN` 会根据数据共享名称和所拥有的全局唯一的集群命名空间 ID (GUID) 来限制访问。它通过将名称指定为星号来完成此操作。

## GetClusterCredentials 的资源策略
<a name="redshift-policy-resources.getclustercredentials-resources"></a>

要使用 IAM 数据库凭证通过 JDBC 或 ODBC 连接来连接到集群数据库，或以编程方式调用 `GetClusterCredentials` 操作，您需要拥有调用 `redshift:GetClusterCredentials` 操作的权限以及对 `dbuser` 资源的访问权限。

如果使用 JDBC 或 ODBC 连接，您可以指定 `server` 和 `port` 来代替 `cluster_id` 和 `region`，为此，您的策略必须允许能够访问 `redshift:DescribeClusters` 资源的 `cluster` 操作。

如果您使用可选参数 `Autocreate`、`DbGroups` 和 `DbName` 调用 `GetClusterCredentials` 操作，您还必须允许这些操作，并允许访问下表中列出的资源。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html)

有关资源的更多信息，请参阅 [Amazon Redshift 资源和操作](redshift-iam-access-control-overview.md#redshift-iam-accesscontrol.actions-and-resources)。

您还可以在策略中包括以下条件：
+ `redshift:DurationSeconds`
+ `redshift:DbName`
+ `redshift:DbUser`

**重要**  
对于 SAML SSO 集成，您可能需要使用 `${redshift:DbUser}` 变量指定 IAM 策略。在此类情况下，我们强烈建议您使用条件语句，以确保调用方无法获取与其 AWS userid 不匹配的用户的凭证。例如，`"StringEquals": {"aws:userid":"AIDIODR4TAW7CSEXAMPLE:${redshift:DbUser}"}"`。请参阅[示例 8：使用 GetClusterCredentials 的 IAM 策略](#redshift-policy-examples-getclustercredentials)。有关条件的更多信息，请参阅[在策略中指定条件](redshift-iam-access-control-overview.md#redshift-policy-resources.specifying-conditions) 

## 客户管理型策略示例
<a name="redshift-iam-accesscontrol.examples"></a>

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

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

### 示例 1：为用户授予所有 Amazon Redshift 操作和资源的完全访问权限
<a name="redshift-policy-example-allow-full-access"></a>

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

------
#### [ JSON ]

****  

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

------

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

### 示例 2：拒绝用户访问一组 Amazon Redshift 操作
<a name="redshift-policy-example-deny-specific-actions"></a>

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

------
#### [ JSON ]

****  

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

------

### 示例 3：允许用户管理集群
<a name="redshift-policy-example-allow-manage-clusters"></a>

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

------
#### [ JSON ]

****  

```
{
  "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 name="redshift-policy-example-allow-authorize-revoke-snapshot"></a>

以下策略允许用户（如用户 A）执行以下操作：
+ 授予对从名为 `shared` 的集群中创建的任何快照的访问权限。
+ 撤消对从快照名称以 `shared` 开头的 `revokable` 集群中创建的任何快照的访问权限。

------
#### [ JSON ]

****  

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

------
#### [ JSON ]

****  

```
{
  "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：允许用户复制集群快照以及从快照中还原集群
<a name="redshift-policy-example-allow-copy-restore-snapshot"></a>

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

------
#### [ JSON ]

****  

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

------

### 示例 6：允许用户访问 Amazon Redshift 以及相关 AWS 服务的常见操作和资源
<a name="redshift-policy-example-allow-related-services"></a>

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

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

------
#### [ JSON ]

****  

```
{
  "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 控制台标记资源
<a name="redshift-policy-example-allow-tagging-with-console"></a>

以下示例策略允许用户使用 AWS Resource Groups 通过 Amazon Redshift 控制台对资源进行标记。此策略可附加到调用新的或原始 Amazon Redshift 控制台的用户角色。有关标记的更多信息，请参阅[在 Amazon Redshift 中为资源添加标签](amazon-redshift-tagging.md)。

------
#### [ JSON ]

****  

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

------

## 示例 8：使用 GetClusterCredentials 的 IAM 策略
<a name="redshift-policy-examples-getclustercredentials"></a>

以下策略使用这些示例参数值：
+ 区域：`us-west-2`
+ AWS 账户：`123456789012`
+ 集群名称：`examplecluster`

以下策略启用 `GetCredentials`、`CreateClusterUser` 和 `JoinGroup` 操作。仅在 AWS 用户 ID 与 `"AIDIODR4TAW7CSEXAMPLE:${redshift:DbUser}@yourdomain.com"` 匹配时，该策略才使用条件键以允许 `GetClusterCredentials` 和 `CreateClusterUser` 操作。IAM 访问权限仅对 `"testdb"` 数据库是必需的。该策略还允许用户参与名为 `"common_group"` 的组。

------
#### [ JSON ]

****  

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

------

以下示例显示允许 IAM 角色调用 `GetClusterCredentials` 操作的策略。该策略指定，对于名为 ` examplecluster` 的集群上的名为 ` temp_creds_user` 的数据库用户，Amazon Redshift `dbuser` 资源为其授予角色访问权限。

------
#### [ JSON ]

****  

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

------

您可使用通配符 (\$1) 替换完整或部分集群名称、用户名和数据库组名称。以下示例允许指定账户中的任何集群上所有以 `temp_` 开头的用户名调用。

**重要**  
以下示例中的语句指定通配符 (\$1) 作为资源的值，以便策略允许以指定字符开头的任何资源。在 IAM 策略使用通配符可能过于宽松。作为最佳实践，我们建议对您的业务应用程序使用最严格的可行策略。

------
#### [ JSON ]

****  

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

------

以下示例显示一个允许 IAM 角色调用 `GetClusterCredentials` 操作的策略，并提供了自动创建新用户和指定用户在登录时加入的组的选项。`"Resource": "*" `子句向角色授予对任何资源 (包括集群、数据库用户或用户组) 的访问权限。

**重要**  
以下示例中的语句指定通配符（\$1）作为给定操作的资源，使策略能够允许访问任何集群和数据库用户，并支持创建任何用户。在 IAM 策略使用通配符可能过于宽松。作为最佳实践，我们建议对您的业务应用程序使用最严格的可行策略。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
             "redshift:GetClusterCredentials",
             "redshift:CreateClusterUser",
		"redshift:JoinGroup"
            ],
    "Resource": "*"
  }
}
```

------

有关更多信息，请参阅 [Amazon Redshift ARN 语法](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-redshift)。

# Amazon Redshift 的原生身份提供者 (IdP) 联合身份验证
<a name="redshift-iam-access-control-native-idp"></a>

借助原生身份提供者联合身份验证，管理 Amazon Redshift 的身份和权限变得更加容易，因为它利用现有身份提供者来简化身份验证和管理权限。它可以通过使身份提供者向 Redshift 共享身份元数据来实现这一目标。对于此功能的第一次迭代，受支持的身份提供者是 [Microsoft Azure Active Directory (Azure AD)](https://azure.microsoft.com/en-us/services/active-directory/)。

要将 Amazon Redshift 配置为对来自第三方身份提供者的身份进行身份验证，您可以向 Amazon Redshift 注册身份提供者。这样做可以让 Redshift 对身份提供者定义的用户和角色进行身份验证。这样，您可以避免必须同时在第三方身份提供者和 Amazon Redshift 中执行精细的身份管理，因为身份信息是共享的。

有关使用从身份提供者 (IdP) 组转移的会话角色的信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [PG\$1GET\$1SESSION\$1ROLES](https://docs.aws.amazon.com/redshift/latest/dg/PG_GET_SESSION_ROLES.html) 。

## 原生身份提供者（IdP）联合身份验证
<a name="redshift-iam-access-control-native-idp-login"></a>

 要完成身份提供者和 Amazon Redshift 之间的初步设置，您需要执行以下几个步骤：首先，向身份提供者注册 Amazon Redshift 作为第三方应用程序，同时请求必要的 API 权限。然后在身份提供者中创建用户和组。最后，您可以使用 SQL 语句向 Amazon Redshift 注册身份提供者，这些语句设置身份提供者特有的身份验证参数。在向 Redshift 注册身份提供者的过程中，您分配一个命名空间以确保正确地对用户和角色进行分组。

 在向 Amazon Redshift 注册身份提供者后，Redshift 和身份提供者之间就建立了通信。然后，客户端可以作为身份提供者实体传递令牌并向 Redshift 进行身份验证。Amazon Redshift 使用 IdP 组成员资格信息来映射到 Redshift 角色。如果用户之前不存在于 Redshift 中，则会创建该用户。创建映射到身份提供者组的角色（如果它们不存在）。Amazon Redshift 管理员授予对角色的权限，而用户可以运行查询和执行其他数据库任务。

以下步骤概述当用户登录时原生身份提供者联合身份验证的工作方式：

1. 当用户从客户端使用原生 IdP 选项登录时，身份提供者令牌将从客户端发送到驱动程序。

1. 对用户进行身份验证。如果 Amazon Redshift 中不存在此用户，则将创建一个新用户。Redshift 将用户的身份提供者组映射到 Redshift 角色。

1. 权限是根据用户的 Redshift 角色分配的。管理员将这些权限授予用户和角色。

1. 用户可以查询 Redshift。

## 桌面客户端工具
<a name="redshift-iam-access-control-native-idp-oauth"></a>

有关如何使用原生身份提供者联合身份验证通过 Power BI 连接到 Amazon Redshift 的说明，请参阅博客文章[将 Amazon Redshift 原生 IdP 联合身份验证与 Microsoft Azure Active Directory (AD) 和 Power BI 集成](https://aws.amazon.com/blogs/big-data/integrate-amazon-redshift-native-idp-federation-with-microsoft-azure-ad-and-power-bi/)。它介绍了使用 Azure AD 实施 Amazon Redshift 原生 IdP 设置的按步骤过程。它详细介绍了为 Power BI 桌面或 Power BI 服务设置客户端连接的步骤。这些步骤包括应用程序注册、配置权限和配置凭证。

要了解如何使用 Power BI 桌面和 JDBC 客户端 SQL WorkBench/J 将 Amazon Redshift 原生 IdP 联合身份验证与 Azure AD 集成，请观看以下视频：

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/S3MQLvZ-NiI/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/S3MQLvZ-NiI)


有关如何使用原生身份提供者联合身份验证通过 SQL 客户端（特别是 DBEaver 或 SQL WorkBench/J）连接到 Amazon Redshift 的说明，请参阅博客文章[使用 SQL 客户端将 Amazon Redshift 原生 IdP 联合身份验证与 Microsoft Azure AD 集成](https://aws.amazon.com/blogs/big-data/integrate-amazon-redshift-native-idp-federation-with-microsoft-azure-ad-using-a-sql-client/)。

## 限制
<a name="redshift-iam-access-control-idp-connect-limitations"></a>

以下限制适用：
+  Amazon Redshift 驱动程序从以下版本开始支持 `BrowserIdcAuthPlugin`：
  +  Amazon Redshift JDBC 驱动程序 v2.1.0.30 
  +  Amazon Redshift ODBC 驱动程序 v2.1.3 
  +  Amazon Redshift Python 驱动程序 v2.1.3 
+  Amazon Redshift 驱动程序从以下版本开始支持 `IdpTokenAuthPlugin`：
  +  Amazon Redshift JDBC 驱动程序 v2.1.0.19 
  +  Amazon Redshift ODBC 驱动程序 v2.0.0.9 
  +  Amazon Redshift Python 驱动程序 v2.0.914 
+ **不支持增强型 VPC** – 使用 AWS IAM Identity Center 配置 Redshift 可信身份传播时，不支持增强型 VPC。有关增强型 VPC 的更多信息，请参阅 [Amazon Redshift 中的增强型 VPC 路由](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html)。
+  **AWS IAM Identity Center 缓存** – AWS IAM Identity Center 会缓存会话信息。当您尝试通过 Redshift 查询编辑器 v2 连接到 Redshift 数据库时，这可能会导致无法预测的访问问题。这是因为查询编辑器 v2 中相关联的 AWS IAM Identity Center 会话即使在数据库用户退出 AWS 控制台的情况下仍然有效。缓存会在一小时后过期，这通常可以解决任何问题。

# 在 Amazon Redshift 上设置身份提供者
<a name="redshift-iam-access-control-native-idp-setup"></a>

本节介绍配置身份提供者和 Amazon Redshift 以便为原生身份提供者联合身份验证建立通信的步骤。您需要身份提供者的有效账户。在配置 Amazon Redshift 之前，您可以向身份提供者注册 Redshift 作为应用程序，并授予管理员同意。

在 Amazon Redshift 中，完成以下步骤：

1. 运行 SQL 语句来注册身份提供者，包括 Azure 应用程序元数据的说明。要在 Amazon Redshift 中创建身份提供者，请在替换参数值 *issuer*、*client\$1id*、*client\$1secret* 和 *audience* 后运行以下命令。这些参数特定于 Microsoft Azure AD。将身份提供者名称替换为您选择的名称，然后用唯一名称替换命名空间，以包含来自身份提供者目录中的用户和角色。

   ```
   CREATE IDENTITY PROVIDER oauth_standard TYPE azure
   NAMESPACE 'aad'
   PARAMETERS '{
   "issuer":"https://sts.windows.net/2sdfdsf-d475-420d-b5ac-667adad7c702/",
   "client_id":"<client_id>",
   "client_secret":"BUAH~ewrqewrqwerUUY^%tHe1oNZShoiU7",
   "audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift"]
   }'
   ```

   类型 `azure` 表示该提供商特意加强了与 Microsoft Azure AD 的通信。这是目前唯一受支持的第三方身份提供者。
   + *issuer* - 收到令牌时要信任的发布者 ID。*tenant\$1id* 的唯一标识符附加到发布者之后。
   + *client\$1id* - 向身份提供者注册的应用程序的唯一公有标识符。这可以称为应用程序 ID。
   + *client\$1secret* - 只有身份提供者和注册的应用程序才知道的秘密标识符或密码。
   + *audience* - 在 Azure 中分配给应用程序的应用程序 ID。

   

   您可以在创建身份提供者时设置参数来指定证书、私有密钥和私有密钥密码，而不使用共享客户端密钥。

   ```
   CREATE IDENTITY PROVIDER example_idp TYPE azure 
   NAMESPACE 'example_aad' 
   PARAMETERS '{"issuer":"https://sts.windows.net/2sdfdsf-d475-420d-b5ac-667adad7c702/", 
   "client_id":"<client_id>", 
   "audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift"], 
   "client_x5t":"<certificate thumbprint>", 
   "client_pk_base64":"<private key in base64 encoding>", 
   "client_pk_password":"test_password"}';
   ```

   私有密钥密码 *client\$1pk\$1password* 为可选项。

1. 可选：在 Amazon Redshift 中运行 SQL 命令以预先创建用户和角色。这有助于提前授予权限。Amazon Redshift 中的角色名称如下所示：*<Namespace>:<GroupName on Azure AD>*。例如，当您在 Microsoft Azure AD 中创建一个名为 `rsgroup` 的组和一个名为 `aad` 的命名空间时，角色名称为 `aad:rsgroup`。从身份提供者命名空间中的这些用户名和组成员资格定义 Amazon Redshift 中的用户和角色名称。

   角色和用户的映射包括验证他们的 `external_id` 值，以确保它是最新的。外部 ID 将映射到身份提供者中组或用户的标识符。例如，角色的外部 ID 将映射到相应的 Azure AD 组 ID。同样，每个用户的外部 ID 都将映射到他们在身份提供者中的 ID。

   ```
   create role "aad:rsgroup";
   ```

1. 根据您的要求向角色授予相关权限。例如：

   ```
   GRANT SELECT on all tables in schema public to role "aad:rsgroup";
   ```

1. 您还可向特定用户授予权限。

   ```
   GRANT SELECT on table foo to aad:alice@example.com
   ```

   请注意，对于联合身份验证的外部用户，其角色成员资格仅在该用户的会话中可用。这对创建数据库对象有影响。例如，当联合身份验证的外部用户创建任何视图或存储过程时，同一个用户无法将这些对象的权限委托给其他用户和角色。

**命名空间的解释**

命名空间将用户或角色映射到特定身份提供者。例如，在 AWS IAM 中创建的用户的前缀是 `iam:`。此前缀可防止用户名冲突，并使支持多个身份存储成为可能。如果用户 alice@example.com 来自向 *aad* 命名空间注册的身份源，则当此用户登录时，会在 Redshift 中创建用户 `aad:alice@example.com`（如果此用户尚未存在）。请注意，用户和角色命名空间与 Amazon Redshift 集群命名空间具有不同的功能，后者是与集群关联的唯一标识符。

# 自动为身份提供者创建 Amazon Redshift 角色
<a name="redshift-iam-access-control-native-idp-autocreate"></a>

借助此特征，您可以根据身份提供者（IdP）的组成员资格在 Redshift 中自动创建角色。自动创建角色支持具有本机 IdP 集成的 Azure Active Directory。

自动创建角色有几个好处。自动创建角色时，Redshift 会在您的 IdP 中创建具有组成员资格的角色，因此您可以避免繁琐的手动角色创建和维护。还可以选择筛选映射到 Redshift 角色的组。

## 工作原理
<a name="sso-autocreate-overview"></a>

当您以 IdP 用户身份登录 Redshift 时，会发生以下一系列事件：

1. Redshift 从 IdP 那里检索您的组成员资格。

1. Redshift 使用角色格式 `idp_namespace:rolename` 自动创建映射到这些组的角色。

1. Redshift 授予您使用映射角色的权限。

每次用户登录时，都会自动创建目录中不存在但该用户所属的每个组。您可以选择设置包括和排除筛选条件，从而控制哪些 IdP 组已创建 Redshift 角色。

## 配置自动创建角色
<a name="sso-autocreate-configuring"></a>

使用 `CREATE IDENTITY PROVIDER` 和 `ALTER IDENTITY PROVIDER` 命令启用和配置自动角色创建。

```
-- Create a new IdP with auto role creation enabled
CREATE IDENTITY PROVIDER <idp_name> TYPE azure
  NAMESPACE '<namespace>' 
  APPLICATION_ARN 'app_arn'
  IAM_ROLE 'role_arn'
  AUTO_CREATE_ROLES TRUE; 

-- Enable on existing IdP 
ALTER IDENTITY PROVIDER <idp_name>
  AUTO_CREATE_ROLES TRUE;

-- Disable  
ALTER IDENTITY PROVIDER <idp_name>
  AUTO_CREATE_ROLES FALSE;
```

## 筛选组
<a name="sso-autocreate-filtering"></a>

您可以选择使用 `INCLUDE` 和 `EXCLUDE` 模式筛选映射到 Redshift 角色的 IdP 组。当模式冲突时，`EXCLUDE` 优先于 `INCLUDE`。

```
-- Only create roles for groups with 'dev' 
CREATE IDENTITY PROVIDER <idp_name> TYPE azure
  ...
  AUTO_CREATE_ROLES TRUE
  INCLUDE GROUPS LIKE '%dev%';
    
-- Exclude 'test' groups
ALTER IDENTITY PROVIDER <idp_name> 
  AUTO_CREATE_ROLES TRUE
  EXCLUDE GROUPS LIKE '%test%';
```

## 示例
<a name="sso-autocreate-filtering"></a>

以下示例说明了如何启用自动创建角色而不进行筛选。

```
CREATE IDENTITY PROVIDER prod_idc TYPE azure ...
  AUTO_CREATE_ROLES TRUE;
```

以下示例包括开发组，不包括测试组。

```
ALTER IDENTITY PROVIDER prod_idc
  AUTO_CREATE_ROLES TRUE
  INCLUDE GROUPS LIKE '%dev%'
  EXCLUDE GROUPS LIKE '%test%';
```

## 最佳实践
<a name="sso-autocreate-bp"></a>

为角色启用自动创建功能时，请考虑遵循以下最佳实践：
+ 使用 `INCLUDE` 和 `EXCLUDE` 筛选条件来控制哪些组获得角色。
+ 定期审核角色并清理未使用的角色。
+ 利用 Redshift 角色层次结构来简化权限管理。

# 将 Redshift 与 AWS IAM Identity Center 连接来提供单点登录体验
<a name="redshift-iam-access-control-idp-connect"></a>

您可以通过可信身份传播来管理用户和组对 Amazon Redshift 数据仓库的访问权限。

[Trusted identity propagation](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overview.html) 是一项 AWS IAM Identity Center 功能，已连接的 AWS 服务的管理员可以使用它来授予和审计对服务数据的访问权限。对这些数据的访问权限基于用户属性，例如组关联。设置可信身份传播要求已连接的 AWS 服务的管理员和 IAM Identity Center 管理员之间进行协作。有关更多信息，请参阅 [Prerequisites and considerations](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overall-prerequisites.html)。

以一个端到端案例来说明，您可以使用 Amazon Quick 控制面板或 Amazon Redshift 查询编辑器 v2 来访问 Redshift。在这种情况下，访问权限基于 AWS IAM Identity Center 组。Redshift 可以确定用户的身份以及他们的组成员资格。AWSIAM Identity Center 还允许通过 Okta 或 PingOne 等第三方身份提供者 (IdP) 连接和管理身份。

管理员设置 Redshift 与 AWS IAM Identity Center 之间的连接后，他们可以根据身份提供者的组来配置精细访问权限，以授权用户访问数据。

**重要**  
从 AWS IAM Identity Center 或连接的身份提供者（IdP）目录中删除用户时，该用户不会自动从 Amazon Redshift 目录中删除。要从 Amazon Redshift 目录中手动删除用户，请运行 `DROP USER` 命令以完全删除已从 AWS IAM Identity Center 或 IdP 中移除的用户。有关如何删除用户的更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [DROP USER](https://docs.aws.amazon.com/redshift/latest/dg/r_DROP_USER.html)。

## Redshift 与 AWS IAM Identity Center 集成的优势
<a name="redshift-iam-access-control-idp-connect-benefits"></a>

将 AWS IAM Identity Center 与 Redshift 结合使用，可以在以下方面为企业带来益处：
+  Amazon Quick 中的控制面板作者无需重新输入密码，也无需要求管理员设置具有复杂权限的 IAM 角色，即可连接 Redshift 数据来源。
+  AWS IAM Identity Center 为您在 AWS 中的员工用户提供了一个中心位置。您可以直接在 AWS IAM Identity Center 创建用户和群，也可以连接您在基于标准的身份提供者中管理的现有用户和组，例如 Okta、PingOne 或 Microsoft Entra ID（Azure AD）。AWSIAM Identity Center 将身份验证定向到您为用户和组选择的信任源，并维护一个用户和组的目录以供 Redshift 访问。有关更多信息，请参阅《AWS IAM Identity Center 用户指南》**中的[管理您的身份源](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-identity-source.html)和[支持的身份提供者](https://docs.aws.amazon.com/singlesignon/latest/userguide/supported-idps.html)。
+ 通过简单的自动发现和连接功能，您便可与多个 Redshift 集群和工作组共享一个 AWS IAM Identity Center 实例。这样可以快速添加集群，而无需额外地为每个集群配置 AWS IAM Identity Center 连接，还可确保所有集群和工作组都能一致地查看用户、其属性和组。请注意，您企业的 AWS IAM Identity Center 实例必须与要连接的任意 Redshift 数据共享位于同一区域。
+ 由于用户身份已知并与数据访问记录在一起，因此您可以通过在 AWS CloudTrail 中审计用户的访问，更轻松地满足合规性监管要求。

## 用于连接应用程序的管理员角色
<a name="redshift-iam-access-control-idp-personas"></a>

在将分析应用程序连接到 AWS IAM Identity Center 托管的 Redshift 应用程序的过程中，以下角色非常关键：
+ **应用程序管理员** – 创建应用程序并配置要与哪些服务启用身份令牌交换。此管理员还需要指定哪些用户或组有权访问应用程序。
+ **数据管理员** – 配置对数据的精细访问权限。AWS IAM Identity Center 中的用户和组可以映射到特定权限。

## 使用 AWS IAM Identity Center 通过 Amazon Quick 连接到 Amazon Redshift
<a name="redshift-iam-access-control-idp-connect-qs"></a>

以下内容演示在连接到 Redshift 并通过 AWS IAM Identity Center 管理访问权限时，如何使用 Quick 通过 Redshift 进行身份验证：[授权从 Quick 到 Amazon Redshift 集群的连接](https://docs.aws.amazon.com/quick/latest/userguide/enabling-access-redshift.html)。这些步骤也适用于 Amazon Redshift Serverless。

## 使用 AWS IAM Identity Center 通过 Amazon Redshift 查询编辑器 v2 连接到 Amazon Redshift
<a name="redshift-iam-access-control-idp-connect-qe"></a>

完成设置 AWS IAM Identity Center 与 Redshift 连接的步骤后，用户可以通过基于 AWS IAM Identity Center 且以命名空间为前缀的身份，访问数据库以及数据库中的相应对象。有关使用查询编辑器 v2 登录身份连接到 Redshift 数据库的更多信息，请参阅[使用查询编辑器 v2 查询数据库使用 Amazon Redshift 查询编辑器 v2 查询数据库](query-editor-v2.md)。



## 跨多个 AWS 区域使用 AWS IAM Identity Center
<a name="redshift-iam-access-control-idp-connect-multi-region"></a>

Amazon Redshift 在多个 AWS 区域中支持 AWS IAM Identity Center。您可以将 AWS IAM Identity Center 从您的主 AWS 区域扩展到其它区域，从而通过靠近用户和提高可靠性来提高性能。在 AWS IAM Identity Center 中添加新区域后，您无需从主区域中复制身份，即可在新区域中创建 Redshift IAM Identity Center 应用程序。您可以在新区域中使用 AWS IAM Identity Center 设置 Amazon Redshift 联合权限，在该新区域中，您可以启用行级、列级和掩蔽控件。有关在多个区域中开始使用 AWS IAM Identity Center 的更多详细信息，请参阅《AWS IAM Identity Center 用户指南》**中的[在多个 AWS 区域中管理 AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/multi-region-iam-identity-center.html)。

## 使用 AWS IAM Identity Center 连接到 Amazon Redshift 的优势
<a name="redshift-iam-access-control-idp-connect-limitations"></a>

使用 AWS IAM Identity Center 单点登录时，请考虑以下限制：


+  **不支持增强型 VPC**：当您对 Amazon Redshift 使用 AWS IAM Identity Center 单点登录时，不支持增强型 VPC。有关增强型 VPC 的更多信息，请参阅 [Amazon Redshift 中的增强型 VPC 路由](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html)。

# 设置 AWS IAM Identity Center 与 Amazon Redshift 的集成
<a name="redshift-iam-access-control-idp-connect-console"></a>

您的 Amazon Redshift 集群管理员或 Amazon Redshift Serverless 管理员必须执行多个步骤，以将 Redshift 配置为启用了 AWS IAM Identity Center 的应用程序。这样，Redshift 便可以自动发现并连接到 AWS IAM Identity Center 来获取登录和用户目录服务。在此之后，当 Redshift 管理员创建集群或工作组时，他们可以允许新的数据仓库使用 AWS IAM Identity Center 来管理数据库访问。

启用 Redshift 作为 AWS IAM Identity Center 托管应用程序的意义在于，您可以从 AWS IAM Identity Center 中或与之集成的第三方身份提供者控制用户和组的权限。当数据库用户（例如分析师或数据科学家）登录 Redshift 数据库时，服务会在 AWS IAM Identity Center 中检查他们所属的组，这些组与 Redshift 中的角色名称相匹配。通过这种方式，举例而言，定义了 Redshift 数据库角色名称的组可以访问一组表以便进行销售分析。以下部分将介绍如何完成此设置。

## 先决条件
<a name="redshift-iam-access-control-idp-connect-prerequisites"></a>

将 AWS IAM Identity Center 与 Amazon Redshift 集成的先决条件如下所示：
+ *账户配置* – 如果您计划使用跨账户应用场景，或者如果您在具有相同 AWS IAM Identity Center 实例的不同账户中使用 Redshift 集群，则必须在 AWS Organizations 管理账户中配置 AWS IAM Identity Center。这包括配置您的身份源。有关更多信息，请参阅**《AWS IAM Identity Center 用户指南》中的[入门](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)、[员工身份](https://docs.aws.amazon.com/singlesignon/latest/userguide/identities.html)和[支持的身份提供者](https://docs.aws.amazon.com/singlesignon/latest/userguide/supported-idps.html)。您必须确保已在 AWS IAM Identity Center 中创建用户或组，或者已从您的身份源同步用户和组，然后才能在 Redshift 中将他们指定到 Redshift 中的数据。
**注意**  
您可以选择使用 AWS IAM Identity Center 的账户实例，前提是 Redshift 和 AWS IAM Identity Center 位于同一个账户中。在创建和配置 Redshift 集群或工作组时，您可以使用小组件创建此实例。
+ *配置可信令牌发布者* – 在某些情况下，您可能需要使用可信令牌发布者，这是可以发布和验证信任令牌的实体。在执行此操作之前，需要先执行预备步骤，然后配置 AWS IAM Identity Center 集成的 Redshift 管理员才能选择可信令牌发布者，并添加必要的属性以完成配置。这些步骤可能包括在 AWS IAM Identity Center 控制台中，将外部身份提供者配置为可信令牌发布者并添加其属性。要完成这些步骤，请参阅 [Using applications with a trusted token issuer](https://docs.aws.amazon.com/singlesignon/latest/userguide/using-apps-with-trusted-token-issuer.html#setuptrustedtokenissuer)。
**注意**  
并非所有外部连接都需要设置可信令牌发布者。使用 Amazon Redshift 查询编辑器 v2 连接到您的 Redshift 数据库时，不需要配置可信令牌发布者。但可能需要对第三方应用程序进行配置，例如通过您的身份提供者进行身份验证的控制面板或自定义应用程序。
+ *配置 IAM 角色* – 后面的部分提到了必须配置的权限。您必须按照 IAM 最佳实践添加权限。后面的步骤将会详细介绍具体权限。

有关更多信息，请参阅 [Getting Started with AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-started-enable-identity-center.html)。

## 配置您的身份提供者以使用 AWS IAM Identity Center
<a name="redshift-iam-access-control-idp-connect-admin-config"></a>

控制用户和组身份管理的第一步是连接到 AWS IAM Identity Center 并配置您的身份提供者。您可以使用 AWS IAM Identity Center 本身作为身份提供者，也可以连接第三方身份存储，例如 Okta。有关设置与身份提供者的连接和进行配置的更多信息，请参阅**《AWS IAM Identity Center 用户指南》中的[连接到外部身份提供者](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-identity-source-idp.html)。请确保在此过程结束时，您已将一小批用户和组添加到 AWS IAM Identity Center 以用于测试目的。

### 管理权限
<a name="redshift-iam-access-control-idp-connect-admin-permissions"></a>

#### Redshift/AWS IAM Identity Center 应用程序生命周期管理所需的权限
<a name="redshift-iam-access-control-permissions-application"></a>

您必须创建一个 IAM 身份供 Redshift 管理员用来配置 Redshift，以便与 AWS IAM Identity Center 结合使用。常见的做法是，创建一个具有相应权限的 IAM 角色，并根据需要将其分配给其他身份。该角色必须具有执行以下操作的权限。

**创建 Redshift/AWS IAM Identity Center 应用程序**
+ `sso:PutApplicationAssignmentConfiguration` – 用于安全设置。
+ `sso:CreateApplication` – 用于创建 AWS IAM Identity Center 应用程序。
+ `sso:PutApplicationAuthenticationMethod` – 授予 Redshift 身份验证访问权限。
+ `sso:PutApplicationGrant` – 用于更改可信令牌发布者信息。
+ `sso:PutApplicationAccessScope` – 用于 Redshift AWS IAM Identity Center 应用程序设置。这包括用于 AWS Lake Formation 和用于 [Amazon S3 Access Grants](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-get-started.html)。
+ `redshift:CreateRedshiftIdcApplication` – 用于创建 Redshift AWS IAM Identity Center 应用程序。

**描述 Redshift/AWS IAM Identity Center 应用程序**
+ `sso:GetApplicationGrant` – 用于列出可信令牌发布者信息。
+ `sso:ListApplicationAccessScopes` – 用于 Redshift AWS IAM Identity Center 应用程序设置以列出下游集成，例如用于 AWS Lake Formation 和 S3 Access Grants。
+ `redshift:DescribeRedshiftIdcApplications` – 用于描述现有 AWS IAM Identity Center 应用程序。

**更改 Redshift/AWS IAM Identity Center 应用程序**
+ `redshift:ModifyRedshiftIdcApplication` – 用于更改现有的 Redshift 应用程序。
+ `sso:UpdateApplication` – 用于更新 AWS IAM Identity Center 应用程序。
+ `sso:GetApplicationGrant` – 获取可信令牌颁发者信息。
+ `sso:ListApplicationAccessScopes` – 用于 Redshift AWS IAM Identity Center 应用程序设置。
+ `sso:DeleteApplicationGrant` – 删除可信令牌颁发者信息。
+ `sso:PutApplicationGrant` – 用于更改可信令牌发布者信息。
+ `sso:PutApplicationAccessScope` – 用于 Redshift AWS IAM Identity Center 应用程序设置。这包括用于 AWS Lake Formation 和用于 [Amazon S3 Access Grants](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-get-started.html)。
+ `sso:DeleteApplicationAccessScope` – 用于删除 Redshift AWS IAM Identity Center 应用程序设置。这包括用于 AWS Lake Formation 和用于 [Amazon S3 Access Grants](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-get-started.html)。

**删除 Redshift/AWS IAM Identity Center 应用程序**
+ `sso:DeleteApplication` – 用于删除 AWS IAM Identity Center 应用程序。
+ `redshift:DeleteRedshiftIdcApplication` – 提供删除现有 Redshift AWS IAM Identity Center 应用程序的功能。

#### Redshift/查询编辑器 v2 应用程序生命周期管理所需的权限
<a name="redshift-iam-access-control-permissions-application-qev2"></a>

您必须创建一个 IAM 身份供 Redshift 管理员用来配置 Redshift，以便与 AWS IAM Identity Center 结合使用。常见的做法是，创建一个具有相应权限的 IAM 角色，并根据需要将其分配给其他身份。该角色必须具有执行以下操作的权限。

**创建查询编辑器 v2 应用程序**
+ `redshift:CreateQev2IdcApplication` – 用于创建 QEV2 应用程序。
+ `sso:CreateApplication` – 提供创建 AWS IAM Identity Center 应用程序的功能。
+ `sso:PutApplicationAuthenticationMethod` – 授予 Redshift 身份验证访问权限。
+ `sso:PutApplicationGrant` – 用于更改可信令牌发布者信息。
+ `sso:PutApplicationAccessScope` – 用于 Redshift AWS IAM Identity Center 应用程序设置。这包括查询编辑器 v2。
+ `sso:PutApplicationAssignmentConfiguration` – 用于安全设置。

**描述查询编辑器 v2 应用程序**
+ `redshift:DescribeQev2IdcApplications` – 用于描述 AWS IAM Identity Center QEV2 应用程序。

**更改查询编辑器 v2 应用程序**
+ `redshift:ModifyQev2IdcApplication` – 用于更改 AWS IAM Identity Center QEV2 应用程序。
+ `sso:UpdateApplication` – 用于更改 AWS IAM Identity Center QEV2 应用程序。

**删除查询编辑器 v2 应用程序**
+ `redshift:DeleteQev2IdcApplication` – 用于删除 QEV2 应用程序。
+ `sso:DeleteApplication` – 用于删除 QEV2 应用程序。

**注意**  
在 Amazon Redshift 开发工具包中，以下 API 不可用：  
CreateQev2IdcApplication
DescribeQev2IdcApplications
ModifyQev2IdcApplication
DeleteQev2IdcApplication
这些操作专门用于在 AWS 控制台中执行 AWS IAM Identity Center 与 Redshift QEV2 的集成。有关更多信息，请参阅 [Amazon Redshift 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonredshift.html#amazonredshift-actions-as-permissions)。

#### 数据库管理员在控制台中连接新资源所需的权限
<a name="redshift-iam-access-control-permissions-application-new-resources"></a>

在创建过程中，需要这些权限才能连接新预置的集群或 Amazon Redshift Serverless 工作组。如果您具有这些权限，则控制台中会显示一个选项，供您选择连接到 AWS IAM Identity Center 托管的 Redshift 应用程序。
+ `redshift:DescribeRedshiftIdcApplications`
+ `sso:ListApplicationAccessScopes`
+ `sso:GetApplicationAccessScope`
+ `sso:GetApplicationGrant`

作为最佳实践，我们建议将权限策略附加到 IAM 角色，然后根据需要将其分配给用户和组。有关更多信息，请参阅 [Amazon Redshift 中的 Identity and Access Management](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html)。

## 使用 AWS IAM Identity Center 将 Redshift 设置为 AWS 托管应用程序
<a name="redshift-iam-access-control-idp-connect-admin-tasks"></a>

Redshift 管理员必须完成以下步骤，使 Redshift 成为 AWS IAM Identity Center 托管应用程序，然后 AWS IAM Identity Center 才能管理 Amazon Redshift 预置集群或 Amazon Redshift Serverless 工作组的身份：

1. 在 Amazon Redshift 或 Amazon Redshift Serverless 控制台菜单中选择 **AWS IAM Identity Center 集成**，然后选择**连接到 AWS IAM Identity Center**。在其中，您可以逐步完成一系列选择来填充 AWS IAM Identity Center 集成的属性。

1. 为 Redshift 的 AWS Identity Center 托管应用程序选择显示名称和唯一名称。

1. 为您的组织指定命名空间。这通常是组织名称的缩写。它已作为前缀添加到 Redshift 数据库中 AWS IAM Identity Center 管理的用户和角色。

1. 选择要使用的 IAM 角色。此 IAM 角色应与用于 Redshift 的其他角色分开，建议不要将该角色其用于其他目的。所需的特定策略权限如下所示：
   + `sso:DescribeApplication` – 需要在目录中创建身份提供者 (IdP) 条目。
   + `sso:DescribeInstance` – 用于手动创建 IdP 联合身份验证角色或用户。

1. 配置客户端连接和可信令牌发布者。配置可信令牌发布者，通过设置与外部身份提供者的关系来协调可信身份的传播。例如，通过身份传播，用户可以登录一个应用程序并访问另一个应用程序中的特定数据。这样用户便可以更无缝地从不同位置收集数据。在此步骤中，您可以在控制台中为每个可信令牌发布者设置属性。这些属性包括名称和受众群体声明（简写为 *aud claim*），您可能需要从工具或服务的配置属性中获取这些信息。您可能还需要从第三方工具的 JSON Web 令牌 (JWT, JSON Web Token) 提供应用程序名称。
**注意**  
每个第三方工具或服务要求的 `aud claim` 可能会有所不同，具体取决于令牌类型，这些可以是身份提供者发布的访问令牌，也可以是 ID 令牌等其他类型。每个供应商都可能不同。在实施可信身份传播并与 Redshift 集成时，您需要为第三方工具发送到 AWS 的令牌类型提供正确的 *aud* 值。请查看您的工具或服务供应商的建议。

   有关可信身份传播的详细信息，请参阅《AWS IAM Identity Center 用户指南》**中的 [Trusted identity propagation overview](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation-overview.html)。

Redshift 管理员完成步骤并保存配置后，AWS IAM Identity Center 属性将显示在 Redshift 控制台中。您也可以查询系统视图 [SVV\$1IDENTITY\$1PROVIDERS](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_IDENTITY_PROVIDERS.html) 来验证应用程序的属性。这些属性包括应用程序名称和命名空间。您可以使用命名空间作为与应用程序关联的 Redshift 数据库对象的前缀。完成这些任务后，Redshift 便成为支持 AWS IAM Identity Center 的应用程序。控制台中的属性包括集成状态。集成完成后，它会显示**已启用**。完成此流程后，可以在每个新集群上启用 AWS IAM Identity Center 集成。

完成配置后，您可以在 Redshift 中使用 AWS IAM Identity Center 的用户和组，方法是选择**用户**或**组**选项卡，然后选择**分配**。

## 为 Amazon Redshift 集群或 Amazon Redshift Serverless 工作组启用 AWS IAM Identity Center 集成
<a name="redshift-iam-access-control-idp-connect-resource-creation"></a>

您的数据库管理员配置新的 Redshift 资源，使其与 AWS IAM Identity Center 配合使用，从而简化登录和数据访问。此过程包括在创建预置集群或无服务器工作组的步骤中。任何有权创建 Redshift 资源的人员都可以执行这些 AWS IAM Identity Center 集成任务。当您创建预置集群时，请首先在 Amazon Redshift 控制台中选择**创建集群**。以下步骤显示如何为数据库启用 AWS IAM Identity Center 管理。（其中并未包括创建集群的所有步骤。）

1. 在创建集群步骤中，在 **IAM Identity Center 集成**部分中，选择**为 <您的集群名称> 启用**。

1. 在启用集成时，流程中有一个步骤。您可以在控制台中选择**启用 IAM Identity Center 集成**来完成此步骤。

1. 对于新的集群或工作组，使用 SQL 命令在 Redshift 中创建数据库角色。命令如下：

   ```
   CREATE ROLE <idcnamespace:rolename>;
   ```

   命名空间和角色名称如下：
   + *IAM Identity Center 命名空间前缀* – 这是您在设置 AWS IAM Identity Center 与 Redshift 之间的连接时，定义的命名空间。
   + *角色名称* – 此 Redshift 数据库角色必须与 AWS IAM Identity Center 中的组名匹配。

   Redshift 连接到 AWS IAM Identity Center，然后提取创建数据库角色并将其映射到 AWS IAM Identity Center 组所需的信息。

请注意，创建新的数据仓库时，为 AWS IAM Identity Center 集成指定的 IAM 角色将自动附加到预置集群或 Amazon Redshift Serverless 工作组。完成所需集群元数据的输入和资源创建后，您可以在属性中查看 AWS IAM Identity Center 集成的状态。如果您在 AWS IAM Identity Center 中的组名有空格，则在创建匹配角色时需要在 SQL 中使用引号。

启用 Redshift 数据库并创建角色后，就可以使用 Amazon Redshift 查询编辑器 v2 或 Amazon Quick 连接到数据库。详细信息将在后面的部分中进一步说明。

### 使用 API 设置默认 `RedshiftIdcApplication`
<a name="redshift-iam-access-control-idp-connect-admin-config-api"></a>

由您的身份管理员完成设置。使用 API，您可以创建并填充 `RedshiftIdcApplication`，它代表 AWS IAM Identity Center 中的 Redshift 应用程序。

1. 首先，您可以创建用户，并将这些用户添加到 AWS IAM Identity Center 的组中。您可以在 AWS 控制台中为 AWS IAM Identity Center 执行此操作。

1. 调用 `create-redshift-idc-application` 以创建 AWS IAM Identity Center 应用程序，使其与 Redshift 的使用兼容。您可以通过填充所需的值来创建应用程序。显示名称是在 AWS IAM Identity Center 控制面板上显示的名称。IAM 角色 ARN 是拥有 AWS IAM Identity Center 权限的 ARN，同样也可由 Redshift 代入。

   ```
   aws redshift create-redshift-idc-application
   ––idc-instance-arn 'arn:aws:sso:::instance/ssoins-1234a01a1b12345d'
   ––identity-namespace 'MYCO'
   ––idc-display-name 'TEST-NEW-APPLICATION'
   ––iam-role-arn 'arn:aws:redshift:us-east-1:012345678901:role/TestRedshiftRole'
   ––redshift-idc-application-name 'myredshiftidcapplication'
   ```

   以下示例显示了对 `create-redshift-idc-application` 的调用返回的示例 `RedshiftIdcApplication` 响应。

   ```
   "RedshiftIdcApplication": {
                   "IdcInstanceArn": "arn:aws:sso:::instance/ssoins-1234a01a1b12345d",
                   "RedshiftIdcApplicationName": "test-application-1",
                   "RedshiftIdcApplicationArn": "arn:aws:redshift:us-east-1:012345678901:redshiftidcapplication:12aaa111-3ab2-3ab1-8e90-b2d72aea588b",
                   "IdentityNamespace": "MYCO",
                   "IdcDisplayName": "Redshift-Idc-Application",
                   "IamRoleArn": "arn:aws:redshift:us-east-1:012345678901:role/TestRedshiftRole",
                   "IdcManagedApplicationArn": "arn:aws:sso::012345678901:application/ssoins-1234a01a1b12345d/apl-12345678910",
                   "IdcOnboardStatus": "arn:aws:redshift:us-east-1:123461817589:redshiftidcapplication",
                   "RedshiftIdcApplicationArn": "Completed",
                   "AuthorizedTokenIssuerList": [
                          "TrustedTokenIssuerArn": ...,
                          "AuthorizedAudiencesList": [...]...
                   ]}
   ```

1. 您可以使用 `create-application-assignment`，将特定组或个人用户分配给 AWS IAM Identity Center 中的托管应用程序。采用这种做法，您可以指定通过 AWS IAM Identity Center 管理的组。如果数据库管理员在 Redshift 中创建数据库角色，则 AWS IAM Identity Center 中的组名会映射到 Redshift 中的角色名称。数据库中的角色控制权限。有关更多信息，请参阅[Assign user access to applications in the AWS IAM Identity Center console](https://docs.aws.amazon.com/singlesignon/latest/userguide/assignuserstoapp.html)。

1. 启用应用程序后，调用 `create-cluster` 并附上 AWS IAM Identity Center 中的 Redshift 托管应用程序 ARN。通过这样做，可以将集群与 AWS IAM Identity Center 中的托管应用程序关联起来。

### 将 AWS IAM Identity Center 应用程序与现有集群或工作组关联
<a name="redshift-iam-access-control-idp-connect-admin-config-existing"></a>

如果您要为现有的集群或工作组启用 AWS IAM Identity Center 集成，可以通过运行 SQL 命令来实现。您也可以运行 SQL 命令来更改集成的设置。有关更多信息，请参阅 [ALTER IDENTITY PROVIDER](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_IDENTITY_PROVIDER.html)。

还可以删除现有身份提供者。以下示例演示如何对附加到身份提供者的用户和角色执行级联删除。

```
DROP IDENTITY PROVIDER
<provider_name> [ CASCADE ]
```

## 设置用户权限
<a name="redshift-iam-access-control-idp-connect-user-permissions"></a>

管理员根据用户的身份属性和组成员资格，在其身份提供者内部或直接在 AWS IAM Identity Center 中配置对各种资源的权限。例如，身份提供者管理员可以将数据库工程师添加到适合其角色的组中。此组名映射到 Redshift 数据库角色名称。该角色提供或限制对 Redshift 中特定表或视图的访问权限。

# 自动为 AWS IAM Identity Center 创建 Amazon Redshift 角色
<a name="redshift-iam-access-control-sso-autocreate"></a>

此特征与 AWS IAM Identity Center 集成，让您可以根据组成员资格在 Redshift 中自动创建角色。

自动创建角色有几个好处。自动创建角色时，Redshift 会在您的 IdP 中创建具有组成员资格的角色，因此您可以避免繁琐的手动角色创建和维护。您还可以选择使用包括和排除模式来筛选映射到 Redshift 角色的组。

## 工作原理
<a name="autocreate-overview"></a>

当您以 IdP 用户身份登录 Redshift 时，会发生以下一系列事件：

1. Redshift 从 IdP 那里检索您的组成员资格。

1. Redshift 使用角色格式 `idp_namespace:rolename` 自动创建映射到这些组的角色。

1. Redshift 授予您使用映射角色的权限。

每次用户登录时，都会自动创建目录中不存在但该用户所属的每个组。您可以选择设置包括和排除筛选条件，从而控制哪些 IdP 组已创建 Redshift 角色。

## 配置自动创建角色
<a name="autocreate-configuring"></a>

使用 `CREATE IDENTITY PROVIDER` 和 `ALTER IDENTITY PROVIDER` 命令启用和配置自动角色创建。

```
-- Create a new IdP with auto role creation enabled
CREATE IDENTITY PROVIDER <idp_name> TYPE AWSIDC
  NAMESPACE '<namespace>' 
  APPLICATION_ARN 'app_arn'
  IAM_ROLE 'role_arn'
  AUTO_CREATE_ROLES TRUE; 

-- Enable on existing IdP 
ALTER IDENTITY PROVIDER <idp_name>
  AUTO_CREATE_ROLES TRUE;

-- Disable  
ALTER IDENTITY PROVIDER <idp_name>
  AUTO_CREATE_ROLES FALSE;
```

## 筛选组
<a name="autocreate-filtering"></a>

您可以选择使用 `INCLUDE` 和 `EXCLUDE` 模式筛选映射到 Redshift 角色的 IdP 组。当模式冲突时，`EXCLUDE` 优先于 `INCLUDE`。

```
-- Only create roles for groups with 'dev' 
CREATE IDENTITY PROVIDER <idp_name> TYPE AWSIDC
  ...
  AUTO_CREATE_ROLES TRUE
  INCLUDE GROUPS LIKE '%dev%';
    
-- Exclude 'test' groups
ALTER IDENTITY PROVIDER <idp_name>  
  AUTO_CREATE_ROLES TRUE
  EXCLUDE GROUPS LIKE '%test%';
```

## 示例
<a name="autocreate-filtering"></a>

以下示例说明了如何启用自动创建角色而不进行筛选。

```
CREATE IDENTITY PROVIDER prod_idc TYPE AWSIDC  ...
  AUTO_CREATE_ROLES TRUE;
```

以下示例包括开发组，不包括测试组。

```
ALTER IDENTITY PROVIDER prod_idc
  AUTO_CREATE_ROLES TRUE
  INCLUDE GROUPS LIKE '%dev%'
  EXCLUDE GROUPS LIKE '%test%';
```

## 最佳实践
<a name="autocreate-bp"></a>

为角色启用自动创建功能时，请考虑遵循以下最佳实践：
+ 使用 `INCLUDE` 和 `EXCLUDE` 筛选条件来控制哪些组获得角色。
+ 定期审核角色并清理未使用的角色。
+ 利用 Redshift 角色层次结构来简化权限管理。

# Amazon Redshift 与 Amazon S3 访问权限管控的集成
<a name="redshift-iam-access-control-sso-s3idc"></a>

通过与 Amazon S3 访问权限管控集成，可以无缝传播 IAM Identity Center 身份，来控制对 Amazon S3 数据的访问权限。此集成支持您根据 IAM Identity Center 用户和组授权 Amazon S3 数据访问权限。

有关 Amazon S3 访问权限管控的信息，请参阅[使用 S3 访问权限管控管理访问权限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants.html)。

使用 Amazon S3 访问权限管控可为应用程序带来以下优势：
+ 基于 IAM Identity Center 身份，对 Amazon S3 数据进行精细的访问控制。
+ 跨 Amazon Redshift 和 Amazon S3 集中管理 IAM Identity Center 身份。
+ 您可以避免为 Amazon S3 访问权限管理单独的 IAM 权限。

## 工作原理
<a name="redshift-iam-access-control-sso-s3idc-howitworks"></a>

要将应用程序与 Amazon S3 访问权限管控集成，请执行以下操作：
+ 首先，使用 AWS 管理控制台或 AWS CLI 将 Amazon Redshift 配置为与 Amazon S3 访问权限管控集成。
+ 接下来，具有 IdC 管理员权限的用户使用 Amazon S3 访问权限管控服务，向特定 IdC 用户/组授予对 Amazon S3 存储桶或前缀的访问权限。有关更多信息，请参阅[在 S3 访问权限管控中处理授权](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-grant.html)。
+ 当经过 Redshift 身份验证的 IdC 用户运行访问 S3 的查询（如 COPY、UNLOAD 或 Spectrum 操作）时，Amazon Redshift 会从 Amazon S3 访问权限管控服务中检索该 IdC 身份范围内的临时 S3 访问凭证。
+ 然后，Amazon Redshift 使用检索到的临时凭证，来访问该查询的经授权的 Amazon S3 位置。

## 设置与 Amazon S3 访问权限管控的集成
<a name="redshift-iam-access-control-sso-s3idc-setup"></a>

要为 Amazon Redshift 设置与 Amazon S3 访问权限管控的集成，请执行以下操作：

**Topics**
+ [使用 AWS 管理控制台设置与 Amazon S3 访问权限管控的集成](#redshift-iam-access-control-sso-s3idc-setup-console)
+ [使用 AWS CLI 启用与 Amazon S3 访问权限管控的集成](#redshift-iam-access-control-sso-s3idc-setup-cli)

### 使用 AWS 管理控制台设置与 Amazon S3 访问权限管控的集成
<a name="redshift-iam-access-control-sso-s3idc-setup-console"></a>

1. 打开 Amazon Redshift 控制台。

1. 从**集群**窗格中选择您的集群。

1. 在集群的详细信息页面的**身份提供者集成**部分，启用与 **S3 访问权限管控**服务的集成。
**注意**  
如果您未配置 IAM Identity Center，则不会显示**身份提供者集成**部分。有关更多信息，请参阅 [Enabling AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-set-up-for-idc.html)。

### 使用 AWS CLI 启用与 Amazon S3 访问权限管控的集成
<a name="redshift-iam-access-control-sso-s3idc-setup-cli"></a>

1. 要创建一个启用了 S3 集成的新 Amazon Redshift IdC 应用程序，请执行以下操作：

   ```
   aws redshift create-redshift-idc-application <other parameters> 
     --service-integrations '[ {"S3AccessGrants": [{"ReadWriteAccess": {"Authorization": "Enabled"}}]} ]'
   ```

1. 要修改现有应用程序以启用 S3 访问权限管控集成，请执行以下操作：

   ```
   aws redshift modify-redshift-idc-application <other parameters>
     --service-integrations '[ {"S3AccessGrants": [{"ReadWriteAccess": {"Authorization": "Enabled"}}]} ]'
   ```

1. 要修改现有应用程序以禁用 S3 访问权限管控集成，请执行以下操作：

   ```
   aws redshift modify-redshift-idc-application <other parameters>
     --service-integrations '[ {"S3AccessGrants": [{"ReadWriteAccess": {"Authorization": "Disabled"}}]} ]'
   ```

## 使用与 S3 访问权限管控的集成
<a name="redshift-iam-access-control-sso-s3idc-using"></a>

配置 S3 访问权限管控集成后，访问 S3 数据的查询（例如 `COPY`、`UNLOAD` 或 Spectrum 查询）将使用 IdC 身份进行授权。未使用 IdC 进行身份验证的用户也可以运行这些查询，但是这些用户账户无法利用 IdC 提供的集中式管理。

以下示例显示了通过 S3 访问权限管控集成运行的查询：

```
COPY table FROM 's3://mybucket/data';  // -- Redshift uses IdC identity 
UNLOAD ('SELECT * FROM table') TO 's3://mybucket/unloaded/'    // -- Redshift uses IdC identity
```

# 通过 AWS Lake Formation 查询数据
<a name="redshift-iam-access-control-idp-analytics-connecting-steps"></a>

使用 AWS Lake Formation 可以更轻松地集中管理和保护您的数据湖，并可用于提供数据访问。通过对 AWS IAM Identity Center 和 Redshift 进行配置，将身份传播到 Lake Formation，这样管理员就可以根据组织的身份提供者（IdP）组，实现对 Amazon S3 数据湖精细的访问控制。这些组通过 AWS IAM Identity Center 进行管理。此部分介绍如何配置几个应用场景，用于从数据湖中进行查询和从数据共享中进行查询，以演示如何将 AWS IAM Identity Center 与 Redshift 结合使用，来连接到由 Lake Formation 管理的资源。

## 使用 AWS IAM Identity Center 和 Redshift 连接来查询数据湖
<a name="redshift-iam-access-control-idp-analytics-connecting-datalake"></a>

这些步骤涵盖的应用场景是，您使用 AWS IAM Identity Center 连接到 Redshift，以便查询 Lake Formation 管理的数据湖。

**先决条件**

此过程有多个先决条件步骤：

1. AWS IAM Identity Center 必须设置为支持 Redshift 的身份验证和身份管理。您可以从控制台启用 AWS IAM Identity Center 并选择身份提供者（IdP）来源。之后，将您的一组 IdP 用户与 AWS IAM Identity Center 同步。您还必须按照本文档前面详述的步骤，在 AWS IAM Identity Center 与 Redshift 之间建立连接。

1. 创建新的 Amazon Redshift 集群，并在配置步骤中启用通过 AWS IAM Identity Center 进行身份管理。

1. 为 Lake Formation 创建托管 AWS IAM Identity Center 应用程序并对其进行配置。此配置应在设置了 AWS IAM Identity Center 与 Redshift 之间的连接之后进行。步骤如下：

   1. 在 AWS CLI 中，使用 `modify-redshift-idc-application` 命令启用 Lake Formation 服务与 AWS IAM Identity Center 托管的 Redshift 应用程序的集成。此调用包括 `service-integrations` 参数，该参数设置为启用对 Lake Formation 进行授权的配置字符串值。

   1. 使用 `create-lake-formation-identity-center-configuration` 命令配置 Lake Formation。这将创建一个适用于 Lake Formation 的 AWS IAM Identity Center 应用程序，该应用程序在 AWS IAM Identity Center 门户中可见。管理员必须设置 `––cli-input-json` 参数，其值是 JSON 文件的路径，该文件使用所有 AWS CLI API 调用的标准格式。您必须包括以下各项的值：
      + `CatalogId` – Lake Formation 目录 ID。
      + `InstanceArn` – AWS IAM Identity Center 实例 ARN 值。

管理员完成先决条件配置后，数据库管理员可以创建用于查询数据湖的外部架构。

1. **管理员创建外部架构** – Redshift 数据库管理员使用以下 SQL 语句连接到数据库并创建外部架构：

   ```
   CREATE EXTERNAL SCHEMA if not exists my_external_schema from DATA CATALOG database 'my_lf_integrated_db' catalog_id '12345678901234';
   ```

   请注意，在这种情况下不需要指定 IAM 角色，因为访问权限是通过 AWS IAM Identity Center 管理的。

1. **管理员授予权限** – 管理员向 AWS IAM Identity Center 组授予使用权限，这会授予对 Redshift 资源的权限。此步骤通过运行如下所示的 SQL 语句完成：

   ```
   GRANT USAGE ON SCHEMA "my_external_schema" to "MYCO:sales";
   ```

   随后，管理员根据组织的要求，使用 AWS CLI 授予 Lake Formation 在对象上的权限：

   ```
   aws lakeformation grant-permissions ...
   ```

1. **用户运行查询** – 举例说明，此时销售人员组中的 AWS IAM Identity Center 用户，可以通过查询编辑器 v2 登录到 Redshift 数据库。然后，他们可以运行访问外部架构中的表的查询，如以下示例：

   ```
   SELECT * from my_external_schema.table1;
   ```

## 使用 AWS IAM Identity Center 和 Redshift 连接来连接到数据共享
<a name="redshift-iam-access-control-idp-analytics-connecting-datashare"></a>

 通过 AWS IAM Identity Center 管理访问权限时，您可以从不同的 Redshift 数据仓库访问数据共享。为此，您需要运行查询来设置外部数据库。完成这些步骤的要求是，假定您已在 Redshift 和 AWS IAM Identity Center 之间建立连接，并且您已经创建了 AWS Lake Formation 应用程序，如前面的过程所述。

1. **创建外部数据库** – 管理员创建外部数据库用于数据共享，并通过其 ARN 进行引用。以下是演示如何操作的示例：

   ```
   CREATE DATABASE "redshift_external_db" FROM ARN 'arn:aws:glue:us-east-1:123456789012:database/redshift_external_db-iad' WITH NO DATA CATALOG SCHEMA;
   ```

   在本使用场景中，您将 AWS IAM Identity Center 与 Redshift 用于身份管理，但不包括 IAM 角色。

1. **管理员设置权限** – 创建数据库后，管理员向 AWS IAM Identity Center 组授予使用权限。这将授予对 Redshift 资源的权限：

   ```
   GRANT USAGE ON DATABASE "my_external_db" to "MYCO:sales";
   ```

   管理员还使用 AWS CLI 授予 Lake Formation 在对象上的权限：

   ```
   aws lakeformation grant-permissions ...
   ```

1. **用户运行查询** – 销售组中的用户可以基于分配的权限查询数据库中的表：

   ```
   select * from redshift_external_db.public.employees;
   ```

有关授予数据湖权限和授予数据共享权限的更多信息，请参阅 [Granting permissions to users and groups](https://docs.aws.amazon.com/lake-formation/latest/dg/grant-permissions-sso.html)。有关向架构或数据库授予使用权限的更多信息，请参阅 [GRANT](https://docs.aws.amazon.com/redshift/latest/dg/r_GRANT.html)。

# 使用可信令牌发布者将应用程序或工具与 OAuth 集成
<a name="redshift-iam-access-control-idp-connect-oauth"></a>

 您可以向所创建的客户端工具中添加功能，以通过 AWS IAM Identity Center 连接来连接到 Redshift。如果您已经配置了 Redshift 与 AWS IAM Identity Center 的集成，请使用此部分中详述的属性来设置连接。

## 用于使用 AWS IAM Identity Center 连接到 Redshift 的身份验证插件
<a name="redshift-iam-access-control-idp-connect-plugin"></a>

您可以使用以下驱动程序插件，通过 AWS IAM Identity Center 连接到 Amazon Redshift：
+  `BrowserIdcAuthPlugin` – 此插件促进实现与 AWS IAM Identity Center 的无缝单点登录集成。插件会创建一个浏览器窗口，供用户使用其企业身份提供者中定义的用户凭证进行登录。
+  `IdpTokenAuthPlugin` – 此插件应由想要自行管理身份验证流程，而不是让 Amazon Redshift 驱动程序打开浏览器窗口进行 AWS IAM Identity Center 身份验证的应用程序使用。插件接受 AWS IAM Identity Center 提供的访问令牌，或 OpenID Connect（OIDC）JSON Web 令牌（JWT），该令牌由与 AWS IAM Identity Center 关联的任意 Web 身份提供者提供，例如 Okta、PingOne 和 Microsoft Entra ID（Azure AD）。客户端应用程序负责生成此必需的访问令牌/JWT。

### 使用 `BrowserIdcAuthPlugin` 进行身份验证
<a name="redshift-iam-access-control-idp-connect-plugin-browseridcauthplugin"></a>

根据您的 Amazon Redshift 驱动程序，使用以下插件名称，通过 `BrowserIdcAuthPlugin` 进行连接。


| 驱动程序 | 连接选项键 | 值 | 备注 | 
| --- | --- | --- | --- | 
| JDBC | `plugin_name` | com.amazon.redshift.plugin.BrowserIdcAuthPlugin | 在连接时，您必须输入插件的完全限定类名。 | 
| ODBC | `plugin_name` | BrowserIdcAuthPlugin |  | 
| Python | `credentials_provider` | BrowserIdcAuthPlugin | Python 驱动程序没有 `plugin_name` 选项可用。请改用`credentials_provider`。 | 

`BrowserIdcAuthPlugin` 插件具有以下额外的连接选项：


| 选项名称 | 必填？ | 说明 | 示例 | 
| --- | --- | --- | --- | 
| idc\$1region | 必需 | AWS IAM Identity Center 实例所在的 AWS 区域。 | us-east-1 | 
| issuer\$1url | 必需 | AWS IAM Identity Center 服务器的实例端点。您可以使用 AWS IAM Identity Center 控制台查找此值。 | https://identitycenter.amazonaws.com/ssoins-g5j2k70sn4yc5nsc | 
| listen\$1port | 可选 | Amazon Redshift 驱动程序用来通过浏览器重定向接收来自 AWS IAM Identity Center 的 `auth_code` 响应的端口。 | 7890 | 
| idc\$1client\$1display\$1name | 可选 | 在 AWS IAM Identity Center 的单点登录同意弹出窗口中，AWS IAM Identity Center 客户端为应用程序使用的名称。 | Amazon Redshift 驱动程序 | 
| idp\$1response\$1timeout | 可选 | Redshift 驱动程序等待身份验证流程完成的时间，以秒为单位。 | 60 | 

您必须输入自己创建并用于连接的工具的这些连接属性值。有关更多信息，请参阅相应的各个驱动程序的连接选项文档：
+ [JDBC 驱动程序版本 2.x 配置的选项](jdbc20-configuration-options.md)
+ [ODBC 驱动程序选项](odbc20-configuration-options.md)
+ [Amazon Redshift Python 连接器的配置选项](python-configuration-options.md)

### 使用 `IdpTokenAuthPlugin` 进行身份验证
<a name="redshift-iam-access-control-idp-connect-plugin-idptokenauthplugin"></a>

根据您的 Amazon Redshift 驱动程序，使用以下插件名称，通过 `IdpTokenAuthPlugin` 进行连接。


| 驱动程序 | 连接选项键 | 值 | 备注 | 
| --- | --- | --- | --- | 
| JDBC | `plugin_name` | com.amazon.redshift.plugin.IdpTokenAuthPlugin | 在连接时，您必须输入插件的完全限定类名。 | 
| ODBC | `plugin_name` | IdpTokenAuthPlugin |  | 
| Python | `credentials_provider` | IdpTokenAuthPlugin | Python 驱动程序没有 `plugin_name` 选项可用。请改用`credentials_provider`。 | 

`IdpTokenAuthPlugin` 插件具有以下额外的连接选项：


| 选项名称 | 必填？ | 说明 | 
| --- | --- | --- | 
| 令牌 | 必需 | AWS IAM Identity Center 提供的访问令牌，或 OpenID Connect（OIDC）JSON Web 令牌（JWT，JSON Web Token），该令牌由与 AWS IAM Identity Center 连接的 Web 身份提供者提供。您的应用程序必须通过 AWS IAM Identity Center 或与 AWS IAM Identity Center 连接的身份提供者，对您的应用程序用户进行身份验证，从而生成此令牌。 | 
| token\$1type | 必需 | 用于 `IdpTokenAuthPlugin` 的令牌类型。可能的值包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/redshift-iam-access-control-idp-connect-oauth.html)  | 

您必须输入自己创建并用于连接的工具的这些连接属性值。有关更多信息，请参阅相应的各个驱动程序的连接选项文档：
+ [JDBC 驱动程序版本 2.x 配置的选项](jdbc20-configuration-options.md)
+ [ODBC 驱动程序选项](odbc20-configuration-options.md)
+ [Amazon Redshift Python 连接器的配置选项](python-configuration-options.md)

# 排除 Amazon Redshift 查询编辑器 v2 连接故障
<a name="redshift-iam-access-control-idp-connect-troubleshooting"></a>

此列表详细列出了经常出现的错误，有助于您使用 AWS IAM Identity Center 身份通过查询编辑器 v2 连接到 Redshift 数据库。
+ 错误：**连接问题：没有可用的身份中心会话信息。**– 出现此错误时，请检查浏览器的安全和隐私设置。这些浏览器设置，尤其是安全 Cookie 设置（如 Firefox 的全面 Cookie 保护功能），可能会导致 Amazon Redshift 查询编辑器 v2 与 Redshift 数据库的连接尝试受阻。请按照您浏览器的详细修复步骤进行修复：
  + **Firefox** – 目前，默认情况下会阻止第三方 Cookie。单击浏览器地址栏中的盾牌，然后切换开关以关闭针对查询编辑器 v2 的增强跟踪保护。
  + **Chrome 隐身模式** – 默认情况下，Chrome 隐身模式会阻止第三方 Cookie。单击地址栏中的眼睛图标以允许查询编辑器 v2 使用第三方 Cookie。将设置更改为允许 Cookie 后，您可能在地址栏上看不到眼睛图标。
  + **Safari** – 在 Mac 上，打开 Safari 应用程序。选择**设置**，然后选择**高级**。切换为关闭：**阻止所有 Cookie**。
  + **Edge** – 选择**设置**，然后选择 **Cookie 和站点权限**。然后选择**管理和删除 Cookie 和站点数据**，并关闭**阻止第三方 Cookie**。

  如果您在更改设置后尝试连接，但继续收到错误消息**连接问题：没有可用的身份中心会话信息**，我们建议您刷新与 AWS IAM Identity Center 的连接。为此，请右键单击您的 Redshift 数据库实例并选择**刷新**。此时将出现一个新窗口，您可以使用该窗口进行身份验证。
+ 错误：**连接问题：身份中心会话已过期或无效。**– 将 Redshift 预置集群或 Serverless 工作组与 AWS IAM Identity Center 集成后，用户在尝试从查询编辑器 v2 连接到 Redshift 数据库时可能会收到此错误。这可能是在成功连接尝试之后发生的。在这种情况下，我们建议您重新进行身份验证。为此，请右键单击您的 Redshift 数据库实例并选择**刷新**。此时将出现一个新窗口，您可以使用该窗口进行身份验证。
+ 错误：**范围无效。用户凭证无权连接到 Redshift。**– 将 Redshift 预置集群或 Serverless 工作组与 AWS IAM Identity Center 集成用于身份管理后，用户在尝试从查询编辑器 v2 连接到 Redshift 数据库时可能会收到此错误。在这种情况下，为了使查询编辑器 v2 成功连接并通过 AWS IAM Identity Center 对用户进行身份验证，以便访问正确的资源，管理员必须通过 Redshift 控制台将用户分配给 Redshift AWS IAM Identity Center 应用程序。这是在 **IAM Identity Center 连接**下完成的。完成这些设置后，用户可以在一个小时之后成功建立连接，这段时间是 AWS IAM Identity Center 会话缓存造成的限制。
+ 错误：**无法列出数据库。致命：集群自动暂停时查询失败。**– 当 Amazon Redshift Serverless 数据库处于空闲状态，未处理任何工作负载时，如果您使用 AWS IAM Identity Center 身份进行连接，它可能会保持暂停状态。要解决此问题，请使用其它身份验证方法登录来恢复无服务器工作组。然后使用您的 AWS IAM Identity Center 身份连接到该数据库。
+ 错误：**尝试与 AWS IAM Identity Center 联合时出错。Amazon Redshift 管理员必须使用 Redshift 控制台删除并重新创建 AWS IAM Identity Center QEV2 应用程序**。– 此错误通常发生在删除与查询编辑器 v2 相关联的 AWS IAM Identity Center 应用程序实例时。要解决这个问题，Amazon Redshift 管理员必须为 AWS IAM Identity Center 删除并重新创建 Redshift 和查询编辑器 v2 应用程序。可以在 Redshift 控制台上或使用 [https://docs.aws.amazon.com/cli/latest/reference/redshift/delete-redshift-idc-application.html](https://docs.aws.amazon.com/cli/latest/reference/redshift/delete-redshift-idc-application.html) CLI 命令执行此操作。

# 对 Amazon Redshift 使用服务相关角色
<a name="using-service-linked-roles"></a>

Amazon Redshift 使用 AWS Identity and Access Management (IAM)[ 服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-linked-role)。服务相关角色是一种独特类型的 IAM 角色，它与 Amazon Redshift 直接相关。服务相关角色由 Amazon Redshift 预定义，具有服务代表您的 Amazon Redshift 集群调用 AWS 服务所需的所有权限。

服务相关角色可让您更轻松地设置 Amazon Redshift，因为您不必手动添加必要权限。该角色与 Amazon Redshift 使用案例相关联并且具有预定义的权限。只有 Amazon Redshift 可以代入该角色，并且只有服务相关角色可以使用预定义的权限策略。Amazon Redshift 会在您首次创建集群或 Redshift 托管的 VPC 端点时，在您的账户中创建服务相关角色。只有删除您账户中的所有 Amazon Redshift 集群或 Redshift 托管的 VPC 端点之后，您才可以删除服务相关角色。这将保护您的 Amazon Redshift 资源，因为您不会无意中删除访问资源所需的权限。

Amazon Redshift 支持在该服务可用的所有区域中使用服务相关角色。有关更多信息，请参阅 [AWS 区域和终端节点](https://docs.aws.amazon.com/general/latest/gr/rande.html?id=docs_gateway#redshift_region)。

有关支持服务相关角色的其它服务的信息，请参阅[使用 IAM 的 AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)，并查找**服务相关角色**列中显示为**是**的服务。选择**是**和链接，查看该服务的服务相关角色文档。

## Amazon Redshift 的服务相关角色权限
<a name="service-linked-role-permissions"></a>

Amazon Redshift 使用名为 **AWSServiceRoleForRedshift** 的服务相关角色 – 允许 Amazon Redshift 代表您调用 AWS 服务。此服务相关角色附加至以下托管式策略上：`AmazonRedshiftServiceLinkedRolePolicy`。有关此策略的更新，请参阅适用于 Amazon Redshift 的 [AWS 托管式策略（预定义）](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#redshift-policy-resources.managed-policies)。

AWSServiceRoleForRedshift 服务相关角色仅信任 **redshift.amazonaws.com** 来代入该角色。

AWSServiceRoleForRedshift 服务相关角色权限策略允许 Amazon Redshift 对所有相关资源完成以下操作：
+ `ec2:DescribeVpcs `
+ `ec2:DescribeSubnets `
+ `ec2:DescribeNetworkInterfaces `
+ `ec2:DescribeAddress `
+ `ec2:AssociateAddress `
+ `ec2:DisassociateAddress `
+ `ec2:CreateNetworkInterface `
+ `ec2:DeleteNetworkInterface `
+ `ec2:ModifyNetworkInterfaceAttribute`
+ `ec2:CreateVpcEndpoint`
+ `ec2:DeleteVpcEndpoints`
+ `ec2:DescribeVpcEndpoints`
+ `ec2:ModifyVpcEndpoint`
+ `ec2:DescribeVpcAttribute`
+ `ec2:DescribeSecurityGroups`
+ `ec2:DescribeInternetGateways`
+ `ec2:DescribeSecurityGroupRules`
+ `ec2:DescribeAvailabilityZones`
+ `ec2:DescribeNetworkAcls`
+ `ec2:DescribeRouteTables`
+ `ec2:AssignIpv6Addresses`
+ `ec2:UnassignIpv6Addresses`

**对网络资源的权限**

以下权限允许在 Amazon EC2 上执行操作来创建和管理安全组规则。这些安全组和规则特别关联到 Amazon Redshift `aws:RequestTag/Redshift` 资源标签。这样可以将权限的范围限制为特定 Amazon Redshift 资源。
+ `ec2:CreateSecurityGroup`
+ `ec2:AuthorizeSecurityGroupEgress`
+ `ec2:AuthorizeSecurityGroupIngress`
+ `ec2:RevokeSecurityGroupEgress`
+ `ec2:RevokeSecurityGroupIngress`
+ `ec2:ModifySecurityGroupRules`
+ `ec2:DeleteSecurityGroup`

**服务配额权限**

以下权限支持调用方获得服务配额。

`servicequotas:GetServiceQuota`

以下 JSON 代码段显示了服务配额的操作和资源范围。

```
{
   "Sid": "ServiceQuotasToCheckCustomerLimits",
   "Effect": "Allow",
   "Action": [
      "servicequotas:GetServiceQuota"
   ],
   "Resource": [
      "arn:aws:servicequotas:*:*:ec2/L-0263D0A3",
      "arn:aws:servicequotas:*:*:vpc/L-29B6F2EB" 
   ]
}
```

配额代码如下：
+ *L-0263D0A3* – EC2-VPC 弹性 IP 的配额代码。
+ *L-29B6F2EB* – 每个 VPC 的接口 VPC 端点的配额代码。

有关更多信息，请参阅 [AWS 服务配额](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)。

**审计日志记录的操作**

列出的带 `logs` 前缀的操作与审计日志记录和相关功能有关。具体来说是创建和管理日志组和日志流的操作。
+ `logs:CreateLogGroup`
+ `logs:PutRetentionPolicy`
+ `logs:CreateLogStream`
+ `logs:PutLogEvents`
+ `logs:DescribeLogStreams`
+ `logs:GetLogEvents`

以下 JSON 向 Amazon Redshift 显示了用于审计日志记录的操作和资源范围。

```
[
    {
        "Sid": "EnableCreationAndManagementOfRedshiftCloudwatchLogGroups",
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogGroup",
            "logs:PutRetentionPolicy"
        ],
        "Resource": [
            "arn:aws:logs:*:*:log-group:/aws/redshift/*"
        ]
    },
    {
        "Sid": "EnableCreationAndManagementOfRedshiftCloudwatchLogStreams",
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogStream",
            "logs:PutLogEvents",
            "logs:DescribeLogStreams",
            "logs:GetLogEvents"
        ],
        "Resource": [
            "arn:aws:logs:*:*:log-group:/aws/redshift/*:log-stream:*"
        ]
    }
]
```

有关服务相关角色及它们在 AWS 中的作用的更多信息，请参阅[使用服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html)。有关 Amazon Redshift 的特定操作和其它 IAM 资源的更多信息，请参阅 [Amazon Redshift 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonredshift.html)。

**使用 AWS Secrets Manager 管理管理员凭证的操作**

所列出的带有 `secretsmanager` 前缀的操作与使用 Amazon Redshift 管理您的管理员凭证有关。Amazon Redshift 通过这些操作，使用 AWS Secrets Manager 来创建和管理您的管理员凭证密钥。

以下 JSON 显示了操作和资源范围，可供 Amazon Redshift 通过 AWS Secrets Manager 管理管理员凭证。

```
[
    {
        "Effect": "Allow",
        "Action": [
            "secretsmanager:DescribeSecret",
            "secretsmanager:DeleteSecret",
            "secretsmanager:PutSecretValue",
            "secretsmanager:UpdateSecret",
            "secretsmanager:UpdateSecretVersionStage",
            "secretsmanager:RotateSecret"
        ],
        "Resource": [
            "arn:aws:secretsmanager:*:*:secret:redshift!*"
        ],
        "Condition": {
            "StringEquals": {
                "secretsmanager:ResourceTag/aws:secretsmanager:owningService": "redshift"
            }
        }
    },
    {
        "Effect": "Allow",
        "Action": [
            "secretsmanager:GetRandomPassword"
        ],
        "Resource": "*"
    }
]
```

**用于将集群和无服务器命名空间注册到 AWS Glue Data Catalog 的操作**

以 `glue` 前缀列出的操作涉及访问 AWS Glue Data Catalog 中的目录，这些目录是通过注册预置集群或无服务器命名空间创建的。有关更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [Apache Iceberg compatibility for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/iceberg-integration_overview.html)。

以下 JSON 显示了 Amazon Redshift 用于访问 AWS Glue Data Catalog 中目录的操作和资源范围：

```
[
    {
        "Sid": "DiscoverRedshiftCatalogs",
        "Effect": "Allow",
        "Action": [
            "glue:GetCatalogs",
            "glue:GetCatalog"
        ],
        "Resource": [
            "arn:aws:glue:*:*:catalog",
            "arn:aws:glue:*:*:catalog/*"
        ], 
   "Condition": 
    { 
        "Bool": 
        { 
            "glue:EnabledForRedshiftAutoDiscovery": "true"
        },
        "StringEquals": {
             "aws:ResourceAccount": "${aws:PrincipalAccount}"
        }
    } 
 }, 
 {
    "Sid": "LakeFormationGetMetadataAccessForFederatedCatalogs",
    "Effect": "Allow", 
    "Action": [ 
        "lakeformation:GetDataAccess"
    ], 
    "Resource": [ "*" ], 
    "Condition": 
    { 
        "Bool": 
        {
            "lakeformation:EnabledOnlyForMetaDataAccess":"true"
        },
        "StringEquals": {
             "aws:ResourceAccount": "${aws:PrincipalAccount}"
        },
        "ForAnyValue:StringEquals": 
        { 
            "aws:CalledVia": "glue.amazonaws.com"
        } 
    }
 }
    }
]
```

`glue:GetCatalog` 和 `glue:GetCatalogs` 权限具有条件 `glue:EnabledForRedshiftAutoDiscovery:true`，这意味着 Amazon Redshift 向 IAM 授予自动发现目录的访问权限。要选择退出，请添加 AWS Glue 账户级资源策略，以便选择性地拒绝服务相关角色访问目录。由于服务相关角色在策略中已经有显式允许操作，因此选择退出策略需要显式拒绝该操作。考虑下面的例子，其中一个额外的策略拒绝 Amazon Redshift 的自动发现功能：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement" : {
            "Effect": "Deny",
            "Action": [
                "glue:GetCatalog",
                "glue:GetCatalogs"
            ],
            "Principal" : {
            "AWS" : "arn:aws:iam::111122223333:role/aws-service-role/redshift.amazonaws.com/AWSServiceRoleForRedshift"
            },
            "Resource": [
                "arn:aws:glue:*:*:catalog/<s3_table_catalog_name>",
                "arn:aws:glue:*:*:catalog/<s3_table_catalog_name>/*"
            ]
        }
}
```

------

**要允许 IAM 实体创建 AWSServiceRoleForRedshift 服务相关角色**

```
{
    "Effect": "Allow",
    "Action": [
        "iam:CreateServiceLinkedRole"      
    ],
    "Resource": "arn:aws:iam::<AWS-account-ID>:role/aws-service-role/redshift.amazonaws.com/AWSServiceRoleForRedshift",
    "Condition": {"StringLike": {"iam:AWSServiceName": "redshift.amazonaws.com"}}
}
```

**要允许 IAM 实体删除 AWSServiceRoleForRedshift 服务相关角色**

向该 IAM 实体的权限中添加以下策略声明：

```
{
    "Effect": "Allow",
    "Action": [
        "iam:DeleteServiceLinkedRole",
        "iam:GetServiceLinkedRoleDeletionStatus"
    ],
    "Resource": "arn:aws:iam::<AWS-account-ID>:role/aws-service-role/redshift.amazonaws.com/AWSServiceRoleForRedshift",
    "Condition": {"StringLike": {"iam:AWSServiceName": "redshift.amazonaws.com"}}
}
```

或者，您可以使用 AWS 托管式策略提供对 Amazon Redshift 的[完全访问权限](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonRedshiftFullAccess)。

## 为 Amazon Redshift 创建服务相关角色
<a name="create-service-linked-role"></a>

您无需手动创建 AWSServiceRoleForRedshift 服务相关角色。Amazon Redshift 将为您创建服务相关角色。如果已从您的账户中删除 AWSServiceRoleForRedshift 服务相关角色，Amazon Redshift 将在您启动新 Amazon Redshift 集群时创建该角色。

**重要**  
如果您在 2017 年 9 月 18 日（从此时开始支持服务相关角色）之前已使用 Amazon Redshift 服务，则 Amazon Redshift 已在您的账户中创建 AWSServiceRoleForRedshift 角色。要了解更多信息，请参阅[我的 IAM 账户中出现新角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_roles.html#troubleshoot_roles_new-role-appeared)。

## 为 Amazon Redshift 编辑服务相关角色
<a name="edit-service-linked-role"></a>

Amazon Redshift 不允许您编辑 AWSServiceRoleForRedshift 服务相关角色。在创建服务相关角色后，您将无法更改角色的名称，因为可能有多种实体引用该角色。不过，您可以使用 IAM 控制台、AWS Command Line Interface (AWS CLI) 或 IAM API 编辑角色描述。有关更多信息，请参阅 *IAM 用户指南*中的[修改角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_modify.html)。

## 删除 Amazon Redshift 的服务相关角色
<a name="delete-service-linked-role"></a>

如果您不再需要使用某个需要服务相关角色的功能或服务，我们建议您删除该角色。这样您就没有未被主动监控或维护的未使用实体。

在删除账户的服务相关角色之前，您需要关闭并删除该账户中的所有集群。有关更多信息，请参阅 [关闭和删除集群](rs-mgmt-shutdown-delete-cluster.md)。

您可以使用 IAM 控制台、AWS CLI 或 IAM API 删除服务相关角色。有关更多信息，请参阅 *IAM 用户指南*中的[删除服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#delete-service-linked-role)。

# 使用 IAM 身份验证生成数据库用户凭证
<a name="generating-user-credentials"></a>

您可以根据通过 AWS Identity and Access Management (IAM) 权限策略授予的权限生成临时数据库凭证，以管理用户的 Amazon Redshift 数据库访问权限。

通常，Amazon Redshift 数据库用户提供数据库用户名和密码以登录到数据库。不过，您不必在 Amazon Redshift 数据库中维护用户名和密码。作为替代方法，您可以将系统配置为允许用户创建用户凭证，并根据其 IAM 凭证登录到数据库。

Amazon Redshift 提供 [GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/APIReference/API_GetClusterCredentials.html) API 操作以生成临时数据库用户凭证。您可使用 Amazon Redshift JDBC 或 ODBC 驱动程序来配置您的 SQL 客户端，这些驱动程序可管理调用 `GetClusterCredentials` 操作的过程。它们通过检索数据库用户凭证并在您的 SQL 客户端和您的 Amazon Redshift 数据库之间建立连接来完成此操作。您也可以使用数据库应用程序以编程方式调用 `GetClusterCredentials` 操作，检索数据库用户凭证并连接到数据库。

如果您已在 AWS 外部管理用户身份，您可以使用与安全断言标记语言 (SAML) 2.0 兼容的身份提供者 (IdP) 管理对 Amazon Redshift 资源的访问。配置您的 IdP 以允许联合身份用户访问 IAM 角色。通过使用该 IAM 角色，您可以生成临时数据库凭证并登录到 Amazon Redshift 数据库。

SQL 客户端需要具有权限才能为您调用 `GetClusterCredentials` 操作。您将通过创建 IAM 角色并附加 IAM 权限策略（该策略授权或限制对 `GetClusterCredentials` 操作和相关操作的访问）来管理这些权限。作为最佳实践，我们建议将权限策略附加到 IAM 角色，然后根据需要将其分配给用户和组。有关更多信息，请参阅 [Amazon Redshift 中的 Identity and Access Management](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html)。

该策略还授权或限制对特定资源 (例如，Amazon Redshift 集群、数据库、数据库用户名和用户组名称) 的访问。

**注意**  
我们建议使用 Amazon Redshift JDBC 或 ODBC 驱动程序来管理调用 `GetClusterCredentials` 操作并登录数据库的过程。为简单起见，我们在整个主题中假定您将 SQL 客户端与 JDBC 或 ODBC 驱动程序结合使用。  
有关使用 `GetClusterCredentials` 操作或并行 `get-cluster-credentials` CLI 命令的具体详细信息和示例，请参阅 [GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/APIReference/API_GetClusterCredentials.html) 和 [get-cluster-credentials](https://docs.aws.amazon.com/cli/latest/reference/redshift/get-cluster-credentials.html)。

为了集中管理身份验证和授权，Amazon Redshift 支持使用 IAM 进行数据库身份验证，从而通过企业联合进行用户身份验证。您也可以不创建用户，而是使用来自 AWS Directory Service、您的企业用户目录或 Web 身份提供者的现有身份。这些用户被称为联合身份用户。在通过 IdP 请求访问权限时，AWS 将为联合身份用户分配角色。

要为组织中的用户或客户端应用程序提供联合访问权限以调用 Amazon Redshift API 操作，您还可以使用具有 SAML 2.0 支持的 JDBC 或 ODBC 驱动程序请求从组织 IdP 中进行身份验证。在这种情况下，组织的用户没有 Amazon Redshift 的直接访问权限。

有关更多信息，请参阅 *IAM 用户指南*中的[身份提供者和联合](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)。

# 创建临时 IAM 凭证
<a name="generating-iam-credentials-steps"></a>

在本节中，您可以了解如何配置系统以生成基于 IAM 的临时数据库用户凭证，并使用新凭证登录到数据库。

概括来说，流程如下所示：

1. [步骤 1：创建用于 IAM 单点登录访问的 IAM 角色](#generating-iam-credentials-sso-role)

   （可选）您可以将 IAM 身份验证和第三方身份提供者 (IdP) 进行集成，对访问 Amazon Redshift 数据库的用户进行身份验证。

1. [步骤 2：为 IdP 配置 SAML 断言](#configuring-saml-assertions)

   （可选）要使用 IdP 进行 IAM 身份验证，您需要在 IdP 应用程序中定义一个声明规则，将组织中的用户或组映射到 IAM 角色。或者，您可以包含属性元素以设置 `GetClusterCredentials` 参数。

1. [步骤 3：创建有权调用 GetClusterCredentialsWithIAM 或 GetClusterCredentials 的 IAM 角色](#generating-iam-credentials-role-permissions)

   您的 SQL 客户端应用程序在调用 `GetClusterCredentials` 操作时代入用户。如果您创建了用于身份提供者访问的 IAM 角色，则可向该角色添加必要权限。

1. [步骤 4：创建数据库用户和数据库组](#generating-iam-credentials-user-and-groups)

   （可选）默认情况下，`GetClusterCredentials` 返回凭证；如果用户名不存在，则会创建一个新用户。您也可以选择指定用户在登录时加入的用户组。默认情况下，数据库用户加入 PUBLIC 组。

1. [步骤 5：配置 JDBC 或 ODBC 连接以使用 IAM 凭证](#generating-iam-credentials-configure-jdbc-odbc)

   要连接到您的 Amazon Redshift 数据库，可将 SQL 客户端配置为使用 Amazon Redshift JDBC 或 ODBC 驱动程序。

## 步骤 1：创建用于 IAM 单点登录访问的 IAM 角色
<a name="generating-iam-credentials-sso-role"></a>

如果您未使用身份提供者进行单点登录访问，则可跳过此步骤。

如果您已在 AWS 外部管理用户身份，则可将 IAM 身份验证和第三方 SAML-2.0 身份提供者 (IdP) 集成，对访问 Amazon Redshift 数据库的用户进行身份验证。

有关更多信息，请参阅 *IAM 用户指南*中的[身份提供者和联合](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html)。

在使用 Amazon Redshift IdP 身份验证之前，请先创建一个 AWS SAML 身份提供者。您可以在 IAM 控制台中创建一个 IdP，以向 AWS 通知该 IdP 及其配置。这样将在您的 AWS 账户和 IdP 之间建立信任。有关创建角色的步骤，请参阅《IAM 用户指南》**中的[创建用于 SAML 2.0 联合的角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html?icmpid=docs_iam_console)。

## 步骤 2：为 IdP 配置 SAML 断言
<a name="configuring-saml-assertions"></a>

在创建 IAM 角色后，您可以在 IdP 应用程序中定义一个声明规则，以将组织中的用户或组映射到 IAM 角色。有关更多信息，请参阅 *IAM 用户指南*中的[为身份验证响应配置 SAML 断言](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html)。

如果选择使用可选的 `GetClusterCredentials` 参数 `DbUser`、`AutoCreate` 和 `DbGroups`，您有两个选择。您可以使用 JDBC 或 ODBC 连接设置这些参数的值，也可以将 SAML 属性元素添加到 IdP 以设置这些值。有关 `DbUser`、`AutoCreate` 和 `DbGroups` 参数的更多信息，请参阅[步骤 5：配置 JDBC 或 ODBC 连接以使用 IAM 凭证](#generating-iam-credentials-configure-jdbc-odbc)。

**注意**  
如果您使用 IAM 策略变量 `${redshift:DbUser}`（如[GetClusterCredentials 的资源策略](redshift-iam-access-control-identity-based.md#redshift-policy-resources.getclustercredentials-resources)中所述），则 `DbUser` 的值将被替换为由 API 操作的请求上下文检索的值。Amazon Redshift 驱动程序使用由连接 URL 提供的 `DbUser` 变量的值，而不是作为 SAML 属性提供的值。  
为了帮助保护该配置，我们建议您在 IAM 策略中使用一个条件以通过 `DbUser` 验证 `RoleSessionName` 值。您可以在 [示例 8：使用 GetClusterCredentials 的 IAM 策略](redshift-iam-access-control-identity-based.md#redshift-policy-examples-getclustercredentials) 中找到如何使用 IAM 策略设置条件。

要配置 IdP 以设置 `DbUser`、`AutoCreate` 和 `DbGroups` 参数，请包含以下 `Attribute` 元素：
+ `Attribute` 属性设置为“https://redshift.amazon.com/SAML/Attributes/DbUser”的 `Name` 元素

  将 `AttributeValue` 元素设置为要连接到 Amazon Redshift 数据库的用户的名称。

  `AttributeValue` 元素中的值必须为小写形式，以字母开头，仅包含字母数字字符、下划线 (\$1)、加号 (\$1)、圆点 (.)、@ 符号或连字符 (-)，并且应少于 128 个字符。通常，用户名为用户 ID (例如，bobsmith) 或电子邮件地址 (例如，bobsmith@example.com)。此值不能包含空格 (例如，像 Bob Smith 这样的用户显示名称)。

  ```
  <Attribute Name="https://redshift.amazon.com/SAML/Attributes/DbUser">
      <AttributeValue>user-name</AttributeValue>
  </Attribute>
  ```
+ Name 属性设置为“https://redshift.amazon.com/SAML/Attributes/AutoCreate”的 Attribute 元素

  可以将 AttributeValue 元素设置为 true 以创建新的数据库用户（如果不存在）。将 AttributeValue 设置为 false 可指定数据库用户必须存在于 Amazon Redshift 数据库中。

  ```
  <Attribute Name="https://redshift.amazon.com/SAML/Attributes/AutoCreate">
      <AttributeValue>true</AttributeValue>
  </Attribute>
  ```
+ `Attribute` 属性设置为“https://redshift.amazon.com/SAML/Attributes/DbGroups”的 `Name` 元素

  该元素包含一个或多个 `AttributeValue` 元素。将每个 `AttributeValue` 元素设置为一个数据库组名称，`DbUser` 将在连接到 Amazon Redshift 数据库的会话期间加入该组。

  ```
  <Attribute Name="https://redshift.amazon.com/SAML/Attributes/DbGroups">
      <AttributeValue>group1</AttributeValue>
      <AttributeValue>group2</AttributeValue>
      <AttributeValue>group3</AttributeValue>
  </Attribute>
  ```

## 步骤 3：创建有权调用 GetClusterCredentialsWithIAM 或 GetClusterCredentials 的 IAM 角色
<a name="generating-iam-credentials-role-permissions"></a>

您的 SQL 客户端需要授权才能代表您调用 ` GetClusterCredentialsWithIAM` 或 `GetClusterCredentials` 操作。要提供该授权，可以创建用户或角色并附加用于授予必要权限的策略。这两项操作都可用于获取集群凭证，但它们的身份验证方法不同。` GetClusterCredentialsWithIAM` 使用 IAM 角色进行身份验证，这将自动创建一个映射到该角色的数据库用户，从而帮助管理 IAM 角色级别的权限，而 `GetClusterCredentials` 则会为数据库中的给定用户名提供凭证。

**创建有权调用 GetClusterCredentialsWithIAM 的 IAM 角色**

1. 利用 IAM 服务，创建用户或角色。您也可以使用现有用户或角色。例如，如果您创建了一个用于身份提供者访问的 IAM 角色，则可向该角色附加必要的 IAM 策略。

1. 附加有权调用 ` redshift:GetClusterCredentialsWithIAM` 操作的权限策略。以下策略示例说明了允许对特定集群和数据库、集群中的任意数据库以及任意集群中的任意数据库执行操作的选项。

   ```
   {
       "Version": "2012-10-17", 		 	 	 
       "Statement": [
           {
               "Sid": "SpecificClusterAndDBName",
               "Effect": "Allow",
               "Action": "redshift:GetClusterCredentialsWithIAM",
               "Resource": [
                   "arn:aws:redshift:us-east-1:123456789012:dbname:testcluster/testdatabase"
               ]
           },
           {
               "Sid": "SpecificClusterAndAnyDBName",
               "Effect": "Allow",
               "Action": "redshift:GetClusterCredentialsWithIAM",
               "Resource": "arn:aws:redshift:us-east-1:123456789012:dbname:examplecluster/*",
           },
           {
               "Sid": "AnyClusterAnyDatabase",
               "Effect": "Allow",
               "Action": "redshift:GetClusterCredentialsWithIAM",
               "Resource": "*"
           }
       ]
   }
   ```

**创建有权调用 GetClusterCredentials 的 IAM 角色**

1. 利用 IAM 服务，创建用户或角色。您也可以使用现有用户或角色。例如，如果您创建了一个用于身份提供者访问的 IAM 角色，则可向该角色附加必要的 IAM 策略。

1. 附加有权调用 `redshift:GetClusterCredentials` 操作的权限策略。根据指定的可选参数，您还可在策略中允许或限制其他操作和资源：
   + 要允许您的 SQL 客户端检索 Redshift 集群资源的集群 ID、AWS 区域和端口，可包含调用 `redshift:DescribeClusters` 操作的权限。
   + 如果您使用 `AutoCreate` 选项，请包含对 `redshift:CreateClusterUser` 资源调用 `dbuser` 的权限。以下 Amazon 资源名称（ARN）指定 Amazon Redshift `dbuser`。将 *`region`*、*`account-id`* 和 *`cluster-name`* 替换为您的 AWS 区域、账户和集群的相应值。对于 *`dbuser-name`*，指定用于登录到集群数据库的用户名。

     ```
     arn:aws:redshift:region:account-id:dbuser:cluster-name/dbuser-name
     ```
   + （可选）添加一个 ARN，以使用以下格式指定 Amazon Redshift `dbname` 资源。将 *`region`*、*`account-id`* 和 *`cluster-name`* 替换为您的 AWS 区域、账户和集群的相应值。对于 `database-name`，指定用户将登录到的数据库的名称。

     ```
     arn:aws:redshift:region:account-id:dbname:cluster-name/database-name
     ```
   + 如果您使用 `DbGroups` 选项，请使用以下格式包含对 Amazon Redshift `dbgroup` 资源调用 `redshift:JoinGroup` 操作的权限。将 *`region`*、*`account-id`* 和 *`cluster-name`* 替换为您的 AWS 区域、账户和集群的相应值。对于 `dbgroup-name`，请指定用户在登录时加入的用户组的名称。

     ```
     arn:aws:redshift:region:account-id:dbgroup:cluster-name/dbgroup-name
     ```

有关更多信息以及示例，请参阅 [GetClusterCredentials 的资源策略](redshift-iam-access-control-identity-based.md#redshift-policy-resources.getclustercredentials-resources)。

## 步骤 4：创建数据库用户和数据库组
<a name="generating-iam-credentials-user-and-groups"></a>

（可选）您可以创建一个用于登录到集群数据库的数据库用户。如果您为现有用户创建临时用户凭证，则可禁用此用户的密码以强制用户使用临时密码进行登录。（可选）您可以使用 `GetClusterCredentials` 选项自动创建新的数据库用户。

您可以创建希望 IAM 数据库用户在登录时加入的数据库用户组并提供相应的权限。在调用 `GetClusterCredentials` 操作时，您可以指定新用户在登录时加入的用户组名称列表。这些组成员资格仅对特定请求生成的凭证所创建的会话有效。

**创建数据库用户和数据库组**

1. 登录到 Amazon Redshift 数据库，并使用 [CREATE USER](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_USER.html) 创建数据库用户或使用 [ALTER USER](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_USER.html) 修改现有用户。

1. （可选）指定 PASSWORD DISABLE 选项可阻止用户使用密码。在禁用用户的密码后，用户只能使用临时凭证进行登录。如果未禁用密码，用户可以使用密码或临时凭证进行登录。您不能禁用超级用户的密码。

   如果用户需要在 AWS 管理控制台之外与 AWS 交互，则需要编程式访问权限。授予编程式访问权限的方法取决于访问 AWS 的用户类型。

   要向用户授予编程式访问权限，请选择以下选项之一。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/generating-iam-credentials-steps.html)

   以下示例创建一个已禁用密码的用户。

   ```
   create user temp_creds_user password disable; 
   ```

   以下示例禁用现有用户的密码。

   ```
   alter user temp_creds_user password disable;
   ```

1. 使用 [CREATE GROUP](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_GROUP.html) 创建数据库用户组。

1. 使用 [GRANT](https://docs.aws.amazon.com/redshift/latest/dg/r_GRANT.html) 命令为组定义访问权限。

## 步骤 5：配置 JDBC 或 ODBC 连接以使用 IAM 凭证
<a name="generating-iam-credentials-configure-jdbc-odbc"></a>

您可以使用 Amazon Redshift JDBC 或 ODBC 驱动程序配置 SQL 客户端。此驱动程序管理创建数据库用户凭证以及在 SQL 客户端和 Amazon Redshift 数据库之间建立连接的过程。

如果您使用身份提供者进行身份验证，请指定凭证提供商插件名称。Amazon Redshift JDBC 和 ODBC 驱动程序包括以下基于 SAML 的身份提供者的插件：
+ Active Directory 联合身份验证服务 (AD FS)
+ PingOne
+ Okta
+ Microsoft Azure AD

  有关将 Microsoft Azure AD 设置为身份提供者的步骤，请参阅[设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。<a name="to-configure-a-jdbc-connection"></a>

**配置 JDBC 连接以使用 IAM 凭证**

1. 从 [为 Amazon Redshift 配置 JDBC 驱动程序版本 2.x 连接](jdbc20-install.md) 页面下载最新的 Amazon Redshift JDBC 驱动程序。

1. 使用下列格式之一创建包含 IAM 凭证选项的 JDBC URL。要使用 IAM 身份验证，请将 `iam:` 添加到 Amazon Redshift JDBC URL 中的 `jdbc:redshift:` 后面，如以下示例中所示。

   ```
   jdbc:redshift:iam://
   ```

   添加 `cluster-name`、`region` 和 `account-id`。JDBC 驱动程序使用您的 IAM 账户信息和集群名称来检索集群 ID和 AWS 区域。为此，您的用户或角色必须有权针对指定的集群调用 `redshift:DescribeClusters` 操作。如果您的用户或角色无权调用 `redshift:DescribeClusters` 操作，请包含集群 ID、AWS 区域和端口，如以下示例中所示。端口号是可选的。

   ```
   jdbc:redshift:iam://examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com:5439/dev
   ```

1. 添加 JDBC 选项可提供 IAM 凭证。使用不同的 JDBC 选项组合可提供 IAM 凭证。有关更多信息，请参阅 [用于创建数据库用户凭证的 JDBC 和 ODBC 选项](options-for-providing-iam-credentials.md#jdbc-and-odbc-options-for-database-credentials)。

   以下 URL 为用户指定 AccessKeyID 和 SecretAccessKey。

   ```
   jdbc:redshift:iam://examplecluster:us-west-2/dev?AccessKeyID=AKIAIOSFODNN7EXAMPLE&SecretAccessKey=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   ```

    以下示例指定包含 IAM 凭证的命名配置文件。

   ```
   jdbc:redshift:iam://examplecluster:us-west-2/dev?Profile=user2
   ```

1. 添加 JDBC 驱动程序用来调用 `GetClusterCredentials` API 操作的 JDBC 选项。如果您以编程方式调用 `GetClusterCredentials` API 操作，请不要包括这些选项。

   以下示例包括 JDBC `GetClusterCredentials` 选项。

   ```
   jdbc:redshift:iam://examplecluster:us-west-2/dev?plugin_name=com.amazon.redshift.plugin.AzureCredentialsProvider&UID=user&PWD=password&idp_tenant=my_tenant&client_secret=my_secret&client_id=my_id
   ```<a name="to-configure-an-odbc-connection"></a>

**配置 ODBC 连接以使用 IAM 凭证**

在以下过程中，您只能找到用于配置 IAM 身份验证的步骤。有关使用标准身份验证 (采用数据库用户名和密码) 的步骤，请参阅[为 Amazon Redshift 配置 ODBC 驱动程序版本 2.x 连接](odbc20-install.md)。

1. 为您的操作系统安装和配置最新的 Amazon Redshift OBDC 驱动程序。有关更多信息，请参阅[为 Amazon Redshift 配置 ODBC 驱动程序版本 2.x 连接](odbc20-install.md)页面。
**重要**  
Amazon Redshift ODBC 驱动程序必须为版本 1.3.6.1000 或更高版本。

1. 根据您的操作系统选择配置连接设置需要遵循的步骤。

1. 在 Microsoft Windows 操作系统上，访问“Amazon Redshift ODBC 驱动程序 DSN 设置”窗口。

   1. 在**连接设置**下，输入以下信息：
      + **数据源名称** 
      + **服务器**（可选） 
      + **端口**（可选） 
      + **数据库** 

      如果您的用户或角色有权调用 `redshift:DescribeClusters` 操作，仅需要**数据源名称**和**数据库**。Amazon Redshift 通过调用 `DescribeCluster` 操作使用 **ClusterId** 和**区域**来获取服务器和端口。

      如果您的用户或角色无权调用 `redshift:DescribeClusters` 操作，请指定**服务器**和**端口**。

   1. 在**身份验证**下，为**身份验证类型**选择一个值。

      对于每种身份验证类型，请输入如下列出的值：  
AWS 配置文件  
输入以下信息：  
      + **ClusterID** 
      + **区域** 
      + **配置文件名称** 

        输入 AWS config 文件中包含 ODBC 连接选项值的配置文件的名称。有关更多信息，请参阅 [使用配置文件](options-for-providing-iam-credentials.md#using-configuration-profile)。
（可选）提供 ODBC 驱动程序用于调用 `GetClusterCredentials` API 操作的选项的详细信息：  
      + **DbUser**
      + **User AutoCreate**
      + **DbGroups**

        有关更多信息，请参阅 [用于创建数据库用户凭证的 JDBC 和 ODBC 选项](options-for-providing-iam-credentials.md#jdbc-and-odbc-options-for-database-credentials)。  
IAM 凭证  
输入以下信息：  
      + **ClusterID** 
      + **区域** 
      + **AccessKeyID** 和 **SecretAccessKey** 

        为 IAM 数据库身份验证配置的 IAM 角色或用户的访问密钥 ID 和秘密访问密钥。
      + **SessionToken** 

        对于具有临时凭证的 IAM 角色，**SessionToken** 是必填的。有关更多信息，请参阅[临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)。
提供 ODBC 驱动程序用于调用 `GetClusterCredentials` API 操作的选项的详细信息：  
      + **DbUser**（必填） 
      + **User AutoCreate**（可选） 
      + **DbGroups**（可选） 

        有关更多信息，请参阅 [用于创建数据库用户凭证的 JDBC 和 ODBC 选项](options-for-providing-iam-credentials.md#jdbc-and-odbc-options-for-database-credentials)。  
Identity Provider: AD FS  
对于使用 AD FS 的 Windows 集成身份验证，请将 **User** 和 **Password** 保留为空。  
提供 IdP 详细信息：  
      + **IdP Host** 

        企业身份提供者主机的名称。此名称不应包含任何斜线 (/)。
      + **IdP Port**（可选）

        身份提供者使用的端口。默认值为 443。
      + **Preferred Role** 

        SAML 断言中的 `AttributeValue` 属性的多值 `Role` 元素中的 IAM 角色 Amazon 资源名称（ARN）。请与 IdP 管理员一起查找适合首选角色的值。有关更多信息，请参阅 [步骤 2：为 IdP 配置 SAML 断言](#configuring-saml-assertions)。
（可选）提供 ODBC 驱动程序用于调用 `GetClusterCredentials` API 操作的选项的详细信息：  
      + **DbUser** 
      + **User AutoCreate** 
      + **DbGroups** 
有关更多信息，请参阅 [用于创建数据库用户凭证的 JDBC 和 ODBC 选项](options-for-providing-iam-credentials.md#jdbc-and-odbc-options-for-database-credentials)。  
Identity Provider: PingFederate  
对于**用户**和**密码**，键入您的 IdP 用户名和密码。  
提供 IdP 详细信息：  
      + **IdP Host** 

        企业身份提供者主机的名称。此名称不应包含任何斜线 (/)。
      + **IdP Port**（可选）

        身份提供者使用的端口。默认值为 443。
      + **Preferred Role** 

        SAML 断言中的 `AttributeValue` 属性的多值 `Role` 元素中的 IAM 角色 Amazon 资源名称（ARN）。请与 IdP 管理员一起查找适合首选角色的值。有关更多信息，请参阅 [步骤 2：为 IdP 配置 SAML 断言](#configuring-saml-assertions)。
（可选）提供 ODBC 驱动程序用于调用 `GetClusterCredentials` API 操作的选项的详细信息：  
      + **DbUser** 
      + **User AutoCreate** 
      + **DbGroups** 
有关更多信息，请参阅 [用于创建数据库用户凭证的 JDBC 和 ODBC 选项](options-for-providing-iam-credentials.md#jdbc-and-odbc-options-for-database-credentials)。  
Identity Provider: Okta  
对于**用户**和**密码**，键入您的 IdP 用户名和密码。  
提供 IdP 详细信息：  
      + **IdP Host** 

        企业身份提供者主机的名称。此名称不应包含任何斜线 (/)。
      + **IdP Port ** 

        Okta 不使用此值。
      + **Preferred Role** 

        SAML 断言中的 `AttributeValue` 属性的 `Role` 元素中的 IAM 角色 Amazon 资源名称（ARN）。请与 IdP 管理员一起查找适合首选角色的值。有关更多信息，请参阅 [步骤 2：为 IdP 配置 SAML 断言](#configuring-saml-assertions)。
      + **Okta App ID** 

        Okta 应用程序的 ID。应用程序 ID 的值位于 Okta 应用程序嵌入链接中的“amazon\$1aws”之后。与您的 IdP 管理员一起获取此值。
（可选）提供 ODBC 驱动程序用于调用 `GetClusterCredentials` API 操作的选项的详细信息：  
      + **DbUser** 
      + **User AutoCreate** 
      + **DbGroups** 
有关更多信息，请参阅 [用于创建数据库用户凭证的 JDBC 和 ODBC 选项](options-for-providing-iam-credentials.md#jdbc-and-odbc-options-for-database-credentials)。  
身份提供者：Azure AD  
对于**用户**和**密码**，键入您的 IdP 用户名和密码。  
对于**集群 ID** 和**区域**，输入 Amazon Redshift 集群的集群 ID 和 AWS 区域。  
对于**数据库**，输入您为 Amazon Redshift 集群创建的数据库。  
提供 IdP 详细信息：  
      + **IdP 租户** 

        用于 Azure AD 的租户。
      + **Azure 客户端密钥**

        Azure 中的 Amazon Redshift 企业应用程序的客户端密钥。
      + **Azure 客户端 ID** 

        Azure 中的 Amazon Redshift 企业应用程序的客户端 ID（应用程序 ID）。
（可选）提供 ODBC 驱动程序用于调用 `GetClusterCredentials` API 操作的选项的详细信息：  
      + **DbUser** 
      + **User AutoCreate** 
      + **DbGroups** 
有关更多信息，请参阅 [用于创建数据库用户凭证的 JDBC 和 ODBC 选项](options-for-providing-iam-credentials.md#jdbc-and-odbc-options-for-database-credentials)。

# 用于提供 IAM 凭证的选项
<a name="options-for-providing-iam-credentials"></a>

要为 JDBC 或 ODBC 连接提供 IAM 凭证，请选择以下选项之一。
+ **AWS 配置文件** 

  作为以 JDBC 或 ODBC 设置形式提供凭证值的替代方案，您可在命名配置文件中放置这些值。有关更多信息，请参阅 [使用配置文件](#using-configuration-profile)。
+ **IAM 凭证**

  以 JDBC 或 ODBC 设置形式提供 AccessKeyID 和 SecretAccessKey 的值，还可以选择提供 SessionToken 的值。SessionToken 仅对于具有临时凭证的 IAM 角色是必填的。有关更多信息，请参阅 [用于提供 IAM 凭证的 JDBC 和 ODBC 选项](#jdbc-options-for-providing-iam-credentials)。
+ **身份提供者联合** 

  在使用身份提供者联合以允许身份提供者中的用户在 Amazon Redshift 中进行身份验证时，请指定凭证提供商插件的名称。有关更多信息，请参阅 [凭证提供程序插件](#using-credentials-provider-plugin)。

  Amazon Redshift JDBC 和 ODBC 驱动程序包括以下基于 SAML 的联合身份验证凭证提供商的插件：
  + Microsoft Active Directory 联合身份验证服务 (AD FS)
  + PingOne
  + Okta
  + Microsoft Azure Active Directory (Azure AD)

  您可以 JDBC 或 ODBC 设置格式提供或使用配置文件提供插件名称和相关值。有关更多信息，请参阅 [JDBC 驱动程序版本 2.x 配置的选项](jdbc20-configuration-options.md)。

有关更多信息，请参阅 [步骤 5：配置 JDBC 或 ODBC 连接以使用 IAM 凭证](generating-iam-credentials-steps.md#generating-iam-credentials-configure-jdbc-odbc)。

## 使用配置文件
<a name="using-configuration-profile"></a>

您可提供 IAM 凭证选项和 `GetClusterCredentials` 选项作为 AWS 配置文件中的命名配置文件的设置。要提供配置文件名称，请使用配置文件 JDBC 选项。该配置存储在名为 `config` 的文件或位于主目录下面的名为 `credentials` 的文件夹中的名为 `.aws` 的文件中。

对于 Amazon Redshift JDBC 或 ODBC 驱动程序附带的基于 SAML 的凭证提供商插件，您可以使用 [凭证提供程序插件](#using-credentials-provider-plugin) 中前面所述的设置。如果未使用 `plugin_name`，则忽略其他选项。

下例所示为一个有两个配置文件的 \$1/.aws/credentials 文件。

```
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[user2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
session_token=AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd
QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU
9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz
+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==
```

要使用 `user2` 示例的凭证，请在 JDBC URL 中指定 `Profile=user2`。

有关使用配置文件的更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[配置和凭证文件设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。

有关为 JDBC 驱动程序使用配置文件的更多信息，请参阅[指定配置文件](jdbc20-configure-authentication-ssl.md#jdbc20-aws-credentials-profiles)。

有关为 ODBC 驱动程序使用配置文件的更多信息，请参阅[身份验证方法](odbc20-authentication-ssl.md)。

## 用于提供 IAM 凭证的 JDBC 和 ODBC 选项
<a name="jdbc-options-for-providing-iam-credentials"></a>

下表列出了用于提供 IAM 凭证的 JDBC 和 ODBC 选项。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/options-for-providing-iam-credentials.html)

## 用于创建数据库用户凭证的 JDBC 和 ODBC 选项
<a name="jdbc-and-odbc-options-for-database-credentials"></a>

要使用 Amazon Redshift JDBC 或 ODBC 驱动程序创建数据库用户凭证，请提供数据库用户名作为 JDBC 或 ODBC 选项。（可选）您可以让驱动程序创建新的数据库用户（如果不存在），并且可以指定用户在登录时加入的数据库用户组列表。

如果您使用身份提供者 (IdP)，请与 IdP 管理员一起确定这些选项的正确值。您的 IdP 管理员还可配置 IdP 来提供这些选项，这样一来，您将无需提供它们作为 JDBC 或 ODBC 选项。有关更多信息，请参阅 [步骤 2：为 IdP 配置 SAML 断言](generating-iam-credentials-steps.md#configuring-saml-assertions)。

**注意**  
如果您使用 IAM 策略变量 `${redshift:DbUser}`（如[GetClusterCredentials 的资源策略](redshift-iam-access-control-identity-based.md#redshift-policy-resources.getclustercredentials-resources)中所述），则 `DbUser` 的值将被替换为由 API 操作的请求上下文检索的值。Amazon Redshift 驱动程序使用由连接 URL 提供的 `DbUser` 变量的值，而不是作为 SAML 属性提供的值。  
为帮助保护此配置，我们建议您在 IAM 策略中使用一个使用来通过 `DbUser` 验证 `RoleSessionName` 值。您可以在 [示例 8：使用 GetClusterCredentials 的 IAM 策略](redshift-iam-access-control-identity-based.md#redshift-policy-examples-getclustercredentials) 中找到如何使用 IAM 策略设置条件。

下表列出了用于创建数据库用户凭证的选项。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/options-for-providing-iam-credentials.html)

## 凭证提供程序插件
<a name="using-credentials-provider-plugin"></a>

Amazon Redshift 使用凭证提供商插件进行单点登录身份验证。

为了支持单点登录身份验证，Amazon Redshift 提供了适用于 Microsoft Azure Active Directory 的 Azure AD 插件。有关如何配置该插件的信息，请参阅[设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。

### 多重身份验证
<a name="setting_mfa"></a>

为了支持多重身份验证（MFA），Amazon Redshift 提供了基于浏览器的插件。请使用适用于 Okta、PingOne 的的浏览器 SAML 插件，以及适用于 Microsoft Azure Active Directory 的浏览器 Azure AD 插件。

在使用浏览器 SAML 插件时，OAuth 身份验证流程如下所示：

![\[OAuth 工作流，用于说明插件、本地服务器、Web 浏览器和端点如何协同工作，通过 SAML 身份验证对用户进行身份验证。\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/BrowserSAML_plugin.png)


1. 用户尝试登录。

1. 该插件启动本地服务器以侦听 localhost 上的传入连接。

1. 该插件启动 Web 浏览器，以通过 HTTPS 从指定的单点登录 URL 联合身份提供者端点请求 SAML 响应。

1. Web 浏览器访问该链接，并提示用户输入凭证。

1. 在用户进行身份验证并获得允许后，联合身份提供者端点通过 HTTPS 向 `redirect_uri` 指示的 URI 返回 SAML 响应。

1. Web 浏览器将包含 SAML 响应的响应消息传送到指示的 `redirect_uri`。

1. 本地服务器接受传入连接，该插件检索 SAML 响应并将其传送到 Amazon Redshift。

在使用浏览器 Azure AD 插件时，SAML 身份验证流程如下所示：

![\[Azure 工作流，用于说明插件、本地服务器、Web 浏览器和端点如何协同工作，通过 SAML 身份验证对用户进行身份验证。\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/BrowserAzure_plugin.png)


1. 用户尝试登录。

1. 该插件启动本地服务器以侦听 localhost 上的传入连接。

1. 该插件启动 Web 浏览器，以从 Azure AD `oauth2/authorize` 端点请求授权代码。

1. Web 浏览器通过 HTTPS 访问生成的链接，并提示用户输入凭证。该链接是使用配置属性（例如 tenant 和 client\$1id）生成的。

1. 在用户进行身份验证并获得允许后，Azure AD `oauth2/authorize` 端点通过 HTTPS 返回包含授权代码的响应并将其发送到指示的 `redirect_uri`。

1. Web 浏览器将包含 SAML 响应的响应消息传送到指示的 `redirect_uri`。

1. 本地服务器接受传入连接，该插件请求和检索授权代码，并将 POST 请求发送到 Azure AD `oauth2/token` 端点。

1. Azure AD `oauth2/token` 端点将包含访问令牌的响应返回到指示的 `redirect_uri`。

1. 该插件检索 SAML 响应并将其传送到 Amazon Redshift。

参阅以下部分：
+ Active Directory 联合身份验证服务 (AD FS)

  有关更多信息，请参阅 [设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。
+ PingOne (Ping) 

  只有使用 Forms 身份验证预先确定的 PingOne IdP 适配器支持 Ping。

  有关更多信息，请参阅 [设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。
+ Okta 

  仅与 AWS 管理控制台 一起使用的 Okta 提供的应用程序支持 Okta。

  有关更多信息，请参阅 [设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。
+ Microsoft Azure Active Directory

  有关更多信息，请参阅 [设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。

### 插件选项
<a name="configuring_plugin_options"></a>

要使用基于 SAML 的凭证提供商插件，请使用 JBDC 或 ODBC 选项，或在命名配置文件中指定以下选项。如果未指定 `plugin_name`，则忽略其他选项。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/options-for-providing-iam-credentials.html)

# 使用 Amazon Redshift CLI 或 API 生成 IAM 身份的数据库凭证
<a name="generating-iam-credentials-cli-api"></a>

为了以编程方式生成临时数据库用户凭证，Amazon Redshift 提供适用于 AWS Command Line Interface (AWS CLI) 和 [GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/APIReference/API_GetClusterCredentials.html) API 操作的 [get-cluster-credentials](https://docs.aws.amazon.com/cli/latest/reference/redshift/get-cluster-credentials.html) 命令。或者，您可以使用 Amazon Redshift JDBC 或 ODBC 驱动程序配置您的 SQL 客户端，这些驱动程序用于管理调用 `GetClusterCredentials` 操作，检索数据库用户凭证，并在您的 SQL 客户端与您的 Amazon Redshift 数据库之间建立连接的过程。有关更多信息，请参阅 [用于创建数据库用户凭证的 JDBC 和 ODBC 选项](options-for-providing-iam-credentials.md#jdbc-and-odbc-options-for-database-credentials)。

**注意**  
我们建议使用 Amazon Redshift JDBC 或 ODBC 驱动程序生成数据库用户凭证。

在此部分中，您可以找到用于以编程方式调用 `GetClusterCredentials` 操作或 get-cluster-credentials 命令，检索数据库用户凭证并连接到数据库的步骤。

**生成和使用临时数据库凭证**

1. 创建或修改具有所需权限的用户或角色。有关 IAM 权限的更多信息，请参阅[步骤 3：创建有权调用 GetClusterCredentialsWithIAM 或 GetClusterCredentials 的 IAM 角色](generating-iam-credentials-steps.md#generating-iam-credentials-role-permissions)。

1. 以您在上一步骤中授权的用户或角色的身份，运行 get-cluster-credentials CLI 命令或调用 `GetClusterCredentials` API 操作并提供下列值：
   + **集群标识符** – 包含数据库的集群的名称。
   + **数据库用户名** – 现有的或新的数据库用户的名称。
     + 如果数据库中不存在此用户且 AutoCreate 为 true，则将创建一个已禁用 PASSWORD 的新用户。
     +  如果此用户不存在且 AutoCreate 为 false，则请求会失败。
     + 在此示例中，数据库用户名为 `temp_creds_user`。
   +  **Autocreate** – （可选）如果数据库用户名不存在，则创建新用户。
   +  **数据库名称** – （可选）授权用户登录的数据库的名称。如果未指定数据库名称，则用户可以登录到任何集群数据库。
   +  **数据库组** – （可选）现有数据库用户组的列表。在成功登录后，数据库用户将添加到指定的用户组中。如果未指定组，则用户仅具有 PUBLIC 权限。此用户组名称必须与在附加到用户或角色的 IAM 策略中指定的 dbgroup 资源 ARN 匹配。
   +  **过期时间** – （可选）临时凭证过期之前经历的时间（以秒为单位）。您可指定一个介于 900 秒 (15 分钟) 和 3600 秒 (60 分钟) 之间的值。默认值为 900 秒。

1. Amazon Redshift 确认用户是否有权使用指定资源来调用 `GetClusterCredentials` 操作。

1. Amazon Redshift 返回临时密码和数据库用户名。

   以下示例使用 Amazon Redshift CLI 为名为 `temp_creds_user` 的现有用户生成临时数据库凭证。

   ```
   aws redshift get-cluster-credentials --cluster-identifier examplecluster --db-user temp_creds_user --db-name exampledb --duration-seconds 3600
   ```

   结果如下所示。

   ```
   {
     "DbUser": "IAM:temp_creds_user", 
     "Expiration": "2016-12-08T21:12:53Z", 
     "DbPassword": "EXAMPLEjArE3hcnQj8zt4XQj9Xtma8oxYEM8OyxpDHwXVPyJYBDm/gqX2Eeaq6P3DgTzgPg=="
   }
   ```

   以下示例使用 Amazon Redshift CLI 与 autocreate 为新用户生成临时数据库凭证并将此用户添加到组 `example_group`。

   ```
   aws redshift get-cluster-credentials --cluster-identifier examplecluster --db-user temp_creds_user --auto-create --db-name exampledb --db-groups example_group --duration-seconds 3600
   ```

   结果如下所示。

   ```
   {
     "DbUser": "IAMA:temp_creds_user:example_group", 
     "Expiration": "2016-12-08T21:12:53Z", 
     "DbPassword": "EXAMPLEjArE3hcnQj8zt4XQj9Xtma8oxYEM8OyxpDHwXVPyJYBDm/gqX2Eeaq6P3DgTzgPg=="
   }
   ```

1. 建立到 Amazon Redshift 集群的安全套接字层 (SSL) 身份验证连接，并发送包含 `GetClusterCredentials` 响应中的用户名和密码的登录请求。请在用户名中包含 `IAM:` 或 `IAMA:` 前缀，例如，`IAM:temp_creds_user` 或 `IAMA:temp_creds_user`。
**重要**  
将您的 SQL 客户端配置为需要 SSL。否则，如果您的 SQL 客户端自动尝试使用 SSL 进行连接，则可能会在出现任何故障时回退到非 SSL。在这种情况下，首次连接尝试可能因凭证过期或无效而失败，随后的另一次连接尝试可能因连接不是 SSL 而失败。如果出现这种情况，第一条错误消息可能会丢失。有关使用 SSL 连接到集群的更多信息，请参阅[配置连接的安全选项](connecting-ssl-support.md)。

1. 如果连接未使用 SSL，则连接尝试可能失败。

1. 集群将向 SQL 客户端发送 `authentication` 请求。

1. 随后，SQL 客户端会向集群发送临时密码。

1. 如果密码有效且尚未到期，集群将完成连接。

# 设置 JDBC 或 ODBC 单点登录身份验证
<a name="setup-azure-ad-identity-provider"></a>

您可以利用外部身份提供者（IdP）对访问 Amazon Redshift 集群的用户进行身份验证和授权，从而简化用户管理并增强安全性。这就实现了集中式用户管理、基于角色的访问控制以及跨多个服务的审计功能。常见应用场景包括简化不同用户组的身份验证、执行一致的访问策略以及满足监管要求。

以下页面将指导您配置 IdP 与 Redshift 集群的集成。有关配置 AWS 作为 IdP 的服务提供商的更多信息，请参阅 *IAM 用户指南*中的[通过信赖方信任和添加陈述来配置 SAML 2.0 IdP](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html#saml_relying-party)。

# AD FS
<a name="setup-identity-provider-adfs"></a>

本教程将向您展示如何将 AD FS 用作身份提供者（IdP）来访问 Amazon Redshift 集群。

## 第 1 步：设置 AD FS 和您的 AWS 账户相互信任
<a name="setup-identity-provider-adfs-trust"></a>

 以下过程介绍如何建立信任关系。

1. 创建或使用现有的 Amazon Redshift 集群，以使 AD FS 用户连接到该集群。要配置连接，需要此集群的某些属性，例如集群标识符。有关更多信息，请参阅[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/create-cluster.html)。

1. 在 Microsoft 管理控制台上设置 AD FS 以控制 Amazon Redshift 访问：

   1. 选择 **ADFS 2.0**，然后选择**添加信赖方信任**。在**添加信赖方信任向导**页面上，选择**开始**。

   1. 在**选择数据源**页面上，选择**导入有关在线或在本地网络上发布的信赖方的数据**。

   1. 对于**联合元数据地址(主机名或 URL)**，请输入 **https://signin.aws.amazon.com/saml-metadata.xml**。元数据 XML 文件是将 AWS 描述为信赖方的标准 SAML 元数据文档。

   1. 在**指定显示名称**页面上，输入**显示名称**的值。

   1. 在**选择颁发授权规则**页面上，选择一个颁发授权规则以允许或拒绝所有用户访问该信赖方。

   1. 在**准备好添加信任**页面上，查看您的设置。

   1. 在**完成**页面上，选择**向导关闭时打开此信赖方信任的“编辑声明规则”对话框**。

   1. 在上下文（右键单击）菜单上，选择**信赖方信任**。

   1. 对于您的信赖方，打开上下文（右键单击）菜单，然后选择**编辑声明规则**。在**编辑声明规则**页面上，选择**添加规则**。

   1. 对于**声明规则模板**，请选择**转换传入声明**，然后在**编辑规则 - NameId** 页面上执行以下操作：
      + 对于**声明规则名称**，请输入 **NameId**。
      + 对于**传入声明名称**，请选择 **Windows 账户名**。
      + 对于**传出声明名称**，请选择**名称 ID**。
      + 对于**传出名称 ID 格式**，请选择**持久性标识符**。
      + 选择**传递所有声明值**。

   1. 在**编辑声明规则**页面上，选择**添加规则**。在**选择规则模板**页面上，对于**声明规则模板**，请选择**以声明方式发送 LDAP 特性**。

   1. 在**配置规则**页面上，执行以下操作：
      + 对于**声明规则名称**，请输入 **RoleSessionName**。
      + 对于**特性存储**，请选择 **Active Directory**。
      + 对于 **LDAP 特性**，请选择**电子邮件地址**。
      + 对于**传出声明类型**，选择 **https://aws.amazon.com/SAML/Attributes/RoleSessionName**。

   1. 在**编辑声明规则**页面上，选择**添加规则**。在**选择规则模板**页面上，对于**声明规则模板**，请选择**使用自定义规则发送声明**。

   1. 在**编辑规则 - 获取 AD 组**页面上，对于**声明规则名称**，请输入**获取 AD 组**。

   1. 对于**自定义规则**，请输入以下内容。

      ```
      c:[Type ==
                                          "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname",
                                          Issuer == "AD AUTHORITY"] => add(store = "Active Directory",
                                          types = ("http://temp/variable"), query = ";tokenGroups;{0}",
                                          param = c.Value);
      ```

   1. 在**编辑声明规则**页面上，选择**添加规则**。在**选择规则模板**页面上，对于**声明规则模板**，请选择**使用自定义规则发送声明**。

   1. 在**编辑规则 - 角色**页面上，对于**声明规则名称**，请键入**角色**。

   1. 对于**自定义规则**，请输入以下内容。

      ```
      c:[Type == "http://temp/variable", Value =~ "(?i)^AWS-"] => issue(Type = "https://aws.amazon.com/SAML/Attributes/Role", Value = RegExReplace(c.Value, "AWS-", "arn:aws:iam::123456789012:saml-provider/ADFS,arn:aws:iam::123456789012:role/ADFS-"));
      ```

      请注意 SAML 提供商的 ARN 和要担任的角色。在该示例中，`arn:aws:iam:123456789012:saml-provider/ADFS` 是 SAML 提供商的 ARN，`arn:aws:iam:123456789012:role/ADFS-` 是角色的 ARN。

1. 确保您已下载 `federationmetadata.xml` 文件。检查以确认文档内容不包含无效的字符。这是在配置与 AWS 的信任关系时使用的元数据文件。

1. 在 IAM 控制台上创建 IAM SAML 身份提供者。您提供的元数据文档是您在设置 Azure 企业应用程序时保存的联合元数据 XML 文件。有关详细步骤，请参阅《IAM 用户指南》**中的[创建和管理 IAM 身份提供者（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html#idp-manage-identityprovider-console)。

1. 在 IAM 控制台上为 SAML 2.0 联合身份创建 IAM 角色。有关详细步骤，请参阅 *IAM 用户指南*中的[创建用于 SAML 的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html#idp_saml_Create)。

1. 创建一个 IAM 策略，您可以将其附加到您在 IAM 控制台上为 SAML 2.0 联合身份验证创建的 IAM 角色。有关详细步骤，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-start)。有关 Azure AD 示例，请参阅[设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。

## 第 2 步：设置 JDBC 或 ODBC，以便向 AD FS 进行身份验证
<a name="setup-identity-provider-adfs-auth"></a>

------
#### [ JDBC ]

 以下过程介绍如何设置与 AD FS 的 JDBC 关系。
+ 将数据库客户端配置为通过 JDBC 并使用 AD FS 单点登录连接到集群。

  您可以使用任何采用 JDBC 驱动程序的客户端通过 AD FS 单点登录进行连接，也可以使用像 Java 这样的语言通过脚本进行连接。有关安装和配置信息，请参阅[为 Amazon Redshift 配置 JDBC 驱动程序版本 2.x 连接](jdbc20-install.md)。

  例如，您可以使用 SQLWorkbench/J 作为客户端。当您配置 SQLWorkbench/J 时，数据库的 URL 使用以下格式。

  ```
  jdbc:redshift:iam://cluster-identifier:us-west-1/dev
  ```

  如果您使用 SQLWorkbench/J 作为客户端，请执行以下步骤：

  1. 启动 SQL Workbench/J。在**选择连接配置文件**页面中，添加一个**配置文件组**，例如，**ADFS**。

  1. 对于**连接配置文件**，请输入您的连接配置文件名称，例如 **ADFS**。

  1. 选择**管理驱动程序**，然后选择 **Amazon Redshift**。选择**库**旁边的**打开文件夹**图标，然后选择适当的 JDBC .jar 文件。

  1. 在**选择连接配置文件**页面上，向连接配置文件添加信息，如下所示：
     + 对于**用户**，请输入您的 AD FS 用户名。这是您用于单点登录的账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。
     + 对于**密码**，请输入您的 AD FS 密码。
     + 对于**驱动程序**，请选择 **Amazon Redshift (com.amazon.redshift.jdbc.Driver)**。
     + 对于 **URL**，请输入 **jdbc:redshift:iam://*your-cluster-identifier*:*your-cluster-region*/*your-database-name***。

  1. 选择**扩展属性**。对于 **plugin\$1name**，请输入 **com.amazon.redshift.plugin.AdfsCredentialsProvider**。该值指定驱动程序将 AD FS 单点登录作为身份验证方法。

------
#### [ ODBC ]

**设置 ODBC 以在 AD FS 中进行身份验证**
+ 将数据库客户端配置为通过 ODBC 并使用 AD FS 单点登录连接到集群。

  Amazon Redshift 提供了适用于 Linux、Windows 和 macOS 操作系统的 ODBC 驱动程序。在安装 ODBC 驱动程序之前，请确定您的 SQL 客户端工具是 32 位还是 64 位。安装符合 SQL 客户端工具要求的 ODBC 驱动程序。

  在 Windows 上的 **Amazon Redshift ODBC 驱动程序 DSN 安装**页的**连接设置**下，输入以下信息：
  + 对于**数据源名称**，输入 ***your-DSN***。这将指定用作 ODBC 配置文件名称的数据源名称。
  + 对于**身份验证类型**，选择**身份提供者：SAML**。这是 ODBC 驱动程序在通过 AD FS 单点登录进行身份验证时使用的身份验证方法。
  + 对于**集群 ID**，请输入 ***your-cluster-identifier***。
  + 对于**区域**，请输入 ***your-cluster-region***。
  + 对于**数据库**，请输入 ***your-database-name***。
  + 对于**用户**，请输入 ***your-adfs-username***。这是您用于单点登录的 AD FS 账户的用户名，该账户有权访问您在尝试进行身份验证时使用的集群。请仅将其用于**身份验证类型**为**身份提供者: SAML** 的情况。
  + 对于**密码**，请输入 ***your-adfs-password***。请仅将其用于 **Auth type (身份验证类型)** 为 **Identity Provider: SAML (身份提供者: SAML)** 的情况。

  在 macOS 和 Linux 上，按如下方式编辑 `odbc.ini` 文件：
**注意**  
所有条目不区分大小写。
  + 对于 **clusterid**，请输入 ***your-cluster-identifier***。这是已创建的 Amazon Redshift 集群的名称。
  + 对于**区域**，请输入 ***your-cluster-region***。这是已创建的 Amazon Redshift 集群的 AWS 区域。
  + 对于**数据库**，请输入 ***your-database-name***。这是您尝试在 Amazon Redshift 集群上访问的数据库的名称。
  + 对于**区域设置**，请输入 **en-us**。这是显示错误消息的语言。
  + 对于 **iam**，请输入 **1**。此值指定要使用 IAM 凭证进行身份验证的驱动程序。
  + 对于 **plugin\$1name**，请执行以下操作之一：
    + 对于具有 MFA 的 AD FS 单点登录配置，请输入 **BrowserSAML**。这是 ODBC 驱动程序在 AD FS 中进行身份验证时使用的身份验证方法。
    + 对于 AD FS 单点登录配置，请输入 **ADFS**。这是 ODBC 驱动程序在通过 Azure AD 单点登录进行身份验证时使用的身份验证方法。
  + 对于 **uid**，请输入 ***your-adfs-username***。这是您用于单点登录的 Microsoft Azure 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。请仅将其用于 **plugin\$1name** 为 **ADFS** 的情况。
  + 对于**密码**，请输入 ***your-adfs-password***。请仅将其用于 **plugin\$1name** 为 **ADFS** 的情况。

  在 macOS 和 Linux 上，还要编辑配置文件设置以添加以下导出。

  ```
  export ODBCINI=/opt/amazon/redshift/Setup/odbc.ini
  ```

  ```
  export ODBCINSTINI=/opt/amazon/redshift/Setup/odbcinst.ini
  ```

------

# Azure
<a name="setup-identity-provider-azure"></a>

您可以使用 Microsoft Azure AD 作为身份提供者 (IdP) 来访问 Amazon Redshift 集群。本教程将向您展示如何将 Azure 用作身份提供者（IdP）来访问 Amazon Redshift 集群。

要了解如何通过 Microsoft Azure AD 单点登录进行联合 Amazon Redshift 访问，请观看以下视频。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/aXs9hEgJCss/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/aXs9hEgJCss)


## 第 1 步：设置 Azure 和您的 AWS 账户相互信任
<a name="setup-identity-provider-azure-trust"></a>

以下过程介绍如何建立信任关系。

**将 Azure AD 和您的 AWS 账户设置为彼此信任**

1. 创建或使用现有的 Amazon Redshift 集群，以使 Azure AD 用户连接到该集群。要配置连接，需要此集群的某些属性，例如集群标识符。有关更多信息，请参阅[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/create-cluster.html)。

1. 在 Microsoft Azure 门户上设置用于 AWS 的 Azure Active Directory、组、用户。

1. 在 Microsoft Azure 门户上添加 Amazon Redshift 以作为企业应用程序，以用于 AWS 控制台单点登录和 Amazon Redshift 联合登录。选择**企业应用程序**。

1. 选择 **\$1 新建应用程序**。将显示“添加应用程序”页面。

1. 在搜索字段中搜索 **AWS**。

1. 选择 **Amazon Web Services (AWS)**，然后选择**添加**。将会创建 AWS 应用程序。

1. 在**管理**下方，选择**单点登录**。

1. 选择 **SAML**。将显示 Amazon Web Services (AWS) \$1 基于 SAML 的登录页面。

1. 选择**是**以转到“使用 SAML 设置单点登录”页面。该页面显示预配置的单点登录相关属性的列表。

1. 对于**基本 SAML 配置**，请选择编辑图标，然后选择**保存**。

1. 在配置多个应用程序时，请提供一个标识符值。例如，输入 ***https://signin.aws.amazon.com/saml\$12***。请注意，从第二个应用程序开始，将该格式与 \$1 符号一起使用以指定唯一的 SPN 值。

1. 在**用户属性和声明**部分中，选择编辑图标。

   默认情况下，预配置了唯一用户标识符 (UID)、角色、RoleSessionName 和 SessionDuration 声明。

1. 选择 **\$1 添加新的声明**，以便为数据库用户添加声明。

   对于**名称**，请输入 **DbUser**。

   对于**命名空间**，请输入 **https://redshift.amazon.com/SAML/Attributes**。

   对于**源**，请选择**属性**。

   对于**源属性**，请选择 **user.userprincipalname**。然后，选择**保存**。

1. 选择 **\$1 添加新的声明**，以便为 AutoCreate 添加声明。

   对于**名称**，请输入 **AutoCreate**。

   对于**命名空间**，请输入 **https://redshift.amazon.com/SAML/Attributes**。

   对于**源**，请选择**属性**。

   对于**源属性**，请选择 **"true"**。然后，选择**保存**。

   此处，`123456789012` 是您的 AWS 账户，*`AzureSSO`* 是您创建的 IAM 角色，*`AzureADProvider`* 是 IAM 提供商。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/setup-identity-provider-azure.html)

1. 在**应用程序注册 > ***your-application-name*** > 身份验证** 下，添加**移动和桌面应用程序**。将 URL 指定为 http://localhost/redshift/。

1. 在 **SAML 签名证书** 部分中，选择**下载**以下载并保存联合元数据 XML 文件，以便在创建 IAM SAML 身份提供者时使用。该文件用于创建单点登录联合身份。

1. 在 IAM 控制台上创建 IAM SAML 身份提供者。您提供的元数据文档是您在设置 Azure 企业应用程序时保存的联合元数据 XML 文件。有关详细步骤，请参阅《IAM 用户指南》**中的[创建和管理 IAM 身份提供者（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html#idp-manage-identityprovider-console)。

1. 在 IAM 控制台上为 SAML 2.0 联合身份创建 IAM 角色。有关详细步骤，请参阅 *IAM 用户指南*中的[创建用于 SAML 的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html#idp_saml_Create)。

1. 创建一个 IAM 策略，您可以将其附加到您在 IAM 控制台上为 SAML 2.0 联合身份验证创建的 IAM 角色。有关详细步骤，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-start)。

   为您的环境修改以下策略（JSON 格式）：
   + 将集群的 AWS 区域替换为 `us-west-1`。
   + 将您的 AWS 账户替换为 *`123456789012`*。
   + 将您的集群标识符（或对于所有集群，则为 `*`）替换为 *`cluster-identifier`*。
   + 将您的数据库（或对于所有集群，则为 `*`）替换为 *`dev`*。
   + 将 IAM 角色的唯一标识符替换为 *`AROAJ2UCCR6DPCEXAMPLE`*。
   + 将您的租户或公司电子邮件域替换为 `example.com`。
   + 将您计划为其分配用户的数据库组替换为 *`my_dbgroup`*。

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "redshift:GetClusterCredentials",
               "Resource": [
                   "arn:aws:redshift:us-west-1:123456789012:dbname:cluster-identifier/dev",
                   "arn:aws:redshift:us-west-1:123456789012:dbuser:cluster-identifier/${redshift:DbUser}",
                   "arn:aws:redshift:us-west-1:123456789012:cluster:cluster-identifier"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:userid": "AROAJ2UCCR6DPCEXAMPLE:${redshift:DbUser}@example.com"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": "redshift:CreateClusterUser",
               "Resource": "arn:aws:redshift:us-west-1:123456789012:dbuser:cluster-identifier/${redshift:DbUser}"
           },
           {
               "Effect": "Allow",
               "Action": "redshift:JoinGroup",
               "Resource": "arn:aws:redshift:us-west-1:123456789012:dbgroup:cluster-identifier/my_dbgroup"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "redshift:DescribeClusters",
                   "iam:ListRoles"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

   此策略授予权限，如下所示：
   + 第一部分授予执行 `GetClusterCredentials` API 操作的权限，以获取指定集群的临时凭证。在此示例中，资源是 `cluster-identifier`，所在的数据库为 *`dev`*，所在的账户为 *`123456789012`*，所在的 AWS 区域为 *`us-west-1`*。`${redshift:DbUser}` 子句仅允许与在 Azure AD 中指定的 `DbUser` 值匹配的用户进行连接。
   + 条件子句会强制只有特定用户能够获得临时凭证。这些用户是由角色唯一 ID *`AROAJ2UCCR6DPCEXAMPLE`* 指定的角色下的用户，该 ID 位于您公司的电子邮件域中的电子邮件地址所标识的 IAM 账户中。有关唯一 ID 的更多信息，请参阅 *IAM 用户指南*中的[唯一 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)。

     您使用 IdP（在本例中为 Azure AD）进行的设置决定了条件子句的写入方式。如果员工的电子邮件是 `johndoe@example.com`，请首先将 `${redshift:DbUser}` 设置为与员工用户名 `johndoe` 匹配的超级用户字段。然后，要使该条件有效，请将 AWS SAML `RoleSessionName` 字段设置为与员工电子邮件 `johndoe@example.com` 匹配的超级用户字段。使用这种方法时，请考虑以下几点：
     + 如果您将 `${redshift:DbUser}` 设置为员工的电子邮件，则删除示例 JSON 中的 `@example.com` 以匹配 `RoleSessionName`。
     + 如果您只是将 `RoleSessionId` 设置为员工的用户名，则删除示例中的 `@example.com` 以匹配 `RoleSessionName`。
     + 在示例 JSON 中，`${redshift:DbUser}` 和 `RoleSessionName` 都已设置为员工电子邮件。此示例 JSON 使用 Amazon Redshift 数据库用户名以及 `@example.com` 让用户登录以访问集群。
   + 第二部分授予在指定集群中创建 `dbuser` 名称的权限。在此示例 JSON 中，它将创建限制为 `${redshift:DbUser}`。
   + 第三部分授予指定用户可以加入 `dbgroup` 的权限。在此示例 JSON 中，用户可以加入指定集群中的 `my_dbgroup` 组。
   + 第四部分授予用户可以对所有资源执行的操作的权限。在此示例 JSON 中，它允许用户调用 `redshift:DescribeClusters` 以获取集群信息，例如集群端点、AWS 区域和端口。它还允许用户调用 `iam:ListRoles` 以检查用户可以代入哪些角色。

## 第 2 步：设置 JDBC 或 ODBC，以便向 Azure 进行身份验证
<a name="setup-identity-provider-azure-auth"></a>

------
#### [ JDBC ]

**设置 JDBC 以在 Microsoft Azure AD 中进行身份验证**
+ 将数据库客户端配置为通过 JDBC 连接（使用 Azure AD 单点登录）到集群。

  您可以使用任何采用 JDBC 驱动程序的客户端通过 Azure AD 单点登录进行连接，也可以使用像 Java 这样的语言通过脚本进行连接。有关安装和配置信息，请参阅[为 Amazon Redshift 配置 JDBC 驱动程序版本 2.x 连接](jdbc20-install.md)。

  例如，您可以使用 SQLWorkbench/J 作为客户端。当您配置 SQLWorkbench/J 时，数据库的 URL 使用以下格式。

  ```
  jdbc:redshift:iam://cluster-identifier:us-west-1/dev
  ```

  如果您使用 SQLWorkbench/J 作为客户端，请执行以下步骤：

  1. 启动 SQL Workbench/J。在**选择连接配置文件**页面上，添加一个称为 **AzureAuth** 的**配置文件组**。

  1. 对于**连接配置文件**，请输入 **Azure**。

  1. 选择**管理驱动程序**，然后选择 **Amazon Redshift**。选择**库**旁边的**打开文件夹**图标，然后选择适当的 JDBC .jar 文件。

  1. 在**选择连接配置文件**页面上，向连接配置文件添加信息，如下所示：
     + 对于**用户**，请输入 Microsoft Azure 用户名。这是您用于单点登录的 Microsoft Azure 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。
     + 对于**密码**，请输入您的 Microsoft Azure 密码。
     + 对于**驱动程序**，请选择 **Amazon Redshift (com.amazon.redshift.jdbc.Driver)**。
     + 对于 **URL**，请输入 **jdbc:redshift:iam://*your-cluster-identifier*:*your-cluster-region*/*your-database-name***。

  1. 选择**扩展属性**以在连接属性中添加其他信息，如下所述。

     对于 Azure AD 单点登录配置，请添加附加信息，如下所示：
     + 对于 **plugin\$1name**，请输入 **com.amazon.redshift.plugin.AzureCredentialsProvider**。该值指定驱动程序将 Azure AD 单点登录作为身份验证方法。
     + 对于 **idp\$1tenant**，请输入 ***your-idp-tenant***。仅用于 Microsoft Azure AD。这是在 Azure AD 上为您的公司配置的租户名称。此值可以是租户名或带连字符的租户唯一 ID。
     + 对于 **client\$1secret**，请输入 ***your-azure-redshift-application-client-secret***。仅用于 Microsoft Azure AD。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端密钥。这仅适用于 com.amazon.redshift.plugin.AzureCredentialsProvider 插件。
     + 对于 **client\$1id**，请输入 ***your-azure-redshift-application-client-id***。仅用于 Microsoft Azure AD。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端 ID（带连字符）。

     对于具有 MFA 的 Azure AD 单点登录配置，请在连接属性中添加附加信息，如下所示：
     + 对于 **plugin\$1name**，请输入 **com.amazon.redshift.plugin.BrowserAzureCredentialsProvider**。此值指定驱动程序将具有 MFA 的 Azure 单点登录作为身份验证方法。
     + 对于 **idp\$1tenant**，请输入 ***your-idp-tenant***。仅用于 Microsoft Azure AD。这是在 Azure AD 上为您的公司配置的租户名称。此值可以是租户名或带连字符的租户唯一 ID。
     + 对于 **client\$1id**，请输入 ***your-azure-redshift-application-client-id***。此选项仅用于 Microsoft Azure AD。这是您在设置具有 MFA 的 Azure AD 单点登录配置时创建的 Amazon Redshift 应用程序的客户端 ID（带连字符）。
     + 对于**侦听端口**，请输入 ***your-listen-port***。这是本地服务器正在侦听的端口。默认值为 7890。
     + 对于 **idp\$1response\$1timeout**，请输入 ***the-number-of-seconds***。这是 IdP 服务器发回响应时超时之前等待的秒数。最小秒数必须为 10。如果建立连接的用时长于此阈值，则连接将被中止。

------
#### [ ODBC ]

**设置 ODBC 以在 Microsoft Azure AD 中进行身份验证**
+ 将数据库客户端配置为通过 ODBC 连接（使用 Azure AD 单点登录）到集群。

  Amazon Redshift 提供了适用于 Linux、Windows 和 macOS 操作系统的 ODBC 驱动程序。在安装 ODBC 驱动程序之前，请确定您的 SQL 客户端工具是 32 位还是 64 位。安装符合 SQL 客户端工具要求的 ODBC 驱动程序。

  在 Windows 上的 **Amazon Redshift ODBC 驱动程序 DSN 安装**页的**连接设置**下，输入以下信息：
  + 对于**数据源名称**，输入 ***your-DSN***。这将指定用作 ODBC 配置文件名称的数据源名称。
  + 对于 Azure AD 单点登录配置的**身份验证类型**，请选择 **Identity Provider: Azure AD**。这是 ODBC 驱动程序在通过 Azure 单点登录进行身份验证时使用的验证方法。
  + 对于具有 MFA 的 Azure AD 单点登录配置的**身份验证类型**，请选择 **Identity Provider: Browser Azure AD**。这是 ODBC 驱动程序在通过 Azure 单点登录（采用 MFA）进行身份验证时使用的验证方法。
  + 对于**集群 ID**，请输入 ***your-cluster-identifier***。
  + 对于**区域**，请输入 ***your-cluster-region***。
  + 对于**数据库**，请输入 ***your-database-name***。
  + 对于**用户**，请输入 ***your-azure-username***。这是您用于单点登录的 Microsoft Azure 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。请仅将其用于**身份验证类型** 为**身份提供者: Azure AD** 的情况。
  + 对于**密码**，请输入 ***your-azure-password***。请仅将其用于 **Auth Type (身份验证类型)** 为 **Identity Provider: Azure AD (身份提供者: Azure AD)** 的情况。
  + 对于 **IdP 租户**，请输入 ***your-idp-tenant***。这是在 IdP (Azure) 上配置的公司的租户名称。此值可以是租户名或带连字符的租户唯一 ID。
  + 对于 **Azure 客户端密钥**，请输入 ***your-azure-redshift-application-client-secret***。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端密钥。
  + 对于 **Azure 客户端 ID**，请输入 ***your-azure-redshift-application-client-id***。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端 ID（带连字符）。
  + 对于**侦听端口**，请输入 ***your-listen-port***。这是本地服务器正在侦听的默认侦听端口。默认值为 7890。这仅适用于浏览器 Azure AD 插件。
  + 对于**响应超时**，请输入 ***the-number-of-seconds***。这是 IdP 服务器发回响应时超时之前等待的秒数。最小秒数必须为 10。如果建立连接的用时长于此阈值，则连接将被中止。该选项仅适用于浏览器 Azure AD 插件。

  在 macOS 和 Linux 上，按如下方式编辑 `odbc.ini` 文件：
**注意**  
所有条目不区分大小写。
  + 对于 **clusterid**，请输入 ***your-cluster-identifier***。这是已创建的 Amazon Redshift 集群的名称。
  + 对于**区域**，请输入 ***your-cluster-region***。这是已创建的 Amazon Redshift 集群的 AWS 区域。
  + 对于**数据库**，请输入 ***your-database-name***。这是您尝试在 Amazon Redshift 集群上访问的数据库的名称。
  + 对于**区域设置**，请输入 **en-us**。这是显示错误消息的语言。
  + 对于 **iam**，请输入 **1**。此值指定要使用 IAM 凭证进行身份验证的驱动程序。
  + 对于 Azure AD 单点登录配置的 **plugin\$1name**，请输入 **AzureAD**。这指定驱动程序使用 Azure 单点登录作为身份验证方法。
  + 对于具有 MFA 的 Azure AD 单点登录配置的 **plugin\$1name**，请输入 **BrowserAzureAD**。这指定驱动程序将 Azure 单点登录（采用 MFA）作为身份验证方法。
  + 对于 **uid**，请输入 ***your-azure-username***。这是您用于单点登录的 Microsoft Azure 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。请仅将其用于 **plugin\$1name** 为 **AzureAD** 的情况。
  + 对于**密码**，请输入 ***your-azure-password***。请仅将其用于 **plugin\$1name** 为 **AzureAD** 的情况。
  + 对于 **idp\$1tenant**，请输入 ***your-idp-tenant***。这是在 IdP (Azure) 上配置的公司的租户名称。此值可以是租户名或带连字符的租户唯一 ID。
  + 对于 **client\$1secret**，请输入 ***your-azure-redshift-application-client-secret***。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端密钥。
  + 对于 **client\$1id**，请输入 ***your-azure-redshift-application-client-id***。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端 ID（带连字符）。
  + 对于**侦听端口**，请输入 ***your-listen-port***。这是本地服务器正在侦听的端口。默认值为 7890。这适用于浏览器 Azure AD 插件。
  + 对于 **idp\$1response\$1timeout**，请输入 ***the-number-of-seconds***。这是等待 Azure 响应的指定时间段（以秒为单位）。此选项适用于浏览器 Azure AD 插件。

  在 macOS 和 Linux 上，还要编辑配置文件设置以添加以下导出。

  ```
  export ODBCINI=/opt/amazon/redshift/Setup/odbc.ini
  ```

  ```
  export ODBCINSTINI=/opt/amazon/redshift/Setup/odbcinst.ini
  ```

------

## 问题排查
<a name="setup-identity-provider-azure-auth"></a>

要解决浏览器 Azure AD 插件的问题，请考虑以下几点。
+ 要使用浏览器 Azure AD 插件，在请求中指定的回复 URL 必须与为应用程序配置的回复 URL 一致。导航到 Microsoft Azure 门户上的**使用 SAML 设置单点登录**页面。然后检查**回复 URL** 是否已设置为 http://localhost/redshift/。
+ 如果收到 IdP 租户错误，请验证 **IdP 租户**名称是否与最初在 Microsoft Azure 中设置 Active Directory 时所用的域名匹配。

  在 Windows 上，导航到 **Amazon Redshift ODBC DSN 设置**页面的**连接设置**部分。然后检查在 IdP (Azure) 上配置的公司租户名称是否与最初在 Microsoft Azure 中设置 Active Directory 时所用的域名匹配。

  在 macOS 和 Linux 上，找到 *odbc.ini* 文件。然后检查在 IdP (Azure) 上配置的公司租户名称是否与最初在 Microsoft Azure 中设置 Active Directory 时所用的域名匹配。
+ 如果收到请求中指定的回复 URL 与为应用程序配置的回复 URL 不一致的错误，请验证**重定向 URI** 是否与回复 URL 相同。

  在 Microsoft Azure 门户上，导航到您的应用程序的**应用程序注册**页面。然后检查重定向 URI 是否与回复 URL 一致。
+ 如果收到“未经授权错误”意外响应，请验证是否已完成**移动和桌面应用程序**配置。

  在 Microsoft Azure 门户上，导航到您的应用程序的**应用程序注册**页面。然后导航到**身份验证**，检查是否已将**移动和桌面应用程序**配置为使用 http://localhost/redshift/ 作为重定向 URI。

# Ping Identity
<a name="setup-identity-provider-ping"></a>

您可以将 Ping Identity 作为身份提供者 (IdP) 以访问 Amazon Redshift 集群。本教程将向您展示如何将 Ping Identity 用作身份提供者（IdP）来访问 Amazon Redshift 集群。

## 第 1 步：设置 Ping Identity 和您的 AWS 账户相互信任
<a name="setup-identity-provider-ping-trust"></a>

以下过程介绍如何使用 PingOne 门户建立信任关系。

**将 Ping 身份和您的 AWS 账户设置为相互信任**

1. 创建或使用现有的 Amazon Redshift 集群，以使 Ping 身份用户连接到该集群。要配置连接，需要此集群的某些属性，例如集群标识符。有关更多信息，请参阅[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/create-cluster.html)。

1. 在 PingOne 门户上添加 Amazon Redshift 以作为新的 SAML 应用程序。有关详细步骤，请参阅 [Ping Identity 文档](https://docs.pingidentity.com/)。

   1. 转到**我的应用程序**。

   1. 在**添加应用程序**下面，选择**新建 SAML 应用程序**。

   1. 对于**应用程序名称**，请输入 **Amazon Redshift**。

   1. 对于**协议版本**，请选择 **SAML v2.0**。

   1. 对于**类别**，请选择 ***your-application-category***。

   1. 对于**断言消费者服务(ACS)**，请键入 ***your-redshift-local-host-url***。这是 SAML 断言重定向到的本地主机和端口。

   1. 对于**实体 ID**，请输入 `urn:amazon:webservices`。

   1. 对于**签名**，请选择**签名断言**。

   1. 在 **SSO 属性映射**部分中，创建声明，如下表中所示。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/setup-identity-provider-ping.html)

1. 对于**组访问权限**，请设置以下组访问权限（如果需要）：
   + **https://aws.amazon.com/SAML/Attributes/Role**
   + **https://aws.amazon.com/SAML/Attributes/RoleSessionName**
   + **https://redshift.amazon.com/SAML/Attributes/AutoCreate**
   + **https://redshift.amazon.com/SAML/Attributes/DbUser**

1. 查看设置，并在必要时进行更改。

1. 将**启动单点登录(SSO) URL** 作为浏览器 SAML 插件的登录 URL。

1. 在 IAM 控制台上创建 IAM SAML 身份提供者。您提供的元数据文档是您在设置 Ping Identity 时保存的联合元数据 XML 文件。有关详细步骤，请参阅 *IAM 用户指南*中的[创建和管理 IAM 身份提供者（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html#idp-manage-identityprovider-console)。

1. 在 IAM 控制台上为 SAML 2.0 联合身份创建 IAM 角色。有关详细步骤，请参阅 *IAM 用户指南*中的[创建用于 SAML 的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html#idp_saml_Create)。

1. 创建一个 IAM 策略，您可以将其附加到您在 IAM 控制台上为 SAML 2.0 联合身份验证创建的 IAM 角色。有关详细步骤，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-start)。有关 Azure AD 示例，请参阅[设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。

## 第 2 步：设置 JDBC 或 ODBC，以便向 Ping Identity 进行身份验证
<a name="setup-identity-provider-ping-auth"></a>

------
#### [ JDBC ]

**设置 JDBC 以在 Ping Identity 中进行身份验证**
+ 配置数据库客户端以使用 Ping Identity 单点登录通过 JDBC 连接到集群。

  您可以使用任何采用 JDBC 驱动程序的客户端通过 Ping Identity 单点登录进行连接，也可以使用像 Java 这样的语言通过脚本进行连接。有关安装和配置信息，请参阅[为 Amazon Redshift 配置 JDBC 驱动程序版本 2.x 连接](jdbc20-install.md)。

  例如，您可以使用 SQLWorkbench/J 作为客户端。当您配置 SQLWorkbench/J 时，数据库的 URL 使用以下格式。

  ```
  jdbc:redshift:iam://cluster-identifier:us-west-1/dev
  ```

  如果您使用 SQLWorkbench/J 作为客户端，请执行以下步骤：

  1. 启动 SQL Workbench/J。在**选择连接配置文件**页面中，添加一个**配置文件组**，例如，**Ping**。

  1. 对于**连接配置文件**，请输入 ***your-connection-profile-name***，例如，**Ping**。

  1. 选择**管理驱动程序**，然后选择 **Amazon Redshift**。选择**库**旁边的**打开文件夹**图标，然后选择适当的 JDBC .jar 文件。

  1. 在**选择连接配置文件**页面上，向连接配置文件添加信息，如下所示：
     + 对于**用户**，请输入您的 PingOne 用户名。这是您用于单点登录的 PingOne 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。
     + 对于**密码**，请输入您的 PingOne 密码。
     + 对于**驱动程序**，请选择 **Amazon Redshift (com.amazon.redshift.jdbc.Driver)**。
     + 对于 **URL**，请输入 **jdbc:redshift:iam://*your-cluster-identifier*:*your-cluster-region*/*your-database-name***。

  1. 选择**扩展属性**并执行以下操作之一：
     + 对于 **login\$1url**，请输入 ***your-ping-sso-login-url***。该值指定 URL 将单点登录用作登录时的身份验证方法。
     + 对于 Ping Identity，请为 **plugin\$1name** 输入 **com.amazon.redshift.plugin.PingCredentialsProvider**。此值指定驱动程序使用 Ping Identity 单点登录作为身份验证方法。
     + 对于具有单点登录的 Ping Identity，请为 **plugin\$1name** 输入 **com.amazon.redshift.plugin.BrowserSamlCredentialsProvider**。该值指定驱动程序将具有单点登录的 Ping Identity PingOne 用作身份验证方法。

------
#### [ ODBC ]

**设置 ODBC 以在 Ping Identity 中进行身份验证**
+ 配置数据库客户端以使用 Ping Identity PingOne 单点登录通过 ODBC 连接到集群。

  Amazon Redshift 提供了适用于 Linux、Windows 和 macOS 操作系统的 ODBC 驱动程序。在安装 ODBC 驱动程序之前，请确定您的 SQL 客户端工具是 32 位还是 64 位。安装符合 SQL 客户端工具要求的 ODBC 驱动程序。

  在 Windows 上的 **Amazon Redshift ODBC 驱动程序 DSN 安装**页的**连接设置**下，输入以下信息：
  + 对于**数据源名称**，输入 ***your-DSN***。这将指定用作 ODBC 配置文件名称的数据源名称。
  + 对于**身份验证类型**，请执行以下操作之一：
    + 对于 Ping Identity 配置，请选择**身份提供者：Ping Federate**。这是 ODBC 驱动程序在通过 Ping Identity 单点登录进行身份验证时使用的身份验证方法。
    + 对于具有单点登录的 Ping Identity 配置，请选择**身份提供者：浏览器 SAML**。这是 ODBC 驱动程序在使用具有单点登录的 Ping Identity 进行身份验证时使用的身份验证方法。
  + 对于**集群 ID**，请输入 ***your-cluster-identifier***。
  + 对于**区域**，请输入 ***your-cluster-region***。
  + 对于**数据库**，请输入 ***your-database-name***。
  + 对于**用户**，请输入 ***your-ping-username***。这是您用于单点登录的 PingOne 账户的用户名，该账户有权访问您在尝试进行身份验证时使用的集群。请仅将其用于**身份验证类型**为**身份提供者: PingFederate**的情况。
  + 对于**密码**，请输入 ***your-ping-password***。请仅将其用于 **Auth type (身份验证类型)** 为 **Identity Provider: PingFederate (身份提供者: PingFederate)** 的情况。
  + 对于**侦听端口**，请输入 ***your-listen-port***。这是本地服务器正在侦听的端口。默认值为 7890。这仅适用于浏览器 SAML 插件。
  +  对于**响应超时**，请输入 ***the-number-of-seconds***。这是 IdP 服务器发回响应时超时之前等待的秒数。最小秒数必须为 10。如果建立连接的用时长于此阈值，则连接将被中止。这仅适用于浏览器 SAML 插件。
  + 对于**登录 URL**，请输入 ***your-login-url***。这仅适用于浏览器 SAML 插件。

  在 macOS 和 Linux 上，按如下方式编辑 `odbc.ini` 文件：
**注意**  
所有条目不区分大小写。
  + 对于 **clusterid**，请输入 ***your-cluster-identifier***。这是已创建的 Amazon Redshift 集群的名称。
  + 对于**区域**，请输入 ***your-cluster-region***。这是已创建的 Amazon Redshift 集群的 AWS 区域。
  + 对于**数据库**，请输入 ***your-database-name***。这是您尝试在 Amazon Redshift 集群上访问的数据库的名称。
  + 对于**区域设置**，请输入 **en-us**。这是显示错误消息的语言。
  + 对于 **iam**，请输入 **1**。此值指定要使用 IAM 凭证进行身份验证的驱动程序。
  + 对于 **plugin\$1name**，请执行以下操作之一：
    + 对于 Ping Identity 配置，请输入 **BrowserSAML**。这是 ODBC 驱动程序在使用 Ping Identity 进行身份验证时所采用的身份验证方法。
    + 对于具有单点登录的 Ping Identity 配置，请输入 **Ping**。这是 ODBC 驱动程序在使用具有单点登录的 Ping Identity 进行身份验证时使用的身份验证方法。
  + 对于 **uid**，请输入 ***your-ping-username***。这是您用于单点登录的 Microsoft Azure 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。请仅将其用于 **plugin\$1name** 为 **Ping** 的情况。
  + 对于**密码**，请输入 ***your-ping-password***。请仅将其用于 **plugin\$1name** 为 **Ping** 的情况。
  + 对于 **login\$1url**，请输入 ***your-login-url***。这是返回 SAML 响应的启动单点登录 URL。这仅适用于浏览器 SAML 插件。
  + 对于 **idp\$1response\$1timeout**，请输入 ***the-number-of-seconds***。这是等待 PingOne Identity 响应的指定时间段（以秒为单位）。这仅适用于浏览器 SAML 插件。
  + 对于**侦听端口**，请输入 ***your-listen-port***。这是本地服务器正在侦听的端口。默认值为 7890。这仅适用于浏览器 SAML 插件。

  在 macOS 和 Linux 上，还要编辑配置文件设置以添加以下导出。

  ```
  export ODBCINI=/opt/amazon/redshift/Setup/odbc.ini
  ```

  ```
  export ODBCINSTINI=/opt/amazon/redshift/Setup/odbcinst.ini
  ```

------

# Okta
<a name="setup-identity-provider-okta"></a>

您可以将 Okta 作为身份提供者 (IdP) 以访问 Amazon Redshift 集群。本教程将向您展示如何将 Okta 用作身份提供者（IdP）来访问 Amazon Redshift 集群。

## 第 1 步：设置 Okta 和您的 AWS 账户相互信任
<a name="setup-identity-provider-okta-trust"></a>

以下过程介绍如何建立信任关系。

**将 Okta 和您的 AWS 账户设置为相互信任**

1. 创建或使用现有的 Amazon Redshift 集群，以使 Okta 用户连接到该集群。要配置连接，需要此集群的某些属性，例如集群标识符。有关更多信息，请参阅[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/create-cluster.html)。

1. 在 Okta 门户上添加 Amazon Redshift 以作为新应用程序。有关详细步骤，请参阅 [Okta 文档](https://developer.okta.com/docs/)。
   + 选择**添加应用程序**。
   + 在**添加应用程序**下面，选择**创建新的应用程序**。
   + 在**创建新添加应用程序集成**页面上，为**平台** 选择 **Web**。
   + 对于**登录方法**，请选择 **SAML v2.0**。
   + 在**常规设置**页面上，为**应用程序名称** 输入 ***your-redshift-saml-sso-name***。这是您的应用程序的名称。
   + 在 **SAML 设置**页面上，为**单点登录 URL** 输入 ***your-redshift-local-host-url***。这是 SAML 断言重定向到的本地主机和端口，例如 `http://localhost:7890/redshift/`。

1. 将**单点登录 URL** 作为**收件人 URL** 和**目标 URL**。

1. 对于**签名**，请选择**签名断言**。

1. 对于**受众 URI (SP 实体 ID)**，为声明输入 **urn:amazon:webservices**，如下表中所示。

1.  在**高级设置**部分中，为 **SAML 颁发者 ID** 输入 ***your-Identity-Provider-Issuer-ID***，您可以在**查看设置说明**部分中找到该 ID。

1. 在**属性语句**部分中，创建声明，如下表中所示。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/setup-identity-provider-okta.html)

1. 在**应用程序嵌入式链接**部分中，找到可用作浏览器 SAML 插件登录 URL 的 URL。

1. 在 IAM 控制台上创建 IAM SAML 身份提供者。您提供的元数据文档是您在设置 Okta 时保存的联合元数据 XML 文件。有关详细步骤，请参阅 *IAM 用户指南*中的[创建和管理 IAM 身份提供者（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html#idp-manage-identityprovider-console)。

1. 在 IAM 控制台上为 SAML 2.0 联合身份创建 IAM 角色。有关详细步骤，请参阅 *IAM 用户指南*中的[创建用于 SAML 的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html#idp_saml_Create)。

1. 创建一个 IAM 策略，您可以将其附加到您在 IAM 控制台上为 SAML 2.0 联合身份验证创建的 IAM 角色。有关详细步骤，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-start)。有关 Azure AD 示例，请参阅[设置 JDBC 或 ODBC 单点登录身份验证](setup-azure-ad-identity-provider.md)。

## 第 2 步：设置 JDBC 或 ODBC，以便向 Okta 进行身份验证
<a name="setup-identity-provider-okta-auth"></a>

------
#### [ JDBC ]

**设置 JDBC 以在 Okta 中进行身份验证**
+ 将数据库客户端配置为通过 JDBC 并使用 Okta 单点登录连接到集群。

  您可以使用任何采用 JDBC 驱动程序的客户端通过 Okta 单点登录进行连接，也可以使用像 Java 这样的语言通过脚本进行连接。有关安装和配置信息，请参阅[为 Amazon Redshift 配置 JDBC 驱动程序版本 2.x 连接](jdbc20-install.md)。

  例如，您可以使用 SQLWorkbench/J 作为客户端。当您配置 SQLWorkbench/J 时，数据库的 URL 使用以下格式。

  ```
  jdbc:redshift:iam://cluster-identifier:us-west-1/dev
  ```

  如果您使用 SQLWorkbench/J 作为客户端，请执行以下步骤：

  1. 启动 SQL Workbench/J。在**选择连接配置文件**页面中，添加一个**配置文件组**，例如，**Okta**。

  1. 对于**连接配置文件**，请输入 ***your-connection-profile-name***，例如，**Okta**。

  1. 选择**管理驱动程序**，然后选择 **Amazon Redshift**。选择**库**旁边的**打开文件夹**图标，然后选择适当的 JDBC .jar 文件。

  1. 在**选择连接配置文件**页面上，向连接配置文件添加信息，如下所示：
     + 对于**用户**，请输入您的 Okta 用户名。这是您用于单点登录的 Okta 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。
     + 对于**密码**，请输入您的 Okta 密码。
     + 对于**驱动程序**，请选择 **Amazon Redshift (com.amazon.redshift.jdbc.Driver)**。
     + 对于 **URL**，请输入 **jdbc:redshift:iam://*your-cluster-identifier*:*your-cluster-region*/*your-database-name***。

  1. 选择**扩展属性**并执行以下操作之一：
     + 对于 **login\$1url**，请输入 ***your-okta-sso-login-url***。该值指定 URL 将单点登录作为身份验证方法以登录到 Okta。
     + 对于 Okta 单点登录，请为 **plugin\$1name** 输入 **com.amazon.redshift.plugin.OktaCredentialsProvider**。此值指定驱动程序使用 Okta 单点登录作为身份验证方法。
     + 对于具有 MFA 的 Okta 单点登录，请为 **plugin\$1name** 输入 **com.amazon.redshift.plugin.BrowserSamlCredentialsProvider**。此值指定驱动程序将具有 MFA 的 Okta 单点登录作为身份验证方法。

------
#### [ ODBC ]

**设置 ODBC 以在 Okta 中进行身份验证**
+ 将数据库客户端配置为通过 ODBC 并使用 Okta 单点登录连接到集群。

  Amazon Redshift 提供了适用于 Linux、Windows 和 macOS 操作系统的 ODBC 驱动程序。在安装 ODBC 驱动程序之前，请确定您的 SQL 客户端工具是 32 位还是 64 位。安装符合 SQL 客户端工具要求的 ODBC 驱动程序。

  在 Windows 上的 **Amazon Redshift ODBC 驱动程序 DSN 安装**页的**连接设置**下，输入以下信息：
  + 对于**数据源名称**，输入 ***your-DSN***。这将指定用作 ODBC 配置文件名称的数据源名称。
  + 对于**身份验证类型**，请执行以下操作之一：
    + 对于 Okta 单点登录配置，请选择 **Identity Provider: Okta**。这是 ODBC 驱动程序在通过 Okta 单点登录进行身份验证时使用的身份验证方法。
    + 对于具有 MFA 的 Okta 单点登录配置，请选择 **Identity Provider: Browser SAML**。这是 ODBC 驱动程序在通过具有 MFA 的 Okta 单点登录进行身份验证时使用的身份验证方法。
  + 对于**集群 ID**，请输入 ***your-cluster-identifier***。
  + 对于**区域**，请输入 ***your-cluster-region***。
  + 对于**数据库**，请输入 ***your-database-name***。
  + 对于**用户**，请输入 ***your-okta-username***。这是您用于单点登录的 Okta 账户的用户名，该账户有权访问您在尝试进行身份验证时使用的集群。请仅将其用于**身份验证类型**为**身份提供者: Okta** 的情况。
  + 对于**密码**，请输入 ***your-okta-password***。请仅将其用于 **Auth type (身份验证类型)** 为 **Identity Provider: Okta (身份提供者: Okta)** 的情况。

  在 macOS 和 Linux 上，按如下方式编辑 `odbc.ini` 文件：
**注意**  
所有条目不区分大小写。
  + 对于 **clusterid**，请输入 ***your-cluster-identifier***。这是已创建的 Amazon Redshift 集群的名称。
  + 对于**区域**，请输入 ***your-cluster-region***。这是已创建的 Amazon Redshift 集群的 AWS 区域。
  + 对于**数据库**，请输入 ***your-database-name***。这是您尝试在 Amazon Redshift 集群上访问的数据库的名称。
  + 对于**区域设置**，请输入 **en-us**。这是显示错误消息的语言。
  + 对于 **iam**，请输入 **1**。此值指定要使用 IAM 凭证进行身份验证的驱动程序。
  + 对于 **plugin\$1name**，请执行以下操作之一：
    + 对于具有 MFA 的 Okta 单点登录配置，请输入 **BrowserSAML**。这是 ODBC 驱动程序在通过具有 MFA 的 Okta 单点登录进行身份验证时使用的身份验证方法。
    + 对于 Okta 单点登录配置，请输入 **Okta**。这是 ODBC 驱动程序在通过 Okta 单点登录进行身份验证时使用的身份验证方法。
  + 对于 **uid**，请输入 ***your-okta-username***。这是您用于单点登录的 Okta 账户的用户名，该账户有权访问您在尝试进行身份验证时使用的集群。请仅将其用于 **plugin\$1name** 为 **Okta** 的情况。
  + 对于**密码**，请输入 ***your-okta-password***。请仅将其用于 **plugin\$1name** 为 **Okta** 的情况。
  + 对于 **login\$1url**，请输入 ***your-login-url***。这是返回 SAML 响应的启动单点登录 URL。这仅适用于浏览器 SAML 插件。
  + 对于 **idp\$1response\$1timeout**，请输入 ***the-number-of-seconds***。这是等待 PingOne 响应的指定时间段（以秒为单位）。这仅适用于浏览器 SAML 插件。
  + 对于**侦听端口**，请输入 ***your-listen-port***。这是本地服务器正在侦听的端口。默认值为 7890。这仅适用于浏览器 SAML 插件。

  在 macOS 和 Linux 上，还要编辑配置文件设置以添加以下导出。

  ```
  export ODBCINI=/opt/amazon/redshift/Setup/odbc.ini
  ```

  ```
  export ODBCINSTINI=/opt/amazon/redshift/Setup/odbcinst.ini
  ```

------

# 授权 Amazon Redshift 代表您访问 AWS 服务
<a name="authorizing-redshift-service"></a>

某些 Amazon Redshift 功能要求 Amazon Redshift 代表您访问其他 AWS 服务。例如，[COPY](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html) 和 [UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html) 命令可使用 Simple Storage Service（Amazon S3）存储桶将数据加载或卸载到您的 Amazon Redshift 集群中。[CREATE EXTERNAL FUNCTION](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html) 命令可以使用标量 Lambda 用户定义的函数 (UDF) 调用 AWS Lambda 函数。Amazon Redshift Spectrum 可以在 Amazon Athena 或 AWS Glue 中使用数据目录。要让您的 Amazon Redshift 集群代表您执行操作，请为这些集群提供安全凭证。提供安全凭证的首选方法是指定一个 AWS Identity and Access Management (IAM) 角色。对于 COPY 和 UNLOAD，您可以提供临时凭证。

如果用户需要在 AWS 管理控制台之外与 AWS 交互，则需要编程式访问权限。授予编程式访问权限的方法取决于访问 AWS 的用户类型。

要向用户授予编程式访问权限，请选择以下选项之一。


****  

| 哪个用户需要编程式访问权限？ | 目的 | 方式 | 
| --- | --- | --- | 
| IAM | （推荐）使用控制台凭证作为临时凭证来签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/authorizing-redshift-service.html)  | 
|  人力身份 （在 IAM Identity Center 中管理的用户）  | 使用临时凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/authorizing-redshift-service.html)  | 
| IAM | 使用临时凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 | 按照《IAM 用户指南》中[将临时凭证用于 AWS 资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)中的说明进行操作。 | 
| IAM | （不推荐使用）使用长期凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/authorizing-redshift-service.html)  | 

接下来，了解如何创建具有访问其他 AWS 服务的适当权限的 IAM 角色。当您执行 Amazon Redshift 命令时，还需要将该角色与您的集群关联并指定角色的 Amazon Resource Name (ARN)。有关更多信息，请参阅 [使用 IAM 角色授权 COPY、UNLOAD、CREATE EXTERNAL FUNCTION 和 CREATE EXTERNAL SCHEMA 操作使用 IAM 角色授权执行操作](copy-unload-iam-role.md)。

此外，超级用户还可以向特定用户和组授予 ASSUMEROLE 权限，以便为 COPY 和 UNLOAD 操作提供对角色的访问权限。有关更多信息，请参阅 *Amazon Redshift 数据库开发人员指南*中的 [GRANT](https://docs.aws.amazon.com/redshift/latest/dg/r_GRANT.html)。

## 创建 IAM 角色以允许 Amazon Redshift 集群访问 AWS 服务


## 创建具有权限的 IAM 角色
<a name="authorizing-redshift-service-creating-an-iam-role"></a>

要创建 IAM 角色以允许您的 Amazon Redshift 集群代表您与其他 AWS 服务通信，请执行以下步骤。本节中使用的值是示例，您可以根据需要选择值。<a name="create-iam-role-for-aws-services"></a>

**要创建 IAM 角色以允许 Amazon Redshift 访问 AWS 服务**

1. 打开 [IAM 控制台](https://console.aws.amazon.com/iam/home?#home)。

1. 在导航窗格中，选择**角色**。

1. 选择 **Create role**（创建角色）。

1. 选择 **AWS 服务**，然后选择 **Redshift**。

1. 在 **Select your use case** 下，选择 **Redshift - Customizable**，然后选择 **Next: Permissions**。此时显示 **Attach permissions policy** 页面。

1. 对于使用 COPY 访问 Simple Storage Service（Amazon S3），作为示例，您可以使用 **AmazonS3ReadOnlyAccess** 并附加。要使用 COPY 或 UNLOAD 访问 Simple Storage Service（Amazon S3），我们建议您创建托管式策略，以相应地限制对所需存储桶和前缀的访问。对于读取和写入操作，我们建议强制执行最低权限，并仅限于 Amazon Redshift 要求的 Simple Storage Service（Amazon S3）存储桶和键前缀。

   要想为 CREATE EXTERNAL FUNCTION 命令调用 Lambda 函数，请添加 **AWSLambdaRole**。

   对于 Redshift Spectrum，除 Simple Storage Service（Amazon S3）访问以外，添加 **AWSGlueConsoleFullAccess** 或 **AmazonAthenaFullAccess**。

   选择 **下一步：标签**。

1. 此时将显示**添加标签**页面。您可以选择性地添加标签。选择**下一步：审核**。

1. 对于**角色名称**，键入一个角色名称，例如 **RedshiftCopyUnload**。选择****创建角色****。

1. 使用新角色的集群中的所有用户都可使用该角色。如需限制访问，只允许特定集群中的特定用户、或特定区域中的集群访问，请编辑该角色的信任关系。有关更多信息，请参阅 [限制对 IAM 角色的访问](authorizing-redshift-service-database-users.md)。

1. 将角色与您的集群关联。您可以在创建集群时关联 IAM 角色，或将角色添加到现有集群中。有关更多信息，请参阅 [将 IAM 角色与集群相关联](copy-unload-iam-role-associating-with-clusters.md)。
**注意**  
要限制对特定数据的访问，请使用授予所需最少权限的 IAM 角色。

# 限制对 IAM 角色的访问
<a name="authorizing-redshift-service-database-users"></a>

预设情况下，对 Amazon Redshift 集群可用的 IAM 角色对集群上的所有用户都可用。您可选择将 IAM 角色限制为特定集群上的特定 Amazon Redshift 数据库用户，或限制为特定区域。

要仅允许特定数据库用户使用 IAM 角色，请执行以下步骤。<a name="identify-db-users-for-iam-role"></a>

**标识对 IAM 角色具有访问权限的特定数据库用户**

1. 标识您的 Amazon Redshift 集群中的数据库用户的 Amazon Resource Name (ARN)。数据库用户的 ARN 采用以下格式：`arn:aws:redshift:region:account-id:dbuser:cluster-name/user-name`。

   对于 Amazon Redshift Serverless，请使用以下 ARN 格式：`arn:aws:redshift:region:account-id:dbuser:serverless-account-id-workgroup-id/user-name`。

1. 打开 [IAM 控制台](https://console.aws.amazon.com/iam/home?#home)。

1. 在导航窗格中，选择**角色**。

1. 选择要限制到特定 Amazon Redshift 数据库用户的 IAM 角色。

1. 选择 **Trust Relationships** 选项卡，然后选择 **Edit Trust Relationship**。允许 Amazon Redshift 代表您访问其他 AWS 服务的新 IAM 角色具有以下信任关系：

------
#### [ JSON ]

****  

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

------

1. 向信任关系的 `sts:AssumeRole` 操作部分添加一个条件以将 `sts:ExternalId` 字段限制为您指定的值。为您要授予对 IAM 角色的访问权限的每个数据库用户包含一个 ARN。外部 ID 可以是任何唯一的字符串。

   例如，以下信任关系指定只有区域 `user1` 中的集群 `user2` 上的数据库用户 `my-cluster` 和 `us-west-2` 有权使用此 IAM 角色。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
     {
       "Effect": "Allow",
       "Principal": { 
         "Service": "redshift.amazonaws.com" 
       },
       "Action": "sts:AssumeRole",
       "Condition": {
         "StringEquals": {
           "sts:ExternalId": [
             "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user1",
             "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user2"
           ]
         }
       }
     }]
   }
   ```

------

1. 选择 **Update Trust Policy**。

# 将 IAM 角色限制为某个 AWS 区域
<a name="authorizing-redshift-service-regions"></a>

您可将 IAM 角色限制为仅在某个特定 AWS 区域中可访问。预设情况下，Amazon Redshift 的 IAM 角色不会限制到任何单一区域。

要按区域限制对 IAM 角色的使用，请执行以下步骤。<a name="identify-regionsfor-iam-role"></a>

**为 IAM 角色标识允许的区域**

1. 通过以下网址打开 [IAM 控制台](https://console.aws.amazon.com/iam/home?#home)：[https://console.aws.amazon.com/](https://console.aws.amazon.com/)。

1. 在导航窗格中，选择 **Roles**（角色）。

1. 选择要用特定区域修改的角色。

1. 选择 **Trust Relationships (信任关系)** 选项卡，然后选择 **Edit Trust Relationship (编辑信任关系)**。允许 Amazon Redshift 代表您访问其他 AWS 服务的新 IAM 角色具有以下信任关系：

------
#### [ JSON ]

****  

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

------

1. 使用您要允许对其使用角色的特定区域的列表修改 `Service` 的 `Principal` 列表。`Service` 列表中的每个区域都必须采用以下格式：`redshift.region.amazonaws.com`。

   例如，以下编辑过的信任关系仅允许在 `us-east-1` 和 `us-west-2` 区域中使用 IAM 角色。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": [
             "redshift.us-east-1.amazonaws.com",
             "redshift.us-west-2.amazonaws.com"
           ]
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

1. 选择 **Update Trust Policy**

# 在 Amazon Redshift 中串联 IAM 角色
<a name="authorizing-redshift-service-chaining-roles"></a>

当您将角色附加到集群时，集群可以代入该角色以您的名义访问 Simple Storage Service（Amazon S3）、Amazon Athena、AWS Glue 和 AWS Lambda。如果附加到集群的角色无法访问必要的资源，则可以串联到另一个角色 (可能属于其他账户)。然后，您的集群临时代入串联的角色来访问数据。您还可以通过串联角色来授予跨账户访问权限。链中的每个角色都会代入链中的下一个角色，直到集群承担位于链尾的角色。您可以关联的最大 IAM 角色数量受配额限制。有关更多信息，请参阅 [Amazon Redshift 对象的配额](amazon-redshift-limits.md#amazon-redshift-limits-quota)中的“Amazon Redshift 用于访问其他 AWS 服务的集群 IAM 角色”。

**注意**  
您必须指定 IAM 角色才能使链正常运行。

例如，假设公司 A 想要访问属于公司 B 的 Simple Storage Service（Amazon S3）存储桶中的数据。公司 A 为 Amazon Redshift 创建一个名为 `RoleA` 的 AWS 服务角色并将其附加到集群上。公司 B 创建一个名为 `RoleB` 的角色，该角色有权访问公司 B 存储桶中的数据。要访问公司 B 存储桶中的数据，公司 A 需要使用串联 `iam_role` 和 `RoleA` 的 `RoleB` 参数运行 COPY 命令。在 COPY 操作的持续时间内，`RoleA` 将临时代入 `RoleB` 以访问 Simple Storage Service（Amazon S3）存储桶。

要串联角色，您可以在角色之间建立信任关系。代入其他角色的角色 (例如，`RoleA`) 必须具有允许其代入下一个串联的角色 (例如，`RoleB`) 的权限策略。反过来，传递权限的角色 (`RoleB`) 必须具有允许其将权限传递给上一个串联的角色 (`RoleA`) 的信任策略。有关更多信息，请参阅 IAM 用户指南中的[使用 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)。

链中的第一个角色必须是附加到集群的角色。第一个角色以及代入链中下一个角色的每个后续角色都必须具有包含特定语句的策略。该语句对 `Allow`操作以及 `sts:AssumeRole ` 元素中的下一个角色的 Amazon Resource Name (ARN) 具有 `Resource` 效果。在我们的示例中，`RoleA` 具有允许其代入由 AWS 账户 `210987654321` 所有的 `RoleB` 的以下权限策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Stmt1487639602000",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::111122223333:role/RoleB"        
       }
    ]
}
```

------

传递给其他角色的角色必须与代入该角色的角色或拥有该角色的 AWS 账户建立信任关系。在我们的示例中，`RoleB` 具有与 `RoleA` 建立信任关系的以下信任策略。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/RoleA"
      }
    }
  ]
}
```

------

以下信任策略与 `RoleA`、AWS 账户 `123456789012` 的拥有者建立信任关系。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      }
    }      
  ]
}
```

------

**注意**  
要将角色串联授权限制给特定用户，请定义条件。有关更多信息，请参阅 [限制对 IAM 角色的访问](authorizing-redshift-service-database-users.md)。

当您运行 UNLOAD、COPY、CREATE EXTERNAL FUNCTION 或 CREATE EXTERNAL SCHEMA 命令时，可以通过在 `iam_role` 参数中包括一个逗号分隔的角色 ARN 列表来串联角色。下面显示了在 `iam_role` 参数中串联角色的语法。

```
unload ('select * from venue limit 10') 
to 's3://acmedata/redshift/venue_pipe_'
IAM_ROLE 'arn:aws:iam::<aws-account-id-1>:role/<role-name-1>[,arn:aws:iam::<aws-account-id-2>:role/<role-name-2>][,...]';
```

**注意**  
整个角色链用单引号括起来，不能包含空格。

在以下示例中，`RoleA` 将附加到属于 AWS 账户 `123456789012` 的集群。属于账户 `210987654321` 的 `RoleB` 具有访问名为 `s3://companyb/redshift/` 的存储桶的权限。以下示例将 `RoleA` 和 `RoleB` 进行串联以将数据卸载到 s3://companyb/redshift/ 存储桶。

```
unload ('select * from venue limit 10') 
to 's3://companyb/redshift/venue_pipe_'
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

以下示例使用 COPY 命令加载已在上一个示例中卸载的数据。

```
copy venue 
from 's3://companyb/redshift/venue_pipe_'
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

在以下示例中，CREATE EXTERNAL SCHEMA 使用串联的角色代入角色 `RoleB`。

```
create external schema spectrumexample from data catalog 
database 'exampledb' region 'us-west-2' 
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

在以下示例中，CREATE EXTERNAL FUNCTION 使用串联的角色代入角色 `RoleB`。

```
create external function lambda_example(varchar)
returns varchar
volatile
lambda 'exampleLambdaFunction'
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

# 使用 IAM 角色授权 COPY、UNLOAD、CREATE EXTERNAL FUNCTION 和 CREATE EXTERNAL SCHEMA 操作
<a name="copy-unload-iam-role"></a>

您可使用 [COPY](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html) 命令将数据加载（或导入）到 Amazon Redshift，使用 [UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html) 命令从 Amazon Redshift 卸载（或导出）数据。您可以使用 CREATE EXTERNAL FUNCTION 命令创建用户定义的函数，这些函数从 AWS Lambda 调用函数。

在使用 Amazon Redshift Spectrum 时，您要使用 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) 命令来指定包含您的数据的 Simple Storage Service（Amazon S3）存储桶的位置。当您运行 COPY、UNLOAD 或 CREATE EXTERNAL SCHEMA 命令时，会提供安全凭证。这些凭证授权您的 Amazon Redshift 集群在目标目的地 [如 Simple Storage Service（Amazon S3）存储桶] 中读取或写入数据。

运行 CREATE EXTERNAL FUNCTION 时，您可以使用 IAM 角色参数提供安全凭证。这些凭证授权您的 Amazon Redshift 集群从 AWS Lambda 调用 Lambda 函数。提供安全凭证的首选方法是指定一个 AWS Identity and Access Management (IAM) 角色。对于 COPY 和 UNLOAD，您可以提供临时凭证。有关创建 IAM 角色的信息，请参阅[授权 Amazon Redshift 代表您访问 AWS 服务](authorizing-redshift-service.md)。

如果用户需要在 AWS 管理控制台之外与 AWS 交互，则需要编程式访问权限。授予编程式访问权限的方法取决于访问 AWS 的用户类型。

要向用户授予编程式访问权限，请选择以下选项之一。


****  

| 哪个用户需要编程式访问权限？ | 目的 | 方式 | 
| --- | --- | --- | 
| IAM | （推荐）使用控制台凭证作为临时凭证来签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/copy-unload-iam-role.html)  | 
|  人力身份 （在 IAM Identity Center 中管理的用户）  | 使用临时凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/copy-unload-iam-role.html)  | 
| IAM | 使用临时凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 | 按照《IAM 用户指南》中[将临时凭证用于 AWS 资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)中的说明进行操作。 | 
| IAM | （不推荐使用）使用长期凭证签署向 AWS CLI、AWS SDK 或 AWS API 发出的编程请求。 |  按照您希望使用的界面的说明进行操作。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/copy-unload-iam-role.html)  | 

使用 IAM 角色的步骤如下所示：
+ 创建要与您的 Amazon Redshift 集群结合使用的 IAM 角色。
+ 将 IAM 角色与集群关联。
+ 在调用 COPY、UNLOAD、CREATE EXTERNAL SCHEMA 或 CREATE EXTERNAL FUNCTION 命令时包含 IAM 角色的 ARN。

# 将 IAM 角色与集群相关联
<a name="copy-unload-iam-role-associating-with-clusters"></a>

在您创建一个 IAM 角色以授权 Amazon Redshift 为您访问其他 AWS 服务，必须将该角色与 Amazon Redshift 集群关联。在使用角色加载或卸载数据之前，您必须执行此操作。

## 将 IAM 角色与集群关联所需的权限
<a name="copy-unload-iam-role-associating-with-clusters-perms"></a>

要将 IAM 角色与集群关联，用户必须具有对该 IAM 角色的 `iam:PassRole` 权限。此权限允许管理员限制用户可关联到 Amazon Redshift 集群的 IAM 角色。作为最佳实践，我们建议将权限策略附加到 IAM 角色，然后根据需要将其分配给用户和组。有关更多信息，请参阅 [Amazon Redshift 中的 Identity and Access Management](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html)。

以下示例显示了一个 IAM policy，该策略可附加到用户以允许该用户执行以下操作：
+ 获取用户的账户拥有的所有 Amazon Redshift 集群的详细信息。
+ 将三个 IAM 角色中的任一角色与两个 Amazon Redshift 集群中的任一集群关联。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "redshift:DescribeClusters",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                 "redshift:ModifyClusterIamRoles",
                 "redshift:CreateCluster"
            ],
            "Resource": [
                 "arn:aws:redshift:us-east-1:123456789012:cluster:my-redshift-cluster",
                 "arn:aws:redshift:us-east-1:123456789012:cluster:my-second-redshift-cluster"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": [
                "arn:aws:iam::123456789012:role/MyRedshiftRole",
                "arn:aws:iam::123456789012:role/SecondRedshiftRole",
                "arn:aws:iam::123456789012:role/ThirdRedshiftRole"
             ]
        }
    ]
}
```

------

当用户具有相应的权限后，该用户可以将 IAM 角色与 Amazon Redshift 集群关联。随后，IAM 角色可以与 COPY 或 UNLOAD 命令或其他 Amazon Redshift 命令一起使用。

有关 IAM 策略的更多信息，请参阅 *IAM 用户指南*中的 [IAM 策略概览](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。

## 管理 IAM 角色与集群的关联
<a name="managing-iam-role-association-with-cluster"></a>

您可以在创建集群时将该 IAM 角色与 Amazon Redshift 集群关联。或者您可以修改现有集群并添加或删除一个或多个 IAM 角色关联。

请注意以下事项：
+ 您可以关联的最大 IAM 角色数量受配额限制。
+ 一个 IAM 角色可与多个 Amazon Redshift 集群关联。
+ 仅当 IAM 角色和集群都归同一 AWS 账户拥有时，该角色才能与 Amazon Redshift 集群关联。

您可通过以下程序，借助控制台管理集群的 IAM 角色关联。

**要管理 IAM 角色关联**

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择 **Clusters（集群）**,然后选择要更新的集群。

1. 对于 **Actions**（操作），选择 **Manage IAM roles**（管理 IAM 角色）以显示与集群关联的当前列表 IAM 角色。

1. 在 **Manage IAM roles**（管理 IAM 角色）页面上，选择要添加的可用 IAM 角色，然后选择 **Add IAM role**（添加 IAM 角色）。

1. 选择 **Done**（完成）以保存您的更改。

您可以使用以下方法，通过 AWS CLI 管理集群的 IAM 角色关联。

要在创建集群后将 IAM 角色与其关联，请在 `--iam-role-arns` 命令的 `create-cluster` 参数中指定 IAM 角色的 Amazon Resource Name (ARN)。调用 `create-cluster` 命令时可以添加的最大 IAM 角色数量受配额限制。

将 IAM 角色与 Amazon Redshift 集群关联和解除两者之间的关联是一个异步过程。您可通过调用 `describe-clusters` 命令获取所有 IAM 角色集群关联的状态。

以下示例将两个 IAM 角色与新创建的名为 `my-redshift-cluster` 的集群关联。

```
aws redshift create-cluster \
    --cluster-identifier "my-redshift-cluster" \
    --node-type "ra3.4xlarge" \
    --number-of-nodes 16 \
    --iam-role-arns "arn:aws:iam::123456789012:role/RedshiftCopyUnload" \
                    "arn:aws:iam::123456789012:role/SecondRedshiftRole"
```

要将 IAM 角色与现有 Amazon Redshift 集群关联，请在 `modify-cluster-iam-roles` 命令的 `--add-iam-roles` 参数中指定 IAM 角色的 Amazon Resource Name (ARN)。调用 `modify-cluster-iam-roles` 命令时可以添加的最大 IAM 角色数量受配额限制。

以下示例将一个 IAM 角色与名为 `my-redshift-cluster` 的现有集群关联。

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier "my-redshift-cluster" \
    --add-iam-roles "arn:aws:iam::123456789012:role/RedshiftCopyUnload"
```

要取消 IAM 角色与集群的关联，请在 `modify-cluster-iam-roles` 命令的 `--remove-iam-roles` 参数中指定 IAM 角色的 ARN。`modify-cluster-iam-roles`调用 `modify-cluster-iam-roles` 命令时可以删除的最大 IAM 角色数量受配额限制。

以下示例从名为 `123456789012` 的集群中删除 `my-redshift-cluster` AWS 账户的 IAM 角色的关联。

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier "my-redshift-cluster" \
    --remove-iam-roles "arn:aws:iam::123456789012:role/RedshiftCopyUnload"
```

### 使用 AWS CLI 列出集群的 IAM 角色关联
<a name="w2aac37c30c30c35c31b7b9c29"></a>

要列出与 Amazon Redshift 集群关联的所有 IAM 角色以及 IAM 角色关联的状态，请调用 `describe-clusters` 命令。与集群关联的每个 IAM 角色的 ARN 将在 `IamRoles` 列表中返回，如以下示例输出所示。

已与集群关联的角色将显示状态 `in-sync`。正在与集群关联的角色将显示状态 `adding`。正与集群解除关联的角色将显示状态 `removing`。

```
{
    "Clusters": [
        {
            "ClusterIdentifier": "my-redshift-cluster",
            "NodeType": "ra3.4xlarge",
            "NumberOfNodes": 16,
            "IamRoles": [
                {
                    "IamRoleArn": "arn:aws:iam::123456789012:role/MyRedshiftRole",
                    "IamRoleApplyStatus": "in-sync"
                },
                {
                    "IamRoleArn": "arn:aws:iam::123456789012:role/SecondRedshiftRole",
                    "IamRoleApplyStatus": "in-sync"
                }
            ],
            ...
        },
        {
            "ClusterIdentifier": "my-second-redshift-cluster",
            "NodeType": "ra3.4xlarge",
            "NumberOfNodes": 10,
            "IamRoles": [
                {
                    "IamRoleArn": "arn:aws:iam::123456789012:role/MyRedshiftRole",
                    "IamRoleApplyStatus": "in-sync"
                },
                {
                    "IamRoleArn": "arn:aws:iam::123456789012:role/SecondRedshiftRole",
                    "IamRoleApplyStatus": "in-sync"
                },
                {
                    "IamRoleArn": "arn:aws:iam::123456789012:role/ThirdRedshiftRole",
                    "IamRoleApplyStatus": "in-sync"
                }
            ],
            ...
        }
    ]
}
```

有关使用 AWS CLI 的更多信息，请参阅 *[AWS CLI 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)*。

# 创建一个 IAM 角色作为 Amazon Redshift 的默认角色
<a name="default-iam-role"></a>

 当您通过 Redshift 控制台创建 IAM 角色时，Amazon Redshift 以编程方式在您的 AWS 账户 中创建角色，并自动附上现有的 AWS 托管式策略。这种方法意味着您可以留在 Redshift 控制台上，而不必切换到 IAM 控制台创建角色。要更精细地控制在 Amazon Redshift 控制台上创建的现有 IAM 角色的权限，您可以将自定义托管式策略附加至 IAM 角色。

## 在控制台中创建的 IAM 角色
<a name="default-iam-role-overview"></a>

当您使用 Amazon Redshift 控制台创建 IAM 角色时，Amazon Redshift 会跟踪所有通过控制台创建的 IAM 角色。Amazon Redshift 预先选择最新的默认 IAM 角色来创建所有新集群，以及从快照中还原集群。

通过 Amazon Redshift 控制台创建一个 IAM 角色，该角色拥有的策略包括可运行 SQL 命令的权限。这些命令包括 COPY、UNLOAD、CREATE EXTERNAL FUNCTION、CREATE EXTERNAL TABLE、CREATE EXTERNAL SCHEMA、CREATE MODEL 或 CREATE LIBRARY。或者，您可以更精细地控制用户通过创建自定义策略并将其附加到 IAM 角色来进行对 AWS 资源的访问。

当您使用控制台创建 IAM 角色并将其设置为集群的默认角色时，您无需提供 IAM 角色的 Amazon Resource Name（ARN）即可执行身份验证和授权。

您通过控制台为集群创建的 IAM 角色具有自动附加的 `AmazonRedshiftAllCommandsFullAccess` 托管式策略。此 IAM 角色允许 Amazon Redshift 为 AWS IAM 账户中的资源复制、卸载、查询和分析数据。托管式策略提供对以下操作的访问权限：[COPY](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-authorization.html)、[UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html)、[CREATE EXTERNAL FUNCTION](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html)、[CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)、[CREATE MODEL](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html) 和 [CREATE LIBRARY](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_LIBRARY.html)。此策略还授予权限，以便为相关 AWS 服务运行 SELECT 语句，例如 Amazon S3、Amazon CloudWatch Logs、Amazon SageMaker AI 和 AWS Glue。

CREATE EXTERNAL FUNCTION、CREATE EXTERNAL SCHEMA、CREATE MODEL 和CREATE LIBRARY 命令都有 `default` 关键字。对于这些命令的此关键字，Amazon Redshift 使用在命令运行时与集群关联的默认 IAM 角色。您可以运行 [DEFAULT\$1IAM\$1ROLE](https://docs.aws.amazon.com/redshift/latest/dg/r_DEFAULT_IAM_ROLE.html) 命令来检查附加至集群的当前默认 IAM 角色。

要控制已有 IAM 角色（设置为 Redshift 集群默认角色）的访问权限，请使用 AUSMEROLE 权限。当数据库用户和组运行前面列出的命令时，此访问控制适用于这些数据库用户和组。向用户或组授予 IAM 角色的 ASSUMEROLE 权限后，该用户或组可以在运行命令时代入该角色。ASSUMEROLE 权限允许您根据需要授予用户相应命令的访问权限。

您可以使用 Amazon Redshift 控制台执行以下操作：
+ [默认创建 IAM 角色](#create-iam)
+ [从集群中删除 IAM 角色](#remove-iam)
+ [将 IAM 角色与集群关联](#associate-iam)
+ [将 IAM 角色设置为默认角色](#set-default-iam)
+ [将 IAM 角色设置为不再是集群的默认角色](#clear-default-iam)

## AmazonRedshiftAllCommandsFullAccess 托管式策略的权限
<a name="default-iam-role-permissions"></a>

以下示例显示了 `AmazonRedshiftAllCommandsFullAccess` 中的权限：托管式策略允许对集群默认的角色（IAM 角色）执行某些操作。附加了权限策略的 IAM 角色可以授权用户或组进行某些操作，以及不允许某些操作。使用这些权限，您可以从 Simple Storage Service（Amazon S3）运行 COPY 命令、运行 UNLOAD，然后使用 CREATE MODEL 命令。

```
{
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetBucketAcl",
                "s3:GetBucketCors",
                "s3:GetEncryptionConfiguration",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:ListMultipartUploadParts",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutBucketAcl",
                "s3:PutBucketCors",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload",
                "s3:CreateBucket"
            ],
            "Resource": [
                "arn:aws:s3:::redshift-downloads",
                "arn:aws:s3:::redshift-downloads/*",
                "arn:aws:s3:::*redshift*",
                "arn:aws:s3:::*redshift*/*"
            ]
}
```

以下示例显示了 `AmazonRedshiftAllCommandsFullAccess` 中的权限：托管式策略允许对集群默认的角色（IAM 角色）执行某些操作。附加了权限策略的 IAM 角色可以授权用户或组进行某些操作，以及不允许某些操作。如果有以下权限，您可以运行 CREATE EXTERNAL FUNCTION 命令。

```
{
    "Action": [
        "lambda:InvokeFunction"
    ],
    "Resource": "arn:aws:lambda:*:*:function:*redshift*"
}
```

以下示例显示了 `AmazonRedshiftAllCommandsFullAccess` 中的权限：托管式策略允许对集群默认的角色（IAM 角色）执行某些操作。附加了权限策略的 IAM 角色可以授权用户或组进行某些操作，以及不允许某些操作。如果具有以下权限，您可以运行 Amazon Redshift Spectrum 所需的 CREATE EXTERNAL SCHEMA 和 CREATE EXTERNAL TABLE 命令。

```
{
            "Effect": "Allow",
            "Action": [
                "glue:CreateDatabase",
                "glue:DeleteDatabase",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:UpdateDatabase",
                "glue:CreateTable",
                "glue:DeleteTable",
                "glue:BatchDeleteTable",
                "glue:UpdateTable",
                "glue:GetTable",
                "glue:GetTables",
                "glue:BatchCreatePartition",
                "glue:CreatePartition",
                "glue:DeletePartition",
                "glue:BatchDeletePartition",
                "glue:UpdatePartition",
                "glue:GetPartition",
                "glue:GetPartitions",
                "glue:BatchGetPartition"
            ],
            "Resource": [
                "arn:aws:glue:*:*:table/*redshift*/*",
                "arn:aws:glue:*:*:catalog",
                "arn:aws:glue:*:*:database/*redshift*"
            ]
}
```

以下示例显示了 `AmazonRedshiftAllCommandsFullAccess` 中的权限：托管式策略允许对集群默认的角色（IAM 角色）执行某些操作。附加了权限策略的 IAM 角色可以授权用户或组进行某些操作，以及不允许某些操作。如果具有以下权限，您可以使用联合查询运行 CREATE EXTERNAL SCHEMA 命令。

```
{
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": [
                "arn:aws:secretsmanager:*:*:secret:*Redshift*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "secretsmanager:ResourceTag/Redshift": "true"
                }
            }
},
```

## 使用控制台管理为集群创建的 IAM 角色
<a name="managing-iam-role-console"></a>

要创建、修改和删除从 Amazon Redshift 控制台创建的 IAM 角色，请使用控制台上的 **Clusters**（集群）部分。

### 默认创建 IAM 角色
<a name="create-iam"></a>

在控制台上，您可以为集群创建一个 IAM 角色，并自动为该角色附上 `AmazonRedshiftAllCommandsFullAccess` 策略。这个新角色让 Amazon Redshift 能够在您的 IAM 角色中复制、加载、查询和分析 Amazon 资源的数据。

一个集群只能有一个默认的 IAM 角色。如果现有 IAM 角色已设置为默认角色，当您创建另一个 IAM 角色并设置为集群默认角色时，新的 IAM 角色将替换现有的 IAM 角色成为默认角色。

**创建新集群和 IAM 角色，并设置 IAM 角色为新集群的默认角色。**

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择**集群**。列出您的账户在当前 AWS 区域 区域中的集群。列表中的各个列中显示了每个集群的一部分属性。

1. 选择**创建集群**以创建集群。

1. 按照控制台页面上的说明进行操作，为**集群配置**输入属性。有关这一步骤的更多信息，请参阅[创建集群](create-cluster.md)。

1. （可选）选择 **Load sample data**（加载示例数据），将示例数据集加载到您的 Amazon Redshift 集群，以便开始使用查询编辑器查询数据。

   如果您在防火墙的后面，则数据库端口必须是接受入站连接的开放端口。

1. 按照控制台页面上的说明操作，为 **Cluster configuration**（集群配置）输入属性。

1. 在 **Cluster permissions**（集群权限）下，从 **Manage IAM roles**（管理 IAM 角色）选择 **Create IAM role**（创建 IAM 角色）。

1. 指定一个 Simple Storage Service（Amazon S3）存储桶，让 IAM 角色通过以下方法访问：
   + 选择 **No additional Simple Storage Service（Amazon S3）bucket** [没有额外 Simple Storage Service（Amazon S3）存储桶]，在不指定特定 Simple Storage Service（Amazon S3）存储桶的情况下创建 IAM 角色。
   + 选择 **Any Simple Storage Service（Amazon S3）bucket** [任何 Simple Storage Service（Amazon S3）存储桶]，允许有权限访问您的 Amazon Redshift 集群的用户，也可以访问在您的 AWS 账户 中的任何 Simple Storage Service（Amazon S3）存储桶及其内容。
   + 选择 **Specific Simple Storage Service（Amazon S3）buckets** [特定 Simple Storage Service（Amazon S3）存储桶]，为创建的 IAM 角色指定一个或多个 Simple Storage Service（Amazon S3）存储桶以供访问。然后从表中选择一个或多个 Simple Storage Service（Amazon S3）存储桶。

1. 选择**创建 IAM 角色作为默认角色**。Amazon Redshift 会自动创建 IAM 角色并将其设置为集群的默认角色。

1. 选择 **Create cluster**（创建集群）以创建集群。集群可能需要几分钟才可以使用。

### 从集群中删除 IAM 角色
<a name="remove-iam"></a>

您可以从集群中移除一个或多个 IAM 角色。

**从集群中删除 IAM 角色**

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择**集群**。列出您的账户在当前 AWS 区域 区域中的集群。列表中的各个列中显示了每个集群的一部分属性。

1. 选择要从中删除的 IAM 角色的集群的名称。

1. 在 **Cluster permissions**（集群权限）下，选择要从集群中删除的一个或多个 IAM 角色。

1. 从 **Manage IAM roles**（管理 IAM 角色）中选择 **Remove IAM roles**（删除 IAM 角色）。

### 将 IAM 角色与集群关联
<a name="associate-iam"></a>

您可以将一个或多个 IAM 角色与集群关联。

**将 IAM 角色与您的集群关联**

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择**集群**。列出您的账户在当前 AWS 区域 区域中的集群。列表中的各个列中显示了每个集群的一部分属性。

1. 选择 IAM 角色需要关联的集群。

1. 在 **Cluster permissions**（集群权限）下，选择要与集群关联的一个或多个 IAM 角色。

1. 从 **Manage IAM roles**（管理 IAM 角色）中选择 **Associate IAM roles**（关联 IAM 角色）。

1. 选择一个或多个 IAM 角色并与您的集群关联。

1. 选择 **Associate IAM role**（关联 IAM 角色）。

### 将 IAM 角色设置为默认角色
<a name="set-default-iam"></a>

您可以将 IAM 角色设置为集群的默认角色。

**将 IAM 角色设置为集群的默认角色**

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择**集群**。列出您的账户在当前 AWS 区域 区域中的集群。列表中的各个列中显示了每个集群的一部分属性。

1. 选择要为其设置默认 IAM 角色的集群。

1. 在 **Cluster permissions**（集群权限）下，从 **Associated IAM roles**（关联 IAM 角色）中选择要设置为集群默认角色的 IAM 角色。

1. 在 **Set default**（设置默认值）下选择 **Make default**（设为默认）。

1. 系统提示时，选择 **Set default**（设置默认值）以确认设置指定的 IAM 角色为默认角色。

### 将 IAM 角色设置为不再是集群的默认角色
<a name="clear-default-iam"></a>

您可以使 IAM 角色不再成为集群的默认角色。

**清除 IAM 角色作为集群默认角色的设置**

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择**集群**。列出您的账户在当前 AWS 区域 区域中的集群。列表中的各个列中显示了每个集群的一部分属性。

1. 选择 IAM 角色需要关联的集群。

1. 在 **Cluster permissions**（集群权限）下，从 **Associated IAM roles**（关联 IAM 角色）中选择要设置为集群默认角色的 IAM 角色。

1. 在 **Set default**（设置默认值）下，选择 **Clear default**（清除默认值）。

1. 系统提示时，选择 **Clear default**（清除默认值）以确指定的 IAM 角色不再是默认角色。

## 使用 AWS CLI 管理在集群上创建的 IAM 角色
<a name="managing-iam-role-association-with-cluster-cli"></a>

您可以使用 AWS CLI 管理在集群上创建的 IAM 角色

### 创建默认设置为 IAM 角色的 Amazon Redshift 集群
<a name="create-cluster-iam"></a>

要创建 Amazon Redshift 集群并将 IAM 角色设为其默认角色，请使用 `aws redshift create-cluster` AWS CLI 命令。

以下 AWS CLI 命令创建一个 Amazon Redshift 集群和名为 myrole1 的 IAM 角色。这个 AWS CLI 命令还将 myrole1 设置为集群的默认值。

```
aws redshift create-cluster \
    --node-type dc2.large \
    --number-of-nodes 2 \
    --master-username adminuser \
    --master-user-password TopSecret1 \
    --cluster-identifier mycluster \
    --iam-roles 'arn:aws:iam::012345678910:role/myrole1' 'arn:aws:iam::012345678910:role/myrole2' \
    --default-iam-role-arn 'arn:aws:iam::012345678910:role/myrole1'
```

以下代码片段是一个反应示例。

```
{
    "Cluster": {
        "ClusterIdentifier": "mycluster",
        "NodeType": "dc2.large",
        "MasterUsername": "adminuser",      
        "DefaultIamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
        "IamRoles": [
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
                "ApplyStatus": "adding"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole2",
                "ApplyStatus": "adding"
            }
        ]
        ...
    }
}
```

### 向 Amazon Redshift 集群添加一个或多个 IAM 角色
<a name="modify-cluster-add-iam"></a>

要添加与集群关联的一个或多个 IAM 角色，请使用 `aws redshift modify-cluster-iam-roles` AWS CLI 命令。

以下 AWS CLI 命令将 `myrole3` 和`myrole4` 添加到集群。

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier mycluster \
    --add-iam-roles 'arn:aws:iam::012345678910:role/myrole3' 'arn:aws:iam::012345678910:role/myrole4'
```

以下代码片段是一个反应示例。

```
{
    "Cluster": {
        "ClusterIdentifier": "mycluster",
        "NodeType": "dc2.large",
        "MasterUsername": "adminuser",
        "DefaultIamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
        "IamRoles": [
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
                "ApplyStatus": "in-sync"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole2",
                "ApplyStatus": "in-sync"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole3",
                "ApplyStatus": "adding"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole4",
                "ApplyStatus": "adding"
            }
        ],
        ...
    }
}
```

### 从 Amazon Redshift 集群中删除一个或多个 IAM 角色
<a name="modify-cluster-remove-iam"></a>

要删除与集群关联的一个或多个 IAM 角色，请使用 `aws redshift modify-cluster-iam-roles` AWS CLI 命令。

以下 AWS CLI 命令从集群中删除 `myrole3` 和 `myrole4`。

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier mycluster \
    --remove-iam-roles 'arn:aws:iam::012345678910:role/myrole3' 'arn:aws:iam::012345678910:role/myrole4'
```

以下代码片段是一个反应示例。

```
{
    "Cluster": {
        "ClusterIdentifier": "mycluster",
        "NodeType": "dc2.large",
        "MasterUsername": "adminuser",
        "DefaultIamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
        "IamRoles": [
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
                "ApplyStatus": "in-sync"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole2",
                "ApplyStatus": "in-sync"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole3",
                "ApplyStatus": "removing"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole4",
                "ApplyStatus": "removing"
            }
        ],
        ...
    }
}
```

### 将关联的 IAM 角色设置为集群的默认角色
<a name="modify-cluster-default-iam-associated"></a>

要将关联的 IAM 角色设置为集群的默认角色，请使用 `aws redshift modify-cluster-iam-roles` AWS CLI 命令。

以下 AWS CLI 命令集设置 `myrole2` 为集群默认角色。

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier mycluster \
    --default-iam-role-arn 'arn:aws:iam::012345678910:role/myrole2'
```

以下代码片段是一个反应示例。

```
{
    "Cluster": {
        "ClusterIdentifier": "mycluster",
        "NodeType": "dc2.large",
        "MasterUsername": "adminuser",
        "DefaultIamRoleArn": "arn:aws:iam::012345678910:role/myrole2",
        "IamRoles": [
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
                "ApplyStatus": "in-sync"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole2",
                "ApplyStatus": "in-sync"
            }
        ],
        ...
    }
}
```

### 将未关联的 IAM 角色设置为集群的默认角色
<a name="modify-cluster-default-iam-not-associated"></a>

要将未关联的 IAM 角色设置为集群的默认角色，请使用 `aws redshift modify-cluster-iam-roles` AWS CLI 命令。

以下 AWS CLI 命令把 `myrole2` 添加到 Amazon Redshift 集群，然后将其设置为集群的默认角色。

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier mycluster \
    --add-iam-roles 'arn:aws:iam::012345678910:role/myrole3' \
    --default-iam-role-arn 'arn:aws:iam::012345678910:role/myrole3'
```

以下代码片段是一个反应示例。

```
{
    "Cluster": {
        "ClusterIdentifier": "mycluster",
        "NodeType": "dc2.large",
        "MasterUsername": "adminuser",
        "DefaultIamRoleArn": "arn:aws:iam::012345678910:role/myrole3",
        "IamRoles": [
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
                "ApplyStatus": "in-sync"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole2",
                "ApplyStatus": "in-sync"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole3",
                "ApplyStatus": "adding"
            }
        ],
        ...
    }
}
```

### 从快照还原集群，并将 IAM 角色设置为其默认角色
<a name="restore-cluster-iam"></a>

从快照还原集群时，您可以关联现有 IAM 角色，也可以创建一个新角色并将其设置为集群的默认角色。

要从快照还原 Amazon Redshift 集群，并将 IAM 角色设置为集群默认角色，请使用 `aws redshift restore-from-cluster-snapshot` AWS CLI 命令。

以下 AWS CLI 命令从快照还原集群，并将 `myrole2` 设置为集群默认角色。

```
aws redshift restore-from-cluster-snapshot \
    --cluster-identifier mycluster-clone \
    --snapshot-identifier my-snapshot-id
    --iam-roles 'arn:aws:iam::012345678910:role/myrole1' 'arn:aws:iam::012345678910:role/myrole2' \
    --default-iam-role-arn 'arn:aws:iam::012345678910:role/myrole1'
```

以下代码片段是一个反应示例。

```
{
    "Cluster": {
        "ClusterIdentifier": "mycluster-clone",
        "NodeType": "dc2.large",
        "MasterUsername": "adminuser",
        "DefaultIamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
        "IamRoles": [
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole1",
                "ApplyStatus": "adding"
            },
            {
                "IamRoleArn": "arn:aws:iam::012345678910:role/myrole2",
                "ApplyStatus": "adding"
            }
        ],
        ...
    }
}
```

# 使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限
<a name="authorization-fas-spectrum"></a>

将 AWS 中的身份联合验证和 `GetDatabaseCredentials` 提供的凭证结合使用，可以简化对本地数据和外部数据的授权和访问。在本教程中，我们将说明如何使用 AWS 身份联合验证（而不是使用特定 IAM 角色）提供对资源的访问权限。

目前，要向用户提供对驻留在 Amazon S3 中的外部数据的访问权限，您需要创建一个具有权限策略中定义的权限的 IAM 角色。之后，附加了此角色的用户便能访问外部数据。虽然这行得通，但如果您想提供粒度规则（例如，使特定列对特定用户不可用），则可能需要在外部架构上进行其他配置。

利用由 `GetDatabaseCredentials` 提供的凭证，身份联合验证可以使用更易于指定和更改的粒度 IAM 规则提供对 AWS Glue 和 Redshift Spectrum 资源的访问权限。这更易于应用符合您的业务规则的访问权限。

使用联合凭证的好处如下：
+ 您不必为 Redshift Spectrum 管理集群附加的 IAM 角色。
+ 集群管理员可以创建一个可供具有不同 IAM 上下文的使用者访问的外部架构。例如，这对于对表执行列筛选会很有用，在此情况下，其他使用者将查询同一外部架构并在返回的记录中获得不同的字段。
+ 您可以使用具有 IAM 权限的用户查询 Amazon Redshift，而不是仅使用角色。

## 准备身份以使用联合身份进行登录
<a name="authorization-fas-spectrum-getting-started-iam"></a>

在使用联合身份登录之前，您必须执行多个预备步骤。这些说明假定您目前有一个 Redshift Spectrum 外部架构，该架构引用了存储在 Amazon S3 存储桶中的数据文件，并且该存储桶与您的 Amazon Redshift 集群或 Amazon Redshift Serverless 数据仓库位于同一账户中。

1. 创建一个 IAM 身份。这可以是用户或 IAM 角色。使用 IAM 支持的任何名称。

1. 将权限策略附加到此身份。指定以下任一项：
   + `redshift:GetClusterCredentialsWithIAM`（适用于 Amazon Redshift 预调配集群）
   + `redshift-serverless:GetCredentials`（适用于 Amazon Redshift Serverless）

   您可以使用 IAM 控制台通过策略编辑器添加权限。

   IAM 身份还需要对外部数据的访问权限。通过直接添加以下 AWS 托管式策略，授予对 Amazon S3 的访问权限：
   + `AmazonS3ReadOnlyAccess`
   + `AWSGlueConsoleFullAccess`

    如果您使用 AWS Glue 准备外部数据，则需要最后一个托管式策略。有关授予对 Amazon Redshift Spectrum 的访问权限的步骤的更多信息，请参阅[为 Amazon Redshift 创建 IAM 角色](https://docs.aws.amazon.com/redshift/latest/dg/c-getting-started-using-spectrum-create-role.html)，它是 Amazon Redshift 和 Redshift Spectrum 入门指南的一部分。此部分介绍了添加 IAM 策略以访问 Redshift Spectrum 的步骤。

1. 设置 SQL 客户端以连接到 Amazon Redshift。使用 Amazon Redshift JDBC 驱动程序，并将用户的凭证添加到此工具的凭证属性中。像 SQL Workbench/J 这样的客户端非常适合执行此操作。设置以下客户端连接扩展属性：
   + *AccessKeyID* – 您的访问密钥标识符。
   + *SecretAccessKey* – 您的秘密访问密钥。（请注意，如果您不使用加密，则传输私有密钥会带来安全风险。） 
   + *SessionToken* – IAM 角色的一组临时凭证。
   + *groupFederation* – 如果要为预调配集群配置联合身份，则设置为 `true`。如果您使用的是 Amazon Redshift Serverless，请不要设置此参数。
   + *LogLevel* – 整数日志级别值。该项为可选项。

1. 将 URL 设置为在 Amazon Redshift 或 Amazon Redshift Serverless 控制台中找到的 JDBC 端点。将 URL 架构替换为 *jdbc:redshift:iam:* 并使用此格式：
   + 适用于 Amazon Redshift 预调配集群的格式：`jdbc:redshift:iam://<cluster_id>.<unique_suffix>.<region>.redshift.amazonaws.com:<port>/<database_name>`

     示例：`jdbc:redshift:iam://test1.12345abcdefg.us-east-1.redshift.amazonaws.com:5439/dev`
   + 适用于 Amazon Redshift Serverless 的格式：`jdbc:redshift:iam://<workgroup-name>.<account-number>.<aws-region>.redshift-serverless.amazonaws.com:5439:<port>/<database_name>`

     示例：`jdbc:redshift:iam://default.123456789012.us-east-1.redshift-serverless.amazonaws.com:5439/dev`

   在您首次使用 IAM 身份连接到数据库后，Amazon Redshift 会自动创建一个同名 Amazon Redshift 身份，其前缀为 `IAM:`（对于用户）或 `IAMR:`（对于 IAM 角色）。本主题中的剩余步骤展示了适用于用户的示例。

   如果未自动创建 Redshift 用户，您可以通过以下方式创建一个此类用户：运行 `CREATE USER` 语句、使用管理员账户并以格式 `IAM:<user name>` 指定用户名。

1.  作为 Amazon Redshift 集群管理员，向 Redshift 用户授予访问外部架构所需的权限。

   ```
   GRANT ALL ON SCHEMA my_schema to "IAM:my_user";
   ```

   要使 Redshift 用户能够在外部架构中创建表，他们必须是架构所有者。例如：

   ```
   ALTER SCHEMA my_schema owner to "IAM:my_user";
   ```

1. 要验证配置，请在授予权限后，使用 SQL 客户端以用户身份运行查询。此查询示例从外部表中检索数据。

   ```
   SELECT * FROM my_schema.my_table;
   ```

## 开始将身份和授权传播到 Redshift Spectrum
<a name="authorization-fas-spectrum-getting-started"></a>

要传递联合身份以查询外部表，请将 `SESSION` 设置为 `CREATE EXTERNAL SCHEMA` 的 `IAM_ROLE` 查询参数的值。以下步骤说明如何设置和利用 `SESSION` 授予对外部架构的查询权限。

1. 创建本地表和外部表。使用 AWS Glue 编写目录的外部表适合此操作。

1. 使用 IAM 身份连接到 Amazon Redshift。如上一节中所述，在身份连接到 Amazon Redshift 时，将创建一个 Redshift 数据库用户。如果用户以前不存在，则将创建该用户。如果用户是新用户，则管理员必须向其授予在 Amazon Redshift 中执行任务（例如查询和创建表）的权限。

1. 使用管理员账户连接到 Redshift。运行该命令以使用 `SESSION` 值创建外部架构。

   ```
   create external schema spectrum_schema from data catalog
   database '<my_external_database>' 
   region '<my_region>'
   iam_role 'SESSION'
   catalog_id '<my_catalog_id>';
   ```

   请注意，在此示例中，将设置 `catalog_id`。这是随功能一起添加的新设置，因为 `SESSION` 替换了特定角色。

   在此示例中，查询中的值将模仿实际值的显示方式。

   ```
   create external schema spectrum_schema from data catalog
   database 'spectrum_db' 
   region 'us-east-1'
   iam_role 'SESSION'
   catalog_id '123456789012'
   ```

   在此情况下，`catalog_id` 值是您的 AWS 账户 ID。

1. 使用您在步骤 2 中连接的 IAM 身份运行查询以访问外部数据。例如：

   ```
   select * from spectrum_schema.table1;
   ```

   例如，在此情况下，`table1` 可以是 Amazon S3 存储桶中某个文件中的采用 JSON 格式的数据。

1. 如果您已有一个使用集群附加的 IAM 角色的外部架构并指向您的外部数据库或架构，则可以替换现有架构并使用联合身份（如这些步骤中所述），也可以创建一个新的架构。

`SESSION` 表示使用联合身份凭证用于查询外部架构。在使用 `SESSION` 查询参数时，请务必设置 `catalog_id`。由于它指向用于架构的数据目录，因此它是必需的。之前，`catalog_id` 是从分配给 `iam_role` 的值中检索的。当您通过此方式设置身份和授权传播时，例如，通过使用联合凭证查询外部架构来传播到 Redshift Spectrum 时，不需要通过 IAM 角色进行授权。

### 使用说明
<a name="authorization-fas-access-usage-notes"></a>

常见的连接错误如下：*检索临时凭证时出现 IAM 错误：无法使用提供的解组器对异常响应进行解组*。此错误是由于使用旧版 JDBC 驱动程序造成的。联合身份所需的最低驱动程序版本为 2.1.0.9。您可以从[下载 Amazon Redshift JDBC 驱动程序版本 2.x](https://docs.aws.amazon.com/redshift/latest/mgmt/jdbc20-download-driver.html) 获取 JDBC 驱动程序。

### 其他资源
<a name="authorization-fas-spectrum-resources"></a>

这些链接为管理外部数据的访问提供了额外信息。
+ 您仍可以使用 IAM 角色访问 Redshift Spectrum 数据。有关更多信息，请参阅 [授权 Amazon Redshift 代表您访问 AWS 服务](authorizing-redshift-service.md)。
+ 当您使用 AWS Lake Formation 管理对外部表的访问权限时，您可以使用具有联合 IAM 身份的 Redshift Spectrum 对其进行查询。您不再需要管理集群附加的 IAM 角色，Redshift Spectrum 可以查询向 AWS Lake Formation 注册的数据。有关更多信息，请参阅[将 AWS Lake Formation 与 Amazon Redshift Spectrum 结合使用](https://docs.aws.amazon.com/lake-formation/latest/dg/RSPC-lf.html)。