Trabalhar com políticas baseadas em recursos no Lambda - AWS Lambda

Trabalhar com políticas baseadas em recursos no Lambda

O 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 ou organizações 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. Você também pode usar uma só política baseada em recursos para conceder permissões a uma organização inteira no AWS Organizations. Também é possível usar políticas baseadas em recurso para conceder permissão de invocação a um serviço da AWS que invoca uma função em resposta a atividades 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 Configuração e, em seguida, escolha Permissões.

  4. Role para baixo até Política baseada em recursos e escolha Exibir documento de política. 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 DOC-EXAMPLE-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:::DOC-EXAMPLE-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

Só é possível atualizar políticas baseadas em recursos para recursos do Lambda dentro do escopo das ações de API AddPermission e AddLayerVersionPermission. 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.

Ações da API com suporte

As seguintes ações de API do Lambda são compatíveis com as políticas baseadas em recursos:

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 acionador à 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 AWS CLI.

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

A seguinte saída deverá ser mostrada:

{"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:::DOC-EXAMPLE-BUCKET --source-account 123456789012

Como conceder acesso de função a uma organização

Para conceder permissões a uma organização no AWS Organizations, especifique o ID da organização como o principal-org-id. Os seguinte comando AddPermission da AWS CLI concede acesso de invocação a todos os usuários na organização o-a1b2c3d4e5f.

aws lambda add-permission --function-name example \ --statement-id PrincipalOrgIDExample --action lambda:InvokeFunction \ --principal * --principal-org-id o-a1b2c3d4e5f
nota

Nesse comando, Principal é *. Isso significa que todos os usuários na organização o-a1b2c3d4e5f recebem permissões de invocação de função. Se você especificar uma conta ou função da AWS como a Principal, somente essa entidade principal recebe permissões de invocação de função, mas apenas se ela também fizer parte organização o-a1b2c3d4e5f.

Esse comando cria uma política baseada em recursos semelhante ao exemplo a seguir:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PrincipalOrgIDExample", "Effect": "Allow", "Principal": "*", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-west-2:123456789012:function:example", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } } } ] }

Para mais informações, consulte aws:PrincipalOrgID no guia do usuário do AWS Identity and Access Management.

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 111122223333 para invocar my-function com o alias prod.

aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 111122223333 --output text

A seguinte saída deverá ser mostrada:

{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333: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 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

A seguinte saída deverá ser mostrada:

{ "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.

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 usando 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.

O exemplo a seguir concede à conta 111122223333 acesso à versão 2 da camada bash-runtime.

aws lambda add-layer-version-permission --layer-name bash-runtime --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 2 --output text

Você deve ver saída semelhante a:

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}

As permissões se aplicam apenas a uma única versão de camada. Repita o processo sempre que criar uma nova 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

A seguinte saída deverá ser mostrada:

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

A seguinte saída deverá ser mostrada:

{"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.

aws lambda get-layer-version-policy --layer-name my-layer --version-number 3 --output text

A seguinte saída deverá ser mostrada:

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"}}}"

Use remove-layer-version-permission para remover instruções da política.

aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org