访问其他 AWS 资源的权限
要在您的集群和其他 AWS 资源(如 Amazon S3 、Amazon DynamoDB、Amazon EMR 或 Amazon EC2)之间移动数据,您的集群必须具有访问相应资源和执行所需操作的权限。例如,要从 Amazon S3 加载数据,COPY 必须具有对桶的 LIST 访问权限以及对桶对象的 GET 访问权限。有关最低权限的更多信息,请参阅 COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限。
要获取访问资源的授权,您的集群必须经过身份验证。您可以选择以下身份验证方法之一:
基于角色的访问控制
利用基于角色的访问控制,您的集群将代表您临时代入 IAM 角色。然后,基于对角色的授权,您的集群可访问所需的 AWS 资源。
创建 IAM 角色类似于向用户授予权限,因为它是一个 AWS 身份,具有确定该身份在 AWS 中可执行和不可执行的操作的权限策略。但是,任何实体都可以根据需要代入某个角色,角色并不是唯一地与某个用户关联。此外,角色没有任何关联的凭证(密码或访问密钥)。相反,如果将角色与集群关联,则会动态创建访问密钥并将其提供给集群。
我们建议使用基于角色的访问控制,因为除了保护您的 AWS 凭证之外,它还将提供对 AWS 资源和敏感用户数据的更安全、精细的访问控制。
基于角色的身份验证具有以下优点:
-
您可以使用 AWS 标准 IAM 工具定义 IAM 角色并将该角色与多个集群关联。当您修改某个角色的访问策略时,更改将自动应用于使用该角色的所有集群。
-
您可定义为特定集群和数据库用户授予对特定 AWS 资源和操作的访问权限的精细 IAM 策略。
-
您的集群将在运行时获取临时会话凭证并按需刷新凭证直到操作完成。如果您使用了基于密钥的临时凭证,并且临时凭证在操作完成前到期,操作将失败。
-
您的访问密钥 ID 和秘密访问密钥 ID 不会在 SQL 代码中存储或传输。
要使用基于角色的访问控制,您必须先使用 Amazon Redshift 服务角色类型创建 IAM 角色,然后将此角色附加到您的集群。此角色至少必须具有 COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限中列出的权限。有关创建 IAM 角色并将其附加到集群的步骤,请参阅《Amazon Redshift 管理指南》中的授权 Amazon Redshift 代表您访问其他 AWS 服务。
通过使用 Amazon Redshift 管理控制台、CLI 或 API,您可将角色添加到集群或查看与集群关联的角色。有关更多信息,请参阅《Amazon Redshift 管理指南》中的将 IAM 角色与集群关联。
当您创建 IAM 角色时,IAM 将返回该角色的 Amazon 资源名称 (ARN)。要指定 IAM 角色,请利用 IAM_ROLE 参数或 CREDENTIALS 参数提供角色 ARN。
例如,假设以下角色已附加到集群。
"IamRoleArn": "arn:aws:iam::0123456789012:role/MyRedshiftRole"
以下 COPY 命令示例使用 IAM_ROLE 参数,其 ARN 在上一示例中用于身份验证和访问 Amazon S3。
copy customer from 's3://amzn-s3-demo-bucket/mydata' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
以下 COPY 命令示例使用 CREDENTIALS 参数指定 IAM 角色。
copy customer from 's3://amzn-s3-demo-bucket/mydata' credentials 'aws_iam_role=arn:aws:iam::0123456789012:role/MyRedshiftRole';
此外,超级用户还可以向数据库用户和组授予 ASSUMEROLE 权限,以便为 COPY 操作提供对角色的访问权限。有关信息,请参阅 GRANT。
基于密钥的访问控制
利用基于密钥的访问控制,您将为获权访问包含数据的 AWS 资源的 IAM 用户提供访问密钥 ID 和秘密访问密钥。您可以配合使用 ACCESS_KEY_ID and SECRET_ACCESS_KEY 参数或使用 CREDENTIALS 参数。
注意
我们强烈建议使用 IAM 角色进行身份验证而不是提供纯文本访问密钥 ID 和秘密访问密钥。如果您选择基于密钥的访问控制,则不要使用 AWS 账户(根)凭证。应始终创建 IAM 用户并提供该用户的访问密钥 ID 和秘密访问密钥。有关创建 IAM 用户的步骤,请参阅在您的 AWS 账户中创建 IAM 用户。
要使用 ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 进行身份验证,请使用授权用户的访问密钥 ID 和完整的秘密访问密钥替换 <access-key-id>
和 <secret-access-key>
,如下所示。
ACCESS_KEY_ID '
<access-key-id>
' SECRET_ACCESS_KEY '<secret-access-key>
';
要使用 CREDENTIALS 参数进行身份验证,请使用授权用户的访问密钥 ID 和完整的秘密访问密钥替换 <access-key-id>
和 <secret-access-key>
,如下所示。
CREDENTIALS 'aws_access_key_id=
<access-key-id>
;aws_secret_access_key=<secret-access-key>
';
IAM 用户必须至少具有 COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限 中列出的权限。
临时安全凭证
如果您使用基于密钥的访问控制,则可通过使用临时安全凭证进一步限制用户对您的数据具有的访问权限。基于角色的身份验证将自动使用临时凭证。
注意
我们强烈建议您使用 role-based access control,而不要创建临时凭证并提供纯文本形式的访问密钥 ID 和秘密访问密钥。基于角色的访问控制将自动使用临时凭证。
临时安全证书可增强安全性,因为它们时效短,过期后无法重复使用。使用令牌生成的访问密钥 ID 和秘密访问密钥无法脱离令牌使用,具有这些临时安全凭证的用户仅可以在凭证未过期前访问您的资源。
要为用户授予对您的资源的临时访问权限,请调用 AWS Security Token Service (AWS STS) API 操作。AWS STS API 操作将返回临时安全凭证,其中包括一个安全令牌、一个访问密钥 ID 和一个秘密访问密钥。您为需要临时访问您的资源的用户颁发临时安全凭证。这些用户可以是现有的 IAM 用户,也可以是非 AWS 用户。有关创建临时安全凭证的更多信息,请参阅《IAM 用户指南》中的使用临时安全凭证。
您可以将 ACCESS_KEY_ID and SECRET_ACCESS_KEY 参数与 SESSION_TOKEN 参数或 CREDENTIALS 参数配合使用。您还必须提供随令牌一起提供的访问密钥 ID 和秘密访问密钥。
要使用 ACCESS_KEY_ID、SECRET_ACCESS_KEY 和 SESSION_TOKEN 进行身份验证,请根据如下所示替换 <temporary-access-key-id>
、<temporary-secret-access-key>
和 <temporary-token>
。
ACCESS_KEY_ID '
<temporary-access-key-id>
' SECRET_ACCESS_KEY '<temporary-secret-access-key>
' SESSION_TOKEN '<temporary-token>
';
要使用 CREDENTIALS 进行身份验证,请在凭证字符串中包括 session_token=
,如下所示。<temporary-token>
CREDENTIALS 'aws_access_key_id=
<temporary-access-key-id>
;aws_secret_access_key=<temporary-secret-access-key>
;session_token=<temporary-token>
';
以下示例为具有临时安全凭证的 COPY 命令。
copy table-name from 's3://objectpath' access_key_id '
<temporary-access-key-id>
' secret_access_key '<temporary-secret-access-key>
' session_token '<temporary-token>
';
以下示例使用临时凭证和文件加密加载 LISTING 表。
copy listing from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' access_key_id '
<temporary-access-key-id>
' secret_access_key '<temporary-secret-access-key>
' session_token '<temporary-token>
' master_symmetric_key '<root-key>
' encrypted;
以下示例将 CREDENTIALS 参数与临时凭证和文件加密配合使用,加载 LISTING 表。
copy listing from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' credentials 'aws_access_key_id=
<temporary-access-key-id>
;aws_secret_access_key=<temporary-secret-access-key>
;session_token=<temporary-token>
;master_symmetric_key=<root-key>
' encrypted;
重要
临时安全凭证必须在整个 COPY 或 UNLOAD 操作持续时间有效。如果临时安全凭证在操作过程中过期,相应命令将失败,事务将被回滚。例如,如果临时安全凭证在 15 分钟后过期而 COPY 操作需要一个小时,则 COPY 操作将失败,无法完成。如果您使用基于角色的访问,则会自动刷新临时安全凭证直到操作完成。
COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限
CREDENTIALS 参数引用的 IAM 角色或用户必须至少具有以下权限:
-
对于从 Amazon S3 执行的 COPY 的操作,这是指对 Amazon S3 桶执行 LIST 以及对正在加载的 Amazon S3 对象以及清单文件(如果已使用)执行 GET 的权限。
-
对于从 Amazon S3、Amazon EMR 执行 COPY 的操作、以及从使用 JSON 格式数据的远程主机 (SSH) 执行 COPY 的操作,这是指对 Amazon S3 上的 JSONPaths 文件(如果已使用)执行 LIST 和 GET 的权限。
-
对于从 DynamoDB 执行 COPY 的操作,这是指对所加载的 DynamoDB 表执行 SCAN 和 DESCRIBE 的权限。
-
对于从 Amazon EMR 集群执行的 COPY 操作,这是指对 Amazon EMR 集群上的
ListInstances
操作的权限。 -
对于向 Amazon S3 执行 UNLOAD 的操作,这是指正在将数据文件卸载到的 Amazon S3 桶的 GET、LIST 和 PUT 权限。
-
对于从 Amazon S3 执行 CREATE LIBRARY 的操作,这是指对 Amazon S3 桶执行 LIST 以及对正在导入的 Amazon S3 对象执行 GET 的权限。
注意
如果您在运行 COPY、UNLOAD 或 CREATE LIBRARY 命令时收到错误消息 S3ServiceException: Access
Denied
,则您的集群对于 Amazon S3 没有适当的访问权限。
您可以通过向附加到集群的 IAM 角色、向用户或向用户所属的组附加 IAM 策略,来管理 IAM 权限。例如,AmazonS3ReadOnlyAccess
托管策略可授予对 Amazon S3 资源的 LIST 和 GET 权限。有关 IAM 策略的更多信息,请参阅《IAM 用户指南》中的管理 IAM 策略。