Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用联合用户临时凭证创建请求 - 适用于 Ruby 的 AWS 开发工具包

您可以为联合用户和应用程序提供临时安全凭证 (参阅 创建请求),以便他们可以发送经身份验证的请求,从而访问您的 AWS 资源。从 IAM 服务请求这些临时凭证时,您必须提供用户名称和 IAM 策略 (描述您需要授予的资源权限)。默认情况下,会话的持续时间为一个小时。但是,如果使用 IAM 用户凭证来请求临时凭证,在请求适用于联合用户和应用程序的临时安全凭证时,您可以显式地设置其他持续时间值。

注意

为了请求适用于联合用户和应用程序的临时安全凭证,出于提高安全性的考虑,您可能需要使用仅具有所需访问权限的专用 IAM 用户。您创建的临时用户可获取的权限不能超过请求临时安全凭证的 IAM 用户。有关更多信息,请参阅 AWS Identity and Access Management 常见问题

使用联合用户临时安全凭证创建请求

1

创建 AWS Security Token Service客户端 AWS::STS::Session 的实例。

2

通过调用您在上一步骤中创建的 STS 客户端的 new_federated_session 方法,开始会话。

您将需要提供会话信息,包括要附加到临时凭证的用户名称和 IAM 策略。

此方法将返回您的临时安全凭证。

3

通过传递临时安全凭证创建 AWS::S3 类的实例。

可使用此客户端向 Amazon S3 发送请求。如果您使用过期的凭证发送请求, Amazon S3 将返回错误。

以下 Ruby 代码示例演示了上述任务。

Copy
# Start a session with restricted permissions. sts = AWS::STS.new() policy = AWS::STS::Policy.new policy.allow( :actions => ["s3:ListBucket"], :resources => "arn:aws-cn:s3:::#{bucket_name}") session = sts.new_federated_session( 'User1', :policy => policy, :duration => 2*60*60) puts "Policy: #{policy.to_json}" # Get an instance of the S3 interface using the session credentials. s3 = AWS::S3.new(session.credentials) # Get a list of all object keys in a bucket. bucket = s3.buckets[bucket_name].objects.collect(&:key)

以下 Ruby 代码示例列出了特定存储桶中的密钥。在代码示例中,对于时长两个小时的会话,您可以首先获取适用于联合用户 (User1) 的临时安全凭证,然后使用它们向 Amazon S3 发送经身份验证的请求。

请求适用于其他人的临时凭证时,出于提高安全性的考虑,您可以使用 IAM 用户 (该用户拥有请求临时安全凭证的权限) 的安全凭证。您也可以限制此 IAM 用户的访问权限,以确保 IAM 用户在请求临时安全凭证时,仅授予特定于应用程序的最小权限。此示例仅会列出特定存储桶中的对象。因此,首先创建附加了以下策略的 IAM 用户。

Copy
{ "Statement":[{ "Action":["s3:ListBucket", "sts:GetFederationToken*" ], "Effect":"Allow", "Resource":"*" } ] }

该策略允许 IAM 用户请求临时安全凭证和用于仅列出 AWS 资源的访问权限。有关如何创建 IAM 用户的更多信息,请参阅 IAM 用户指南 中的创建您的第一个 IAM 用户和管理员组

您现在可以使用 IAM 用户安全凭证测试下面的示例。该示例将使用临时安全凭证向 Amazon S3 发送经身份验证的请求。该示例在请求适用于联合用户 (User1) 的临时安全凭证时指定了以下策略,该策略对列出特定存储桶 (YourBucketName) 中的对象设置了访问权限限制。要在您的代码中使用此示例,请更新策略并提供您自己的存储桶名称。

Copy
{ "Statement":[ { "Sid":"1", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":"arn:aws-cn:s3:::YourBucketName" } ] }

要在您的代码使用此示例,请提供您的访问密钥 ID 和私有密钥,以及您在前面的联合用户访问策略中指定的存储桶名称。

Copy
require 'rubygems' require 'aws-sdk' # In real applications, the following code is part of your trusted code. It has # your security credentials that you use to obtain temporary security credentials. bucket_name = '*** Provide bucket name ***' # Start a session with restricted permissions. sts = AWS::STS.new() policy = AWS::STS::Policy.new policy.allow( :actions => ["s3:ListBucket"], :resources => "arn:aws-cn:s3:::#{bucket_name}") session = sts.new_federated_session( 'User1', :policy => policy, :duration => 2*60*60) puts "Policy: #{policy.to_json}" # Get an instance of the S3 interface using the session credentials. s3 = AWS::S3.new(session.credentials) # Get a list of all object keys in a bucket. bucket = s3.buckets[bucket_name].objects.collect(&:key) puts "No. of Objects = #{bucket.count.to_s}" puts bucket