Uso de políticas baseadas em recursos para o AWS Lambda - AWS Lambda

Uso de políticas baseadas em recursos para o AWS Lambda

O AWS Lambda oferece suporte a políticas de permissões baseadas em recursos para funções e camadas do Lambda. As políticas baseadas em recursos permitem conceder permissão de uso a outras contas da AWS por recurso. Também é possível usar uma política baseada em recurso para permitir que um serviço da AWS invoque a função em seu nome.

Para funções do Lambda, conceda uma permissão à conta para invocar ou gerenciar uma função. É possível adicionar várias instruções para conceder acesso a várias contas ou permitir que qualquer conta invoque a função. Também é possível usar a política para conceder permissão de invocar a um serviço da AWS que invoca uma função em resposta à atividade em sua conta.

Como visualizar a política baseada em recursos de uma função

  1. Abra a página Funções do console do Lambda.

  2. Escolha uma função.

  3. Escolha Permissions (Permissões).

  4. A política baseada em recursos mostra as permissões aplicadas quando outra conta ou serviço da AWS tenta acessar a função. O exemplo a seguir mostra uma instrução que permite ao Amazon S3 invocar uma função chamada my-function para um bucket chamado my-bucket na conta 123456789012.

    exemplo Política baseada em recurso

    { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "lambda-allow-s3-my-function", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function” "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" }, "ArnLike": { "AWS:SourceArn": "arn:aws:s3:::my-bucket" } } } ] }

Para camadas do Lambda, é possível usar somente uma política baseada em recurso em uma versão específica da camada, em vez de toda a camada. Além de políticas que concedem permissão a uma única conta ou a várias as contas, para camadas, também é possível conceder permissão a todas as contas em uma organização.

nota

Você só pode atualizar políticas baseadas em recursos para recursos do Lambda dentro do escopo das ações de API AddLayerVersionPermission e AddPermission. Atualmente, não é possível criar políticas para os recursos do Lambda em JSON ou usar condições não mapeadas para parâmetros dessas ações.

As políticas baseadas em recursos se aplicam a uma única função, versão, alias ou versão da camada. Elas concedem permissão para um ou mais serviços e contas. Para contas confiáveis que você deseja que tenham acesso a vários recursos, ou para usar ações de API não compatíveis com políticas baseadas em recursos, use funções entre contas.

Conceder acesso de função aos serviços da AWS

Ao usar um serviço da AWS para invocar a função, você concede permissão em uma instrução em uma política baseada em recursos. É possível aplicar a instrução a toda a função a ser invocada ou gerenciada ou limitar a instrução a uma única versão ou alias.

nota

Quando você adiciona um trigger à função com o console do Lambda, este atualiza a política baseada em recursos da função para permitir que o serviço a invoque. Para conceder permissões a outras contas ou serviços que não estejam disponíveis no console do Lambda, é possível usar a CLI da AWS.

