2017-08-21 5 views
1

Nous avons cette exigence est sorti des tests de stylo. J'ai une fonction lambda "add_address" et un rôle "account_management_role".Comment rendre un rôle assumable par une fonction lambda donnée?

Je veux rendre "account_management_role" assumable seulement par "add_address" fonction lambda. Je ne veux pas que d'autres fonctions lambda assument ce rôle.

J'ai essayé différentes choses, j'ai essayé d'ajouter cette entrée dans "Trust Relationship" du rôle IAM. Cela n'a pas fonctionné.

Quelqu'un a une idée de comment cela fonctionnera?

{ 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "Service": "lambda.amazonaws.com" 
     }, 
     "Action": "sts:AssumeRole", 
     "Condition": { 
     "ArnEquals": { 
      "aws:SourceArn": "<ARN of lambda function>" 
     } 
     } 
    } 
    ] 
} 

Répondre

1

@nagalakshmi À partir du lien donné http://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html au premier paragraphe, ils mentionnent clairement ne sont pas pris en charge.

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "CreateFunctionPermissions", 
      "Effect": "Allow", 
      "Action": [ 
       "lambda:CreateFunction" 
      ], 
      "Resource": "*" 
     }, 
     { 
      "Sid": "PermissionToPassAnyRole", 
      "Effect": "Allow", 
      "Action": [ 
       "iam:PassRole" 
      ], 
      "Resource": "arn:aws:iam::account-id:role/*" 
     } 
    ] 
} 

De la documentation AWS

La politique a deux déclarations:

Les premières subventions des états autorisations pour l'action AWS Lambda (lambda: createFunction) sur une ressource en utilisant le nom de ressource Amazon (ARN) pour la fonction Lambda. Actuellement, AWS Lambda ne prend pas en charge les autorisations pour cette action particulière au niveau de la ressource. Par conséquent, la stratégie spécifie un caractère générique (*) en tant que valeur de ressource. La seconde instruction accorde des autorisations pour l'action IAM (iam: PassRole) sur les rôles IAM. Le caractère générique () à la fin de la valeur Resource signifie que l'instruction autorise l'action iam: PassRole sur tout rôle IAM. Pour limiter cette autorisation à un rôle spécifique, remplacez le caractère générique () dans l'ARN de ressource avec le nom de rôle spécifique.

Dans la déclaration ci-dessus de la documentation, ils ont mentionné ne pas prendre en charge les autorisations au niveau des ressources.

Ils peuvent donc avoir une demande de fonctionnalité.

+0

a du sens. C'est ce que nous faisons maintenant. On dirait que l'ajout de condition pour restreindre qui peut assumer le rôle ne fonctionne pas comme prévu. –

0

Créé Rôle X et attaché à la fonction Lambda Fonction A. Ensuite, je crée une nouvelle fonction Lambda B avec le même rôle X. Je suis arrivé ci-dessous erreur

« L'onglet de configuration n'a pas sauvé la raison:.. Votre rôle est pas prêt, ou ne peut pas être assumée par Lambda S'il vous plaît attendre jusqu'à à une minute et réessayez. ".

Vous trouverez ci-dessous la même politique de relation de confiance. Veuillez vérifier votre ARN lambda.

{ 
     "Version": "2012-10-17", 
     "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": { 
      "Service": "lambda.amazonaws.com" 
      }, 
      "Action": "sts:AssumeRole", 
      "Condition": { 
      "ArnEquals": { 
       "aws:SourceArn": "arn:aws:lambda:us-east-1:xxxxxxxxx:function:lambdatest" 
      } 
      } 
     } 
     ] 
    } 
+0

Problème est même Lambda La fonction A ne peut pas assumer le rôle X. J'ai la même erreur. "L'onglet Configuration n'a pas pu être sauvegardé Raison: Votre rôle n'est pas prêt ou ne peut pas être pris en charge par Lambda. Veuillez patienter jusqu'à une minute et réessayer." Cela n'a pas été cohérent. Il cesse de fonctionner après avoir attendu quelques heures. –

0

On dirait que c'est un bug. C'est la réponse que j'ai obtenue pour le ticket que j'ai créé avec l'équipe de support AWS. Ressemble seule façon de déterminer qui peut assumer le rôle est-il restreint en changeant

Blockquote accès au niveau utilisateur, je suis allé de l'avant et a essayé les restrictions que vous essayez d'atteindre dans une seule fonction Lambda, mais nous avons été incapables pour le faire fonctionner correctement; nous avons effectué une série de tests pour être sûr du résultat, et nos tests ont échoué parce que nous étions incapables de spécifier une fonction spécifique comme condition pour assumer un rôle. Cela est dû au fait que l'hypothèse de rôle initiale est effectuée par le service Lambda lui-même, sans même rechercher la fonction qu'il cherche à invoquer. J'ai découvert cela en ajoutant le modificateur 'IfExists' à 'StringLike: ceci dit à IAM de vérifier ce trait particulier dans la requête AssumeRole, mais s'il n'est pas présent, ignorez la condition et continuez. La fonction ne fonctionnerait pas avec un ensemble de conditions spécifique, et même si l'ARN exact était fourni, il échouerait toujours. Cependant, après avoir ajouté IfExists, la fonction a fonctionné ... mais il en a été de même pour une autre fonction non reliée qui a essayé d'utiliser le rôle. Cela signifie que l'ARN de la fonction Lambda n'est pas vérifié avant que le service Lambda n'assume un rôle. Blockquote Au moment où vous appelez une fonction, vous faites implicitement confiance au service AWS Lambda pour assumer le rôle et exécuter la fonction exactement comme décrit. En tant que tel, votre relation de confiance n'est pas ce qui devrait être modifié; Si vous souhaitez restreindre l'accès à une fonction particulière, vous devez restreindre l'entité IAM qui l'appelle lorsque le rôle est transmis en raison d'une entité disposant des autorisations iam: PassRole adéquates pour transmettre un rôle particulier au service Lambda, lequel Lambda utilise ensuite pour appeler la fonction. Le document suivant montre un exemple de la façon de limiter iam: PassRole à un rôle particulier ou un ensemble de rôles que: http://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html

+0

Bonjour nagalakshmi hier j'ai d'abord essayé en utilisant IAM: passrole mais ça ne marche pas pour votre cas d'utilisation. Si vous trouvez la mise à jour de la solution ici, –