Criptografia de dados de execução durável do AWS Lambda
Com as funções duráveis do AWS Lambda, você pode criar aplicações resilientes de várias etapas que funcionam por até um ano usando pontos de verificação para recuperar cada execução de falhas, reproduzindo o trabalho concluído.
O Lambda sempre criptografa os dados em repouso de execução durável. Além disso, você pode configurar sua própria chave gerenciada pelo cliente AWS KMS na função para controle de rotação, visibilidade de auditoria ou conformidade. Com uma chave gerenciada pelo cliente, somente as entidades principais que você autorizar podem ler os dados de execução.
Como a criptografia funciona
Uma execução durável do Lambda usa a mesma chave KMS com a qual começou durante toda a vida útil. Alterar ou remover a chave na função afeta somente as execuções iniciadas após a alteração. Consulte Quando a chave gerenciada pelo cliente não está disponível para saber como uma execução durável se comporta quando sua chave não está disponível.
As chaves gerenciadas pelo cliente incorrem em cobranças do AWS KMS padrão. Para obter detalhes de preço, consulte Definição de preço do AWS Key Management Service
O que é criptografado
Quando você configura uma chave gerenciada pelo cliente em uma função durável, o Lambda usa essa chave para criptografar os seguintes dados em repouso de execução durável:
A carga útil de entrada que você transmite com cada solicitação
Invoke.Os dados do ponto de verificação persistiram pela API
CheckpointDurableExecution, incluindo os resultados das etapas, os erros das etapas e as entradas de invocação encadeadas.Resultados e erros de execução.
Resultados e erros de retorno de chamada que você envia por meio de
SendDurableExecutionCallbackSuccesseSendDurableExecutionCallbackFailure.
As chaves de execução durável e de função são independentes
O nível de função KMSKeyArn que criptografa as variáveis do ambiente, os pacotes de implantação .zip e os snapshots do SnapStart é separado de KMSKeyArn em DurableConfig, que criptografa os dados de execução durável. Configurar um não configura o outro. É possível usar a mesma chave do KMS para ambas ou usar diferentes chaves do KMS.
Configuração da criptografia da chave gerenciada pelo cliente
A configuração da criptografia da chave gerenciada pelo cliente para uma função durável é um processo de três etapas. Conclua as etapas a seguir na ordem.
Criar uma chave gerenciada pelo cliente
As funções duráveis oferecem suporte às chaves do KMS de criptografia simétrica na mesma região da AWS da função. Chaves entre regiões não são compatíveis. Para criar uma chave simétrica gerenciada pelo cliente, siga as etapas para Criar chaves do KMS de criptografia simétrica no Guia do desenvolvedor do AWS Key Management Service.
Permissões
Você concede as permissões do AWS KMS por meio da política de chave do KMS.
A configuração de uma chave gerenciada pelo cliente requer permissões do AWS KMS na entidade principal que cria ou atualiza a função. A invocação de uma função durável não exige permissões do AWS KMS no chamador; o Lambda executa a criptografia com sua entidade principal do serviço.
Política de chave
As políticas de chaves controlam o acesso à chave gerenciada pelo cliente. Cada chave gerenciada pelo cliente deve ter exatamente uma política de chaves. Em uma política de chave, Resource: "*" se refere somente à chave do KMS à qual a política está vinculada, não a todas as chaves do KMS em sua conta.
A política de chave de uma função durável concede a cada entidade principal apenas as ações do AWS KMS de que ela precisa, com escopo definido pelo ARN da função e do serviço. As seções a seguir descrevem as declarações, as condições e um exemplo completo.
Declarações da política necessárias
A política concede os seguintes recursos:
Habilitar as permissões do usuário do IAM. Concede acesso incondicional à raiz da conta para gerenciar a chave. Essa declaração não usa condições porque definir o escopo impede que você rotacione, atualize ou exclua a chave.
Permita que o Lambda use essa chave para funções duráveis. Concede
kms:GenerateDataKeyekms:Decryptà entidade principal do serviço do Lambda.Permita que o perfil de execução da função descriptografe os dados de execução durável. Concede o perfil de execução
kms:Decryptpara ler o estado e progredir na execução.Permita que o autor da função descreva essa chave. Concede
kms:DescribeKeypara que o Lambda possa validar se a chave é simétrica e está habilitada duranteCreateFunctionouUpdateFunctionConfiguration.Permita que o autor da função valide essa chave para uma função específica. Concede
kms:GenerateDataKeyekms:Decrypt, portanto o Lambda pode validar as principais permissões e acessos com o contexto de criptografia da função duranteCreateFunctionouUpdateFunctionConfiguration. Isso confirma que a política de chave aceita chamadas para essa função específica antes que a função seja criada ou atualizada.Permita os operadores de execução durável. Concede aos operadores
kms:Decryptpara chamadas paraGetDurableExecutioneGetDurableExecutionHistorycomIncludeExecutionData=true,GetDurableExecutionState,StopDurableExecutione as APIs de retorno de chamada.
Como prática recomendada, use entidades principais separadas para o perfil de execução, o autor da função e o operador da execução durável para que cada identidade tenha somente os recursos necessários.
Condições recomendadas para a política
A política usa as seguintes condições para reduzir o acesso:
kms:ViaServicerestringe o uso de chaves às solicitações roteadas pelo Lambda. Aplicar isso ao perfil de execução, ao autor da função e às declarações do operador impede que eles usem a chave diretamente pelo AWS KMS.aws:SourceArneaws:SourceAccountprotegem contra o problema de representante confuso entre serviços. O Lambda encaminha esses valores quando faz chamadas do AWS KMS usando suas próprias credenciais de serviço. Essa condição se aplica somente à declaração da entidade principal do serviço do Lambda. O perfil de execução, o autor da função e as instruções do operador chamam o AWS KMS com as credenciais da sessão de acesso direto do chamador, que não carregam esses cabeçalhos.kms:EncryptionContext:aws:lambda:FunctionArndefine o escopo da chave para uma função específica. O Lambda adiciona isso ao contexto de criptografia em cada chamada do AWS KMS para obter dados de execução durável.
O exemplo a seguir combina as declarações e condições acima.
exemplo Política de chave para funções duráveis
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow Lambda to use this key for durable functions", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "aws:SourceArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow the function execution role to decrypt durable execution data", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/myDurableFunctionRole" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow the function author to describe this key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/FunctionAuthor" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com" } } }, { "Sid": "Allow the function author to validate this key for a specific function", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/FunctionAuthor" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow durable execution operators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/DurableExecutionOperator" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } } ] }
Para obter mais informações sobre as políticas de chaves do AWS KMS, consulte Como alterar uma política de chave no Guia do desenvolvedor do AWS Key Management Service.
Configurar uma chave gerenciada pelo cliente em uma função durável.
Você configura a chave gerenciada pelo cliente para os dados de execução durável por meio do campo KMSKeyArn do objeto DurableConfig. Defina-a ao criar a função com CreateFunction; atualize-a em uma função durável existente com UpdateFunctionConfiguration.
Importante
Cada execução durável usa a chave gerenciada pelo cliente que foi configurada na função quando ela foi iniciada. A alteração ou remoção da chave afeta somente as execuções iniciadas após a alteração; as execuções em andamento continuam usando a chave com a qual iniciaram até serem concluídas ou falharem.
Leitura de dados de execução durável
Duas APIs de leitura retornam os dados de execução durável:
GetDurableExecutionretorna o estado atual de uma única execução, incluindo sua carga útil de entrada, os dados mais recentes do ponto de verificação e as informações sobre resultados ou erros.GetDurableExecutionHistoryretorna a lista ordenada de eventos que a execução emitiu, mostrando as entradas e os resultados do ponto de verificação, as entradas e os resultados da invocação em cadeia e o resultado final.
Ambas as APIs aceitam um parâmetro de solicitação IncludeExecutionData. Quando IncludeExecutionData é true, o Lambda usa as credenciais do chamador para chamar kms:Decrypt na chave gerenciada pelo cliente. O Lambda então retorna os dados de execução descriptografados na resposta. A identidade do chamador deve estar kms:Decrypt na chave gerenciada pelo cliente.
Quando IncludeExecutionData é false, o Lambda não chama AWS KMS nem descriptografa os dados de execução, e a resposta define ExecutionDataIncluded como false. A resposta ainda inclui DurableConfig, o que reflete o ARN da chave gerenciada pelo cliente que a execução usou. IncludeExecutionData é definida como false por padrão, então os chamadores que precisam apenas de metadados não precisam de permissões do AWS KMS.
Exemplo: resposta GetDurableExecution com IncludeExecutionData=false
{ "DurableExecutionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction:execution:exec-abc123", "DurableExecutionName": "exec-abc123", "FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction", "StartTimestamp": 1733256000, "Status": "RUNNING", "ExecutionDataIncluded": false, "DurableConfig": { "ExecutionTimeout": 3600, "KMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id", "RetentionPeriodInDays": 30 } }
Invocações em cadeia
Quando uma função durável usa invocação em cadeia para chamar outra função durável, o Lambda trata a execução secundária como uma execução durável independente: ela tem sua própria ID de execução, seu próprio fluxo de ponto de verificação e sua própria chave gerenciada pelo cliente. A configuração da chave gerenciada pelo cliente definida como principal não tem efeito nos dados da secundária e a configuração da chave gerenciada pelo cliente secundária não tem efeito nos dados da principal.
Permissões
A entidade principal de serviço do Lambda deve ter kms:GenerateDataKey e kms:Decrypt na chave gerenciada pelo cliente da função secundária. Se as funções principal e secundária usarem chaves gerenciadas pelo cliente diferentes, você concederá acesso à entidade principal do serviço em cada chave separadamente. O perfil de execução da função principal não precisa de permissões na chave gerenciada pelo cliente secundária.
Identificar qual chave criptografou qual execução
GetDurableExecution e ListDurableExecutionsByFunction retornam o ARN da chave gerenciada pelo cliente que criptografou cada execução. Use essas APIs para confirmar qual chave estava em vigor quando uma execução principal ou secundária foi iniciada.
Armazenamento em cache de chaves de dados
Para reduzir o volume de chamadas do AWS KMS e melhorar a disponibilidade durante interrupções no serviço, o Lambda armazena em cache uma chave de dados gerada a partir da chave gerenciada pelo cliente por até 15 minutos. Enquanto o cache está aquecido, o Lambda reutiliza a mesma chave de dados nas operações de uma execução e nas execuções iniciadas durante a janela de cache.
Custo
O custo de AWS KMS por execução permanece baixo porque o Lambda chama GenerateDataKey no máximo uma vez por janela de cache, não uma vez por ponto de verificação. Com altas taxas de solicitação, o custo por execução cai ainda mais porque mais execuções compartilham cada chave de dados em cache. Você é cobrado pelas chamadas do AWS KMS que o Lambda efetivamente fizer, não por cada ponto de verificação ou leitura.
Estabilidade estática
As chaves de dados permanecem em cache por até 15 minutos. As alterações na sua chave entrarão em vigor na próxima atualização do cache. Durante interrupções prolongadas de serviço, o Lambda continua atendendo a partir do cache, mantendo as execuções em andamento.
CloudTrail
O armazenamento em cache de chaves de dados significa que você vê menos eventos GenerateDataKey no CloudTrail do que execuções ou pontos de verificação. Para obter exemplos de eventos, consulte Monitoramento das chaves do KMS para funções duráveis.
Quando a chave gerenciada pelo cliente não está disponível
Se a chave gerenciada pelo cliente com a qual uma execução foi iniciada estiver desativada, programada para exclusão ou tiver seu acesso revogado por meio da política de chave, a execução não poderá mais progredir. No próximo ponto de verificação, o Lambda falha na execução com um erro AWS KMS que não pode ser repetido. A restauração do acesso à chave não retoma automaticamente a execução. Você deve iniciar uma nova execução.
As APIs que leem ou gravam cargas úteis também falham quando a chave não está disponível. Elas podem retornar uma das seguintes exceções:
KMSAccessDeniedException: o Lambda não conseguiu descriptografar os dados da execução durável porque o acesso à chave do KMS foi negado.KMSDisabledException: o Lambda não conseguiu descriptografar os dados da execução durável porque a chave do KMS está desativada.KMSInvalidStateException: o Lambda não conseguiu descriptografar os dados da execução durável porque o estado da chave do KMS não é válido paraDecrypt.KMSNotFoundException: o Lambda não conseguiu descriptografar os dados da execução durável porque a chave do KMS não foi encontrada.
A restauração do acesso à chave do KMS permite que essas APIs de leitura tenham êxito novamente em execuções que já falharam. As execuções que falharam continuam com falha; você deve iniciar uma nova execução.
Para inspecionar os metadados de execução enquanto a chave do KMS não estiver disponível, chame GetDurableExecution com IncludeExecutionData=false. Isso retorna o status da execução, os carimbos de data/hora e DurableConfig (incluindo o ARN da chave do KMS) sem chamar AWS KMS.
Como o Lambda armazena em cache as chaves de dados, a desativação de uma chave não tem efeito imediato. Para obter detalhes, consulte Armazenamento em cache de chaves de dados.
Importante
A exclusão de uma chave do KMS da qual as execuções em andamento ou retidas ainda dependam destrói permanentemente essas execuções e seu histórico.
Monitoramento das chaves do KMS para funções duráveis
Ao usar uma chave gerenciada pelo cliente com uma função durável, é possível usar AWS CloudTrail para rastrear as chamadas do AWS KMS que o Lambda fizer por você. Para obter orientações gerais sobre como pesquisar eventos do AWS KMS, consulte Pesquisar atividade da API do AWS KMS.
Para confirmar se o Lambda está usando sua chave conforme o esperado, procure esses campos em cada evento:
eventName: um deGenerateDataKey,DecryptouDescribeKeyeventSource:kms.amazonaws.com.rproxy.govskope.causerIdentity.invokedBy:lambda.amazonaws.com.rproxy.govskope.carequestParameters.encryptionContext.aws:lambda:FunctionArn: o ARN da função durável
Os exemplos a seguir são eventos do CloudTrail de uma chamada CreateFunction ou UpdateFunctionConfiguration que configura uma chave gerenciada pelo cliente em uma função durável. O Lambda emite três chamadas do AWS KMS para validar a chave: uma DescribeKey verdadeira, e GenerateDataKey e Decrypt simuladas.