Adicione uma instrução com o comando add-permission. A instrução de política baseada em recursos mais simples permite que um serviço invoque uma função. O comando a seguir concede permissão ao Amazon SNS para invocar uma função chamada my-function.

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns \ --principal sns.amazonaws.com --output text {"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

Isso permite que o Amazon SNS chame a API lambda:Invoke para a função, mas não restrinja o tópico do Amazon SNS que aciona a invocação. Para garantir que a função só seja invocada por um recurso específico, especifique o Amazon Resource Name (ARN – Nome de recurso da Amazon) do recurso com a opção source-arn. O comando a seguir só permite que o Amazon SNS invoque a função para assinaturas de um tópico chamado my-topic.

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns-my-topic \ --principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-2:123456789012:my-topic

Alguns serviços podem invocar funções em outras contas. Se você especificar um ARN de origem que tenha o ID da conta, isso não será um problema. No entanto, para o Amazon S3 a origem é um bucket cujo ARN não tem um ID da conta. É possível que você consiga excluir o bucket e outra conta consiga criar um bucket com o mesmo nome. Use a opção source-account com o ID da sua conta para garantir que apenas os recursos na conta possam invocar a função.

$ aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id s3-account \ --principal s3.amazonaws.com --source-arn arn:aws:s3:::my-bucket-123456 --source-account 123456789012

Conceder acesso de função a outras contas

Para conceder permissões a outra conta da AWS, especifique o ID da conta como o principal. O exemplo a seguir concede permissão à conta 210987654321 para invocar my-function com o alias prod.

$ aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 210987654321 --output text {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

A política baseada em recursos concede permissão para a outra conta acessar a função, mas não permite que os usuários nessa conta excedam suas permissões. Os usuários na outra conta devem ter as permissões de usuário correspondentes para usar a API do Lambda.

Para limitar o acesso a um usuário, grupo ou função em outra conta, especifique o ARN completo da identidade como o principal. Por exemplo, arn:aws:iam::123456789012:user/developer.

O alias limita qual versão a outra conta pode chamar. Ele exige que a outra conta inclua o alias no ARN da função.

$ aws lambda invoke --function-name arn:aws:lambda:us-west-2:123456789012:function:my-function:prod out { "StatusCode": 200, "ExecutedVersion": "1" }

Depois disso, o proprietário da função pode atualizar o alias para apontar para uma nova versão sem que o chamador precise alterar a maneira como eles invocam sua função. Isso garante que a outra conta não precise alterar o código para usar a nova versão, e ela tem permissão somente para invocar a versão da função associada ao alias.

Conceda acesso entre contas para a maioria das ações de API que operam em uma função existente. Por exemplo, é possível conceder acesso a lambda:ListAliases para obter uma lista de aliases ou a lambda:GetFunction para permitir que eles façam download do código da função. Adicione cada permissão separadamente ou use lambda:* para conceder acesso a todas as ações da função especificada.

APIs entre contas

Atualmente, o Lambda não oferece suporte a ações entre contas para todas as APIs por meio de políticas baseadas em recursos. As seguintes APIs são compatíveis:

Para conceder permissão a outras contas para várias funções ou para ações que não operem em uma função, recomendamos usar as funções do IAM.

Conceder acesso de camada a outras contas

Para conceder permissão de uso de camadas a outra conta, adicione uma instrução à política de permissões da versão da camada com o comando add-layer-version-permission. Em cada instrução, você pode conceder permissão a uma única conta, a todas as contas ou a uma organização.

$ aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

As permissões só se aplicam a uma única versão de uma camada. Repita o procedimento cada vez que você criar uma versão da camada.

Para conceder permissão a todas as contas em uma organização, use a opção organization-id. O exemplo a seguir concede a todas as contas em uma organização permissão para usar a versão 3 de uma camada.

$ aws lambda add-layer-version-permission --layer-name my-layer \ --statement-id engineering-org --version-number 3 --principal '*' \ --action lambda:GetLayerVersion --organization-id o-t194hfs8cz --output text b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"

Para conceder permissão a todas as contas da AWS, use * para a entidade principal e omita o ID da organização. Para várias contas ou organizações, é necessário adicionar várias instruções.

Limpar políticas baseadas em recursos

Para exibir a política baseada em recursos de uma função, use o comando get-policy.

$ aws lambda get-policy --function-name my-function --output text {"Version":"2012-10-17","Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:us-east-2:123456789012:lambda*"}}}]} 7c681fc9-b791-4e91-acdf-eb847fdaa0f0

Para versões e aliases, acrescente o número da versão ou o alias ao nome da função.

$ aws lambda get-policy --function-name my-function:PROD

Para remover permissões da função, use remove-permission.

$ aws lambda remove-permission --function-name example --statement-id sns

Use o comando get-layer-version-policy para visualizar as permissões em uma camada. Use remove-layer-version-permission para remover instruções da política.

$ aws lambda get-layer-version-policy --layer-name my-layer --version-number 3 --output text b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}" $ aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org