Ler credenciais de perfil do IAM no Amazon EC2 usando o SDK para Java 2.x
Você pode usar um perfil do IAM com o objetivo de gerenciar credenciais temporárias para aplicações em execução em uma instância do EC2 e fazer solicitações da AWS CLI ou da API da AWS. É preferível fazer isso a armazenar chaves de acesso na instância do EC2. Para atribuir um perfil da AWS a uma instância do EC2 e disponibilizá-la para todas as suas aplicações, crie um perfil de instância que esteja anexado a ela. Um perfil de instância contém o perfil e permite que os programas em execução na instância do EC2 obtenham credenciais temporárias. Para mais informações, consulte Utilizar um perfil do IAM para conceder permissões a aplicações em execução nas instâncias do Amazon EC2 no Guia do usuário do IAM.
Este tópico fornece informações sobre como configurar a aplicação Java para ser executada em uma instância do EC2 e permitir que o AWS SDK for Java 2.x adquira credenciais do perfil do IAM.
Adquirir credenciais de perfil do IAM do ambiente
Se a aplicação criar um cliente de serviço da AWS usando o método create (ou os métodos builder().build()), o SDK para Java usará a cadeia de provedores de credenciais padrão. A cadeia de provedores de credenciais padrão pesquisa no ambiente de execução os elementos de configuração que o SDK pode trocar por credenciais temporárias. A seção Cadeia de fornecedores de credenciais padrão no AWS SDK for Java 2.x descreve o processo completo de pesquisa.
A etapa final da cadeia de provedores padrão está disponível somente durante a execução da aplicação em uma instância do Amazon EC2. Nesta etapa, o SDK usa um InstanceProfileCredentialsProvider para ler o perfil do IAM definido no perfil da instância do EC2. Depois, o SDK adquire credenciais temporárias para esse perfil do IAM.
Embora essas credenciais sejam temporárias e acabem expirando, o InstanceProfileCredentialsProvider as atualiza periodicamente para você, de maneira que elas continuem permitindo o acesso à AWS.
Adquirir credenciais de perfil do IAM programaticamente
Como alternativa à cadeia de provedores de credenciais padrão que eventualmente usa um InstanceProfileCredentialsProvider no EC2, você pode configurar um cliente de serviço explicitamente com um InstanceProfileCredentialsProvider. Essa abordagem é mostrada no trecho a seguir.
S3Client s3 = S3Client.builder() .credentialsProvider(InstanceProfileCredentialsProvider.create()) .build();
Adquirir com segurança as credenciais de perfil do IAM
Por padrão, as instâncias do EC2 executam o IMDS (Instance Metadata Service), que permite que o InstanceProfileCredentialsProvider do SDK acesse informações como o perfil do IAM que foi configurado. As instâncias do EC2 executam duas versões do IMDS por padrão:
-
Serviço de metadados da instância versão 1 (IMDSv1) – um método de solicitação/resposta
-
Serviço de metadados da instância versão 2 (IMDSv2): um método orientado a sessões
O IMDSv2 é uma abordagem mais segura
Por padrão, o Java SDK primeiro tenta usar o IMDSv2 para obter o perfil do IAM, mas se isso falhar, ele tentará usar o IMDSv1. No entanto, como o IMDSv1 é menos seguro, a AWS recomenda usar somente o IMDSv2 e impedir que o SDK tente usar o IMDSv1.
Para usar a abordagem mais segura, impeça que o SDK use o IMDSv1 fornecendo uma das configurações a seguir com um valor de true.
-
Variável de ambiente:
AWS_EC2_METADATA_V1_DISABLED -
Propriedade do sistema de JVM: aws.
disableEc2MetadataV1 -
Configuração do arquivo de configuração compartilhado:
ec2_metadata_v1_disabled
Com uma dessas configurações definida como true, o SDK não carrega as credenciais do perfil do IMDS usando o IMDSv1 se a chamada inicial do IMDSv2 falha.