Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用联合用户临时凭证创建请求 - AWS SDK for Java

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

注意

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

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

1

创建 AWS Security Token Service客户端 AWSSecurityTokenServiceClient 的实例。

2

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

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

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

3

将临时安全凭证打包在 BasicSessionCredentials 对象的实例中。您可以使用此对象向您的 Amazon S3 客户端提供临时安全凭证。

4

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

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

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

Copy
// In real applications, the following code is part of your trusted code. It has // your security credentials you use to obtain temporary security credentials. AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient(new ProfileCredentialsProvider()); GetFederationTokenRequest getFederationTokenRequest = new GetFederationTokenRequest(); getFederationTokenRequest.setDurationSeconds(7200); getFederationTokenRequest.setName("User1"); // Define the policy and add to the request. Policy policy = new Policy(); // Define the policy here. // Add the policy to the request. getFederationTokenRequest.setPolicy(policy.toJson()); GetFederationTokenResult federationTokenResult = stsClient.getFederationToken(getFederationTokenRequest); Credentials sessionCredentials = federationTokenResult.getCredentials(); // Package the session credentials as a BasicSessionCredentials object // for an S3 client object to use. BasicSessionCredentials basicSessionCredentials = new BasicSessionCredentials( sessionCredentials.getAccessKeyId(), sessionCredentials.getSecretAccessKey(), sessionCredentials.getSessionToken()); // The following will be part of your less trusted code. You provide temporary security // credentials so it can send authenticated requests to Amazon S3. // Create an Amazon S3 client by passing in the basicSessionCredentials object. AmazonS3Client s3 = new AmazonS3Client(basicSessionCredentials); // Test. For example, send list object keys in a bucket. ObjectListing objects = s3.listObjects(bucketName);

要在策略中设置条件,请创建一个 Condition 对象并将它与策略关联。下面的代码示例显示了一个条件,该条件允许来自特定 IP 范围的用户列出对象。

Copy
Policy policy = new Policy(); // Allow only a specified IP range. Condition condition = new StringCondition(StringCondition.StringComparisonType.StringLike, ConditionFactory.SOURCE_IP_CONDITION_KEY , "192.168.143.*"); policy.withStatements(new Statement(Effect.Allow) .withActions(S3Actions.ListObjects) .withConditions(condition) .withResources(new Resource("arn:aws-cn:s3:::"+ bucketName))); getFederationTokenRequest.setPolicy(policy.toJson());

以下 Java 代码示例列出了指定存储桶中的密钥。在代码示例中,对于时长两个小时的会话,您可以首先获取适用于联合用户 (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" } ] }

您必须更新下面的示例并提供您在前面的联合用户访问策略中指定的存储桶名称。

Copy
import java.io.IOException; import com.amazonaws.auth.BasicSessionCredentials; import com.amazonaws.auth.PropertiesCredentials; import com.amazonaws.auth.policy.Policy; import com.amazonaws.auth.policy.Resource; import com.amazonaws.auth.policy.Statement; import com.amazonaws.auth.policy.Statement.Effect; import com.amazonaws.auth.policy.actions.S3Actions; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient; import com.amazonaws.services.securitytoken.model.Credentials; import com.amazonaws.services.securitytoken.model.GetFederationTokenRequest; import com.amazonaws.services.securitytoken.model.GetFederationTokenResult; import com.amazonaws.services.s3.model.ObjectListing; public class S3Sample { private static String bucketName = "*** Specify bucket name ***"; public static void main(String[] args) throws IOException { AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient(new ProfileCredentialsProvider()); GetFederationTokenRequest getFederationTokenRequest = new GetFederationTokenRequest(); getFederationTokenRequest.setDurationSeconds(7200); getFederationTokenRequest.setName("User1"); // Define the policy and add to the request. Policy policy = new Policy(); policy.withStatements(new Statement(Effect.Allow) .withActions(S3Actions.ListObjects) .withResources(new Resource("arn:aws-cn:s3:::ExampleBucket"))); getFederationTokenRequest.setPolicy(policy.toJson()); // Get the temporary security credentials. GetFederationTokenResult federationTokenResult = stsClient.getFederationToken(getFederationTokenRequest); Credentials sessionCredentials = federationTokenResult.getCredentials(); // Package the session credentials as a BasicSessionCredentials // object for an S3 client object to use. BasicSessionCredentials basicSessionCredentials = new BasicSessionCredentials(sessionCredentials.getAccessKeyId(), sessionCredentials.getSecretAccessKey(), sessionCredentials.getSessionToken()); AmazonS3Client s3 = new AmazonS3Client(basicSessionCredentials); // Test. For example, send ListBucket request using the temporary security credentials. ObjectListing objects = s3.listObjects(bucketName); System.out.println("No. of Objects = " + objects.getObjectSummaries().size()); } }

相关资源

本页内容: