Comment spécifier un rôle IAM pour une instance Amazon EC2 lancée via l'AWS CLI?

20

J'utilise la commande "aws ec2 run-instances" (à partir de l' interface de ligne de commande AWS (CLI) ) pour lancer une instance Amazon EC2 . Je veux définir un rôle IAM pour l'instance EC2 que je lance. Le rôle IAM est configuré et je peux l'utiliser avec succès lors du lancement d'une instance à partir de l'interface utilisateur Web AWS. Mais lorsque j'essaie de le faire en utilisant cette commande et l'option "--iam-instance-profile", cela a échoué. Faire "aide aux instances d'exécution aws ec2" affiche les sous-champs Arn = et Name = pour la valeur. Lorsque j'essaie de rechercher Arn en utilisant "aws iam list-instance-profiles", il donne ce message d'erreur:

Une erreur client (AccessDenied) s'est produite: utilisateur: arn: aws: sts :: xxxxxxxxxxxx: assume-role / shell / i-15c2766d n'est pas autorisé à effectuer: iam: ListInstanceProfiles sur la ressource: arn: aws: iam :: xxxxxxxxxxxxx: instance -profil/

(où xxxxxxxxxxxx est mon numéro de compte AWS à 12 chiffres)

J'ai recherché la chaîne Arn via l'interface utilisateur Web et l'ai utilisée via "--iam-instance-profile Arn = arn: aws: iam :: xxxxxxxxxxxx: instance-profile / shell" sur la commande run-instances, et cela a échoué avec :

Une erreur client (UnauthorizedOperation) s'est produite: vous n'êtes pas autorisé à effectuer cette opération.

Si je laisse complètement l'option "--iam-instance-profile", l'instance se lancera mais elle n'aura pas le paramètre de rôle IAM dont j'ai besoin. La permission semble donc avoir quelque chose à voir avec l'utilisation de "--iam-instance-profile" ou l'accès aux données IAM. J'ai répété plusieurs fois en cas de pépins AWS (ils se produisent parfois) et sans succès.

Je soupçonne qu'il existe peut-être une restriction selon laquelle une instance avec un rôle IAM n'est pas autorisée à lancer une instance avec un rôle IAM plus puissant. Mais dans ce cas, l'instance dans laquelle je fais la commande a le même rôle IAM que j'essaie d'utiliser. nommé "shell" (bien que j'aie aussi essayé d'en utiliser un autre, pas de chance).

  • La définition d'un rôle IAM n'est-elle même pas autorisée à partir d'une instance (via ses informations d'identification de rôle IAM)?

  • Existe-t-il une autorisation de rôle IAM plus élevée nécessaire pour utiliser les rôles IAM que celle requise pour le lancement d'une instance simple?

  • "--Iam-instance-profile" est-il la manière appropriée de spécifier un rôle IAM?

  • Dois-je utiliser un sous-ensemble de la chaîne Arn ou le formater d'une autre manière?

  • Est-il possible de configurer un rôle IAM pouvant accéder à n'importe quel rôle IAM (peut-être un "Super Root IAM" ... constituant ce nom)?

Pour info, tout implique Linux fonctionnant sur les instances. De plus, j'exécute tout cela à partir d'une instance car je n'ai pas pu installer ces outils sur mon bureau. Cela et je ne veux pas mettre mes informations d'identification d'utilisateur IAM sur un stockage AWS comme conseillé par AWS ici .

après avoir répondu:

Je n'ai pas mentionné l'autorisation d'instance de lancement de "PowerUserAccess" (par rapport à "AdministratorAccess") car je ne savais pas qu'un accès supplémentaire était nécessaire au moment où la question a été posée. J'ai supposé que le rôle IAM était une "information" attachée au lancement. Mais c'est vraiment plus que ça. Il s'agit d'une autorisation.

Skaperen
la source

Réponses:

23

Mise à jour

Mike Pope a publié un bel article sur l' octroi d'une autorisation de lancement d'instances EC2 avec des rôles IAM (autorisation PassRole) sur le blog de sécurité AWS , qui explique le sujet d'un point de vue AWS.


Réponse initiale

La réponse de Skaperen est partiellement correcte (+1), mais légèrement imprécise / trompeuse comme suit (l'explication semble un peu trop complexe pour un commentaire, d'où cette réponse séparée):

Le lancement d'une instance EC2 avec un rôle IAM nécessite un accès administratif à la fonction IAM.

C'est correct en tant que tel et pointe vers le problème sous-jacent, mais les autorisations administratives requises sont plutôt limitées, donc la conclusion suivante ...

Étant donné que les rôles IAM accordent des autorisations, il existe clairement un problème de sécurité à résoudre. Vous ne voudriez pas que les rôles IAM soient un moyen d'autoriser l'escalade des autorisations.

