Fazer solicitações usando credenciais temporárias de usuário do IAM
Uma Conta da AWS ou um usuário do IAM podem solicitar credenciais de segurança temporárias e usá-las para enviar solicitações autenticadas ao Amazon S3. Esta seção fornece exemplos de como usar AWS SDK para Java, .NET e PHP para obter credenciais de segurança temporárias e usá-las para autenticar suas solicitações para o Amazon S3.
- Java
-
Um usuário do IAM ou uma Conta da AWS podem solicitar credenciais de segurança temporárias (consulte Fazer solicitações) usando o AWS SDK para Java e usá-las para acessar o Amazon S3. Essas credenciais expiram após a duração da sessão especificada.
Por padrão, a duração da sessão é de uma hora. Se usar credenciais de usuário do IAM, você poderá especificar a duração ao solicitar as credenciais de segurança temporárias de 15 minutos até a duração máxima de sessão para a função. Para obter mais informações sobre credenciais de segurança temporárias, consulte Credenciais de segurança temporárias no Manual do usuário do IAM. Para mais informações sobre fazer solicitações, consulte Fazer solicitações.
Como obter credenciais de segurança temporárias e acesso ao Amazon S3
-
Crie uma instância da classe
AWSSecurityTokenService. -
Recupere as credenciais de segurança temporárias para a função desejada chamando o método
assumeRole()do cliente STS (Security Token Service). -
Empacote as credenciais de segurança temporárias em um objeto
BasicSessionCredentials. Use esse objeto para fornecer as credenciais de segurança temporárias para o cliente do Amazon S3. -
Crie uma instância da classe
AmazonS3Clientusando as credenciais de segurança temporárias. Envie solicitações ao Amazon S3 usando esse cliente. Se você enviar solicitações usando credenciais expiradas, o Amazon S3 retornará um erro.
nota
Se você obtiver as credenciais de segurança temporárias usando suas credenciais de segurança de Conta da AWS, as credenciais temporárias serão válidas somente por uma hora. Você pode especificar a duração de sessão somente se usar credenciais de usuário do IAM para solicitar uma sessão.
O exemplo a seguir lista um conjunto de chaves de objeto no bucket especificado. O exemplo obtém credenciais de segurança temporárias para uma sessão e usa essas credenciais para enviar uma solicitação autenticada ao Amazon S3.
Para testar o exemplo usando credenciais de usuário do IAM, crie um usuário do IAM em sua Conta da AWS. Para obter mais informações sobre como criar um usuário do IAM, consulte Criar o primeiro usuário do IAM e grupo de administradores no Manual do usuário do IAM.
Consulte instruções sobre como criar e testar uma amostra funcional em Getting Started no Guia do desenvolvedor do AWS SDK para Java.
import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicSessionCredentials; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.ObjectListing; import com.amazonaws.services.securitytoken.AWSSecurityTokenService; import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder; import com.amazonaws.services.securitytoken.model.AssumeRoleRequest; import com.amazonaws.services.securitytoken.model.AssumeRoleResult; import com.amazonaws.services.securitytoken.model.Credentials; public class MakingRequestsWithIAMTempCredentials { public static void main(String[] args) { String clientRegion = "*** Client region ***"; String roleARN = "*** ARN for role to be assumed ***"; String roleSessionName = "*** Role session name ***"; String bucketName = "*** Bucket name ***"; try { // Creating the STS client is part of your trusted code. It has // the security credentials you use to obtain temporary security credentials. AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Obtain credentials for the IAM role. Note that you cannot assume the role of // an AWS root account; // Amazon S3 will deny access. You must use credentials for an IAM user or an // IAM role. AssumeRoleRequest roleRequest = new AssumeRoleRequest() .withRoleArn(roleARN) .withRoleSessionName(roleSessionName); AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest); Credentials sessionCredentials = roleResponse.getCredentials(); // Create a BasicSessionCredentials object that contains the credentials you // just retrieved. BasicSessionCredentials awsCredentials = new BasicSessionCredentials( sessionCredentials.getAccessKeyId(), sessionCredentials.getSecretAccessKey(), sessionCredentials.getSessionToken()); // Provide temporary security credentials so that the Amazon S3 client // can send authenticated requests to Amazon S3. You create the client // using the sessionCredentials object. AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) .withRegion(clientRegion) .build(); // Verify that assuming the role worked and the permissions are set correctly // by getting a set of object keys from the bucket. ObjectListing objects = s3Client.listObjects(bucketName); System.out.println("No. of Objects: " + objects.getObjectSummaries().size()); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } } -
- .NET
-
Um usuário do IAM ou uma Conta da AWS podem solicitar credenciais de segurança temporárias usando o AWS SDK para .NET e usá-las para acessar o Amazon S3. Essas credenciais expiram após a duração da sessão.
Por padrão, a duração da sessão é de uma hora. Se usar credenciais de usuário do IAM, você poderá especificar a duração ao solicitar as credenciais de segurança temporárias de 15 minutos até a duração máxima de sessão para a função. Para obter mais informações sobre credenciais de segurança temporárias, consulte Credenciais de segurança temporárias no Manual do usuário do IAM. Para mais informações sobre fazer solicitações, consulte Fazer solicitações.
Como obter credenciais de segurança temporárias e acesso ao Amazon S3
-
Crie uma instância do cliente do AWS Security Token Service,
AmazonSecurityTokenServiceClient. -
Inicie uma sessão chamando o método
GetSessionTokendo cliente STS criado na etapa anterior. Forneça informações da sessão para esse método usando um objetoGetSessionTokenRequest.O método retorna as credenciais de segurança temporárias.
-
Empacote as credenciais de segurança temporárias em uma instância do objeto
SessionAWSCredentials. Use esse objeto para fornecer as credenciais de segurança temporárias para o cliente do Amazon S3. -
Crie uma instância da classe
AmazonS3Clientpassando as credenciais de segurança temporárias. Envie solicitações ao Amazon S3 usando esse cliente. Se você enviar solicitações usando credenciais expiradas, o Amazon S3 retornará um erro.
nota
Se você obtiver as credenciais de segurança temporárias usando suas credenciais de segurança de Conta da AWS, as credenciais serão válidas somente por uma hora. Você poderá especificar a duração de sessão somente se usar as credenciais de usuário do IAM para solicitar uma sessão.
O exemplo do C# a seguir lista chaves de objeto no bucket especificado. Como ilustração, o exemplo obtém credenciais de segurança temporárias para uma sessão padrão de uma hora e usa essas credenciais para enviar uma solicitação autenticada ao Amazon S3.
Para testar o exemplo usando credenciais de usuário do IAM, crie um usuário do IAM em sua Conta da AWS. Para obter mais informações sobre como criar um usuário do IAM, consulte Criar o primeiro usuário do IAM e grupo de administradores no Manual do usuário do IAM. Para mais informações sobre fazer solicitações, consulte Fazer solicitações.
Para obter informações sobre como configurar e executar exemplos de código, consulte Conceitos básicos do AWS SDK for .NET no Guia do desenvolvedor do AWS SDK for .NET.
using Amazon; using Amazon.Runtime; using Amazon.S3; using Amazon.S3.Model; using Amazon.SecurityToken; using Amazon.SecurityToken.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class TempCredExplicitSessionStartTest { private const string bucketName = "*** bucket name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { ListObjectsAsync().Wait(); } private static async Task ListObjectsAsync() { try { // Credentials use the default AWS SDK for .NET credential search chain. // On local development machines, this is your default profile. Console.WriteLine("Listing objects stored in a bucket"); SessionAWSCredentials tempCredentials = await GetTemporaryCredentialsAsync(); // Create a client by providing temporary security credentials. using (s3Client = new AmazonS3Client(tempCredentials, bucketRegion)) { var listObjectRequest = new ListObjectsRequest { BucketName = bucketName }; // Send request to Amazon S3. ListObjectsResponse response = await s3Client.ListObjectsAsync(listObjectRequest); List<S3Object> objects = response.S3Objects; Console.WriteLine("Object count = {0}", objects.Count); } } catch (AmazonS3Exception s3Exception) { Console.WriteLine(s3Exception.Message, s3Exception.InnerException); } catch (AmazonSecurityTokenServiceException stsException) { Console.WriteLine(stsException.Message, stsException.InnerException); } } private static async Task<SessionAWSCredentials> GetTemporaryCredentialsAsync() { using (var stsClient = new AmazonSecurityTokenServiceClient()) { var getSessionTokenRequest = new GetSessionTokenRequest { DurationSeconds = 7200 // seconds }; GetSessionTokenResponse sessionTokenResponse = await stsClient.GetSessionTokenAsync(getSessionTokenRequest); Credentials credentials = sessionTokenResponse.Credentials; var sessionCredentials = new SessionAWSCredentials(credentials.AccessKeyId, credentials.SecretAccessKey, credentials.SessionToken); return sessionCredentials; } } } } -
- PHP
-
Para obter mais informações sobre a API do AWS SDK for Ruby, acesse AWS SDK for Ruby Version 2.
Um usuário do IAM ou uma Conta da AWS podem solicitar credenciais de segurança temporárias usando a versão 3 do AWS SDK para PHP. Posteriormente, as credenciais temporárias podem ser usadas para acessar o Amazon S3. As credenciais expiram quando a duração da sessão expira.
Por padrão, a duração da sessão é de uma hora. Se usar credenciais de usuário do IAM, você poderá especificar a duração ao solicitar as credenciais de segurança temporárias de 15 minutos até a duração máxima de sessão para a função. Para obter mais informações sobre credenciais de segurança temporárias, consulte Credenciais de segurança temporárias no Manual do usuário do IAM. Para mais informações sobre fazer solicitações, consulte Fazer solicitações.
nota
Se você obtiver as credenciais de segurança temporárias usando suas credenciais de segurança de Conta da AWS, as credenciais de segurança temporárias serão válidas somente por uma hora. Você pode especificar a duração de sessão somente se usar credenciais de usuário do IAM para solicitar uma sessão.
exemplo
O exemplo de PHP a seguir lista as chaves de objeto no bucket especificado usando credenciais de segurança temporárias. O exemplo obtém credenciais de segurança temporárias para uma sessão padrão de uma hora e usa essas credenciais para enviar uma solicitação autenticada ao Amazon S3. Para obter mais informações sobre a API do AWS SDK for Ruby, acesse AWS SDK for Ruby Version 2.
Para testar o exemplo usando credenciais de usuário do IAM, crie um usuário do IAM em sua Conta da AWS. Para obter informações sobre como criar um usuário do IAM, consulte Criar o primeiro usuário do IAM e grupo de administradores no Manual do usuário do IAM. Para obter exemplos de definição de duração de sessão usando credenciais de usuário do IAM para solicitar uma sessão, consulte Fazer solicitações usando credenciais temporárias de usuário do IAM.
require 'vendor/autoload.php'; use Aws\S3\Exception\S3Exception; use Aws\S3\S3Client; use Aws\Sts\StsClient; $bucket = '*** Your Bucket Name ***'; $sts = new StsClient([ 'version' => 'latest', 'region' => 'us-east-1' ]); $sessionToken = $sts->getSessionToken(); $s3 = new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'credentials' => [ 'key' => $sessionToken['Credentials']['AccessKeyId'], 'secret' => $sessionToken['Credentials']['SecretAccessKey'], 'token' => $sessionToken['Credentials']['SessionToken'] ] ]); $result = $s3->listBuckets(); try { // Retrieve a paginator for listing objects. $objects = $s3->getPaginator('ListObjects', [ 'Bucket' => $bucket ]); echo "Keys retrieved!" . PHP_EOL; // List objects foreach ($objects as $object) { echo $object['Key'] . PHP_EOL; } } catch (S3Exception $e) { echo $e->getMessage() . PHP_EOL; } - Ruby
-
Um usuário do IAM ou uma Conta da AWS podem solicitar credenciais de segurança temporárias usando o AWS SDK para Ruby e usá-las para acessar o Amazon S3. Essas credenciais expiram após a duração da sessão.
Por padrão, a duração da sessão é de uma hora. Se usar credenciais de usuário do IAM, você poderá especificar a duração ao solicitar as credenciais de segurança temporárias de 15 minutos até a duração máxima de sessão para a função. Para obter mais informações sobre credenciais de segurança temporárias, consulte Credenciais de segurança temporárias no Manual do usuário do IAM. Para mais informações sobre fazer solicitações, consulte Fazer solicitações.
nota
Se você obtiver as credenciais de segurança temporárias usando suas credenciais de segurança de Conta da AWS, as credenciais de segurança temporárias serão válidas somente por uma hora. É possível especificar a duração da sessão somente ao usar as credenciais de usuário do IAM para solicitar uma sessão.
O seguinte exemplo de Ruby cria um usuário temporário para listar os itens em um bucket especificado por uma hora. Para usar esse exemplo, você deve ter credenciais da AWS com as permissões necessárias para criar novos clientes do AWS Security Token Service (AWS STS) e listar buckets do Amazon S3.
# Prerequisites: # - A user in AWS Identity and Access Management (IAM). This user must # be able to assume the following IAM role. You must run this code example # within the context of this user. # - An existing role in IAM that allows all of the Amazon S3 actions for all of the # resources in this code example. This role must also trust the preceding IAM user. # - An existing S3 bucket. require 'aws-sdk-core' require 'aws-sdk-s3' require 'aws-sdk-iam' # Checks whether a user exists in IAM. # # @param iam [Aws::IAM::Client] An initialized IAM client. # @param user_name [String] The user's name. # @return [Boolean] true if the user exists; otherwise, false. # @example # iam_client = Aws::IAM::Client.new(region: 'us-west-2') # exit 1 unless user_exists?(iam_client, 'my-user') def user_exists?(iam_client, user_name) response = iam_client.get_user(user_name: user_name) return true if response.user.user_name rescue Aws::IAM::Errors::NoSuchEntity # User doesn't exist. rescue StandardError => e puts 'Error while determining whether the user ' \ "'#{user_name}' exists: #{e.message}" end # Creates a user in IAM. # # @param iam_client [Aws::IAM::Client] An initialized IAM client. # @param user_name [String] The user's name. # @return [AWS:IAM::Types::User] The new user. # @example # iam_client = Aws::IAM::Client.new(region: 'us-west-2') # user = create_user(iam_client, 'my-user') # exit 1 unless user.user_name def create_user(iam_client, user_name) response = iam_client.create_user(user_name: user_name) response.user rescue StandardError => e puts "Error while creating the user '#{user_name}': #{e.message}" end # Gets a user in IAM. # # @param iam_client [Aws::IAM::Client] An initialized IAM client. # @param user_name [String] The user's name. # @return [AWS:IAM::Types::User] The existing user. # @example # iam_client = Aws::IAM::Client.new(region: 'us-west-2') # user = get_user(iam_client, 'my-user') # exit 1 unless user.user_name def get_user(iam_client, user_name) response = iam_client.get_user(user_name: user_name) response.user rescue StandardError => e puts "Error while getting the user '#{user_name}': #{e.message}" end # Checks whether a role exists in IAM. # # @param iam_client [Aws::IAM::Client] An initialized IAM client. # @param role_name [String] The role's name. # @return [Boolean] true if the role exists; otherwise, false. # @example # iam_client = Aws::IAM::Client.new(region: 'us-west-2') # exit 1 unless role_exists?(iam_client, 'my-role') def role_exists?(iam_client, role_name) response = iam_client.get_role(role_name: role_name) return true if response.role.role_name rescue StandardError => e puts 'Error while determining whether the role ' \ "'#{role_name}' exists: #{e.message}" end # Gets credentials for a role in IAM. # # @param sts_client [Aws::STS::Client] An initialized AWS STS client. # @param role_arn [String] The role's Amazon Resource Name (ARN). # @param role_session_name [String] A name for this role's session. # @param duration_seconds [Integer] The number of seconds this session is valid. # @return [AWS::AssumeRoleCredentials] The credentials. # @example # sts_client = Aws::STS::Client.new(region: 'us-west-2') # credentials = get_credentials( # sts_client, # 'arn:aws:iam::123456789012:role/AmazonS3ReadOnly', # 'ReadAmazonS3Bucket', # 3600 # ) # exit 1 if credentials.nil? def get_credentials(sts_client, role_arn, role_session_name, duration_seconds) Aws::AssumeRoleCredentials.new( client: sts_client, role_arn: role_arn, role_session_name: role_session_name, duration_seconds: duration_seconds ) rescue StandardError => e puts "Error while getting credentials: #{e.message}" end # Checks whether a bucket exists in Amazon S3. # # @param s3_client [Aws::S3::Client] An initialized Amazon S3 client. # @param bucket_name [String] The name of the bucket. # @return [Boolean] true if the bucket exists; otherwise, false. # @example # s3_client = Aws::S3::Client.new(region: 'us-west-2') # exit 1 unless bucket_exists?(s3_client, 'amzn-s3-demo-bucket') def bucket_exists?(s3_client, bucket_name) response = s3_client.list_buckets response.buckets.each do |bucket| return true if bucket.name == bucket_name end rescue StandardError => e puts "Error while checking whether the bucket '#{bucket_name}' " \ "exists: #{e.message}" end # Lists the keys and ETags for the objects in an Amazon S3 bucket. # # @param s3_client [Aws::S3::Client] An initialized Amazon S3 client. # @param bucket_name [String] The bucket's name. # @return [Boolean] true if the objects were listed; otherwise, false. # @example # s3_client = Aws::S3::Client.new(region: 'us-west-2') # exit 1 unless list_objects_in_bucket?(s3_client, 'amzn-s3-demo-bucket') def list_objects_in_bucket?(s3_client, bucket_name) puts "Accessing the contents of the bucket named '#{bucket_name}'..." response = s3_client.list_objects_v2( bucket: bucket_name, max_keys: 50 ) if response.count.positive? puts "Contents of the bucket named '#{bucket_name}' (first 50 objects):" puts 'Name => ETag' response.contents.each do |obj| puts "#{obj.key} => #{obj.etag}" end else puts "No objects in the bucket named '#{bucket_name}'." end true rescue StandardError => e puts "Error while accessing the bucket named '#{bucket_name}': #{e.message}" end