3 votes

Rôles AWS STS avec EC2 AssumeRole

Je veux déployer mon code sur une instance EC2, mais je ne veux pas intégrer la clé et le secret AWS. AWS fournit un service IAM qui me permet d'assigner un rôle à mes instances EC2, ce qui permettra à ces instances d'accéder à l'aide de clés temporaires.

Comment faire pour que cela fonctionne ? J'ai essayé d'utiliser le SDK et StsClient pour assumerRole mais cela génère une erreur

User:  arn:aws:sts::XXXXXXXXXXXX:assumed-role/ROLE-NAME/INSTANCE No is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::XXXXXXXXXXXX:role/ROLE-NAME

En lisant un peu partout, il semble que la demande STS doive utiliser elle-même les informations d'identification pour effectuer l'attribution des rôles, mais je pensais que les clés de l'instance EC2 seraient utilisées.

6voto

Graeme Points 1074

Oui, l'appel STS pour assumer un rôle a besoin d'informations d'identification pour fonctionner, mais il utilise les informations d'identification fournies lors de la construction, et si celles-ci sont omises, il ne revient pas à des informations d'identification basées sur l'instance.

Pour utiliser des informations d'identification basées sur l'instance pour effectuer l'appel, vous devez utiliser quelque chose comme :

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile();

qui récupère le nom du rôle associé, puis les informations d'identification de l'instance temporaire. Si vous connaissez le nom du rôle, vous pouvez le spécifier dans le constructeur

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile(['profile' => 'role-name-here']);

Vous devrez également mettre à jour la relation de confiance sur le rôle pour permettre à l'instance d'assumer le rôle. J'ai supposé que l'entrée de service ferait cela, mais le fait de changer cela pour référencer le rôle IAM semble fonctionner.

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::XXXXXXXXXXXX:role/ROLE-NAME"
  },
  "Action": "sts:AssumeRole"
}

(N'oubliez pas d'ajouter la virgule à la fin des sections précédentes qui se terminent par } ).

Passez maintenant ces informations d'identification dans le constructeur du client Sts et votre appel à AssumeRole devrait être renvoyé avec succès. Mon code de test est le suivant :

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile();

$stsClient = new \Aws\Sts\StsClient(['region' => 'eu-west-1', 'version' => 'latest', 'credentials' => $credentials]);

$ar = $stsClient->assumeRole(['RoleArn' => 'arn:aws:iam::XXXXXXXXXXXX:role/Ec2Role-queue', 'RoleSessionName' => 'test']);

$creds = $stsClient->createCredentials($ar);

var_dump($creds);

Quelles sont les sorties :

object(Aws\Credentials\Credentials)#96 (4) {
  ["key":"Aws\Credentials\Credentials":private]=>
  string(20) "XXXXIYH36RJ5NZCDXXXX"
  ["secret":"Aws\Credentials\Credentials":private]=>
  string(40) "eXXXX+azLUNi9LjwyX4MkNI4rnEpFrG9pNNXXXXX"
  ["token":"Aws\Credentials\Credentials":private]=>
  string(308)     "FQoDYXdzEH4aDIa3Rx/onWIa4ArZeyLHAX+muL7zKt9trAQhMa98pkzpGGmOGa0N5UhCjX2GXQ3Dc2APElwlpCfr9F+J2k5igAeonadgrwAOC/OvEDv34i1JdmkaUjEE14S2hVGz2dXXXXegYra7kvx0cdoOjCPIFmXSZJeD1PR27lFyacH2x5+F1XKFugveiYCD63axATp4t8fq0K+EPjXXXX/wYKm5tJt7hYkCV7+tThLYFDPZ6NkXXXXjsSKkOw9u52yGJY4yD50y+liSprHH+/ZJyQppDIJcZbbpyBoojoeRvwU="
  ["expires":"Aws\Credentials\Credentials":private]=>
  int(1474580894)
}

J'espère que cela aidera quelqu'un d'autre à sauver quelques follicules pileux :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X