... est un peu trompeur, dans la mesure où le problème de sécurité potentiel peut être correctement résolu. Le sujet est traité dans Accorder aux applications qui s'exécutent sur des instances Amazon EC2 l'accès aux ressources AWS :

Vous pouvez utiliser des rôles IAM pour gérer les informations d'identification des applications qui s'exécutent sur des instances Amazon EC2. Lorsque vous utilisez des rôles, vous n'avez pas à distribuer les informations d'identification AWS aux instances Amazon EC2. Au lieu de cela, vous pouvez créer un rôle avec les autorisations dont les applications auront besoin lorsqu'elles s'exécutent sur Amazon EC2 et effectuer des appels vers d'autres ressources AWS. Lorsque les développeurs lancent une instance Amazon EC2, ils peuvent spécifier le rôle que vous avez créé pour associer à l'instance. Les applications qui s'exécutent sur l'instance peuvent ensuite utiliser les informations d'identification de rôle pour signer les demandes.

Maintenant, dans le cas d'utilisation à portée de main, les développeurs mentionnés [qui] lancent une instance Amazon EC2 sont en fait des instances EC2 elles-mêmes, ce qui semble générer le problème de sécurité catch 22 décrit par Skaperen. Ce n'est pas vraiment le cas, comme l'illustre l'exemple de stratégie de la section Autorisations requises pour l'utilisation des rôles avec Amazon EC2 :

{
   "Version": "2012-10-17",
   "Statement": [{
      "Effect":"Allow",
      "Action":"iam:PassRole",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"iam:ListInstanceProfiles",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"ec2:*",
      "Resource":"*"
    }]
}

Il iam:PassRoles'agit donc en fait de la seule autorisation IAM requise, et bien que techniquement de nature administrative, cela ne va pas si loin - bien sûr, l'exemple de stratégie ci-dessus permettrait toujours d'augmenter les autorisations au moyen de la liste et, à son tour, de transmettre tout rôle disponible, mais cela peut être évité en spécifiant uniquement les rôles que vous souhaitez / sécuriser à passer pour le cas d'utilisation à portée de main - cela est décrit dans la section Restriction des rôles pouvant être transmis aux instances Amazon EC2 (à l'aide de PassRole) :

Vous pouvez utiliser l'autorisation PassRole pour empêcher les utilisateurs de passer un rôle à Amazon EC2 qui dispose de plus d'autorisations que l'utilisateur n'en a déjà accordé, puis d'exécuter des applications avec les privilèges élevés pour ce rôle. Dans la stratégie de rôle, autorisez l'action PassRole et spécifiez une ressource (telle que arn: aws: iam :: 111122223333: role / ec2Roles / *) pour indiquer que seul un rôle ou un ensemble de rôles spécifique peut être transmis à une instance Amazon EC2 .

L'exemple de politique respectif illustre exactement le cas d'utilisation en question, c'est-à-dire accorde la permission de lancer une instance avec un rôle en utilisant l'API Amazon EC2 :

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect":"Allow",
      "Action":"ec2:RunInstances",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"iam:PassRole",
      "Resource":"arn:aws:iam::123456789012:role/Get-pics"
    }]
}
Steffen Opel
la source
Merci pour l'info sur iam: PassRole. C'est plus de détails que ce que j'avais appris auparavant, cela montre beaucoup plus que ce qui peut être fait en configurant les autorisations comme ceci.
Skaperen
1

Le lancement d'une instance EC2 avec un rôle IAM nécessite un accès administratif à la fonction IAM. Cela s'applique même si la nouvelle instance doit avoir exactement le même rôle que l'instance effectuant le lancement. L'instance à partir de laquelle je lancais avait l'autorisation "PowerUserAccess", qui permettait de lancer une instance, mais pas l'accès au rôle IAM. Une fois que j'ai avancé l'autorisation dans l'instance de lancement à "AdministratorAccess", cela a fonctionné.

Étant donné que les rôles IAM accordent des autorisations, il existe clairement un problème de sécurité à résoudre. Vous ne voudriez pas que les rôles IAM soient un moyen d'autoriser l'escalade des autorisations. Mais cela signifie également que pour accorder un rôle IAM, l'instance de lancement doit avoir "AdministratorAccess" ou utiliser des clés d'accès utilisateur / secrètes (avec une telle autorisation) à partir de l'instance (non recommandé), ce qui permettrait d'accorder n'importe quel rôle IAM.

Pouvoir lancer une instance avec la même autorisation (même rôle IAM) que celle détenue par l'instance effectuant le lancement serait utile, mais EC2 ou IAM n'ont pas ce niveau de granularité ou n'ont pas les moyens de le vérifier en toute sécurité. .

Skaperen
la source
1
Vous avez analysé / décrit correctement le problème sous-jacent (+1), mais vos conclusions sont légèrement imprécises / trompeuses - j'ai ajouté une réponse distincte pour expliquer correctement comment le problème de sécurité potentiel est résolu par IAM.
Steffen Opel