Assumir um perfil do IAM usando o AWS SDK para PHP versão 3
Uso de perfis do IAM para credenciais variáveis da instância do Amazon EC2
Se estiver executando a aplicação em uma instância do Amazon EC2, a maneira preferencial de fornecer credenciais para fazer chamadas para a AWS é usar um perfil do IAM para obter credenciais de segurança temporárias.
Quando você usa perfis do IAM, não há a necessidade de se preocupar com o gerenciamento de credenciais na aplicação. Eles permitem que uma instância “assuma” um perfil recuperando credenciais temporárias do servidor de metadados da instância do Amazon EC2.
As credenciais temporárias, geralmente conhecidas como credenciais de perfil de instância, permitem acesso a ações e recursos que a política do perfil permite. O Amazon EC2 controla todo o trabalho de autenticação de instâncias com segurança para que o serviço IAM assuma o perfil e, periodicamente, atualiza as credenciais dos perfis recuperadas. Isso mantém o aplicativo seguro com praticamente nenhum trabalho de sua parte. Para obter uma lista de serviços que aceitam credenciais de segurança temporárias, consulte os serviços da AWS que funcionam com o IAM no Guia do usuário do IAM.
nota
Para evitar acessar o serviço de metadados sempre, é possível passar uma instância de Aws\CacheInterface como a opção 'credentials' para um construtor de cliente. Isso permite que o SDK use credenciais de perfil de instância em cache no lugar. Para obter detalhes, consulte Configuração do AWS SDK para PHP Versão 3.
Para obter mais informações sobre o desenvolvimento de aplicações do Amazon EC2 usando os SDKs, consulte Uso de perfis do IAM para instâncias do Amazon EC2 no Guia de referência de SDKs e ferramentas da AWS.
Criar e atribuir o perfil do IAM a uma instância do Amazon EC2
-
Crie um cliente do IAM.
Importações
require 'vendor/autoload.php'; use Aws\Iam\IamClient;Código de exemplo
$client = new IamClient([ 'region' => 'us-west-2', 'version' => '2010-05-08' ]); -
Crie um perfil do IAM com as permissões das ações e dos recursos que você usará.
Código de exemplo
$result = $client->createRole([ 'AssumeRolePolicyDocument' => 'IAM JSON Policy', // REQUIRED 'Description' => 'Description of Role', 'RoleName' => 'RoleName', // REQUIRED ]); -
Crie um perfil de instância do IAM e armazene o nome do recurso da Amazon (ARN) do resultado.
nota
Quando você usa o console do IAM em vez do AWS SDK para PHP, o console cria automaticamente um perfil de instância e dá a ele o mesmo nome do perfil correspondente.
Código de exemplo
$IPN = 'InstanceProfileName'; $result = $client->createInstanceProfile([ 'InstanceProfileName' => $IPN , ]); $ARN = $result['Arn']; $InstanceID = $result['InstanceProfileId']; -
Crie um cliente do Amazon EC2.
Importações
require 'vendor/autoload.php'; use Aws\Ec2\Ec2Client;Código de exemplo
$ec2Client = new Ec2Client([ 'region' => 'us-west-2', 'version' => '2016-11-15', ]); -
Adicione o perfil de instância a uma instância do Amazon EC2 em execução ou interrompida. Use o nome do perfil de instância do seu perfil do IAM.
Código de exemplo
$result = $ec2Client->associateIamInstanceProfile([ 'IamInstanceProfile' => [ 'Arn' => $ARN, 'Name' => $IPN, ], 'InstanceId' => $InstanceID ]);
Para obter mais informações, consulte Funções do IAM para o Amazon EC2 no Guia do usuário do Amazon EC2.
Usar perfis do IAM para tarefas do Amazon ECS
Uma tarefa no Amazon Elastic Container Service (Amazon ECS) pode assumir um perfil do IAM para fazer chamadas de API da AWS. Essa é uma estratégia de gerenciar credenciais para as aplicações usarem, semelhante à forma como os perfis de instância do Amazon EC2 fornecem credenciais para instâncias do Amazon EC2.
Em vez de criar e distribuir credenciais de longo prazo da AWS para contêineres ou usar o perfil de instância do Amazon EC2, você pode associar um perfil do IAM que usa credenciais temporárias a uma definição de tarefa do ECS ou operação de API RunTask.
Para obter mais informações sobre o uso dos perfis do IAM que as tarefas de contêiner podem assumir, consulte o tópico da Perfil do IAM de tarefa no Guia do desenvolvedor do Amazon ECS. Para obter exemplos de uso do perfil do IAM da tarefa na forma de um taskRoleArn nas definições de tarefas, consulte Exemplos de definições de tarefas também no Guia do desenvolvedor do Amazon ECS.
Assumir um perfil do IAM em outra Conta da AWS
Quando você trabalha em uma Conta da AWS (Conta A) e deseja assumir um perfil em outra conta (Conta B), você deve primeiro criar um perfil do IAM na conta B. Esse perfil permite que as entidades em sua conta (Conta A) executem ações específicas na conta B. Para obter mais informações sobre acesso entre contas, consulte Tutorial do IAM: Delegar acesso entre contas da AWS usando perfis do IAM.
Depois de criar um perfil na Conta B, registre o ARN do perfil. Você usará esse ARN quando assumir o perfil da Conta A. Você assume o perfil usando as credenciais da AWS associadas à sua entidade na Conta A.
Crie um cliente do AWS STS com credenciais para sua Conta da AWS. No exemplo a seguir, usamos um perfil de credenciais, mas é possível usar qualquer método. Com o cliente AWS STS recém-criado, chame assume-role e forneça um sessionName personalizado. Recupere as novas credenciais temporárias do resultado. Por padrão, as credenciais duram uma hora.
Código de exemplo
$stsClient = new Aws\Sts\StsClient([ 'profile' => 'default', 'region' => 'us-east-2', 'version' => '2011-06-15' ]); $ARN = "arn:aws:iam::123456789012:role/xaccounts3access"; $sessionName = "s3-access-example"; $result = $stsClient->AssumeRole([ 'RoleArn' => $ARN, 'RoleSessionName' => $sessionName, ]); $s3Client = new S3Client([ 'version' => '2006-03-01', 'region' => 'us-west-2', 'credentials' => [ 'key' => $result['Credentials']['AccessKeyId'], 'secret' => $result['Credentials']['SecretAccessKey'], 'token' => $result['Credentials']['SessionToken'] ] ]);
Para obter mais informações, consulte Usar funções do IAM ou AssumeRole na Referência de API do AWS SDK para PHP.
Usar um perfil do IAM com identidade da web
A federação de identidades da web permite que os clientes usem provedores de identidade de terceiros para autenticação ao acessar recursos da AWS. Antes de assumir um perfil com identidade da web, você deve criar um perfil do IAM e configurar um provedor de identidades (IdP) da web. Para obter mais informações, consulte Criar uma função para identidades da web ou federação do OpenID Connect (Console).
Depois de criar um provedor de identidade e criar uma função para sua identidade da web, use um cliente AWS STS para autenticar um usuário. Forneça o webIdentityToken e ProviderId para sua identidade, e o ARN da função para a função do IAM com permissões para o usuário.
Código de exemplo
$stsClient = new Aws\Sts\StsClient([ 'profile' => 'default', 'region' => 'us-east-2', 'version' => '2011-06-15' ]); $ARN = "arn:aws:iam::123456789012:role/xaccounts3access"; $sessionName = "s3-access-example"; $duration = 3600; $result = $stsClient->AssumeRoleWithWebIdentity([ 'WebIdentityToken' => "FACEBOOK_ACCESS_TOKEN", 'ProviderId' => "graph.facebook.com", 'RoleArn' => $ARN, 'RoleSessionName' => $sessionName, ]); $s3Client = new S3Client([ 'version' => '2006-03-01', 'region' => 'us-west-2', 'credentials' => [ 'key' => $result['Credentials']['AccessKeyId'], 'secret' => $result['Credentials']['SecretAccessKey'], 'token' => $result['Credentials']['SessionToken'] ] ]);
Para obter mais informações, consulte AssumeRoleWithWebIdentity — Federação por meio de um provedor de identidade baseado na web ou AssumeRoleWithWebIdentity na Referência de API do AWS SDK para PHP.
Assumir função com perfil
Definir perfis em ~/.aws/credentials
Você pode configurar o AWS SDK para PHP para usar um perfil do IAM definindo um perfil em ~/.aws/credentials.
Crie um perfil com a configuração do role_arn para o perfil que você assumirá. Inclua também a configuração source_profile para um perfil com credenciais que tenham permissões para assumir o perfil do IAM. Para obter mais detalhes sobre essas configurações, consulte Assumir credenciais de função no Guia de referência de SDKs e ferramentas da AWS.
Por exemplo, no ~/.aws/credentials seguinte, o perfil project1 define o role_arn e especifica o perfil default como a fonte das credenciais para verificar se a entidade associada a elas pode assumir o perfil.
[project1] role_arn = arn:aws:iam::123456789012:role/testing source_profile = default role_session_name = OPTIONAL_SESSION_NAME [default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY aws_session_token= YOUR_AWS_SESSION_TOKEN
Ao definir a variável de ambiente AWS_PROFILE ou usar o parâmetro profile ao instanciar um cliente de serviço, o perfil especificado em project1 será assumido, usando o perfil default como as credenciais de origem.
O trecho a seguir mostra o uso do parâmetro profile em um construtor do S3Client. O S3Client terá as permissões associadas à função associada ao perfil project1.
$s3 = new Aws\S3\S3Client([ 'region' => 'us-east-1', 'version' => '2006-03-01', 'profile' => 'project1' ]);
Definir perfis em ~/.aws/config
O arquivo ~/.aws/config também pode conter perfis que você deseja que sejam assumidos. Se você definir a variável de ambiente AWS_SDK_LOAD_NONDEFAULT_CONFIG, o SDK for PHP carregará perfis do arquivo config. Quando AWS_SDK_LOAD_NONDEFAULT_CONFIG estiver configurado, o SDK carrega perfis de ~/.aws/config e ~/.aws/credentials. Os perfis de ~/.aws/credentials são carregados por último e têm precedência sobre um perfil de ~/.aws/config com o mesmo nome. Perfis de qualquer um desses locais podem servir como o source_profile ou o perfil a ser assumido.
O exemplo a seguir usa o perfil project1 definido no arquivo config e o perfil default no arquivo credentials. O AWS_SDK_LOAD_NONDEFAULT_CONFIG também está definido.
# Profile in ~/.aws/config. [profile project1] role_arn = arn:aws:iam::123456789012:role/testing source_profile = default role_session_name = OPTIONAL_SESSION_NAME
# Profile in ~/.aws/credentials. [default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY aws_session_token= YOUR_AWS_SESSION_TOKEN
Quando o construtor do S3Client executa o trecho a seguir, a função definida no perfil project1 será assumida usando as credenciais associadas ao perfil default.
$s3 = new Aws\S3\S3Client([ 'region' => 'us-east-1', 'version' => '2006-03-01', 'profile' => 'project1' ]);