腾讯云对象存储使用临时秘钥访问

使用临时秘钥访问腾讯云对象存储应用场景

对于客户端应用,把访问密钥放到客户端代码中,这既容易泄露你的密钥信息,也不便于控制用户访问权限。类似这种需临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来进行限制,仅提供最小的权限。

腾讯云STS服务提供了一种临时访问授权。通过STS可以获取临时的AccessKey、secretKey及Token,在有效期内,该临时秘钥可以用来访问腾讯云对象存储。

相关术语:

  • STS:安全凭证服务(SecurityTokenService),提供临时访问授权,请求STS可以获取临时秘钥。
  • 角色:表示某种操作权限的虚拟概念,没有独立的登录密码和AccessKey。
  • 临时秘钥:请求STS返回一组临时的AccessKey、secretKey及Token,即为临时秘钥。

使用流程

主账号A(AccountID:111111111111)有一个名为test-app的存储桶,并希望其APP用户可以在该存储桶下保存数据。该场景可通过使用临时秘钥访问腾讯云对象存储来实现。具体流程如下:

1.创建角色

A账号创建角色test-role,指定A账号可以代入该角色;创建完成后为test-role附加IAMPolicy,该Policy允许访问test-app存储桶;详见角色说明。

Policy示例如下,允许该角色上传Object至test-app存储桶中。

{"Version":3,"Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["jrn:oss::111111111111:test-app/"]}]}2.创建子用户

A账号创建IAM子用户test-iam,并对该用户附加IAMPolicy,该Policy允许代入角色test-role;详见子用户说明;

Policy示例如下,允许该用户扮演test-role角色。

{"Version":3,"Statement":[{"Effect":"Allow","Action":["sts:assumeRole"],"Resource":["jrn:iam::111111111111:role/test-role"]}]}3.获取临时秘钥

使用test-iam用户代入test-role角色,获取临时秘钥,并指定有效期;详见角色-用户角色扮演和切换;

4.访问腾讯云对象存储

使用临时秘钥访问腾讯云对象存储,该临时秘钥拥有test-role角色的权限,在秘钥有效期内可以正常访问test-app存储桶。

访问示例

以下以JavaSDK为例,说明如何使用临时秘钥访问腾讯云对象存储。

  • 获取临时秘钥:调用STS服务AssumeRole接口获取临时AccessKey、secretKey及Token;该示例使用jdcloud-sdk-java初始化stsClient获取临时秘钥。
  • 使用临时秘钥访问腾讯云对象存储:该示例使用临时秘钥初始化s3Client,并上传Object。

importcom.amazonaws.ClientConfiguration;importcom.amazonaws.auth.AWSCredentialsProvider;importcom.amazonaws.auth.AWSStaticCredentialsProvider;importcom.amazonaws.auth.BasicSessionCredentials;importcom.amazonaws.client.builder.AwsClientBuilder;importcom.amazonaws.services.s3.AmazonS3;importcom.amazonaws.services.s3.AmazonS3Client;importcom.jdcloud.sdk.auth.CredentialsProvider;importcom.jdcloud.sdk.auth.StaticCredentialsProvider;importcom.jdcloud.sdk.http.HttpRequestConfig;importcom.jdcloud.sdk.http.Protocol;importcom.jdcloud.sdk.service.sts.client.StsClient;importcom.jdcloud.sdk.service.sts.model.AssumeRoleInfo;importcom.jdcloud.sdk.service.sts.model.AssumeRoleRequest;importcom.jdcloud.sdk.service.sts.model.AssumeRoleResponse;importcom.jdcloud.sdk.service.sts.model.Credentials;publicclassTokenExample{publicstaticCredentialsgetToken(){//使用子用户test-iam的AK/SK初始化stsClientStringaccessKey="your-ak";StringsecretKey="your-sk";CredentialsProvidercredentialsProvider=newStaticCredentialsProvider(accessKey,secretKey);StsClientstsClient=StsClient.builder().credentialsProvider(credentialsProvider).httpRequestConfig(newHttpRequestConfig.Builder().protocol(Protocol.HTTPS).build()).build();//调用AssumeRoleAPI代入角色AssumeRoleInfoassumeRoleInfo=newAssumeRoleInfo().roleJrn("your-roleJrn").roleSessionName("your-session-name");AssumeRoleRequestassumeRoleRequest=newAssumeRoleRequest();assumeRoleRequest.setAssumeRoleInfo(assumeRoleInfo);AssumeRoleResponseresponse=stsClient.assumeRole(assumeRoleRequest);Credentialscredentials=response.getResult().getCredentials();//返回代入角色后的临时秘钥returncredentials;}publicstaticvoidmain(String[]str){//获取临时秘钥Credentialscredentials=getToken();//使用临时秘钥初始化s3ClientBasicSessionCredentialsbasicSessionCredentials=newBasicSessionCredentials(credentials.getAccessKey(),credentials.getSecretKey(),credentials.getSessionToken());Stringendpoint="https://s3.REGION.jdcloud-oss.com";ClientConfigurationconfig=newClientConfiguration();AwsClientBuilder.EndpointConfigurationendpointConfig=newAwsClientBuilder.EndpointConfiguration(endpoint,"REGION");AWSCredentialsProviderawsCredentialsProvider=newAWSStaticCredentialsProvider(basicSessionCredentials);AmazonS3s3Client=AmazonS3Client.builder().withEndpointConfiguration(endpointConfig).withClientConfiguration(config).withCredentials(awsCredentialsProvider).disableChunkedEncoding().withPathStyleAccessEnabled(true).build();//使用s3Client上传Objects3Client.putObject("your-bucket","your-key","thisistest");}}